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