Matlab产生TestBeach所需要的波形数据
在用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:N 24 if B_s(j)=='1' 25 tb=1; 26 else 27 tb=0; 28 end 29 fprintf(fid,'%d',tb); 30 end 31 fprintf(fid,'\r\n'); 32 end 33 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 begin 14 $readmemb("E:/Workspace/Vivado_16.4/2017_11_8_TestBeach/TestBeach/sin_data.txt",data_men); 15 end 16 always @(posedge SCLK) begin 17 data_out <= data_men[i]; 18 i <= i + 8'd1; 19 end 20 //------------------------------------// 21 22 //--------------时钟部分----------------// 23 initial SCLK = 0; 24 always #10 SCLK = ~SCLK; 25 26 27 28 29 endmodule //
运行vivado仿真,如下图:
将matlab的波形缩小后看,是和仿真波形一样的。