Vivado中FFT9.0仿真2

1.仿真環境搭建

一開始準備用vivado自帶的仿真器來仿真,發現一直報錯,類似於沒有庫文件。然後想到需要用modelsim仿真,可是發現用10.4c仿真,vivado還是報錯,差異在於以前vivado版本是17.2,現在爲18.1。探索很久,查閱18.1版本說明,需要使用10.6c版本的modelsim。

下載10.6c版本的modelsim安裝

該部分略

編譯仿真庫

在modelsim安裝路徑中添加文件夾存放lib。

自動生成庫文件,這個會花費一些時間,完成後,打開生成庫文件夾的modelsim.ini文件,如下所示:

​​​​​​​修改modelsim.ini文件

把庫文件中ini路徑拷貝到modelsim安裝路徑下的ini文件,如下所示:

設置第三方仿真軟件路徑:具體百度

csv文件轉換

首先在matlab導入csv文件,然後寫文件如下所示:

strdir='D:\fft_sim\AD\';

filename=[strdir, 'ad_data30.pcm'];

fid = fopen(filename,'w');

count = fwrite(fid,adc_data_16150,'int16');

fclose(fid);

.modelsim讀文件

    `timescale 1ns / 1ps

module AA_tb;

 

reg        sys_clk;   

reg        rst_n;

initial

begin

    #0    sys_clk    = 1'b0;

end

always #1  sys_clk = ~sys_clk;

initial

begin

    #0     rst_n=0;

    #35   rst_n=1;

end

 

reg        fft_trig;

reg        data_en;

initial

begin

    #0     fft_trig   =0;

    #0     data_en    =0;

    #85   fft_trig   =1;

    #30   fft_trig   =0;

    #35    data_en    =1;

end

 

//**************data source**************************

integer       read_cnt =0   ; //30M 100M

integer       fd_din     ;

//reg [7:0]       mem[7:0]   ;// I=32bit Q=32bit

reg [7:0]     mem[1:0]   ;   //only AD ,16bit

reg [64*8-1:0]    filename   ;

 

initial begin

 

    read_cnt = 30;

    $swrite(filename,"E:/fft_sim/AD/ad_data30_35.pcm");

    fd_din = $fopen(filename,"rb");

   

    mem[0] = 0;

    mem[1] = 0;

end

 

reg        R_Rx_En;

reg        valid;

integer    fread_return;

reg [15:0] ad_data;

reg [15:0]  cnt;

always@(posedge sys_clk or negedge rst_n)

begin

    if(!rst_n)

       R_Rx_En <= 0;

    else if(data_en==1) 

       R_Rx_En <= 1;

end

 

always@(posedge sys_clk or negedge rst_n)

begin

    if(!rst_n)

       begin

           ad_data <= 0;

           cnt     <= 0;

           valid  <= 1;

       end

    if ( R_Rx_En)

       begin

           fread_return = $fread(mem,fd_din);

           if(fread_return==0)

              begin

                  valid <= 0;

                  $fclose(fd_din);

                  $swrite(filename,"E:/fft_sim/AD/ad_data30_15.pcm");

                  fd_din = $fopen(filename,"rb");

              end

           else

              valid <= 1;             

              //R_din_I = {mem[3][7:0],mem[2][7:0],mem[1][7:0],mem[0][7:0]};

              //R_din_Q = {mem[7][7:0],mem[6][7:0],mem[5][7:0],mem[4][7:0]};

           ad_data = {mem[1][7:0],mem[0][7:0]};

       end

end

 

//****************************************************

wire [15:0] data_in;

reg        data_in_vld;

assign data_in = ad_data;

always@(posedge sys_clk or negedge rst_n)

begin

    if(!rst_n)

       data_in_vld <= 0;

    else

       data_in_vld <= valid&R_Rx_En;

end

 

 

wire [31:0] fft_data_tdata;

wire       fft_data_tvalid;

wire fft_data_tlast;

fft_module fft_module

(

 

    .clk          (sys_clk   ),

    .rst_n        (rst_n     ),

    .fft_trig     (fft_trig|fft_data_tlast ),

    .data_in_vld  (data_in_vld),

    .data_in      ({data_in,16'b0}  ),

    .fft_data_tdata   (fft_data_tdata),

    .fft_data_tvalid(fft_data_tvalid),

    .fft_data_tlast (fft_data_tlast)

);

reg [15:0] cnt_fft;

always@(posedge sys_clk or negedge rst_n)

begin

    if(!rst_n)

       cnt_fft <= 0;

    else if(fft_data_tvalid)

       cnt_fft <= cnt_fft+1;

    else

       cnt_fft <= 0;

end

endmodule

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章