版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rè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ū)命令窗口庫標(biāo)簽ModelSim用戶界面主窗口設(shè)計輸入過程1.啟動ModelSim “開始所有程序 ModelSim SE 6.0 ModelSim” 命令2. 改變當(dāng)前工作目錄事先在資源管理器下新建一個工作目錄(最好與頂層設(shè)計同名)
2、 ;FileChange Directory菜單命令3. 創(chuàng)建設(shè)計庫(默認(rèn)為work)用于存放編譯結(jié)果。FileNewLibrary菜單命令4. 建立仿真工程項目FileNewProject菜單命令5.編寫新的源程序FileNewSourceVerilog菜單命令6. 編寫Verilog測試文件 所有路徑名必須是英文!344源程序每個子模塊和頂層電路都采用Verilog HDL語言描述,對子模塊的調(diào)用采用模塊元件例化的方法。便于利用Modelsim對頂層設(shè)計文件進(jìn)行仿真。設(shè)計實例電子秒表電路【例4.11】設(shè)計一個電子秒表電路,使其具有異步清零和啟動/停止計數(shù)功能,最大能計到59.99s ,用數(shù)
3、碼管顯示各位數(shù)值。用ModelSim進(jìn)行功能仿真。設(shè)計實例為避免加載設(shè)計時找不到底層子模塊,將所有子模塊的源代碼直接復(fù)制到頂層設(shè)計文件中!對子模塊調(diào)用時端口定義采用按位置對應(yīng)的方法,注意一定嚴(yán)格按照子模塊的端口定義一一對應(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為啟/停信號,負(fù)脈沖有效;clrn:異步清零信號,負(fù)脈沖有效 output6:0 dsec,sec,secd,secm;/7段顯示器字段輸出,dsec6:0相當(dāng)于秒高位的a,b,c,d,e,f,g output3:0 bin_dsec, bin_sec, bin_secd, bin_secm;/BCD碼計數(shù)器輸出 output cn; / 向分鐘的進(jìn)位信號 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) / 當(dāng)計到121時,使計數(shù)器清零 cnt=0; end else cnt=0; / 當(dāng)pbn無效,且enable為0時,則cnt清零-此句不能少! enable=!(cnt=0);
11、/ 當(dāng)cnt=0時, enable 為0. signal=(cnt=0); / 當(dāng)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; / 秒高位向分鐘的進(jìn)位 reg3:0 dsec,sec,secd,secm; reg cn; always (posedge clkin or negedge clrn) begin
12、if (!clrn) / 1)異步清零! begin cn=0; / 進(jìn)位信號也必須清零! 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)生向分鐘的進(jì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相當(dāng)于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; / 維持負(fù)脈沖2ms,然后變?yōu)? # 3000000 startstopn=0; / 延遲3ms,startstopn從1-0,啟動計數(shù) # 2500000 startstopn=1; / 維持負(fù)脈沖,然后變?yōu)? 測試文件test_second_vlg.v 1616 # 2000000 startstopn=0; / 延遲2ms,startstopn從1-0,模擬抖動 # 2000000 startstopn=1; / 維持負(fù)脈沖2ms,然后變?yōu)? # 130000000 startstopn=
16、0; / 延遲130ms,startstopn從1-0,暫停計數(shù) # 2500000 startstopn=1; / 維持負(fù)脈沖,然后變?yōu)? # 2000000 startstopn=0; / 延遲2ms,startstopn從1-0,模擬抖動 # 2000000 startstopn=1; / 維持負(fù)脈沖2ms,然后變?yōu)? # 140000000 startstopn=0; / 延遲140ms,startstopn從1-0,繼續(xù)計數(shù) # 2500000 startstopn=1; / 維持負(fù)脈沖,然后變?yōu)? # 2000000 startstopn=0; / 延遲2ms,startstopn
17、從1-0,模擬抖動 # 2000000 startstopn=1; / 維持負(fù)脈沖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ù)的負(fù)脈沖,來模擬按鈕的抖動;在模擬啟動計數(shù)、暫停計數(shù)和繼續(xù)計數(shù)時,startstopn信號出現(xiàn)兩次有效負(fù)脈沖(非抖動)的間隔必須大于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)”目錄為當(dāng)前工作目錄。 20202、創(chuàng)建設(shè)計庫(可選)執(zhí)行FileNewLibrary菜單命令,在當(dāng)前工作目錄下創(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)會默認(rèn)創(chuàng)建一個設(shè)計庫work,位于中,則第2步中不必創(chuàng)建設(shè)計庫。23234、編譯設(shè)計文件和仿真文件選擇“ Complie Complie All ” 菜單命令,編譯添加
22、到工程中的所有文件添加文件后的Project標(biāo)簽頁 編譯通過2424載入編譯后的設(shè)計模塊。選擇SimulateStart Simulation菜單命令,在 “Start Simulation”對話框中選擇要加載的仿真文件5、加載設(shè)計到仿真器方法一加載后出現(xiàn)sim標(biāo)簽頁 25方法二在Library標(biāo)簽頁中,單擊work前面的“+”展開該庫,可以看到編譯后的設(shè)計模塊second_vlg和test_second_vlg;雙擊test_second加載設(shè)計模塊(或右擊test_second,在快捷菜單中選擇“Simulate”),則在工作區(qū)會出現(xiàn)一個新的sim標(biāo)簽頁,并在命令窗口顯示加載信息 雙擊 加
23、載設(shè)計的另一種方法26加載信息sim標(biāo)簽頁加載成功后Objects三窗口2727選擇ViewDebug WindowsWave菜單命令,打開Wave窗口在Objects窗口中選擇要添加到Wave窗口中的信號選擇AddWaveSelected Signals菜單命令,將所選信號送到Wave窗口中顯示6、向Wave窗口添加需要仿真的信號不希望觀察的信號不要選擇!若要在Wave窗口顯示所有的信號,則選擇AddWave Signals in Region菜單命令?;蛘咴贠bjects窗口中右擊,在快捷菜單中選擇Add to WaveSelected Signals命令2828Wave窗口中已添加的信號
24、29297、運行仿真在Wave窗口中單擊 Run按鈕,則開始運行仿真,并在100ns后結(jié)束(缺省仿真長度)。運行仿真前,可以適當(dāng)調(diào)整信號先后順序,并設(shè)置其進(jìn)制!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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)藥分公司藥品研發(fā)管理規(guī)范
- 校車的應(yīng)急預(yù)案
- 建筑工程工法管理辦法
- IT行業(yè)外包安全管理辦法
- 《Excel數(shù)據(jù)獲取與處理實戰(zhàn)》 課件 第8章 宏和VBA
- 2022年大學(xué)心理學(xué)專業(yè)大學(xué)物理二期中考試試卷-附解析
- 2022年大學(xué)法醫(yī)學(xué)專業(yè)大學(xué)物理下冊期中考試試題-含答案
- 2022年大學(xué)能源動力專業(yè)大學(xué)物理下冊開學(xué)考試試卷D卷-附解析
- 2022年大學(xué)動物醫(yī)學(xué)專業(yè)大學(xué)物理下冊期中考試試卷D卷-含答案
- 腦血管病介入診療護(hù)理
- 啟蒙思想家盧梭
- 診所計劃書范本
- 小學(xué)一年級新生學(xué)位申請表
- 高中教育課題申報書:高中歷史教學(xué)中學(xué)生歷史學(xué)科核心素養(yǎng)的培養(yǎng)
- 浙教版勞動教育六年級上冊項目三 任務(wù)一《班級生活共觀察》教學(xué)課件
- zippo稀有品系列圖鑒
- 西泠印社小學(xué)三年級上冊書法
- 個體工商戶名稱(字號)預(yù)先核準(zhǔn)登記申請書
- 糧油保管員(中級)技能理論考試題庫-上(單選題匯總)
- 第六章 人工智能及其應(yīng)用 教學(xué)課件 2023-2024學(xué)年粵教版(2019)高中信息技術(shù)必修1
- 醫(yī)院志愿者培訓(xùn)課件
評論
0/150
提交評論