在用vivado仿真的时候,很多情况下需要自己产生波形来代替AD采样波形。以前的做法都是用DDS内部产生所需要的波形来模仿外部输入,后来发现这种做法不仅麻烦,而且不易修改,对仿真很不友好。于是改用matlab产生所需要的波形,将数据以二进制补码形式存在.txt文件中,仿真的时候在testbeach中读取外部数据,十分方便。

  Matlab代码如下:

 %=============设置系统参数==============%
f1=50e4; %设置波形频率
f2=30e4;
f3=10e4;
Fs=50e6; %设置采样频率
L=; %数据长度
N=; %数据位宽
%=============产生输入信号==============%
t=:/Fs:(/Fs)*(L-);
y1=sin(*pi*f1*t);
y2=sin(*pi*f2*t);
y3=sin(*pi*f3*t);
y4=y1+y2+y3;
y_n=round(y4*(^(N-)-)); %N比特量化;如果有n个信号相加,则设置(N-n)
%=================画图==================%
a=; %改变系数可以调整显示周期
stem(t,y_n);
axis([ L/Fs/a -^N ^N]); %显示
%=============写入外部文件==============%
fid=fopen('E:/Workspace/Vivado_16.4/2017_11_8_TestBeach/TestBeach/sin_data.txt','w'); %把数据写入sin_data.txt文件中,如果没有就创建该文件
for k=:length(y_n)
B_s=dec2bin(y_n(k)+((y_n(k))<)*^N,N);
for j=:N
if B_s(j)==''
tb=;
else
tb=;
end
fprintf(fid,'%d',tb);
end
fprintf(fid,'\r\n');
end fprintf(fid,';');
fclose(fid);

  运行后,波形如下:

  Matlab产生TestBeach所需要的波形数据-LMLPHP

  保存在.txt文件中的数据都是以二进制补码形式保存,也就相当于输入的外部激励是有符号数。

  TestBeach代码如下:

 `timescale 1ns/1ps

 module TB_readfile();
reg SCLK;
reg [:] data_out; //-------------------------------------//
parameter data_num = 'd1024;
integer i = ;
reg [:] data_men[:data_num];
reg [:] data_reg = ;
initial begin
$readmemb("E:/Workspace/Vivado_16.4/2017_11_8_TestBeach/TestBeach/sin_data.txt",data_men);
end
always @(posedge SCLK) begin
data_out <= data_men[i];
i <= i + 'd1;
end
//------------------------------------// //--------------时钟部分----------------//
initial SCLK = ;
always # SCLK = ~SCLK; endmodule //

  运行vivado仿真,如下图:

Matlab产生TestBeach所需要的波形数据-LMLPHP

  

  将matlab的波形缩小后看,是和仿真波形一样的。

05-11 11:10