在用vivado仿真的时候,很多情况下需要自己产生波形来代替AD采样波形。以前的做法都是用DDS内部产生所需要的波形来模仿外部输入,后来发现这种做法不仅麻烦,而且不易修改,对仿真很不友好。于是改用matlab产生所需要的波形,将数据以二进制补码形式存在.txt文件中,仿真的时候在testbeach中读取外部数据,十分方便。
Matlab代码如下:
1 %=============设置系统参数==============% 2 f1=50e4; %设置波形频率 3 f2=30e4; 4 f3=10e4; 5 Fs=50e6; %设置采样频率 6 L=1024; %数据长度 7 N=14; %数据位宽 8 %=============产生输入信号==============% 9 t=0:1/Fs:(1/Fs)*(L-1);10 y1=sin(2*pi*f1*t);11 y2=sin(2*pi*f2*t);12 y3=sin(2*pi*f3*t);13 y4=y1+y2+y3;14 y_n=round(y4*(2^(N-3)-1)); %N比特量化;如果有n个信号相加,则设置(N-n)15 %=================画图==================%16 a=10; %改变系数可以调整显示周期17 stem(t,y_n);18 axis([0 L/Fs/a -2^N 2^N]); %显示19 %=============写入外部文件==============%20 fid=fopen('E:/Workspace/Vivado_16.4/2017_11_8_TestBeach/TestBeach/sin_data.txt','w'); %把数据写入sin_data.txt文件中,如果没有就创建该文件 21 for k=1:length(y_n)22 B_s=dec2bin(y_n(k)+((y_n(k))<0)*2^N,N);23 for j=1:N24 if B_s(j)=='1'25 tb=1;26 else27 tb=0;28 end29 fprintf(fid,'%d',tb);30 end31 fprintf(fid,'\r\n');32 end33 34 fprintf(fid,';');35 fclose(fid);
运行后,波形如下:
保存在.txt文件中的数据都是以二进制补码形式保存,也就相当于输入的外部激励是有符号数。
TestBeach代码如下:
1 `timescale 1ns/1ps 2 3 module TB_readfile(); 4 reg SCLK; 5 reg [13:0] data_out; 6 7 8 //-------------------------------------// 9 parameter data_num = 32'd1024;10 integer i = 0;11 reg [13:0] data_men[1:data_num];12 reg [13:0] data_reg = 0;13 initial begin14 $readmemb("E:/Workspace/Vivado_16.4/2017_11_8_TestBeach/TestBeach/sin_data.txt",data_men);15 end16 always @(posedge SCLK) begin17 data_out <= data_men[i];18 i <= i + 8'd1;19 end20 //------------------------------------//21 22 //--------------时钟部分----------------//23 initial SCLK = 0;24 always #10 SCLK = ~SCLK;25 26 27 28 29 endmodule //
运行vivado仿真,如下图:
将matlab的波形缩小后看,是和仿真波形一样的。