FIR IP核在modelsim中的仿真问题

恳请请各位指正

一、问题遇到的现象和发生背景 :

最近在学习FIR滤波器,通过quartus生成FIR的IP核,再调用modelsim进行仿真,报错如下:

img

二、操作环境、软件版本等信息

系统版本:win10
quartus: 13.1(IP核已破解,如下图)
modelsim: ModelSim-Altera 10.1d

img

三、问题猜想:

可能是工程中既有.v又有.vhd文件,可是.vhd文件明明是在生成IP核时产生的,但是在生成IP核时选了verilog.

img

img

img

四、代码如下:

1、主代码:

module fir_prj(
    clk         ,
    rst_n       ,
    key         ,
    dac_mode    ,
    dac_sleep   ,
    dac_clka    ,
    dac_dat_a   ,
    dac_wra     ,
    dac_clkb    ,
    dac_dat_b   ,
    dac_wrb
);

input             clk         ;
input             rst_n       ;
input   [7:0]     key         ;
output            dac_mode    ;   
output            dac_sleep   ;
output            dac_clka    ;
output  [7:0]     dac_dat_a   ;
output            dac_wra     ;
output            dac_clkb    ; 
output  [7:0]     dac_dat_b   ; 
output            dac_wrb     ;


reg     [7:0]     sin_data    ;
reg     [31:0]    cnt1        ;
wire              add_cnt1    ;
wire              end_cnt1    ;
wire    [16:0]    addr_temp   ;
wire    [6:0]     addr        ;
reg     [11:0]    x           ;
reg     [7:0]     dac_dat_a   ;
wire              dac_sleep   ;
wire              dac_mode    ;
wire              dac_clka    ;
reg     [1:0]     cnt0        ;
wire              add_cnt0    ;
wire              end_cnt0    ;
wire    [7:0]     fir_dout    ;
wire              fir_dout_vld;
reg     [7:0]     dac_dat_b   ;
wire              dac_clkb    ;
wire              dac_wrb     ;
wire    [7:0]     fir_din     ;
wire    [7:0]     fir_dout2   ;



always @(*) begin
       case(addr)
0: sin_data = 8'h7F;
1: sin_data = 8'h85;
2: sin_data = 8'h8C;
3: sin_data = 8'h92;
4: sin_data = 8'h98;
5: sin_data = 8'h9E;
6: sin_data = 8'hA4;
7: sin_data = 8'hAA;
8: sin_data = 8'hB0;
9: sin_data = 8'hB6;
10: sin_data = 8'hBC;
11: sin_data = 8'hC1;
12: sin_data = 8'hC6;
13: sin_data = 8'hCB;
14: sin_data = 8'hD0;
15: sin_data = 8'hD5;
16: sin_data = 8'hDA;
17: sin_data = 8'hDE;
18: sin_data = 8'hE2;
19: sin_data = 8'hE6;
20: sin_data = 8'hEA;
21: sin_data = 8'hED;
22: sin_data = 8'hF0;
23: sin_data = 8'hF3;
24: sin_data = 8'hF5;
25: sin_data = 8'hF7;
26: sin_data = 8'hF9;
27: sin_data = 8'hFB;
28: sin_data = 8'hFC;
29: sin_data = 8'hFD;
30: sin_data = 8'hFE;
31: sin_data = 8'hFE;
32: sin_data = 8'hFE;
33: sin_data = 8'hFE;
34: sin_data = 8'hFE;
35: sin_data = 8'hFD;
36: sin_data = 8'hFC;
37: sin_data = 8'hFA;
38: sin_data = 8'hF8;
39: sin_data = 8'hF6;
40: sin_data = 8'hF4;
41: sin_data = 8'hF1;
42: sin_data = 8'hEF;
43: sin_data = 8'hEB;
44: sin_data = 8'hE8;
45: sin_data = 8'hE4;
46: sin_data = 8'hE0;
47: sin_data = 8'hDC;
48: sin_data = 8'hD8;
49: sin_data = 8'hD3;
50: sin_data = 8'hCE;
51: sin_data = 8'hC9;
52: sin_data = 8'hC4;
53: sin_data = 8'hBE;
54: sin_data = 8'hB9;
55: sin_data = 8'hB3;
56: sin_data = 8'hAD;
57: sin_data = 8'hA7;
58: sin_data = 8'hA1;
59: sin_data = 8'h9B;
60: sin_data = 8'h95;
61: sin_data = 8'h8F;
62: sin_data = 8'h89;
63: sin_data = 8'h82;
64: sin_data = 8'h7D;
65: sin_data = 8'h77;
66: sin_data = 8'h70;
67: sin_data = 8'h6A;
68: sin_data = 8'h64;
69: sin_data = 8'h5E;
70: sin_data = 8'h58;
71: sin_data = 8'h52;
72: sin_data = 8'h4C;
73: sin_data = 8'h46;
74: sin_data = 8'h41;
75: sin_data = 8'h3C;
76: sin_data = 8'h36;
77: sin_data = 8'h31;
78: sin_data = 8'h2C;
79: sin_data = 8'h28;
80: sin_data = 8'h23;
81: sin_data = 8'h1F;
82: sin_data = 8'h1B;
83: sin_data = 8'h17;
84: sin_data = 8'h14;
85: sin_data = 8'h11;
86: sin_data = 8'hE ;
87: sin_data = 8'hB ;
88: sin_data = 8'h9 ;
89: sin_data = 8'h7 ;
90: sin_data = 8'h5 ;
91: sin_data = 8'h3 ;
92: sin_data = 8'h2 ;
93: sin_data = 8'h1 ;
94: sin_data = 8'h1 ;
95: sin_data = 8'h1 ;
96: sin_data = 8'h1 ;
97: sin_data = 8'h1 ;
98: sin_data = 8'h2 ;
99: sin_data = 8'h3 ;
100: sin_data = 8'h4 ;
101: sin_data = 8'h6 ;
102: sin_data = 8'h7 ;
103: sin_data = 8'hA ;
104: sin_data = 8'hC ;
105: sin_data = 8'hF ;
106: sin_data = 8'h12;
107: sin_data = 8'h15;
108: sin_data = 8'h19;
109: sin_data = 8'h1D;
110: sin_data = 8'h21;
111: sin_data = 8'h25;
112: sin_data = 8'h2A;
113: sin_data = 8'h2E;
114: sin_data = 8'h33;
115: sin_data = 8'h38;
116: sin_data = 8'h3E;
117: sin_data = 8'h43;
118: sin_data = 8'h49;
119: sin_data = 8'h4E;
120: sin_data = 8'h54;
121: sin_data = 8'h5A;
122: sin_data = 8'h60;
123: sin_data = 8'h67;
124: sin_data = 8'h6D;
125: sin_data = 8'h73;
126: sin_data = 8'h79;
127: sin_data = 8'h7F;           
       endcase
end

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt1 <= 0;
    end
    else if(add_cnt1)begin
        if(end_cnt1)
            cnt1 <= 0;
        else
            cnt1 <= cnt1 + 1;
    end
end

assign add_cnt1 = 1 ;       
assign end_cnt1 = 0 ;   


always @(*) begin
    if(key == 0)
        x  = 262    ;
    else if(key == 1)
        x  = 524    ;
    else if(key == 2)
        x  = 786    ;
    else if(key == 3)
        x  = 1029   ;
    else if(key == 4)
        x  = 1311   ;
    else if(key == 5)
        x  = 1573   ;
    else if(key == 6)
        x  = 1835   ;
    else  
        x  = 2097   ;
end
assign addr_temp = cnt1 * x        ;
assign addr      = addr_temp >> 10 ;


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
       dac_dat_a <= 0 ;
    end
    else begin
       dac_dat_a <= 255 - sin_data ;
    end
end

assign  dac_sleep = 0        ;
assign  dac_mode  = 1        ;
assign  dac_wra   = dac_clka ;
assign  dac_clka  = ~clk     ;


always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt0 <= 0;
    end
    else if(add_cnt0)begin
        if(end_cnt0)
            cnt0 <= 0;
        else
            cnt0 <= cnt0 + 1;
    end
end

assign add_cnt0 = 1 ;       
assign end_cnt0 = add_cnt0 && cnt0== 4 - 1 ; 
assign fir_din  = sin_data - 128           ;
my_fir u_fir( 
        .clk              (clk             ),        
        .reset_n          (rst_n           ),          
        .ast_sink_data    (fir_din         ),    
        .ast_sink_valid   (end_cnt0        ),   
        .ast_sink_error   (2'b00           ),   
        .ast_source_data  (fir_dout        ),  
        .ast_source_valid (fir_dout_vld    ), 
        .ast_source_error ( )  
    );
assign fir_dout2 = fir_dout + 128 ;
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        dac_dat_b <= 0 ;
    end
    else if(fir_dout_vld) begin
        dac_dat_b <= 255 - fir_dout2 ;
    end
end

assign  dac_wrb   = dac_clkb ;
assign  dac_clkb  = ~clk     ;

endmodule

2、IP核代码:


`timescale 1 ps / 1 ps
module my_fir (
        input  wire       clk,              //                     clk.clk
        input  wire       reset_n,          //                     rst.reset_n
        input  wire [7:0] ast_sink_data,    //   avalon_streaming_sink.data
        input  wire       ast_sink_valid,   //                        .valid
        input  wire [1:0] ast_sink_error,   //                        .error
        output wire [7:0] ast_source_data,  // avalon_streaming_source.data
        output wire       ast_source_valid, //                        .valid
        output wire [1:0] ast_source_error  //                        .error
    );

    my_fir_0002 my_fir_inst (
        .clk              (clk),              //                     clk.clk
        .reset_n          (reset_n),          //                     rst.reset_n
        .ast_sink_data    (ast_sink_data),    //   avalon_streaming_sink.data
        .ast_sink_valid   (ast_sink_valid),   //                        .valid
        .ast_sink_error   (ast_sink_error),   //                        .error
        .ast_source_data  (ast_source_data),  // avalon_streaming_source.data
        .ast_source_valid (ast_source_valid), //                        .valid
        .ast_source_error (ast_source_error)  //                        .error
    );

endmodule

3、测试文件:

`timescale 1 ns/1 ns

module tb_fir_prj();

//时钟和复位
reg clk  ;
reg rst_n;

//uut的输入信号
reg[7:0]  key   ;

//uut的输出信号
wire           dac_mode    ;   
wire           dac_sleep   ;
wire           dac_clka    ;
wire [7:0]     dac_dat_a   ;
wire           dac_wra     ;
wire           dac_clkb    ; 
wire [7:0]     dac_dat_b   ; 
wire           dac_wrb     ;


//时钟周期,单位为ns,可在此修改时钟周期。
parameter CYCLE    = 200;

//复位时间,此时表示复位3个时钟周期的时间。
parameter RST_TIME = 3 ;

//待测试的模块例化
fir_prj uut(
   .clk       (clk       ),
   .rst_n     (rst_n     ),
   .key       (key       ),
   .dac_mode  (dac_mode  ),
   .dac_sleep (dac_sleep ),
   .dac_clka  (dac_clka  ),
   .dac_dat_a (dac_dat_a ),
   .dac_wra   (dac_wra   ),
   .dac_clkb  (dac_clkb  ),
   .dac_dat_b (dac_dat_b ),
   .dac_wrb   (dac_wrb   )

);


//生成本地时钟50M
initial begin
    clk = 0;
    forever
    #(CYCLE/2)
    clk=~clk;
end

//产生复位信号
initial begin
    rst_n = 1;
    #2;
    rst_n = 0;
    #(CYCLE*RST_TIME);
    rst_n = 1;
end

//输入信号key赋值方式
initial begin
    forever begin
    #(10000*CYCLE);
    //赋初值
    key = 0;
    #(10000*CYCLE);
    key = 1;
    #(10000*CYCLE);
    key = 2;
     #(10000*CYCLE);
    key = 3;
     #(10000*CYCLE);
    key = 4;
    #(10000*CYCLE);
    key = 5;
     #(10000*CYCLE);
    key = 6;
     #(10000*CYCLE);
    key = 7;
end
end
endmodule




文件未添加到工程?

你这是加载过程出错,如果你使用的FIR IP核版本与ModelSim不兼容,可能会导致加载错误或者IP核文件可能损坏或不完整

modelsim仿真quartus软件IP核错误及解决办法
可以参考下


https://www.yii666.com/blog/473891.html

先检查 IP核接口,两种语言的模块实例化方式,以及仿真工程的设置

文件未添加到工程?

题主,这个问题我来替你解决(参考结合AI智能、文心一言),若有帮助,还望采纳,点击回答右侧采纳即可。


这个错误是因为工程中同时存在Verilog和VHDL文件,而且这些文件的命名不同步导致的。

在Quartus中生成FIR滤波器的IP核时,需要选择使用哪种语言进行描述,通常有两种选择:Verilog和VHDL。如果你选择了Verilog进行描述,那么生成的IP核文件也会是Verilog格式的;而如果你选择了VHDL进行描述,那么生成的IP核文件就是VHDL格式的。

那么在工程中同时出现Verilog和VHDL文件,你需要检查生成IP核时选择的是哪种语言,以及现有的文件是否与生成IP核时的语言相对应。如果生成IP核时选择的是Verilog,那么应该只会有Verilog格式的文件出现在工程中,如果生成时选择的是VHDL,那么应该只会有VHDL格式的文件出现在工程中。

如果你确定生成IP核时选用的是Verilog,但工程中却出现了VHDL格式的文件,那么你需要手动删除这些文件,并重新生成IP核。如果你不确定生成IP核时选用的是哪种语言,可以重复生成IP核,并检查生成的文件类型。

保你的设计文件存在并且路径正确。
设计文件可能被损坏或无法读取。尝试使用其他版本的控制台或工具打开该文件,看看是否可以解决问题。
你的仿真环境可能没有正确配置。请确保已经正确设置了ModelSim和相关的仿真库。
如果正在使用宏,可能是由于宏文件的问题。请检查宏文件,确保它没有语法错误或其他问题。

参考gpt
根据您提供的错误信息,这个问题可能是由于FIR IP核的设计与您使用的HDL语言不兼容所导致的。根据错误信息中的提示,ALTERA版本只支持单一的HDL语言。

要解决这个问题,您可以尝试以下几个步骤:

  1. 确认IP核的设计语言:检查FIR IP核的设计语言是否与您使用的HDL语言相匹配。如果您在Quartus中生成FIR IP核时选择了不同的HDL语言,可能会导致与您当前使用的HDL语言不兼容。

  2. 检查modelsim的设置:确保modelsim的设置与您使用的HDL语言相匹配。您可以在modelsim中的设置中检查HDL语言选项,并确保选择了正确的语言。

  3. 检查modelsim的版本:确保您使用的modelsim版本与您的设计工具(如Quartus)兼容。有时候,不同版本的设计工具和仿真工具之间可能存在兼容性问题。

  4. 尝试使用其他仿真工具:如果上述步骤都没有解决问题,您可以尝试使用其他的仿真工具,如Xilinx Vivado自带的仿真工具(如XSIM)或其他第三方仿真工具,来进行FIR IP核的仿真。

文件未加入工程

检查IP核生成的文件是否包含了所有必要的模块和子模块,在模块化设计中,如果某个模块没有被正确实例化或连接,会导致仿真错误

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:根据报错信息和提供的代码,可以看出存在以下问题和背景:报错是因为 仿真无法成功加载设计,导致程序中断。
【报错原因】根据报错信息,可以初步推测以下原因导致了错误:

1IP核实例化失败:报错信息中提到Instantiation of my_fir failed,表示在实例化FIR IP核时出现了问题。
2、 Quartus版本不支持:报错信息中提到ALTERA version supports only a single HDI,可能是因为你使用的Quartus版本不支持同时实例化多个HDI(Hierarchical Design Instance)。

【解决办法】要解决这个问题,可以尝试以下几个步骤:

1、 检查Quartus版本:确认你使用的Quartus版本是否支持同时实例化多个HDI。如果不支持,尝试升级到支持该功能的版本。
2、 检查IP核实例化:确保IP核的实例化部分代码正确无误,包括端口连接和信号命名。
3、 检查IP核文件路径:确认IP核文件的路径是否正确,并且在仿真环境中能够正确加载。
4、 检查依赖文件:确保所需的库文件和依赖文件已正确导入,并且在仿真环境中能够找到。

根据报错信息和问题的背景,需要对代码进行修改。以下是可能需要进行的更改:
1、 修改模块实例化部分:
将实例化模块的名称从my_fir_0002更改为my_fir,具体代码修改如下:

   my_fir_0002 my_fir_inst (
        .clk              (clk),              // clk.clk
        .reset_n          (reset_n),          // rst.reset_n
        .ast_sink_data    (ast_sink_data),    // avalon_streaming_sink.data
        .ast_sink_valid   (ast_sink_valid),   // .valid
        .ast_sink_error   (ast_sink_error),   // .error
        .ast_source_data  (ast_source_data),  // avalon_streaming_source.data
        .ast_source_valid (ast_source_valid), // .valid
        .ast_source_error (ast_source_error)  // .error
    );

2、 修改测试模块实例化部分:确保实例化测试模块的名称与模块定义一致,具体修改如下:

   fir_prj uut (
       .clk       (clk       ),
       .rst_n     (rst_n     ),
       .key       (key       ),
       .dac_mode  (dac_mode  ),
       .dac_sleep (dac_sleep ),
       .dac_clka  (dac_clka  ),
       .dac_dat_a (dac_dat_a ),
       .dac_wra   (dac_wra   ),
       .dac_clkb  (dac_clkb  ),
       .dac_dat_b (dac_dat_b ),
       .dac_wrb   (dac_wrb   )
   );

请注意,这些更改仅基于提供的代码片段和错误信息,并假设其他部分的代码是正确的。如果问题仍然存在,更详细的错误信息。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

引用 皆我百晓生 小程序回复内容作答:

根据你提供的信息,可能出现以下问题:

  1. IP核的语言不匹配:你在生成IP核时选择了Verilog语言,但是在modelsim中调用时使用的是VHDL语言。确保IP核的语言与仿真环境中使用的语言一致。

  2. IP核文件未添加到modelsim工程中:确保将IP核生成的Verilog文件(my_fir_0002.v)添加到modelsim工程中。

  3. 生成的IP核不完整或存在错误:检查生成的IP核是否包含所有必要的文件,并确保IP核的设置正确。

  4. 仿真文件中的路径错误:检查模块文件(fir_prj.v)和IP核文件(my_fir_0002.v)的路径是否正确,并确保在modelsim中正确加载了这些文件。

如果上述问题都没有解决你的问题,建议提供更多的详细信息,以便更好地帮助你解决问题。

提供参考实例:https://blog.csdn.net/Cthanta/article/details/122766018

结合GPT给出回答如下请题主参考
根据您提供的错误信息,可以看出是在模拟FIR IP核时出现问题,具体原因可能有多种。以下是一些可能的排查方向和建议:

  1. 确保IP核的设计正确性,包括信号连接、数据位宽、时钟频率等参数的设置与连线是否正确。可以在Quartus中进行综合和布局,在Quartus或Modelsim中观察波形来检查设计的正确性。

  2. 检查仿真文件的路径设置是否正确。在Modelsim中打开仿真文件时,需要指定正确的文件路径和文件名。如果路径或文件名错误,就会出现类似“Cannot open design file”这样的错误。

  3. 确保Modelsim版本与使用的Quartus版本兼容。不同版本的Quartus所使用的Modelsim可能会有差异,如果版本不兼容可能会导致错误。建议使用最新版本的Modelsim。

  4. 确保Modelsim中的库文件包含所需的IP核库。IP核一般包括Verilog或VHDL代码、仿真模型以及其他依赖库等文件。在Modelsim中需要将这些文件添加到库中才能正确地进行仿真。

希望以上建议能够帮助您解决问题,如有不明白的地方可以继续提问。