在fpga開發過程中幾乎都要用到**的功能,對於一些簡單的外部激勵(如時鐘、復位、簡單資料或者訊號等)直接在testbench中編寫產生就行了,但對於複雜的外部激勵資料,很難在testbench中產生,這時就要通過讀取外部檔案裡的資料來實現。通過和matlab的配合使用,基本上可以模擬各種外部激勵。
舉例來說:輸入訊號是三個不同頻率的正弦波的相加,經過fir低通濾波器濾除高頻分量,輸出頻率最低的那個正弦訊號。這種情況下測試用的輸入訊號不能通過testbench編寫產生。
簡單來說有以下兩種方法可以模擬輸入訊號:
顯然第二種方法更加靈活和便捷。下面,具體介紹一下這種方法的使用。
%**********===設定系統引數**********====%
f1=1e6; %設定波形頻率
f2=500e3;
f3=800e3;
fs=20e6; %設定取樣頻率
l=1024; %資料長度
n=14; %資料位寬
%**********===產生輸入訊號**********====%
t=0:1/fs:(1/fs)*(l-1);
y1=sin(2*pi*f1*t);
y2=sin(2*pi*f2*t);
y3=sin(2*pi*f3*t);
y4=y1+y2+y3;
y_n=round(y4*(2^(n-3)-1)); %n位元量化;如果有n個訊號相加,則設定(n-n)
%***************==畫圖***************===%
a=10; %改變係數可以調整顯示週期
stem(t,y_n);
axis([0 l/fs/a -2^n 2^n]); %顯示
%**********===寫入外部檔案**********====%
fid=fopen('e:\workspace\vivado_16.4\test\testbench\sin_data.txt','w'); %把資料寫入sin_data.txt檔案中,如果沒有就建立該檔案
for k=1:length(y_n)
b_s=dec2bin(y_n(k)+((y_n(k))<0)*2^n,n);
forj=1:n
if b_s(j)=='1'
tb=1;
else
tb=0;
endfprintf(fid,'%d',tb);
endfprintf(fid,'\r\n');
endfprintf(fid,';');
fclose(fid);
此程式中設定了三個頻率分別為1m、500k和800k的正弦波,然後將三個波形相加並且量化後作為輸出。最後將路徑設定為相應檔案所在路徑即可,需要注意的是如果對應路徑下沒有相應檔案,則會自動新建檔案並寫入資料。
接下來就可以進行在testbench中讀取外部資料的操作了。
`timescale 1ns/1ps
module tb_readfile();
reg sclk;
reg [13:0] data_out;
//--------------時鐘部分----------------//
initial sclk = 0;
always #10 sclk = ~sclk;
//-------------------------------------//
parameter data_num = 32
'd1024;
integer i = 0;
reg [13:0] data_men[1:data_num];
reg [13:0] data_reg = 0;
initial begin
$readmemb("e:/workspace/vivado_16.4/2017_8_28_test/testbench/sin_data.txt",data_men); //注意斜槓的方向,不能反<<<<<<<
endalways @(posedge sclk) begin
data_out <= data_men[i];
i <= i + 8
'd1;
end//------------------------------------//
endmodule
因為這裡只需要讀取外部資料,所以vivado工程裡只需要新增**檔案就行了。
matlab可以說是個很強大的工具,在設計中合理的使用matlab可以起到事半功倍的效果。當然我也在不斷的學習中,如果有疑問或者更好的想法歡迎交流。。。
MATLAB資料檔案讀取
matlab可以匯入.txt,csv等格式的資料檔案,下面對其進行簡單的說明。1 匯入.txt文字資料 函式格式如下 a importdata filename example a importdata pastespecial example a importdata delimiterin a ...
matlab 批量讀取資料檔案 mat dat
檔名如d00.dat,d01.dat,d21.dat filepath g traindata 資料夾的路徑 for i 1 3 n是要讀入的檔案的個數 load filepath d0 num2str i dat end迴圈讀取和繪製圖形 filepath g traindata 資料夾的路徑 f...
matlab收發資料,並實時顯示波形
port com3 埠號 if exist s var 判斷上一次開啟的埠有沒有關閉 fclose s 關閉s ends serial port,baudrate 115200 設定波特率 fopen s 開啟s fprintf s,autoout 1 給串列埠寫入資料 fprintf s,hex ...