VerilogHDL硬件描述-31_第1頁
VerilogHDL硬件描述-31_第2頁
VerilogHDL硬件描述-31_第3頁
VerilogHDL硬件描述-31_第4頁
VerilogHDL硬件描述-31_第5頁
已閱讀5頁,還剩109頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、福州大學(xué)微電子系福州大學(xué)微電子系2復(fù)習(xí)復(fù)習(xí) 整數(shù)三種表達(dá)方式整數(shù)三種表達(dá)方式 參數(shù)定義和參數(shù)值修改參數(shù)定義和參數(shù)值修改 數(shù)據(jù)類型:線網(wǎng)類型和寄存器類型數(shù)據(jù)類型:線網(wǎng)類型和寄存器類型 兩者最大的區(qū)別:兩者最大的區(qū)別: 寄存器類型保持最后一次的賦值,而線網(wǎng)寄存器類型保持最后一次的賦值,而線網(wǎng)類型則需要持續(xù)的驅(qū)動。類型則需要持續(xù)的驅(qū)動。 位選擇和部分選擇位選擇和部分選擇 存儲器存儲器3復(fù)習(xí)復(fù)習(xí) 選擇數(shù)據(jù)類型時常犯的錯誤選擇數(shù)據(jù)類型時常犯的錯誤 把模塊的輸入信號定義為寄存器類型了。把模塊的輸入信號定義為寄存器類型了。 把實(shí)例的輸出連接出去時,把它定義為寄存把實(shí)例的輸出連接出去時,把它定義為寄存器類型了

2、。器類型了。 在過程塊中對變量賦值時,忘了把它定義為在過程塊中對變量賦值時,忘了把它定義為寄存器類型(寄存器類型(regreg)或已把它定義為連接類型)或已把它定義為連接類型了(了(wirewire)。)。這是經(jīng)常犯的三個錯誤!這是經(jīng)常犯的三個錯誤!4復(fù)習(xí)復(fù)習(xí)運(yùn)算符運(yùn)算符 算術(shù)運(yùn)算符算術(shù)運(yùn)算符 按位運(yùn)算符按位運(yùn)算符 邏輯運(yùn)算符邏輯運(yùn)算符 關(guān)系運(yùn)算符關(guān)系運(yùn)算符 等式運(yùn)算符等式運(yùn)算符 移位運(yùn)算符移位運(yùn)算符 位拼接運(yùn)算符位拼接運(yùn)算符 縮減運(yùn)算符縮減運(yùn)算符 條件運(yùn)算符條件運(yùn)算符5塊語句塊語句 順序塊順序塊1)1) 塊內(nèi)的語句是按順序執(zhí)行的,即只有上面一條塊內(nèi)的語句是按順序執(zhí)行的,即只有上面一條語句執(zhí)行

3、完后下面的語句才能執(zhí)行。語句執(zhí)行完后下面的語句才能執(zhí)行。2)2) 每條語句的延遲時間是相對于前一條語句的仿每條語句的延遲時間是相對于前一條語句的仿真時間而言的。真時間而言的。3)3) 直到最后一條語句執(zhí)行完,程序流程控制才跳直到最后一條語句執(zhí)行完,程序流程控制才跳出該語句塊。出該語句塊。 順序塊的格式如下:順序塊的格式如下:begin :begin 語句語句1;1;語句語句2;2;.語句語句n;n;endendbegin areg = breg; creg = areg; /creg的值為的值為breg值值end6塊語句塊語句 并行塊并行塊1)1) 塊內(nèi)語句是同時執(zhí)行的,即程序流程控制一塊內(nèi)語

4、句是同時執(zhí)行的,即程序流程控制一進(jìn)入到該并行塊,塊內(nèi)語句則開始同時并行地進(jìn)入到該并行塊,塊內(nèi)語句則開始同時并行地執(zhí)行。執(zhí)行。2)2) 塊內(nèi)每條語句的延遲時間是相對于程序流程塊內(nèi)每條語句的延遲時間是相對于程序流程控制進(jìn)入到塊內(nèi)時的仿真時間的。控制進(jìn)入到塊內(nèi)時的仿真時間的。3)3) 延遲時間是用來給賦值語句提供執(zhí)行時序的。延遲時間是用來給賦值語句提供執(zhí)行時序的。4)4) 當(dāng)按時間時序排序在最后的語句執(zhí)行完后,當(dāng)按時間時序排序在最后的語句執(zhí)行完后,程序流程控制跳出該程序塊。程序流程控制跳出該程序塊。7塊語句塊語句 并行塊的格式并行塊的格式: :fork:fork 語句語句1;1;語句語句2;2;.語

5、句語句n;n;JoinJoin并行塊一般只用于仿真。并行塊一般只用于仿真。8塊語句塊語句在順序塊中,語句一條接一條地計(jì)算執(zhí)行。在順序塊中,語句一條接一條地計(jì)算執(zhí)行。在并行塊中,所有語句在各自的延遲之后立即計(jì)算執(zhí)行。在并行塊中,所有語句在各自的延遲之后立即計(jì)算執(zhí)行。begin #5 a = 3; #5 a = 5; #5 a = 4;endfork #5 a = 3; #15 a = 4; #10 a = 5;join 上面的兩個例子在功能上是等價的。上面的兩個例子在功能上是等價的。Fork-joinFork-join例子里的例子里的賦值故意打亂順序是為了強(qiáng)調(diào)順序是沒有關(guān)系的。賦值故意打亂順序是

6、為了強(qiáng)調(diào)順序是沒有關(guān)系的。 注意注意fork-joinfork-join塊是典型的不可綜合語句,并且在一些仿塊是典型的不可綜合語句,并且在一些仿真器時效率較差。真器時效率較差。 9塊名塊名 在在VerilogVerilog HDL HDL語言中,可以為每個塊取語言中,可以為每個塊取一個名字,只需將名字加在關(guān)鍵字一個名字,只需將名字加在關(guān)鍵字beginbegin或或forkfork后面即可。定義塊名的原因有:后面即可。定義塊名的原因有: 可以在塊內(nèi)定義局部變量,即只能在塊內(nèi)使用可以在塊內(nèi)定義局部變量,即只能在塊內(nèi)使用的變量。的變量。 可以允許塊被其他語句調(diào)用,如可以允許塊被其他語句調(diào)用,如dis

7、abledisable語句語句 在在VerilogVerilog HDL HDL語言中,所有的變量都是靜態(tài)語言中,所有的變量都是靜態(tài)的,即所有的變量都只有一個唯一的存儲地址,的,即所有的變量都只有一個唯一的存儲地址,因此進(jìn)入或跳出塊并不影響存儲在變量內(nèi)的值。因此進(jìn)入或跳出塊并不影響存儲在變量內(nèi)的值。10塊起始時間和結(jié)束時間塊起始時間和結(jié)束時間在并行塊和順序塊中都有一個起始時間和結(jié)束時間在并行塊和順序塊中都有一個起始時間和結(jié)束時間的概念。的概念。對于順序塊,起始時間就是第一條語句開始被執(zhí)行對于順序塊,起始時間就是第一條語句開始被執(zhí)行的時間,結(jié)束時間就是最后一條語句執(zhí)行完的時間。的時間,結(jié)束時間就

8、是最后一條語句執(zhí)行完的時間。而對于并行塊來說,起始時間對于塊內(nèi)所有的語句而對于并行塊來說,起始時間對于塊內(nèi)所有的語句是相同的,即程序流程控制進(jìn)入該塊的時間,其結(jié)是相同的,即程序流程控制進(jìn)入該塊的時間,其結(jié)束時間是按時間排序在最后的語句執(zhí)行完的時間。束時間是按時間排序在最后的語句執(zhí)行完的時間。在在fork_joinfork_join塊內(nèi),各條語句不必按順序給出,因此塊內(nèi),各條語句不必按順序給出,因此在并行塊里,各條語句在前還是在后是無關(guān)緊要的。在并行塊里,各條語句在前還是在后是無關(guān)緊要的。在在begin-endbegin-end塊中采用非阻塞賦值與并行塊功能一致。塊中采用非阻塞賦值與并行塊功能一

9、致。11塊語句塊語句timescale 10ns/1nsmodule wave2;reg wave;parameter cycle=5;initialforkwave=0;#(cycle) wave=1;#(2*cycle) wave=0;#(3*cycle) wave=1;#(4*cycle) wave=0;#(5*cycle) wave=1;#(6*cycle) $finish;joininitial $monitor($time,wave=%b,wave);endmoduletimescale 10ns/1nsmodule wave1;reg wave;parameter cycle=1

10、0;initialBeginwave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) $finish ;endinitial $monitor($time,wave=%b,wave);endmodule12if_elseif_else語句語句 ifif語句是用來判定所給定的條件是否滿足,根據(jù)判定語句是用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假的結(jié)果(真或假) )決定執(zhí)行給出的決定執(zhí)行給出的兩種兩種操作之一操作之一 。 Veril

11、ogVerilog 語言提供了三種形式的語言提供了三種形式的ifif語句:語句: if ( if (表達(dá)式)表達(dá)式) 語句語句1 1; if ( if (表達(dá)式)表達(dá)式) 語句語句1 1; else else 語句語句2 2; if(if(表達(dá)式表達(dá)式1) 1) 語句語句1;1; else if( else if(表達(dá)式表達(dá)式2) 2) 語句語句2;2; else if( else if(表達(dá)式表達(dá)式3) 3) 語句語句3;3; . . else else if(if(表達(dá)式表達(dá)式m m) ) 語句語句m m; ; else else 語句語句m+1;m+1;13if_elseif_else語

12、句語句六點(diǎn)說明六點(diǎn)說明 :1.1.三種形式的三種形式的ifif語句中在語句中在ifif后面都有后面都有“表達(dá)式表達(dá)式”,一般,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。系統(tǒng)對表達(dá)式的值進(jìn)行為邏輯表達(dá)式或關(guān)系表達(dá)式。系統(tǒng)對表達(dá)式的值進(jìn)行判斷,若為判斷,若為0,x,z0,x,z,按,按“假假”處理,若為處理,若為1 1,按,按“真真”處理,執(zhí)行指定的語句。處理,執(zhí)行指定的語句。2.2.第二、第三種形式的第二、第三種形式的ifif語句中,在每個語句中,在每個elseelse前面有一前面有一分號,整個語句結(jié)束處有一分號。分號,整個語句結(jié)束處有一分號。 elseelse子句不能作為子句不能作為語句單獨(dú)使用,它必須是

13、語句單獨(dú)使用,它必須是ifif語句的一部分,與語句的一部分,與ifif配對配對使用。使用。 各 有 一 個 分 號 If (ab) out1 =int1;else out1 b) begin out1=int1; out2=int2;endelsebegin out1=int2; out20)for(i=0; i0)begin $display(.); memoryi=0;endelse $display(errorindexiszero);if(index0) begin :me integer i;for(i=0; i0)begin $display(.); memoryi=0;end e

14、ndelse $display(error-indexiszero);盡管程序設(shè)計(jì)者把盡管程序設(shè)計(jì)者把elseelse寫在第一寫在第一個個ifif同一列,但實(shí)際是與第二個同一列,但實(shí)際是與第二個ifif對應(yīng)對應(yīng), ,因?yàn)樗鼈兿嗑嘧罱驗(yàn)樗鼈兿嗑嘧罱鼮樘岣呖勺x為提高可讀性及確保正性及確保正確關(guān)聯(lián),用確關(guān)聯(lián),用beginbeginendend塊語句指定塊語句指定其作用域。其作用域。6.if-else6.if-else語句例子語句例子17從從ifif語句推導(dǎo)出鎖存器語句推導(dǎo)出鎖存器 ifif語句使用不當(dāng)生成了并不想要的鎖存器。語句使用不當(dāng)生成了并不想要的鎖存器。timescale 1ns/1nsmo

15、dule if_atch (din,en,qout);input din;input en;output qout;reg qout;always (en,din) / 需核實(shí)需核實(shí)beginif(en) qout=din;endendmodulelatqoutqoutendinD0Q0C當(dāng)當(dāng)enen為為1 1時,時,qoutqout與輸入信號與輸入信號dindin相同,否則相同,否則qoutqout不隨不隨dindin發(fā)生發(fā)生變化而保持變化而保持en=1en=1時刻的值。時刻的值。因此因此可直觀看出該電路具有鎖可直觀看出該電路具有鎖存功能,綜合后是一個鎖存器。存功能,綜合后是一個鎖存器。如果

16、不希望出現(xiàn)鎖存器,需要如果不希望出現(xiàn)鎖存器,需要加入加入elseelse分支。分支。18無鎖存器無鎖存器timescale 1ns/1nsmodule if_noatch (din,en,qout);input din;input en;output qout;reg qout;always (en,din) / 核實(shí)核實(shí)beginif(en) qout=din; else qout D C B AE D C B A20模為模為6060的的BCDBCD碼加法計(jì)數(shù)器碼加法計(jì)數(shù)器module count60(qout,cout, data,load, cin,reset,clk); output7

17、:0 qout; output cout; input7:0 data; input load,cin,clk,reset; reg7:0 qout;always (posedge clk)beginif (reset) qout=0; /同步復(fù)位同步復(fù)位else if(load) qout=data; /同步置數(shù)同步置數(shù)else if(cin) beginif(qout3:0=9) /低位是否為低位是否為9 beginqout3:0=0; /回回0,并判高位為,并判高位為5? if (qout7:4=5) qout7:4=0; else /高位不為高位不為5,則加,則加1 qout7:4=q

18、out7:4+1; end else /低位不為低位不為9,則加,則加1 qout3:0=qout3:0+1; endendassign cout=(qout=8D59)&cin)?1:0; endmodule /產(chǎn)生進(jìn)位輸出信號產(chǎn)生進(jìn)位輸出信號21casecase語句語句 casecase語句是一種多分支選擇語句,語句是一種多分支選擇語句,casecase語句是控制表達(dá)式語句是控制表達(dá)式與另外一系列表達(dá)式分支是否匹配的一個多路條件語句。與另外一系列表達(dá)式分支是否匹配的一個多路條件語句。case (case (敏感表達(dá)式)敏感表達(dá)式) 分支表達(dá)式分支表達(dá)式1 1:語句:語句1 1; 分支表達(dá)式

19、分支表達(dá)式2 2:語句:語句2 2; 分支表達(dá)式分支表達(dá)式n n:語句:語句n n; default: default: 語句語句n+1;n+1;endcaseendcase case case語句進(jìn)行逐位比較以語句進(jìn)行逐位比較以求完全匹配求完全匹配( (包括包括x x和和z)z)。 defaultdefault語句可選,在沒有語句可選,在沒有任何條件成立時執(zhí)行。任何條件成立時執(zhí)行。 如果未說明如果未說明defaultdefault, casecase語句可不執(zhí)行任何動作。語句可不執(zhí)行任何動作。 多個多個defaultdefault語句是非法。語句是非法。1 1、使用、使用defaultdef

20、ault語句是一個很好的編程習(xí)慣,特別是用于檢測語句是一個很好的編程習(xí)慣,特別是用于檢測x x和和z z。2 2、casezcasez和和casexcasex為為casecase語句的變體,允許比較無關(guān)語句的變體,允許比較無關(guān)(dont-care(dont-care)值。值。casecase表達(dá)式或表達(dá)式或casecase項(xiàng)中任何位為無關(guān)值時,在比較過程該位不予考慮。項(xiàng)中任何位為無關(guān)值時,在比較過程該位不予考慮。 在在casezcasez語句中,語句中,? ?和和z z被當(dāng)作無關(guān)值被當(dāng)作無關(guān)值。 在在casexcasex語句中,語句中,? ?,z z 和和x x被當(dāng)作無關(guān)值被當(dāng)作無關(guān)值。22c

21、asecase語句語句casecase括弧內(nèi)的表達(dá)式稱為控制表達(dá)式(也稱為敏感括弧內(nèi)的表達(dá)式稱為控制表達(dá)式(也稱為敏感表達(dá)式),表達(dá)式),casecase分支項(xiàng)中的表達(dá)式稱為分支表達(dá)式分支項(xiàng)中的表達(dá)式稱為分支表達(dá)式??刂票磉_(dá)式通常為控制信號的某些位,分支表達(dá)式控制表達(dá)式通常為控制信號的某些位,分支表達(dá)式則是這些控制信號具體狀態(tài)值:則是這些控制信號具體狀態(tài)值:分支表達(dá)式是常量分支表達(dá)式是常量表達(dá)式表達(dá)式。注意:要用整數(shù)完整描述注意:要用整數(shù)完整描述casecase語句的行為如同一個嵌套的語句的行為如同一個嵌套的ifif語句。語句。當(dāng)控制表當(dāng)控制表達(dá)式的值與分支表達(dá)式的值相等時,就執(zhí)行分支表達(dá)式的

22、值與分支表達(dá)式的值相等時,就執(zhí)行分支表達(dá)式后面的語句。如果所有的分支表達(dá)式的值都沒達(dá)式后面的語句。如果所有的分支表達(dá)式的值都沒有與控制表達(dá)式的值相匹配的,就執(zhí)行有與控制表達(dá)式的值相匹配的,就執(zhí)行defaultdefault后面后面的語句。的語句。defaultdefault項(xiàng)可有可無,一個項(xiàng)可有可無,一個casecase語句里只準(zhǔn)有一個語句里只準(zhǔn)有一個defaultdefault項(xiàng)。項(xiàng)。23casecase語句語句 每一個每一個casecase分項(xiàng)中的分支表達(dá)式值必須互不相同,否分項(xiàng)中的分支表達(dá)式值必須互不相同,否則會出現(xiàn)矛盾。則會出現(xiàn)矛盾。 執(zhí)行完執(zhí)行完casecase分項(xiàng)后的語句,則跳出該

23、分項(xiàng)后的語句,則跳出該casecase語句結(jié)構(gòu),語句結(jié)構(gòu),即終止即終止casecase語句的執(zhí)行。語句的執(zhí)行。 要注意詳細(xì)說明要注意詳細(xì)說明casecase分項(xiàng)的分支表達(dá)式值。分項(xiàng)的分支表達(dá)式值。 casecase語句的語句的所有表達(dá)式值的位寬必須相等所有表達(dá)式值的位寬必須相等,只有這樣,只有這樣,控制表達(dá)式和分支表達(dá)式才能進(jìn)行對應(yīng)位的比較。控制表達(dá)式和分支表達(dá)式才能進(jìn)行對應(yīng)位的比較。 分項(xiàng)后語句如果是多個操作語句,要用分項(xiàng)后語句如果是多個操作語句,要用beginbegin和和endend這這兩個關(guān)鍵詞將幾個語句包含起來成為一個復(fù)合塊語句。兩個關(guān)鍵詞將幾個語句包含起來成為一個復(fù)合塊語句。24

24、casecase語句執(zhí)行流程語句執(zhí)行流程25p VerilogVerilog HDL HDL針對電路的特性提供了針對電路的特性提供了casecase語句語句的其它兩種形式,即的其它兩種形式,即casezcasez和和casexcasex,用來處理,用來處理分支項(xiàng)中存在分支項(xiàng)中存在z z和和x x的情況。的情況。p casezcasez語句用來處理分支項(xiàng)中存在高阻值語句用來處理分支項(xiàng)中存在高阻值z z的的情況情況,?和,?和z z被當(dāng)作無關(guān)值。被當(dāng)作無關(guān)值。 p casexcasex語句則用來處理分支項(xiàng)中包括高阻值語句則用來處理分支項(xiàng)中包括高阻值z z或不定值或不定值x x的情況的情況,? ?,

25、z z和和x x被當(dāng)作無關(guān)值。被當(dāng)作無關(guān)值。casezcasez和和casexcasex語句語句26casecase、casezcasez和和casexcasex的真值的真值表表case0 1 x zcasez0 1 x zcasex0 1 x z01 0 0 001 0 0 101 0 1 110 1 0 010 1 0 110 1 1 1x0 0 1 0 x0 0 1 1x1 1 1 1z0 0 0 1z1 1 1 1z1 1 1 1casezcasez語句用來處理不考慮高阻值語句用來處理不考慮高阻值z z的比較過程,的比較過程,casexcasex語語句則將高阻值句則將高阻值z z和不定

26、值和不定值x x都視為無關(guān)項(xiàng)。所謂無關(guān)項(xiàng),即都視為無關(guān)項(xiàng)。所謂無關(guān)項(xiàng),即在表達(dá)式進(jìn)行比較時,不將該位的狀態(tài)考慮在內(nèi)。這樣在在表達(dá)式進(jìn)行比較時,不將該位的狀態(tài)考慮在內(nèi)。這樣在casecase語句表達(dá)式進(jìn)行比較時,就可以靈活地設(shè)置以對信號語句表達(dá)式進(jìn)行比較時,就可以靈活地設(shè)置以對信號的某些位進(jìn)行比較。的某些位進(jìn)行比較。27casecase語句語句module compute (result, rega, regb, opcode);input 7: 0 rega, regb;input 2: 0 opcode;output 7: 0 result;reg 7: 0 result;always (

27、rega or regb or opcode) case (opcode) 3b000 : result = rega + regb; 3b001 : result = rega - regb; 3b010 , / specify multiple cases witht he same result 3b100 : result = rega / regb; default : begin result = bx; $display ( no match); end endcaseendmodule微處理器的指令譯微處理器的指令譯碼通常用碼通常用casecase語句語句28casecase語

28、句語句 casecase語句通常用于微處理器的指令譯碼,語句通常用于微處理器的指令譯碼,casecase語句的行語句的行為如同一個嵌套的為如同一個嵌套的ifif語句。語句。注意整數(shù)的完整描述注意整數(shù)的完整描述29module decode4_7(decodeout,indec);output6:0 decodeout;input3:0 indec;reg6:0 decodeout; always (indec) begin case(indec) /用用case 語句進(jìn)行譯碼語句進(jìn)行譯碼 4d0:decodeout=7b1111110; 4d1:decodeout=7b0110000; 4d2

29、:decodeout=7b1101101; 4d3:decodeout=7b1111001; 4d4:decodeout=7b0110011; 4d5:decodeout=7b1011011; 4d6:decodeout=7b1011111; 4d7:decodeout=7b1110000; 4d8:decodeout=7b1111111; 4d9:decodeout=7b1111011; default: decodeout=7bx; endcase end endmoduleBCD BCD 碼碼七段數(shù)碼管顯示譯碼器七段數(shù)碼管顯示譯碼器30用casez 描述的數(shù)據(jù)選擇器module mux_

30、casez(out,a,b,c,d,select);output out;input a,b,c,d;input3:0 select;reg out;always (select or a or b or c or d) begin casez(select) 4b?1: out = a; 4b?1?: out = b; 4b?1?: out = c; 4b1?: out = d; endcase endendmodule31casexcasex語句語句32casecase語句時生成鎖存器的例子語句時生成鎖存器的例子 always (sel1:0 or a or b) case(sel1:0)

31、 2b00: q=a; 2b11: q=b; endcase 有 鎖 存 器 always (sel1:0 or a or b) case(sel1:0) 2b00: q=a; 2b11: q=b; default: q=b0; endcase 無 鎖 存 器 33timescale 1ns/1nsmodule decode3_8(din,dout);input 2:0 din;output 7:0 dout;reg 7:0 dout;always (din2:0)case(din) 3b000: dout=8b00000001;3b001: dout=8b00000010;3b010: do

32、ut=8b00000100;3b011: dout=8b00001000;3b100: dout=8b00010000;3b101: dout=8b00100000;3b110: dout=8b01000000;3b111: dout=8b10000000;endcaseendmodule如果將如果將casecase語句中的最語句中的最后一個分支項(xiàng)刪除,后一個分支項(xiàng)刪除,那么電路綜合后就會得那么電路綜合后就會得到到什么樣什么樣的結(jié)果的結(jié)果?casecase語句與鎖存器語句與鎖存器3-83-8譯碼器譯碼器34casecase語句生成鎖存器的例子語句生成鎖存器的例子注意整數(shù)的完整描述注意整數(shù)的完整

33、描述35casecase語句生成鎖存器的例子語句生成鎖存器的例子輸出信號為復(fù)數(shù)時,如果不將所有條件寫全輸出信號為復(fù)數(shù)時,如果不將所有條件寫全Always (A) begin case (A) 3b000 : begin DATA1 = 1b1; DATA2= 1b0; end 3b001 : begin DATA1 = 1b0; DATA3= 1b1; end 3b010 : begin DATA1 = 1b0; DATA2= 1b1; end 3b101 : begin DATA1 = 1b1; end default : begin DATA1 = 1b0; DATA2= 1b0; DAT

34、A3= 1b0; end endcaseend沒有沒有DATA3的描述的描述沒有沒有DATA2的描述的描述36輸出信號為復(fù)數(shù)時,針對每一個條件應(yīng)將輸出寫全輸出信號為復(fù)數(shù)時,針對每一個條件應(yīng)將輸出寫全Always (A) begin case (A) 3b000 : begin DATA1 = 1b1; DATA2= 1b0; DATA3= 1bx; end 3b001 : begin DATA1 = 1b0; DATA2= 1bx; DATA3= 1b1; end 3b010 : begin DATA1 = 1b0; DATA2= 1b1; DATA3= 1bx; end 3b101 : be

35、gin DATA1 = 1b1; DATA2= 1bx; DATA3= 1bx; end default : begin DATA1 = 1b0; DATA2= 1b0; DATA3= 1b0; endEndcaseendcasecase語句不生成鎖存器的例子語句不生成鎖存器的例子37ifif和和casecase語句的區(qū)別語句的區(qū)別 ifif語句指定了一個有優(yōu)先級的編碼邏輯,而語句指定了一個有優(yōu)先級的編碼邏輯,而casecase語句生成的邏輯是并行的,不具有優(yōu)先級語句生成的邏輯是并行的,不具有優(yōu)先級 ifif語句可包含一系列不同的表達(dá)式,而語句可包含一系列不同的表達(dá)式,而casecase語句語

36、句比較的是一個公共的表達(dá)式比較的是一個公共的表達(dá)式 ifif語句結(jié)構(gòu)速度慢,但占用面積小,嵌套語句結(jié)構(gòu)速度慢,但占用面積小,嵌套ifif語句語句使用不當(dāng),會導(dǎo)致大的延時。使用不當(dāng),會導(dǎo)致大的延時。casecase語句結(jié)構(gòu)速度語句結(jié)構(gòu)速度快,但占用面積大快,但占用面積大 有時為了兼顧面積和速度,將有時為了兼顧面積和速度,將ifif和和casecase語句合用語句合用38循環(huán)語句循環(huán)語句 在在VerilogVerilog HDL HDL中存在著四種類型的循環(huán)語句,用來控制執(zhí)中存在著四種類型的循環(huán)語句,用來控制執(zhí)行語句的執(zhí)行次數(shù)。其中行語句的執(zhí)行次數(shù)。其中forfor、repeatrepeat、wh

37、ilewhile是可綜合的,是可綜合的,但循環(huán)次數(shù)必須在編譯之前確定,動態(tài)改變循環(huán)次數(shù)的語但循環(huán)次數(shù)必須在編譯之前確定,動態(tài)改變循環(huán)次數(shù)的語句是不可綜合的。句是不可綜合的。foreverforever 連續(xù)的執(zhí)行語句。連續(xù)的執(zhí)行語句。repeatrepeat 連續(xù)執(zhí)行一條語句連續(xù)執(zhí)行一條語句 n n 次。次。whilewhile 執(zhí)行一條語句直到某個條件不滿足。如果一開執(zhí)行一條語句直到某個條件不滿足。如果一開 始條件不滿足始條件不滿足( (為假為假) ),則語句一次也不被執(zhí)行。,則語句一次也不被執(zhí)行。for for 通過以下三個步驟來決定語句的循環(huán)執(zhí)行。通過以下三個步驟來決定語句的循環(huán)執(zhí)行。先

38、給控制循環(huán)次數(shù)的變量賦初值。先給控制循環(huán)次數(shù)的變量賦初值。判定控制循環(huán)表達(dá)式的值,如為假則跳出循環(huán)判定控制循環(huán)表達(dá)式的值,如為假則跳出循環(huán)語句,如為真則執(zhí)行指定語句后,轉(zhuǎn)到第三步。語句,如為真則執(zhí)行指定語句后,轉(zhuǎn)到第三步。執(zhí)行一條賦值語句來修正控制循環(huán)變量次數(shù)的執(zhí)行一條賦值語句來修正控制循環(huán)變量次數(shù)的變量的值,然后返回第二步。變量的值,然后返回第二步。39foreverforever語句語句foreverforever語句的格式如下:語句的格式如下:foreverforever語句語句; ; 或或foreverforeverbeginbegin 多條語句多條語句 endend 此循環(huán)語句連續(xù)執(zhí)

39、行過程語句。同時,在過程語句中必須此循環(huán)語句連續(xù)執(zhí)行過程語句。同時,在過程語句中必須使用某種形式的時序控制,否則,使用某種形式的時序控制,否則, foreverforever循環(huán)將在循環(huán)將在0 0時時延后永遠(yuǎn)循環(huán)下去。延后永遠(yuǎn)循環(huán)下去。 initialinitial begin beginclkclk = 0; = 0;#5 forever #10 clk#5 forever #10 clk = = clkclk; ; end end ForeverForever不可綜合,一般用來產(chǎn)生仿真波形。不可綜合,一般用來產(chǎn)生仿真波形。 它用于它用于“永久永久”反復(fù)執(zhí)行某些語句,它與反復(fù)執(zhí)行某些語句,它

40、與alwaysalways塊的不同塊的不同之處在于它不能獨(dú)立出現(xiàn)在代碼中,之處在于它不能獨(dú)立出現(xiàn)在代碼中,必須在必須在initialinitial塊中塊中。產(chǎn)生時鐘波形產(chǎn)生時鐘波形, ,時鐘先初時鐘先初始化為始化為0 0,并一直保持到第,并一直保持到第5 5個時間單位。此后每隔個時間單位。此后每隔1010個時間單位,個時間單位,clkclk反相一次。反相一次。40repeat(repeat(表達(dá)式表達(dá)式) ) 語句;語句;repeat(repeat(表達(dá)式表達(dá)式) begin ) begin 多條語句多條語句 end end 這里的表達(dá)式應(yīng)該是常量表達(dá)式,給出了這里的表達(dá)式應(yīng)該是常量表達(dá)式,給

41、出了后面語句后面語句需需要循環(huán)的次數(shù)。如果循環(huán)計(jì)數(shù)表達(dá)要循環(huán)的次數(shù)。如果循環(huán)計(jì)數(shù)表達(dá)式的值不確定,即為式的值不確定,即為x x或或z z時,那么循環(huán)次數(shù)按時,那么循環(huán)次數(shù)按0 0處理。處理。repeatrepeat語句語句41循環(huán)循環(huán)(looping)(looping)語句語句-repeat-repeatrepeatrepeat:將一塊:將一塊語句循環(huán)執(zhí)行確語句循環(huán)執(zhí)行確定次數(shù)定次數(shù)。/ Parameterizable shift and add multipliermodule multiplier( result, op_a, op_b); parameter size = 8; inpu

42、t size:1 op_a, op_b; output 2* size:1 result; reg 2* size:1 shift_opa, result; reg size:1 shift_opb; always ( op_a or op_b) begin result = 0; shift_opb = op_b; shift_opa = op_a; / 零擴(kuò)展至零擴(kuò)展至16位位repeat (size) begin #10 if (shift_opb1) result = result +shift_opa; shift_opa = shift_opa 1; / Shift right e

43、nd endendmodule為什么要說明一個shift_opb變量?42whilewhile(表達(dá)式(表達(dá)式) ) 語句;語句;whilewhile(表達(dá)式(表達(dá)式) begin ) begin 多條語句多條語句 end end 當(dāng)表達(dá)式為當(dāng)表達(dá)式為“真真”時執(zhí)行后面對應(yīng)的句,時執(zhí)行后面對應(yīng)的句,否則執(zhí)行下一條語句。該語句常出現(xiàn)于測試代否則執(zhí)行下一條語句。該語句常出現(xiàn)于測試代碼中,用于等待某個條件的發(fā)生。碼中,用于等待某個條件的發(fā)生。whilewhile循環(huán)循環(huán)43. . .reg 7: 0 tempreg;reg 3: 0 count;. . . count = 0; while (tem

44、preg) / / 統(tǒng)計(jì)統(tǒng)計(jì)tempregtempreg中中1 1的個數(shù)的個數(shù) begin if (tempreg 0) count = count + 1; tempreg = tempreg 1; / Shift right endendwhilewhile:只要表達(dá)式為:只要表達(dá)式為真真( (不為不為0)0),則重復(fù)執(zhí),則重復(fù)執(zhí)行一條語句行一條語句( (或語句塊或語句塊) )whilewhile循環(huán)循環(huán)44forfor語句語句 forfor語句的一般形式為:語句的一般形式為: forfor(表達(dá)式(表達(dá)式1 1;表達(dá)式;表達(dá)式2 2;表達(dá)式;表達(dá)式3) 3) 語句語句執(zhí)行過程如下:執(zhí)行過

45、程如下:1)1) 先求解表達(dá)式先求解表達(dá)式1 1;2)2) 求解表達(dá)式求解表達(dá)式2 2,若其值為真(非,若其值為真(非0)0),則執(zhí)行,則執(zhí)行forfor語句中指定語句中指定的內(nèi)嵌語句,然后執(zhí)行下面的第的內(nèi)嵌語句,然后執(zhí)行下面的第3 3步。若為假步。若為假(0)(0),則結(jié)束,則結(jié)束循環(huán),轉(zhuǎn)到第循環(huán),轉(zhuǎn)到第5 5步。步。3)3) 若表達(dá)式為真,在執(zhí)行指定的語句后,求解表達(dá)式若表達(dá)式為真,在執(zhí)行指定的語句后,求解表達(dá)式3 3。4)4) 轉(zhuǎn)回上面的第轉(zhuǎn)回上面的第2 2步驟繼續(xù)執(zhí)行。步驟繼續(xù)執(zhí)行。5)5) 執(zhí)行執(zhí)行forfor語句下面的語句。語句下面的語句。forfor語句最簡單的應(yīng)用形式是很易理解

46、的,其形式如下:語句最簡單的應(yīng)用形式是很易理解的,其形式如下: for(for(循環(huán)變量賦初值;循環(huán)結(jié)束條件;循環(huán)變量增值循環(huán)變量賦初值;循環(huán)結(jié)束條件;循環(huán)變量增值) ) 執(zhí)行語句執(zhí)行語句45forfor語句語句 注意:循環(huán)變量增值不支持注意:循環(huán)變量增值不支持“+”+”或或“-” -” 運(yùn)算,運(yùn)算,因此必須通過完整的語句如因此必須通過完整的語句如i=i+1i=i+1 forfor循環(huán)語句實(shí)際上相當(dāng)于采用循環(huán)語句實(shí)際上相當(dāng)于采用whilewhile循環(huán)語句建循環(huán)語句建立以下的循環(huán)結(jié)構(gòu):立以下的循環(huán)結(jié)構(gòu):begin循環(huán)變量賦初值;循環(huán)變量賦初值;while(循環(huán)結(jié)束條件循環(huán)結(jié)束條件)begin

47、執(zhí)行語句執(zhí)行語句 循環(huán)變量增值循環(huán)變量增值;endend46forfor語句語句 forfor循環(huán)語句是典型的可以綜合的循環(huán)語句,循環(huán)語句是典型的可以綜合的循環(huán)語句,forfor循環(huán)的循環(huán)的綜合是通過展開來實(shí)現(xiàn)的。綜合是通過展開來實(shí)現(xiàn)的。也就是說,復(fù)制也就是說,復(fù)制forfor循環(huán)中的循環(huán)中的所有語句,對循環(huán)變量每一個可能的取值復(fù)制一次所有語句,對循環(huán)變量每一個可能的取值復(fù)制一次. . 需要對循環(huán)邊界加以限制,保證循環(huán)邊界都是常量。需要對循環(huán)邊界加以限制,保證循環(huán)邊界都是常量。/ X/ X檢測檢測for (index = 0; index size; index = index + 1) if

48、 (val index = 1bx) $display ( found an X);/ / 存儲器初始化存儲器初始化; “!= 0”; “!= 0”仿真效率高仿真效率高for (i = size; i != 0; i = i - 1) memory i- 1 = 0;/ / 階乘序列階乘序列factorial = 1;for (j = num; j != 0; j = j - 1) factorial = factorial * j;47循環(huán)語句的深入理解循環(huán)語句的深入理解 硬件電路并沒有循環(huán)電路原型,因此在使用循環(huán)語句硬件電路并沒有循環(huán)電路原型,因此在使用循環(huán)語句要十分小心,必須時刻考慮其可

49、綜合性。要十分小心,必須時刻考慮其可綜合性。 在硬件系統(tǒng)中,任何在硬件系統(tǒng)中,任何RTLRTL代碼都會占用資源,由于資代碼都會占用資源,由于資源有限,因此必須確保循環(huán)是有限循環(huán)。源有限,因此必須確保循環(huán)是有限循環(huán)。 在硬件中的在硬件中的forfor語句不會頻繁使用,原因:語句不會頻繁使用,原因:forfor語句需語句需要占用一定的硬件資源,另外要占用一定的硬件資源,另外forfor循環(huán)可通過計(jì)數(shù)器循環(huán)可通過計(jì)數(shù)器來代替。來代替。 因此,在因此,在VerilogVerilog中,使用循環(huán)語句要謹(jǐn)慎,畢竟描中,使用循環(huán)語句要謹(jǐn)慎,畢竟描述層次越抽象,將其轉(zhuǎn)化成硬件的難度越大,性能越述層次越抽象,將

50、其轉(zhuǎn)化成硬件的難度越大,性能越差,并且占用較大資源。差,并且占用較大資源。 另外在循環(huán)語句中出現(xiàn)的另外在循環(huán)語句中出現(xiàn)的變量都要采用阻塞賦值變量都要采用阻塞賦值,若,若采用非阻塞賦值,則會造成循環(huán)語句只執(zhí)行一次采用非阻塞賦值,則會造成循環(huán)語句只執(zhí)行一次。48特殊符號特殊符號 “ “#”#”特殊符號特殊符號 “ “#” #” 常用來表示延遲:常用來表示延遲: 在過程賦值語句時表示延遲。在過程賦值語句時表示延遲。例:例:initial begin #10 rst=1; #50 rstinitial begin #10 rst=1; #50 rst=0; =0; endend 在門級實(shí)例引用時表示延

51、遲。在門級實(shí)例引用時表示延遲。例:例:not #1 not1(nsel, selnot #1 not1(nsel, sel);); and #2 and2(a1, a, nsel and #2 and2(a1, a, nsel);); 在模塊實(shí)例引用時表示參數(shù)傳遞在模塊實(shí)例引用時表示參數(shù)傳遞 49在在test benchtest bench中使用簡單延時(中使用簡單延時(# #延時)施加激勵,或在行延時)施加激勵,或在行為模型中模擬實(shí)際延時。為模型中模擬實(shí)際延時。module muxtwo (out, a, b, sl); input a, b, sl; output out; reg out

52、; always ( sl or a or b) if (! sl) #10 out = a; / 從從a a到到outout延時延時1010個時間單位個時間單位 else #12 out = b;/從從b b到到outout延時延時1212個時間單位個時間單位endmodule在簡單延時中可以使用模塊參在簡單延時中可以使用模塊參數(shù)數(shù)parameter:module clock_gen (clk); output clk; reg clk; parameter cycle = 20; initial clk = 0; always #(cycle/2) clk = clk;endmodule特

53、殊符號特殊符號 “ “#”#”50特殊符號特殊符號 “ “” 事件控制是指指定信號的電平發(fā)生變化時發(fā)生事件控制是指指定信號的電平發(fā)生變化時發(fā)生指定的行為。指定的行為。 電平觸發(fā),可以單個信號,也可以多個信號。電平觸發(fā),可以單個信號,也可以多個信號。如果是多個信號,則信號名之間需要有關(guān)鍵字如果是多個信號,則信號名之間需要有關(guān)鍵字 “or” or” ,在,在20012001規(guī)范中,可用規(guī)范中,可用“,”來表示或來表示或關(guān)系。關(guān)系。 (a) (a) 行為語句;行為語句; ( a( a,b b,c ) c ) 行為語句;行為語句; (邊沿觸發(fā)事件邊沿觸發(fā)事件) 行為語句;行為語句; (邊沿觸發(fā)事件邊沿

54、觸發(fā)事件 or 邊沿觸發(fā)事件邊沿觸發(fā)事件 ) ) 行為語句;行為語句; posedge 信號(信號(多數(shù)為時鐘信號及復(fù)位多數(shù)為時鐘信號及復(fù)位) negedge 信號(信號(多數(shù)為時鐘信號及復(fù)位多數(shù)為時鐘信號及復(fù)位)51復(fù)習(xí)1 1、塊語句:、塊語句:begin-end,forkbegin-end,fork-join-join2 2、VerilogVerilog 語言提供了三種形式的語言提供了三種形式的ifif語句:語句: if ( if (表達(dá)式)表達(dá)式) 語句語句1 1; if ( if (表達(dá)式)表達(dá)式) 語句語句1 1; else else 語句語句2 2; if(if(表達(dá)式表達(dá)式1)

55、1) 語句語句1;1; else if( else if(表達(dá)式表達(dá)式2) 2) 語句語句2;2; else if( else if(表達(dá)式表達(dá)式3) 3) 語句語句3;3; . . else else if(if(表達(dá)式表達(dá)式m m) ) 語句語句m m; ; else else 語句語句m+1;m+1;52復(fù)習(xí)3 3、casecase語句是一種多分支選擇語句,語句是一種多分支選擇語句,casecase語句語句是控制表達(dá)式與另外一系列表達(dá)式分支是否匹配是控制表達(dá)式與另外一系列表達(dá)式分支是否匹配的一個多路條件語句。的一個多路條件語句。case (case (敏感表達(dá)式)敏感表達(dá)式) 分支表達(dá)式

56、分支表達(dá)式1 1:語句:語句1 1; 分支表達(dá)式分支表達(dá)式2 2:語句:語句2 2; 分支表達(dá)式分支表達(dá)式n n:語句:語句n n; default: default: 語句語句n+1;n+1;endcaseendcase 在在casezcasez語句中,語句中,? ?和和z z被當(dāng)作無關(guān)值被當(dāng)作無關(guān)值。 在在casexcasex語句中,語句中,? ?,z z 和和x x被當(dāng)作無關(guān)值被當(dāng)作無關(guān)值。53復(fù)習(xí)(循環(huán)語句)循環(huán)語句) 4 4、在、在VerilogVerilog HDL HDL中存在著四種類型的循環(huán)語句,用來中存在著四種類型的循環(huán)語句,用來控制執(zhí)行語句的執(zhí)行次數(shù)。控制執(zhí)行語句的執(zhí)行次數(shù)

57、。 foreverforever 連續(xù)的執(zhí)行語句。連續(xù)的執(zhí)行語句。 repeatrepeat 連續(xù)執(zhí)行一條語句連續(xù)執(zhí)行一條語句 n n 次。次。 whilewhile 執(zhí)行一條語句直到某個條件不滿足。如果執(zhí)行一條語句直到某個條件不滿足。如果一開始條件不滿足一開始條件不滿足( (為假為假) ),則語句一次也不被執(zhí)行。,則語句一次也不被執(zhí)行。 for for 通過以下三個步驟來決定語句的循環(huán)執(zhí)行。通過以下三個步驟來決定語句的循環(huán)執(zhí)行。先給控制循環(huán)次數(shù)的變量賦初值。先給控制循環(huán)次數(shù)的變量賦初值。判定控制循環(huán)表達(dá)式的值,如為假則跳出判定控制循環(huán)表達(dá)式的值,如為假則跳出循環(huán)語句,如為真則執(zhí)行指定語句后,

58、轉(zhuǎn)循環(huán)語句,如為真則執(zhí)行指定語句后,轉(zhuǎn)到第三步。到第三步。執(zhí)行一條賦值語句來修正控制循環(huán)變量次執(zhí)行一條賦值語句來修正控制循環(huán)變量次數(shù)的變量的值,然后返回第二步。數(shù)的變量的值,然后返回第二步。54過程語句過程語句 用于行為建模用于行為建模 兩種語句:兩種語句:pinitialinitialpalwaysalways 一個模塊內(nèi)可包含任意多個一個模塊內(nèi)可包含任意多個initial initial 和和alwaysalways語句,它們相互并行執(zhí)行,即它們語句,它們相互并行執(zhí)行,即它們的執(zhí)行順序與其在模塊中的順序無關(guān)的執(zhí)行順序與其在模塊中的順序無關(guān)55initialinitial語句語句 只執(zhí)行一次

59、只執(zhí)行一次 在模擬開始時執(zhí)行在模擬開始時執(zhí)行 帶順序過程的帶順序過程的initialinitial語句語句 regreg State,Reset; State,Reset; initial initial begin begin State=0; State=0; Reset=0; Reset=0; #5 Reset=1; #5 Reset=1; #10 Reset=0; #10 Reset=0; end end 56行為建模:使用行為建模:使用alwaysalways語句語句 alwaysalways語句格式如下:語句格式如下: always always alwaysalways語句是重復(fù)

60、執(zhí)行的,只有和一定的時序控制語句是重復(fù)執(zhí)行的,只有和一定的時序控制結(jié)合在一起才有用。結(jié)合在一起才有用。 如果一個如果一個alwaysalways語句沒有時序控制,則這個語句沒有時序控制,則這個alwaysalways語句將會生成一個仿真死鎖。語句將會生成一個仿真死鎖。 always aregalways areg = = aregareg; ; 此語句將在此語句將在0 0時刻無限循環(huán),形成仿真死鎖。時刻無限循環(huán),形成仿真死鎖。57alwaysalways語句兩種時序控制方式語句兩種時序控制方式1) 1) 時延控制時延控制 always #half_period clkalways #half_

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論