modelsim(版本60)功能仿真實例演示(自學) ok_第1頁
modelsim(版本60)功能仿真實例演示(自學) ok_第2頁
modelsim(版本60)功能仿真實例演示(自學) ok_第3頁
modelsim(版本60)功能仿真實例演示(自學) ok_第4頁
modelsim(版本60)功能仿真實例演示(自學) ok_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1ModelSim功能仿真舉例編譯設(shè)計文件和仿真文件 2加載設(shè)計到仿真器3向wave窗口添加需要仿真的信號 4運行仿真 5打開源程序1保存仿真波形6通過 修改源程序 未通過 2這里使用的是ModelSim 版本執(zhí)行“開始所有程序 ModelSim SE 6.0 ModelSim”,啟動ModelSim,則出現(xiàn)“ModelSim SE PLUS 6.0”工作界面工作區(qū)命令窗口庫標簽ModelSim用戶界面主窗口設(shè)計輸入過程1.啟動ModelSim “開始所有程序 ModelSim SE 6.0 ModelSim” 命令2. 改變當前工作目錄事先在資源管理器下新建一個工作目錄(最好與頂層設(shè)計同名)

2、 ;FileChange Directory菜單命令3. 創(chuàng)建設(shè)計庫(默認為work)用于存放編譯結(jié)果。FileNewLibrary菜單命令4. 建立仿真工程項目FileNewProject菜單命令5.編寫新的源程序FileNewSourceVerilog菜單命令6. 編寫Verilog測試文件 所有路徑名必須是英文!344源程序每個子模塊和頂層電路都采用Verilog HDL語言描述,對子模塊的調(diào)用采用模塊元件例化的方法。便于利用Modelsim對頂層設(shè)計文件進行仿真。設(shè)計實例電子秒表電路【例4.11】設(shè)計一個電子秒表電路,使其具有異步清零和啟動/停止計數(shù)功能,最大能計到59.99s ,用數(shù)

3、碼管顯示各位數(shù)值。用ModelSim進行功能仿真。設(shè)計實例為避免加載設(shè)計時找不到底層子模塊,將所有子模塊的源代碼直接復制到頂層設(shè)計文件中!對子模塊調(diào)用時端口定義采用按位置對應(yīng)的方法,注意一定嚴格按照子模塊的端口定義一一對應(yīng),否則仿真不會正確。55電子秒表電路系統(tǒng)功能框圖 clko TFF_clkenablecnt_en66module second_vlg(clk,startstopn,clrn,dsec,sec,secd,secm,bin_dsec,bin_sec,bin_secd,bin_secm,cn, clk_10KHz,clk_1KHz,enable,clko,cnt_debounc

4、e); input clk,startstopn,clrn; / clk為系統(tǒng)時鐘信號,50MHz;startstopn為啟/停信號,負脈沖有效;clrn:異步清零信號,負脈沖有效 output6:0 dsec,sec,secd,secm;/7段顯示器字段輸出,dsec6:0相當于秒高位的a,b,c,d,e,f,g output3:0 bin_dsec, bin_sec, bin_secd, bin_secm;/BCD碼計數(shù)器輸出 output cn; / 向分鐘的進位信號 output clk_10KHz,clk_1KHz,enable,clko; /中間變量 output6:0 cnt_d

5、ebounce; / 中間變量,對按鈕消抖定時的計數(shù)器 reg enable; / 隨startstopn信號而變,為1時允許計數(shù);為0時暫停計數(shù) wire cnt_en; / 計數(shù)允許信號,為clk_10KHz和enable信號相與的結(jié)果 wire clk_10KHz,clk_1KHz,clko; /中間變量,一定要聲明為wire,而不能聲明為reg,否則加載時出錯 / clko:分頻電路子模塊的輸出時鐘信號,T clko =0.01s wire TFF_clk,enable1,clr,startstopn_out;/中間變量 wire6:0 cnt_debounce; 設(shè)計文件 端口定義為

6、仿真將它們聲明為輸出信號77 assign TFF_clk = !startstopn_out; /(1)產(chǎn)生中間節(jié)點信號TFF_clk always (posedge TFF_clk or negedge clrn) / (2)產(chǎn)生enable信號 begin if(!clrn) enable=0; / clrn為異步清零信號,低有效 else enable 10KHz,10KHz - 1KHz)module clkdiv(clkin,clrn,clk_10KHz,clk_1KHz); parameter count_width=5000; input clkin,clrn; output

7、clk_10KHz,clk_1KHz; reg clk_10KHz,clk_1KHz; reg13:0 count1; reg3:0 count2; / 5000分頻 always (posedge clkin or negedge clrn ) begin if(!clrn) count1=0; / clrn為0,使所有寄存器清零 else begin if(count1=count_width-1) count1=0; else count1=count1+1; clk_10KHz=(count1=count_width-1); end end設(shè)計文件second_vlg.v 子模塊99

8、/ 10分頻 always (posedge clk_10KHz or negedge clrn ) begin if(!clrn) count2=0; else begin if (count2=9) count2=0; else count2=count2+1; clk_1KHz=(count2=9); / clk_1KHz只在計數(shù)值為9時為1 end endendmodule 設(shè)計文件second_vlg.v 子模塊(續(xù))1010 module clkdiv100(clkin,clrn,clkout); / 100分頻 input clkin,clrn; output clkout; r

9、eg clkout; reg6:0 count; always (posedge clkin or negedge clrn) begin if (!clrn) count =0; else begin if (count=99) count=0; else count=count+1; clkout=(count=99); / clkout只在計數(shù)值為99時為1 end endendmodule設(shè)計文件second_vlg.v 子模塊1111 / 按鈕消抖電路module button(clk,pbn,signal,cnt,enable); input clk,pbn; / Tclk = 1

10、ms,pbn為按鈕輸入信號,低有效 output signal,enable; output6:0 cnt; /聲明為輸出,便于觀察 reg signal; reg6:0 cnt; / 加法計數(shù)器,用于定時 reg enable; / enable為中間變量,用于維持計數(shù) always (posedge clk) begin if(!pbn|enable) begin cnt=cnt+1; if(cnt=121) / 當計到121時,使計數(shù)器清零 cnt=0; end else cnt=0; / 當pbn無效,且enable為0時,則cnt清零-此句不能少! enable=!(cnt=0);

11、/ 當cnt=0時, enable 為0. signal=(cnt=0); / 當cnt=0時, signal 為1. end endmodule設(shè)計文件second_vlg.v 子模塊1212 / 定時計數(shù)子模塊module bcdcnt(clkin,clrn,dsec,sec,secd,secm,cn); output3:0 dsec,sec,secd,secm; / dsec:秒高位 output cn; / 秒高位向分鐘的進位 reg3:0 dsec,sec,secd,secm; reg cn; always (posedge clkin or negedge clrn) begin

12、if (!clrn) / 1)異步清零! begin cn=0; / 進位信號也必須清零! dsec3:0=0; sec3:0=0; secd3:0=0; secm3:0=0; end 設(shè)計文件second_vlg.v 子模塊1313 else /2)計數(shù),采用4個if語句的嵌套 begin if(secm3:0=9) /百分秒低位是否為9? beginsecm3:0=0;if(secd3:0=9) /百分秒高位是否為9? begin secd3:0=0; if(sec3:0=9) /秒低位是否為9? begin sec3:0=0; if(dsec3:0=5) dsec3:0=0; /秒高位是

13、否為5? else dsec3:0=dsec3:0+1; end else sec3:0=sec3:0+1; end else secd3:0=secd3:0+1; end else secm3:0=secm3:0+1; / 3)產(chǎn)生向分鐘的進位信號 if (dsec3:0=5)&(sec3:0=9)&(secd3:0=9)&(secm3:0=9) cn=1; else cn=0; end end endmodule設(shè)計文件second_vlg.v 子模塊(續(xù))1414 / 7段顯示譯碼器module p7seg(data,out); input 3:0data ; /7段顯示器輸入 outp

14、ut 6:0 out; /7段顯示器字段輸出,out6:0相當于a,b,c,d,e,f,g reg 6:0 out; always (data ) case (data) 4d0: out = 7b0111111 ; 4d1: out = 7b0000110 ; 4d2: out = 7b1011011 ; 4d3: out = 7b1001111 ; 4d4: out = 7b1100110 ; 4d5: out = 7b1101101 ; 4d6: out = 7b1111101 ; 4d7: out = 7b0000111 ; 4d8: out = 7b0000111 ; 4d9: ou

15、t = 7b1111111 ; default:out 0 # 2000000 clrn = 1; / 維持負脈沖2ms,然后變?yōu)? # 3000000 startstopn=0; / 延遲3ms,startstopn從1-0,啟動計數(shù) # 2500000 startstopn=1; / 維持負脈沖,然后變?yōu)? 測試文件test_second_vlg.v 1616 # 2000000 startstopn=0; / 延遲2ms,startstopn從1-0,模擬抖動 # 2000000 startstopn=1; / 維持負脈沖2ms,然后變?yōu)? # 130000000 startstopn=

16、0; / 延遲130ms,startstopn從1-0,暫停計數(shù) # 2500000 startstopn=1; / 維持負脈沖,然后變?yōu)? # 2000000 startstopn=0; / 延遲2ms,startstopn從1-0,模擬抖動 # 2000000 startstopn=1; / 維持負脈沖2ms,然后變?yōu)? # 140000000 startstopn=0; / 延遲140ms,startstopn從1-0,繼續(xù)計數(shù) # 2500000 startstopn=1; / 維持負脈沖,然后變?yōu)? # 2000000 startstopn=0; / 延遲2ms,startstopn

17、從1-0,模擬抖動 # 2000000 startstopn=1; / 維持負脈沖2ms,然后變?yōu)? #800000000 $stop; / 延遲800ms,暫停仿真 end second_vlg my_second_vlg (clk,startstopn,clrn,dsec,sec,secd,secm,bin_dsec,bin_sec,bin_secd,bin_secm,cn, clk_10KHz,clk_1KHz,enable,clko,cnt_debounce); endmodule測試文件test_second_vlg.v (續(xù))startstopn信號的初始化,應(yīng)符合實際情況。sta

18、rtstopn信號第一次有效必須是在clk_1KHz信號產(chǎn)生后,也即必須在1ms后;可以給startstopn幾個連續(xù)的負脈沖,來模擬按鈕的抖動;在模擬啟動計數(shù)、暫停計數(shù)和繼續(xù)計數(shù)時,startstopn信號出現(xiàn)兩次有效負脈沖(非抖動)的間隔必須大于120ms,否則BCD碼計數(shù)器不可能隨著startstopn信號的變化啟動計數(shù)或暫停計數(shù)。 17功能仿真的過程1. 打開源程序 在ModelSim主界面中用FileOpenFile菜單命令3. 加載設(shè)計到仿真器在主界面中執(zhí)行SimulateSimulate菜單命令,在 “Simulate”對話框中選擇要加載的模塊。2. 編譯設(shè)計文件和仿真文件 在文

19、本編輯畫面中執(zhí)行Tools Compile菜單命令;或在主窗口中執(zhí)行Compile Compile菜單命令。 18功能仿真的過程(續(xù))6. 保存仿真波形結(jié)果(.wlf) 在wave窗口中執(zhí)行FileSave Datasetsim命令5. 運行仿真 單擊Main窗口工具條中的Run按鈕,或執(zhí)行SimulateRunRun-All菜單命令4. 向wave窗口添加需要仿真的信號選擇View菜單中的Signals和Wave選項,彈出signals窗口和wave窗口;在signals窗口選擇需要仿真的信號拖入wave窗口。1919實例演示1、切換工作目錄這里使用的是版本選擇FileChange Dire

20、ctory命令,彈出Choose folder對話框,選擇“teststopwatch(OK)”目錄為當前工作目錄。 20202、創(chuàng)建設(shè)計庫(可選)執(zhí)行FileNewLibrary菜單命令,在當前工作目錄下創(chuàng)建一個新的設(shè)計庫即一個子目錄,來存放用于仿真的編譯結(jié)果,缺省為work 。ModelSim在此目錄中保存了名為_info的特殊文件。創(chuàng)建設(shè)計庫也可以省略,在創(chuàng)建仿真工程后會自動創(chuàng)建一個設(shè)計庫work如果以前已創(chuàng)建好設(shè)計庫,則以后每次打開源程序和測試文件時,不必再創(chuàng)建新的設(shè)計庫。21執(zhí)行FileNewProject菜單命令,彈出Create Project對話框,填入工程名稱(后綴為.mpf

21、),指定其路徑;3、建立仿真工程(1/2)單擊OK按鈕,彈出Select Initial Ini對話框,選擇Use Current Ini。22則彈出Add items to the project對話框,選擇Add Existing File,將、 添加到工程中。3、建立仿真工程(2/2)仿真工程的存在與否并不影響仿真結(jié)果,但使用工程可以簡化編譯和仿真的操作。仿真工程在建立設(shè)計庫之前或之后來建立都可以。如果先建立仿真工程,系統(tǒng)會默認創(chuàng)建一個設(shè)計庫work,位于中,則第2步中不必創(chuàng)建設(shè)計庫。23234、編譯設(shè)計文件和仿真文件選擇“ Complie Complie All ” 菜單命令,編譯添加

22、到工程中的所有文件添加文件后的Project標簽頁 編譯通過2424載入編譯后的設(shè)計模塊。選擇SimulateStart Simulation菜單命令,在 “Start Simulation”對話框中選擇要加載的仿真文件5、加載設(shè)計到仿真器方法一加載后出現(xiàn)sim標簽頁 25方法二在Library標簽頁中,單擊work前面的“+”展開該庫,可以看到編譯后的設(shè)計模塊second_vlg和test_second_vlg;雙擊test_second加載設(shè)計模塊(或右擊test_second,在快捷菜單中選擇“Simulate”),則在工作區(qū)會出現(xiàn)一個新的sim標簽頁,并在命令窗口顯示加載信息 雙擊 加

23、載設(shè)計的另一種方法26加載信息sim標簽頁加載成功后Objects三窗口2727選擇ViewDebug WindowsWave菜單命令,打開Wave窗口在Objects窗口中選擇要添加到Wave窗口中的信號選擇AddWaveSelected Signals菜單命令,將所選信號送到Wave窗口中顯示6、向Wave窗口添加需要仿真的信號不希望觀察的信號不要選擇!若要在Wave窗口顯示所有的信號,則選擇AddWave Signals in Region菜單命令。或者在Objects窗口中右擊,在快捷菜單中選擇Add to WaveSelected Signals命令2828Wave窗口中已添加的信號

24、29297、運行仿真在Wave窗口中單擊 Run按鈕,則開始運行仿真,并在100ns后結(jié)束(缺省仿真長度)。運行仿真前,可以適當調(diào)整信號先后順序,并設(shè)置其進制!3030Run-All按鈕和Break按鈕或單擊Run-All按鈕則仿真將一直運行,直到遇到暫停仿真語句(如#800000000 $stop;)或結(jié)束仿真語句(如#1000000000 $finish;)才終止;或者單擊Break按鈕強制中斷仿真Break執(zhí)行“View-Goto time”菜單命令,直接跳轉(zhuǎn)到欲查看波形的時間位置3131方法二:在主窗口工具欄上的仿真時間選項框里填寫好仿真時間(如500ns)后,再單擊Run按鈕開始仿真。運行仿真方法二仿真運行了500ns 32方法三: SimulateRun菜單命令中的子菜單。Run 500nsRun AllContinue 運行仿真方法三33功能仿真波形(1/3) 在處清零,在處開始分頻清零clrn=1則開始分頻計數(shù)34功能仿真波形(2/3) 在處開始計數(shù)(enable變?yōu)?)及按鈕去抖 開始計數(shù)35功能仿真波形(3/3) 暫停計數(shù)(enable變?yōu)?)和繼續(xù)計數(shù)(enable變?yōu)?) 暫停計數(shù)繼續(xù)計數(shù)36368、保存仿真波形結(jié)果選擇FileSaveD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論