(1)FIR ip核仿真
(2)FIR 多通道应用
(3)多通道fir ip核需要注意的复位问题
=======================================================================
(1)FIR ip核仿真
=======================================================================
关于FIR的modelsim仿真一直困惑着我。今天终于解决了。
在生成IP核时,会生成两个相应的文件夹XX_ip和XX_ip_sim,“XX”表示IP核的命名。在下面的文件夹中,我的IP命名为fir2。打开XX_ip_sim文件夹,里面有不同仿真工具的支持文件,其中mentor就是modelsim的。把modelsim的仿真路径
修改到mentor文件夹下。仿真路径所调用的文件来自xx_ip_sim文件夹下的文件。当然是可以自己修改的。
打开mentor文件夹,里面就是相应的Tcl文件,不过在我们应用时要做一些修改。把顶层文件修改为自己编写的tb文件。文件
也要入在xx_ip_sim文件夹下。
3、在modelsim的tool菜单下选择Tcl,运行msim_setup文件。
4、运行dev_com
5、运行com
6、运行elab_debug
如果重新生成了IP核,只需要运行com和elab_debug即可,不需要每次都编译库文件的。
==================================================================
(2)FIR多通道仿真应用
===================================================================
IP核的设置如下:
测试脚本如下:
module fir_i2_20m_4ch_4x_tb;
parameter CLK_CYCLE = 4'd10; reg clk =0; reg rst =0; reg [15:0] din1=0; reg [15:0] din2=0; reg [15:0] din3=0; reg [15:0] din4=0; reg [1:0] cnt =0; reg [15:0] din =0; reg in_valid =0; reg in_sop =0; reg in_eop =0; wire [69:0] dout; wire [34:0] dout_i; wire [34:0] dout_q; wire out_chanl; assign dout_i = dout[34:0]; assign dout_q = dout[69:35]; initial begin #0 clk =0; rst =1; #(3*CLK_CYCLE) rst =0; end always #(CLK_CYCLE/2) clk = ~clk; always @( posedge clk ) begin if( rst ) begin cnt <= 2'd0; end else begin cnt <= cnt + 1'b1; end end always @( posedge clk ) begin if( & cnt ) begin din1 <= din1 + 1; din2 <= din2+2; din3 <= din3; din4 <= din4; end end always @( posedge clk ) begin if( rst ) begin in_valid <= 1'b0; in_sop <= 1'b0; in_eop <= 1'b0; din <= 0; end else begin case( cnt ) 2'd0 : begin in_valid <= 1'b1; in_sop <= 1'b1; in_eop <= 1'b0; din <= din1; end 2'd1 : begin in_valid <= 1'b1; in_sop <= 1'b0; in_eop <= 1'b0; din <= din2; end 2'd2 : begin in_valid <= 1'b1; in_sop <= 1'b0; in_eop <= 1'b0; din <= din3; end 2'd3 : begin in_valid <= 1'b1; in_sop <= 1'b0; in_eop <= 1'b1; din <= din4; end default: begin in_valid <= 1'b0; in_sop <= 1'b0; in_eop <= 1'b0; din <= 0; end endcase end end reg [1:0] ast_sink_error= 2'd0; wire [1:0] ast_source_error; fir_i2_20m_4ch_4x_ip fir_i2_20m_4ch_4x_ip_inst ( .clk (clk), // clk.clk .reset_n (~rst), // rst.reset_n .ast_sink_data (din), // avalon_streaming_sink.data .ast_sink_valid (in_valid), // .valid .ast_sink_error (ast_sink_error), // .error .ast_sink_sop (in_sop), // .startofpacket .ast_sink_eop (in_eop), // .endofpacket .ast_source_data (dout), // avalon_streaming_source.data .ast_source_valid (out_valid), // .valid .ast_source_error (ast_source_error), // .error .ast_source_sop (out_sop), // .startofpacket .ast_source_eop (out_eop), // .endofpacket .ast_source_channel (out_chanl) // .channel );endmodule
在仿真中只给出一通道的信号
在仿真中分别给出一,二通道的信号。
结论:在四通道插四的仿真中,IP核会把1,2通道分在一起,3,4通道分在一起。out_chanl也只是一位的。
=============================================================================
(3)多通道fir ip核需要注意的复位问题
=============================================================================
在复位状态in_valid不能与in_sop(或in_eop)同时为高,否则在运算中会出现错误。