雖然Modelsim的功能非常強大,仿真的波形可以以多種形式進行顯示,但是當涉及到數(shù)字信號處理的算法的仿真驗證的時候,則顯得有點不足。而進行數(shù)字信號處理是Matlab的強項,不但有大量的關(guān)于數(shù)字信號處理的函數(shù),而且圖形顯示功能也很強大,所以在做數(shù)字信號處理算法的FPGA驗證的時候借助Matlab會大大加快算法驗證的速度。
ModelSim顯示模擬波形
問題是,要看一個振幅調(diào)制的輸出波形,ModelSim默認的是數(shù)字輸出,想直接看波形。
這個問題應(yīng)該不難,想想看ModelSim肯定支持這種功能,只是要摸索一下。一般都是點右鍵,果然有一個Format,里面有一個Analog選項,點上它,彈出了對話框,先用默認的試試看,輸出波形感覺顯示的幅度太小,看起來不方便,再回過頭來把對話框里的值調(diào)整一下,得到了一個比較好的波形。不過問題就出現(xiàn)了,出來的波形上下重疊了。
菜單欄里逐個找了一遍,發(fā)現(xiàn)也有一個Format,里面有height這個選項。打開看,默認是17,改大一點看,比如50,輸出顯示的信號之間的間距就拉大了,就不會再重疊了。
很多朋友都不知道怎樣用Modelsim仿真模擬波形。下面是我的一些心得
1 需要查看正弦波的變量必須為多比特變量。
2 關(guān)于Analog選項
Analog step ——應(yīng)該是顯示鋸齒波形
Analog Interpolated ——按插值顯示
Analog Backstep ——分段顯示模擬波形
scale——按比例顯示
offset——偏移量
modelsim中顯示正弦波
在一般情況下,我們僅僅需要看到數(shù)據(jù)的二進制或者十六進制,但是當信號為方波正弦波信號或者為頻譜信號時候,在仿真過程中,如果能夠顯示出波形信號,那么仿真結(jié)果將更加直觀,由于公司不能上網(wǎng),所以在家實現(xiàn)該仿真功能,結(jié)果如下:
第一步:生成sin波形文件(sin.txt)
這一步使用matlab完成,matlab中的代碼如下:
fc = 10e6;
n = 1/fc/256;
t = [0:255]*n;
x = sin(2*pi*fc*t);
xx = fix(128+(2^7-1)*x);
y = dec2hex(xx);
解釋:
在一個周期采樣256個點,fix函數(shù)是將數(shù)據(jù)向0取整,例如1.1變成1,1.2也變成1.這里先將正弦波幅值變成128.最后將數(shù)據(jù)變成16進制。最后將y的值存到sin.txt文件中,結(jié)果如下圖所示:
第二步:編寫testbench文件
編寫testbench的原理不解釋,如下圖所示:
第三步:運行modelsim
對于這樣只有tb文件而沒有其他模塊的仿真對于我還是第一次,首先新建工程,添加文件后,編譯,仿真,添加信號,結(jié)果如下圖所示。
這時候信號顯示為二進制,其中data_out就是正弦波信號,如果要將這個信號在modelsim中顯示為正弦波圖形,需要進行下面設(shè)置:
1、選擇data_out信號,右擊—》Radix—》Unsigned
2、選擇data_out信號,右擊—》Format—》Analog(automatic)
設(shè)置好后,就可以顯示正弦波,如下圖所示。
其實這個僅僅是為了后面做FFT的仿真做鋪墊,后期將會對其頻譜進行圖形顯示。
下面一段Matlab的程序是將數(shù)據(jù)讀取,并通過圖形顯示出數(shù)據(jù)的波形。
fid = fopen(‘data_out.txt’,‘r’);
num(i) = fscanf(fid, ‘%x’, 1); %
這句話的意思是從fid所指的文件以16進制方式讀出一個數(shù)據(jù)。
第一:保證讀取的數(shù)據(jù)格式和文件中保存的數(shù)據(jù)格式是相同的,例如這里文件中保存的格式是十六進制所以讀取的時候也應(yīng)該以十六進制的形式讀出。
第二:要保證文件中數(shù)據(jù)的個數(shù)和設(shè)定的讀取的數(shù)目(這里是256)保持一致。例如,要將生成文件data_out.txt中多余的換行符去掉(一般最后會多出一行),否則Matlab會將空的行也當做一個數(shù)據(jù),從而兩個數(shù)目不一致,導致Matlab報錯。
當然,有了Matlab這個強大的工具,也就可以很方便的看信號的頻譜等信息了。
另外在說一點,就是關(guān)于通過Verilog將數(shù)據(jù)寫入文件有多種方法,上面用的是$fdisplay這個系統(tǒng)函數(shù),當然還有$fmonitor和$fwrite等幾個命令,下面簡單說一下這幾個命令的不同。 $fdisplay
這個命令需要有觸發(fā)條件,才會把數(shù)據(jù)寫入文件,例如,上例的觸發(fā)條件就是always(i),當i變化的時候才寫入。每寫入一次數(shù)據(jù)會自動增加一個換行符。 $fmonitor
關(guān)于Matlab的函數(shù)有:fopen, 關(guān)于Modelsim的函數(shù)有:$fopen, $fclose,$readmemh,$readmemb,$fmonitor,$fdisplay,$fwrite。
這個命令不需要觸發(fā)條件,只要有變化就可以將數(shù)據(jù)寫入文件。例如可以通過以下語句: initial $fmonitor(w_file,“%h”,data_out);
這樣可以將整個仿真過程產(chǎn)生的data_out數(shù)據(jù)都寫入文件中。 $fwrite
這個命令和$fdisplay基本相同,也是需要觸發(fā)條件才會寫入,不同的是每寫入一個數(shù)據(jù)不會自動添加換行符。例如可以通過以下語句: always @(posedge clk) begin
$fwrite(w_file,“%h ”,data_out); end
關(guān)于這幾個命令的詳細介紹,大家可以參考Verilog的相關(guān)數(shù)據(jù)。
評論