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