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