zoukankan      html  css  js  c++  java
  • 关于FIR的modelsim

    (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)同时为高,否则在运算中会出现错误。

  • 相关阅读:
    Twain文档链接
    JavaScript 事件绑定函数
    VC++ 字符串Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
    Sciter参考资料
    C++对windows控制面板的操作
    C++ Msi函数判断应用是否已经安装
    WMware 安装 Mac OSX
    C++文件流操作
    jquery弹出层
    CSS3 水平翻转
  • 原文地址:https://www.cnblogs.com/zhongguo135/p/4116300.html
Copyright © 2011-2022 走看看