最近在做基於FPGA的仿核脈沖信號發生器,在寫完部分代碼之后,需要驗證是否符合所預期的效果,即相鄰脈沖的時間間隔符合指數分布,計數率即一定時間內的脈沖數是否符合泊松分布,於是希望用matlab進行繪圖,看起來更直觀。那么modelsim中的波形數據怎么導出呢?這里用的方法是將數據導出到txt文件中,再在matlab中導入。
要將波形導入txt文件,需要用到$fopen()和$fdisplay();先貼上代碼,后面再解釋。
integer i; integer w_file; initial begin Rst_n = 0; i = 0; #(`clk_period*20+1); Rst_n = 1; /*導出space_cnt的波形數據*/ w_file = $fopen("space_cnt.txt"); for(i=0;i<=2047;i=i+1)begin wait(pulse); #50; $fdisplay(w_file,"%d",space_cnt); if(i == 2047) $fclose(w_file); end
/* 導出Opulse_cnt的波形數據
w_file = $fopen("Opulse_cnt.txt");
for(i=0;i<=8191;i=i+1)begin
#10_000;
$fdisplay(w_file,"%d",Opulse_cnt);
if(i == 8191)
$fclose(w_file);
end*/
#(`clk_period*2000); $stop; end
這里的space_cnt.txt就是數據導入的文件,這個文件不用自己去新建,testbench會幫你生成好。space_cnt是數據信號線,即要導出的數據。
做脈沖間隔計數,關注的就是兩個脈沖之間有多少個時鍾周期,所以這里每兩個脈沖檢測完我只輸出一個最終數據,而將計數器的計數過程選擇不關心,即x。從波形可以看出,space_cnt的輸出時刻比pulse的上升沿滯后了50ns,所以代碼中在等待到pulse的上升沿之后,延時50ns再去將數據寫入txt。注意:這里寫入2048個數據,還是會有個別的數據為x,這些x在matlab讀取時是讀不出來的而且會阻斷它后面的數據讀取。所以在matlab讀取之前需要將txt中的x全部替換成空。
matlab代碼及結果如下: