VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第3章_第1頁(yè)
VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第3章_第2頁(yè)
VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第3章_第3頁(yè)
VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第3章_第4頁(yè)
VerilogHDL數(shù)字設(shè)計(jì)教程(賀敬凱)第3章_第5頁(yè)
已閱讀5頁(yè),還剩199頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章 Verilog HDL常用建模方法 3.1 建模方法引例3.2 結(jié)構(gòu)化形式建模3.3 數(shù)據(jù)流級(jí)建模3.4 行為級(jí)建模3.5 小結(jié)習(xí)題3 第3章 Verilog HDL常用建模方法 3.1 建模方法引例建模方法引例下面通過(guò)一個(gè)典型數(shù)字電路實(shí)例來(lái)引入建模方法?!纠?-1】 設(shè)計(jì)實(shí)現(xiàn)一個(gè)3人判決電路,若3個(gè)人中有2人或者超過(guò)2人同意,則表決結(jié)果為通過(guò);否則表決結(jié)果為不通過(guò)。這是一道經(jīng)典的數(shù)字電路例題,下面我們來(lái)看一下數(shù)字電路中對(duì)該問(wèn)題的求解過(guò)程。第3章 Verilog HDL常用建模方法 第一步:理解題意。設(shè)a、b、c分別代表3個(gè)人,同意用1表示,不同意用0表示,y代表表決結(jié)果,1表示通過(guò),

2、0表示不通過(guò)。根據(jù)題意有,當(dāng)a、b、c三個(gè)中有2個(gè)為1,或者3個(gè)均為1時(shí),y為1,否則y為0。第二步:根據(jù)題意,列真值表,如表3-1所示。第3章 Verilog HDL常用建模方法 第3章 Verilog HDL常用建模方法 第三步:根據(jù)真值表,列輸出方程: y = abc + abc + abc + abc第四步:化簡(jiǎn)方程,可以采用代數(shù)化簡(jiǎn)法或者卡諾圖化簡(jiǎn)法(見(jiàn)圖3-1)。 圖3-1 卡諾圖化簡(jiǎn)第3章 Verilog HDL常用建模方法 化簡(jiǎn)后的方程為:y = ab + bc+ca。第五步:根據(jù)化簡(jiǎn)后的方程畫(huà)出電路圖,如圖3-2所示。圖3-2 例3-1的電路實(shí)現(xiàn)第3章 Verilog HDL

3、常用建模方法 至此解題完畢。以上五步,我們均可以采用Verilog HDL語(yǔ)言進(jìn)行數(shù)字電路建模,建模過(guò)程見(jiàn)例3-2至例3-6?!纠?-2】 對(duì)應(yīng)于步驟一的Verilog建模。 第3章 Verilog HDL常用建模方法 module decision_1(a,b,c,y);input a,b,c;output reg y;always (a,b,c)if(a&b=1)|(b&c=1)|(c&a=1)|(a&b&c=1) y=1;else y=0;endmodule使用Quartus 軟件綜合的結(jié)果如圖3-3所示。第3章 Verilog HDL常用建模方法

4、 圖3-3 例3-2的綜合結(jié)果第3章 Verilog HDL常用建模方法 【例3-3】 對(duì)應(yīng)于步驟二的Verilog建模。module decision_2(a,b,c,y);input a,b,c;output reg y;always (a,b,c)case(a,b,c)3b000: y=0;3b001: y=0;3b010: y=0;第3章 Verilog HDL常用建模方法 3b011: y=1;3b100: y=0;3b101: y=1;3b110: y=1;3b111: y=1;endcaseendmodule使用Quartus 軟件綜合的結(jié)果如圖3-4所示。第3章 Verilog

5、 HDL常用建模方法 圖3-4 例3-3的綜合結(jié)果第3章 Verilog HDL常用建模方法 【例3-4】 對(duì)應(yīng)于步驟三的Verilog建模。module decision_3(a,b,c,y);input a,b,c;output y;assign y=(a&b&c)|(a&b&c)|(a&b&c)|(a&b&c);endmodule使用Quartus 軟件綜合的結(jié)果如圖3-5所示。第3章 Verilog HDL常用建模方法 圖3-5 例3-4的綜合結(jié)果第3章 Verilog HDL常用建模方法 【例3-5】 對(duì)應(yīng)于步驟四的Ve

6、rilog建模。module decision_4(a,b,c,y);input a,b,c;output y;assign y=(a&b)|(b&c)|(c&a);endmodule使用Quartus 軟件綜合的結(jié)果如圖3-2所示。第3章 Verilog HDL常用建模方法 【例3-6】 對(duì)應(yīng)于步驟五的Verilog建模。module decision_5(a,b,c,y);input a,b,c;output y;/assign y=(a&b)+(b&c)+(c&a);/assign y=a&b+b&c;and (ab,a,b

7、), (bc,b,c), (ca,c,a);or (y,ab,bc,ca);endmodule使用Quartus 軟件綜合的結(jié)果如圖3-2所示。以上五步對(duì)應(yīng)著不同的建模方法,但其功能仿真波形都是相同的,如圖3-6所示。第3章 Verilog HDL常用建模方法 圖3-6 功能仿真波形第3章 Verilog HDL常用建模方法 從仿真波形可以看出,以上五種不同的建模方法均實(shí)現(xiàn)了判決功能,都是問(wèn)題的解決方法。對(duì)例3-2至例3-6的說(shuō)明:(1) 各種建模方法得出的電路圖不盡相同,但最終的仿真結(jié)果完全相同,也就是說(shuō),最終的電路實(shí)現(xiàn)不同,但功能卻相同。 第3章 Verilog HDL常用建模方法 (2)

8、 例3-2和例3-3采用了行為建模方式建模,用到了always語(yǔ)句;例3-4和例3-5采用了數(shù)據(jù)流建模方式建模,用到了assign語(yǔ)句;例3-6采用了門(mén)級(jí)建模方式建模,調(diào)用了門(mén)級(jí)原語(yǔ)。這三種建模方式是Verilog HDL最主要的建模方式。在一個(gè)模塊中,可以采用以上三種建模方式的一種建模,也可以采用多種方式混合建模。本章后續(xù)內(nèi)容還要對(duì)上述三種建模方式展開(kāi)討論。第3章 Verilog HDL常用建模方法 (3) 例3-2用到了條件語(yǔ)句if,例3-3用到多路分支語(yǔ)句case,這些語(yǔ)句只能用在always語(yǔ)句中,也就是只能用在行為建模中;assign語(yǔ)句是數(shù)據(jù)流建模的標(biāo)志;模塊調(diào)用類(lèi)似于門(mén)級(jí)原語(yǔ)調(diào)用

9、,均歸屬結(jié)構(gòu)化建模。(4) 從以上例子也可以看出,從門(mén)級(jí)建模到數(shù)據(jù)流建模再到行為建模,建模抽象程度越來(lái)越高,距離電路的具體實(shí)現(xiàn)越來(lái)越遠(yuǎn),但是也越來(lái)越接近人類(lèi)解決問(wèn)題的思維。 第3章 Verilog HDL常用建模方法 3.2 結(jié)構(gòu)化形式建模結(jié)構(gòu)化形式建模在Verilog HDL中可使用如下方式描述結(jié)構(gòu):(1) 開(kāi)關(guān)級(jí)原語(yǔ)(在晶體管級(jí))開(kāi)關(guān)級(jí)建模。(2) 內(nèi)置門(mén)原語(yǔ)(在門(mén)級(jí))門(mén)級(jí)建模。(3) 用戶(hù)定義的原語(yǔ)。(4) 模塊實(shí)例(創(chuàng)建層次結(jié)構(gòu))。上述幾種結(jié)構(gòu)化描述方式之中,比較常用的是門(mén)級(jí)建模、用戶(hù)自定義原語(yǔ)和模塊實(shí)例。而模塊實(shí)例化已在第2章中進(jìn)行了介紹,下面僅就門(mén)級(jí)建模和用戶(hù)自定義原語(yǔ)作詳細(xì)介紹。

10、第3章 Verilog HDL常用建模方法 3.2.1 門(mén)級(jí)建模門(mén)級(jí)建模簡(jiǎn)單的邏輯電路可以使用邏輯門(mén)來(lái)設(shè)計(jì)實(shí)現(xiàn)?;镜倪壿嬮T(mén)分為兩類(lèi):與/或門(mén)類(lèi)、緩沖/非門(mén)類(lèi)。1. 與與/或門(mén)類(lèi)或門(mén)類(lèi)與/或門(mén)類(lèi)包括與門(mén)(and)、或門(mén)(or)、與非門(mén)(nand)、或非門(mén)(nor)、異或門(mén)(xor)、同或門(mén)(xnor)。與/或門(mén)類(lèi)都具有一個(gè)標(biāo)量輸出端和多個(gè)標(biāo)量輸入端,門(mén)的端口列表中的第一個(gè)端口必定是輸出端口,其他均為輸入端口。當(dāng)任意一個(gè)輸入端口的值發(fā)生變化時(shí),輸出端的值立即重新計(jì)算。第3章 Verilog HDL常用建模方法 與/或門(mén)類(lèi)的實(shí)例引用:wire OUT,IN1,IN2,IN3;and and2(OU

11、T,IN1,IN2); /基本門(mén)的實(shí)例引用nand nand3(OUT,IN1,IN2,IN3); /輸入端超過(guò)兩個(gè),三輸入與非門(mén)and (OUT,IN1,IN2,IN3); /合法的門(mén)實(shí)例引用,不給實(shí)例命名 第3章 Verilog HDL常用建模方法 2. 緩沖緩沖/非門(mén)類(lèi)非門(mén)類(lèi)緩沖/非門(mén)類(lèi)包括緩沖器(buf)、非門(mén)(not)、帶控制端的緩沖器/非門(mén)(bufif1、bufif0、notif1、notif0)。緩沖/非門(mén)類(lèi)具有一個(gè)標(biāo)量輸入端和多個(gè)標(biāo)量輸出端,門(mén)的端口列表中的最后一個(gè)端口必定是輸入端口,其他均為輸出端口。緩沖/非門(mén)類(lèi)的實(shí)例引用:第3章 Verilog HDL常用建模方法 wire

12、 OUT1,OUT2,OUT3,IN,ctrl;buf b1(OUT1,IN); /基本門(mén)的實(shí)例引用not n1(OUT1,IN); /基本門(mén)的實(shí)例引用buf b2(OUT1,OUT2,OUT3,IN); /輸出端超過(guò)兩個(gè),三輸出緩沖not (OUT1,OUT2,IN); /合法的門(mén)實(shí)例引用,不給實(shí)例命名bufif1(OUT1,IN,ctrl); /ctrl為1時(shí),OUT1=INnotif0(OUT1,IN,ctrl); / ctrl為0時(shí),OUT1=IN第3章 Verilog HDL常用建模方法 【例3-7】 利用雙輸入端的nand門(mén),編寫(xiě)自己的雙輸入端的與門(mén)(my_and)、或門(mén)(my_o

13、r)、非門(mén)(my_not)、異或門(mén)(my_xor)。module my_and(a,b,y); /用兩個(gè)nand門(mén)實(shí)現(xiàn)與門(mén)input a,b;output y; wire nandab;nand(nandab,a,b), (y,nandab,nandab);endmodule第3章 Verilog HDL常用建模方法 module my_or(a,b,y); /用三個(gè)nand門(mén)實(shí)現(xiàn)或門(mén)input a,b;output y; wire nandaa,nandbb;nand(nandaa,a,a), (nandbb,b,b), (y,nandaa,nandbb);endmodule第3章 Veri

14、log HDL常用建模方法 module my_not(a,y); /用一個(gè)nand門(mén)實(shí)現(xiàn)非門(mén)input a;output y; nand(y,a,a);endmodule第3章 Verilog HDL常用建模方法 module my_xor(a,b,y); /用四個(gè)nand門(mén)實(shí)現(xiàn)異或門(mén)input a,b;output y; wire andab,c,d;nand(andab,a,b),(c,andab,a),(d,andab,b),(y,c,d);endmodule 第3章 Verilog HDL常用建模方法 程序說(shuō)明:(1) 在以上示例中,調(diào)用門(mén)級(jí)原語(yǔ)時(shí)均沒(méi)有給出實(shí)例名。注意,在門(mén)級(jí)原語(yǔ)實(shí)

15、例引用的時(shí)候,我們可以不指定具體的實(shí)例名,這一點(diǎn)對(duì)需要實(shí)例引用幾百個(gè)甚至更多門(mén)的模塊提供了方便。但對(duì)于初學(xué)者,建議在調(diào)用門(mén)級(jí)原語(yǔ)時(shí)給出實(shí)例名。(2) 在實(shí)際應(yīng)用中,與非門(mén)和或非門(mén)的應(yīng)用更為普遍,這是因?yàn)橛蛇@兩種門(mén)生成其他邏輯門(mén)較容易實(shí)現(xiàn)。第3章 Verilog HDL常用建模方法 (3) 例子中有4個(gè)模塊,分別實(shí)現(xiàn)與門(mén)、或門(mén)、非門(mén)、異或門(mén),可在多模塊編譯環(huán)境Quartus 中逐個(gè)模塊編譯并進(jìn)行仿真驗(yàn)證,這部分工作留給讀者完成。邏輯門(mén)是最基本的電路單元,任何復(fù)雜的數(shù)字邏輯電路均可由邏輯門(mén)實(shí)現(xiàn)。但復(fù)雜電路的設(shè)計(jì)如果從邏輯門(mén)開(kāi)始來(lái)搭建,顯然是不現(xiàn)實(shí)的,必須采用其他建模方式 。第3章 Verilog

16、HDL常用建模方法 3.2.2 用戶(hù)自定義原語(yǔ)用戶(hù)自定義原語(yǔ)Verilog HDL提供了一整套標(biāo)準(zhǔn)的原語(yǔ),例如and、or、nor和not等,它們是該語(yǔ)言的一部分,即通常所說(shuō)的內(nèi)置原語(yǔ)。然而,在設(shè)計(jì)過(guò)程中,設(shè)計(jì)者有時(shí)希望使用自己編寫(xiě)的原語(yǔ)。Verilog HDL具有這種自定義原語(yǔ)的能力,這種原語(yǔ)就是用戶(hù)自定義原語(yǔ)(User Defined Primitive,UDP)。UDP是自成體系的,在UDP中不能調(diào)用其他模塊或者其他原語(yǔ)。UDP的調(diào)用方式和門(mén)級(jí)原語(yǔ)的調(diào)用方式完全相同。第3章 Verilog HDL常用建模方法 UDP有兩類(lèi):(1) 表示組合邏輯的UDP:輸出僅取決于輸入信號(hào)的組合邏輯。(

17、2) 表示時(shí)序邏輯的UDP:下一個(gè)輸出值不但取決于當(dāng)前的輸入值,還取決于當(dāng)前的內(nèi)部狀態(tài)。UDP的語(yǔ)法定義如下:第3章 Verilog HDL常用建模方法 primitive UDP名稱(chēng) (,);/端口說(shuō)明語(yǔ)句output ;input ;reg ;(可選,只有表示時(shí)序邏輯的UDP才需要)/UDP初始化(只有時(shí)序邏輯才需要)第3章 Verilog HDL常用建模方法 Initial = /UDP狀態(tài)表tableendtableendprimitive下面舉例對(duì)這兩類(lèi)UDP進(jìn)行說(shuō)明。第3章 Verilog HDL常用建模方法 【例3-8】 表示組合邏輯的UDP舉例:一位全加器。全加器進(jìn)位實(shí)現(xiàn)部分:

18、primitive U_ADD_C(CO, A, B, CI); output CO; input A, B, CI; table / A B CI : CO 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1; 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0; endtableendprimitive第3章 Verilog HDL常用建模方法 全加器求和實(shí)現(xiàn)部分:primitive U_ADD_S(S, A, B,CI); output S; input A, B, CI; table / A B CI : S 0 0 0 : 0; 0 0 1 : 1; 0 1

19、0 : 1; 0 1 1 : 0; 1 0 0 : 1; 1 0 1 : 0; 1 1 0 : 0; 1 1 1 : 1; endtableendprimitive第3章 Verilog HDL常用建模方法 調(diào)用上述兩個(gè)UDP的全加器模塊:module U_ADD(SUM,CO,a, b,ci);input a, b,ci;output SUM,CO;U_ADD_S U1(SUM, a, b,ci);U_ADD_C U2(CO,a, b,ci);endmodule第3章 Verilog HDL常用建模方法 程序說(shuō)明:(1) 若使用UDP設(shè)計(jì)全加器,僅需要兩個(gè) UDP來(lái)描述全加器的邏輯功能;而使

20、用Verilog HDL原語(yǔ)元件,則需要多個(gè)Verilog HDL提供的基本門(mén)級(jí)原語(yǔ)元件。當(dāng)設(shè)計(jì)需要使用大量全加器時(shí),采用UDP來(lái)表示全加器,將大大減少內(nèi)存的需要,事件的數(shù)目將大大降低。(2) 兩個(gè)UDP的端口列表中,第一個(gè)端口CO和S均為輸出端口,其余端口均為輸入端口。(3) 程序中的“?”表示邏輯值可以為0、1或x。(4) 使用Quartus 軟件綜合的結(jié)果如圖3-7所示。 第3章 Verilog HDL常用建模方法 圖3-7 一位全加器的綜合結(jié)果第3章 Verilog HDL常用建模方法 其仿真波形如圖3-8所示。圖3-8 一位全加器的仿真波形第3章 Verilog HDL常用建模方法

21、從仿真波形可以看出,該設(shè)計(jì)實(shí)現(xiàn)了一位全加器的功能。【例3-9】 表示時(shí)序邏輯的UDP舉例:D觸發(fā)器。primitive d_edge_ff (q, clk, data); output q; input clk, data; reg q; table / clk dat state next(01) 0 : ? : 0 ;(01) 1 : ? : 1 ;/時(shí)鐘下降沿第3章 Verilog HDL常用建模方法 (?0) ? : ? : - ; /時(shí)鐘穩(wěn)定時(shí)忽略data的變化? (?) : ? : - ; endtableendprimitive程序說(shuō)明:(1) 使用Quartus 軟件綜合的結(jié)果

22、如圖3-9所示。 第3章 Verilog HDL常用建模方法 圖3-9 D觸發(fā)器的綜合結(jié)果第3章 Verilog HDL常用建模方法 從綜合結(jié)果可以看出,該設(shè)計(jì)實(shí)現(xiàn)了一個(gè)D觸發(fā)器。(2) 程序中的“?”表示邏輯值可以為0、1或x。(3) 端口列表中的第一個(gè)端口q為輸出端口,其余為輸入端口。對(duì)用戶(hù)自定義原語(yǔ)的進(jìn)一步說(shuō)明:(1) UDP只能有一個(gè)輸出,輸出端口必須列為端口列表的第一個(gè)。如果在功能上要求有多個(gè)輸出,則需要在UDP輸出端連接其他的基本單元,或者同時(shí)使用幾個(gè)UDP。(2) UDP可以有110個(gè)輸入。若輸入端口超過(guò)5,則存儲(chǔ)需求會(huì)大幅增加。表3-2列出輸入端口數(shù)與存儲(chǔ)需求的關(guān)系。第3章 V

23、erilog HDL常用建模方法 第3章 Verilog HDL常用建模方法 (3) 所有端口必須為標(biāo)量且不允許是雙向端口。(4) 不支持邏輯值z(mì)。第3章 Verilog HDL常用建模方法 3.3 數(shù)據(jù)流級(jí)建模數(shù)據(jù)流級(jí)建模在電路規(guī)模較小的情況下,由于包含的門(mén)數(shù)比較少,因此使用門(mén)級(jí)建模進(jìn)行設(shè)計(jì)不僅直觀,而且方便。但是,如果電路的功能比較復(fù)雜,則通常該電路包含的邏輯門(mén)的個(gè)數(shù)會(huì)很多,這時(shí)使用門(mén)級(jí)建模不僅繁瑣而且很容易出錯(cuò)。在這種情況下,如果從更高抽象層次入手,將設(shè)計(jì)重點(diǎn)放在功能實(shí)現(xiàn)上,則不僅能避免繁瑣的細(xì)節(jié),還可以大大提高設(shè)計(jì)的效率。本節(jié)介紹更高抽象層次的建模方法:數(shù)據(jù)流建模。 第3章 Veril

24、og HDL常用建模方法 3.3.1 連續(xù)賦值語(yǔ)句以關(guān)鍵詞assign開(kāi)始的語(yǔ)句為連續(xù)賦值語(yǔ)句,連續(xù)賦值語(yǔ)句是Verilog數(shù)據(jù)流建模的基本語(yǔ)句,用于對(duì)線網(wǎng)進(jìn)行賦值?!纠?-10】 使用數(shù)據(jù)流建模,實(shí)現(xiàn)一位半加器。解題指引:半加器實(shí)現(xiàn)的是不帶進(jìn)位的兩個(gè)數(shù)的相加,若半加器的輸入為ain和bin,輸出為sum和co,其中sum為和,co為進(jìn)位,則半加器的真值表如表3-3所示。 第3章 Verilog HDL常用建模方法 第3章 Verilog HDL常用建模方法 Verilog HDL實(shí)現(xiàn)代碼如下:module adder_half(ain,bin,sum,co); input ain,bin;

25、output sum,co;assign co,sum= ain+bin;endmodule第3章 Verilog HDL常用建模方法 程序說(shuō)明:(1) assign co,sum= ain+bin; 是一條連續(xù)賦值語(yǔ)句,它將ain和bin的和存放在co,sum中。該語(yǔ)句中,“ ”為位拼接符,其功能是將co和sum拼接成一個(gè)兩位的數(shù)。(2) 連續(xù)賦值語(yǔ)句的左邊必須是一個(gè)標(biāo)量或向量線網(wǎng),或者是標(biāo)量或向量線網(wǎng)的拼接,而不能是任何形式的寄存器。例如下面的形式是非法的:reg sum;assign co,sum= ain+bin; /非法,sum不能為寄存器類(lèi)型 第3章 Verilog HDL常用建模

26、方法 對(duì)連續(xù)賦值語(yǔ)句的進(jìn)一步說(shuō)明:(1) 連續(xù)賦值語(yǔ)句的基本元素是表達(dá)式、運(yùn)算符和操作數(shù)。其功能是計(jì)算右側(cè)表達(dá)式的值,然后賦給左邊變量。表達(dá)式由運(yùn)算符和操作數(shù)構(gòu)成,根據(jù)運(yùn)算符界定的功能對(duì)操作數(shù)進(jìn)行運(yùn)算后得出結(jié)果。數(shù)據(jù)流的強(qiáng)大建模能力體現(xiàn)在多種運(yùn)算符類(lèi)型上。下一節(jié)我們將詳細(xì)介紹運(yùn)算符類(lèi)型。第3章 Verilog HDL常用建模方法 (2) 連續(xù)賦值語(yǔ)句總是處于激活狀態(tài)。只要任意一個(gè)操作數(shù)發(fā)生變化,表達(dá)式就會(huì)被立即重新計(jì)算,并且將結(jié)果賦給等號(hào)左邊的線網(wǎng)。(3) 操作數(shù)可以是標(biāo)量或向量線網(wǎng),也可以是標(biāo)量或向量寄存器。 第3章 Verilog HDL常用建模方法 3.3.2 運(yùn)算符類(lèi)型運(yùn)算符類(lèi)型Ver

27、ilog HDL提供了許多類(lèi)型的運(yùn)算符,分別是算術(shù)、關(guān)系、邏輯、按位、縮減、條件、移位和位拼接運(yùn)算符。表3-4按運(yùn)算符類(lèi)型列出了常用的運(yùn)算符。 第3章 Verilog HDL常用建模方法 第3章 Verilog HDL常用建模方法 從表3-4可知,在Verilog HDL語(yǔ)言中運(yùn)算符所帶的操作數(shù)是不同的。只帶一個(gè)操作數(shù)的運(yùn)算符稱(chēng)為單目運(yùn)算符,此時(shí)操作數(shù)需放在運(yùn)算符的右邊;帶二個(gè)操作數(shù)的運(yùn)算符稱(chēng)為雙目運(yùn)算符,操作數(shù)需放在運(yùn)算符的兩邊;帶三個(gè)操作數(shù)的運(yùn)算符稱(chēng)為三目運(yùn)算符,這三個(gè)操作數(shù)用三目運(yùn)算符分隔開(kāi),如條件運(yùn)算符就是三目運(yùn)算符。表達(dá)式中的操作數(shù)可以是以下類(lèi)型中的一種:常數(shù)、參數(shù)、線網(wǎng)、寄存器、位

28、選擇、部分選擇、存儲(chǔ)器單元和函數(shù)調(diào)用。下面對(duì)表3-4中的運(yùn)算符分別加以介紹。 第3章 Verilog HDL常用建模方法 1. 算術(shù)運(yùn)算符算術(shù)運(yùn)算符算術(shù)運(yùn)算符包括加(+)、減(-)、乘(*)、除(/)、取模(%)、乘方(*)?!纠?-11】 算術(shù)運(yùn)算符示例。module arith(a,b,add,sub,mul,div,mod,pow);input7:0 a,b;output7:0 add,sub,mul,div,mod,pow;assign add=a+b,第3章 Verilog HDL常用建模方法 sub=a-b,mul=a*b,div=a/b,mod=a%b,pow=a*4;endmo

29、dule第3章 Verilog HDL常用建模方法 程序說(shuō)明:(1) 加(+)、減(-)、乘(*)、除(/)、取模(%)、乘方(*)均為雙目運(yùn)算符,要求運(yùn)算符兩側(cè)均有操作數(shù)。(2) 該例仿真時(shí)可以設(shè)置在0255內(nèi)的任意輸入值a和b,觀察add、sub、mul、div、mod、pow值的變化。(3) 乘方運(yùn)算符要求冪是一個(gè)常量,不能為變量。第3章 Verilog HDL常用建模方法 對(duì)于算術(shù)運(yùn)算符的進(jìn)一步說(shuō)明:(1) 在進(jìn)行整數(shù)除法運(yùn)算時(shí),結(jié)果值要略去小數(shù)部分,只取整數(shù)部分。 (2) 取模運(yùn)算符又稱(chēng)為求余運(yùn)算符,要求兩側(cè)均為整型數(shù)據(jù)。(3) 取模運(yùn)算時(shí),結(jié)果值的符號(hào)位采用模運(yùn)算式里第一個(gè)操作數(shù)的

30、符號(hào)位。表3-5中列舉了一些例子。 第3章 Verilog HDL常用建模方法 第3章 Verilog HDL常用建模方法 2. 關(guān)系運(yùn)算符關(guān)系運(yùn)算符關(guān)系運(yùn)算符包括大于()、小于(=)、小于等于(=)、等于(=)、不等于(!=)。在進(jìn)行關(guān)系運(yùn)算時(shí),如果聲明的關(guān)系是假的(flase),則返回值是0,如果聲明的關(guān)系是真的(true),則返回值是1。關(guān)系運(yùn)算符中大于、小于、大于等于、小于等于有著相同的優(yōu)先級(jí)別,等于、不等于有著相同的優(yōu)先級(jí)別,前者的優(yōu)先級(jí)別大于后者的優(yōu)先級(jí)別。關(guān)系運(yùn)算符的優(yōu)先級(jí)別低于算術(shù)運(yùn)算符的優(yōu)先級(jí)別。例如: 第3章 Verilog HDL常用建模方法 a = size-1 /這種

31、表達(dá)方式等同于:a =(size-1)size - ( 1 = a ) /這種表達(dá)方式不等同于:size - 1 = aa size-1 /這種表達(dá)方式等同于:a (size-1)size - ( 1 a ) /這種表達(dá)方式不等同于:size - 1 a從上面的例子可以看出這兩種不同運(yùn)算符的優(yōu)先級(jí)別。當(dāng)表達(dá)式size-(1a)進(jìn)行運(yùn)算時(shí),關(guān)系表達(dá)式先運(yùn)算,然后返回結(jié)果值0或1被size減去。而當(dāng)表達(dá)式 size1b)&(bc)、(ab)|(bb)。表3-6為邏輯運(yùn)算的真值表。它表示當(dāng)a和b的值為不同的組合時(shí),各種邏輯運(yùn)算所得到的值。 第3章 Verilog HDL常用建模方法 第3章

32、Verilog HDL常用建模方法 邏輯運(yùn)算符中“&”和“|”的優(yōu)先級(jí)別低于關(guān)系運(yùn)算符,“!”高于算術(shù)運(yùn)算符。例如:(ab)&(xy)/可寫(xiě)成: ab & xy(a=b)|(x=y)/可寫(xiě)成:a=b | x=y(!a)|(ab)/可寫(xiě)成: !a | ab第3章 Verilog HDL常用建模方法 4. 按位運(yùn)算符按位運(yùn)算符按位運(yùn)算符包括取反()、按位與(&)、按位或(|)、按位異或()、按位同或(,)。位運(yùn)算符中除了是單目運(yùn)算符以外,其余均為雙目運(yùn)算符。位運(yùn)算符中的雙目運(yùn)算符要求對(duì)兩個(gè)操作數(shù)的相應(yīng)位進(jìn)行運(yùn)算操作。表3-7給出了按位操作的邏輯規(guī)則。第3章 Veri

33、log HDL常用建模方法 第3章 Verilog HDL常用建模方法 對(duì)按位運(yùn)算符的幾點(diǎn)說(shuō)明:(1) 兩個(gè)長(zhǎng)度不同的數(shù)據(jù)進(jìn)行位運(yùn)算時(shí),系統(tǒng)會(huì)自動(dòng)將兩者按右端對(duì)齊。位數(shù)少的操作數(shù)會(huì)在相應(yīng)的高位用0填滿(mǎn),以使兩個(gè)操作數(shù)按位進(jìn)行操作。(2) 按位運(yùn)算符與邏輯運(yùn)算符雖然符號(hào)相近,但兩者完全不同。邏輯運(yùn)算符執(zhí)行邏輯操作,運(yùn)算的結(jié)果是一個(gè)邏輯值0或1;按位運(yùn)算符產(chǎn)生一個(gè)跟較長(zhǎng)位寬操作數(shù)等寬的數(shù)值,該數(shù)值的每一位都是兩個(gè)操作數(shù)按位運(yùn)算的結(jié)果。 第3章 Verilog HDL常用建模方法 5. 縮減運(yùn)算符縮減運(yùn)算符縮減運(yùn)算符包括縮減與(&)、縮減與非(&)、縮減或(|)、縮減或非(|)、縮減

34、異或()、縮減同或(,)??s減運(yùn)算符是單目運(yùn)算符,也有與、或、非運(yùn)算。其與、或、非運(yùn)算規(guī)則類(lèi)似于位運(yùn)算符的與、或、非運(yùn)算規(guī)則,但其運(yùn)算過(guò)程不同。位運(yùn)算是對(duì)操作數(shù)的相應(yīng)位進(jìn)行與、或、非運(yùn)算,操作數(shù)是幾位數(shù),運(yùn)算結(jié)果也是幾位數(shù)。而縮減運(yùn)算則不同,縮減運(yùn)算是對(duì)單個(gè)操作數(shù)進(jìn)行與、或、非遞推運(yùn)算,最后的運(yùn)算結(jié)果是一位二進(jìn)制數(shù)。第3章 Verilog HDL常用建模方法 縮減運(yùn)算的具體運(yùn)算過(guò)程是這樣的:第一步先將操作數(shù)的第一位與第二位進(jìn)行與、或、非運(yùn)算,第二步將運(yùn)算結(jié)果與第三位進(jìn)行與、或、非運(yùn)算,依次類(lèi)推,直至最后一位。例如:reg 3:0 B;reg C;C = &B; /C =( (B0&am

35、p;B1) & B2 ) & B3;由于邏輯運(yùn)算符、按位運(yùn)算符、縮減運(yùn)算符都使用相同的符號(hào)表示,因此有時(shí)容易混淆。區(qū)分這些運(yùn)算符的重點(diǎn)在于分清操作數(shù)的數(shù)目和運(yùn)算的規(guī)則。 第3章 Verilog HDL常用建模方法 6. 條件運(yùn)算符條件運(yùn)算符條件運(yùn)算符(?:)帶有三個(gè)操作數(shù),其格式為:條件表達(dá)式 ? 真表達(dá)式 : 假表達(dá)式;執(zhí)行過(guò)程為:首先計(jì)算條件表達(dá)式,如果為真,則計(jì)算真表達(dá)式的值;如果為假,則計(jì)算假表達(dá)式的值。條件運(yùn)算符可以嵌套使用,每個(gè)真表達(dá)式或假表達(dá)式也可以是一個(gè)條件運(yùn)算符表達(dá)式。條件表達(dá)式的作用相當(dāng)于控制開(kāi)關(guān)。 第3章 Verilog HDL常用建模方法 【例3-12】

36、 試用條件運(yùn)算符來(lái)實(shí)現(xiàn)一個(gè)四選一多路選擇器。Verilog實(shí)現(xiàn)代碼如下:module mux4to1(out,condition1,condition2,in1,in2,in3,in4);output out;input in1,in2,in3,in4;input condition1,condition2;assign out=(condition1) ? (condition2? in1 : in2) : (condition2? in3 : in4);endmodule第3章 Verilog HDL常用建模方法 程序說(shuō)明:(1) assign out=(condition1) ? (co

37、ndition2? in1 : in2) : (condition2? in3 : in4); 在真表達(dá)式和假表達(dá)式中均嵌套了一個(gè)條件運(yùn)算符表達(dá)式。程序的運(yùn)算過(guò)程如下:首先判斷condition1是否為真,若為真則計(jì)算(condition2? in1 : in2),否則計(jì)算(condition2? in3 : in4),然后按照同樣的規(guī)則計(jì)算這兩個(gè)條件運(yùn)算符表達(dá)式。 第3章 Verilog HDL常用建模方法 (2) 本代碼實(shí)現(xiàn)了一個(gè)四選一多路選擇器,輸出由條件condition1和condition2決定。根據(jù)代碼可以得出,當(dāng)condition2, condition1為2b11時(shí)選擇in1

38、,為2b10時(shí)選擇in3,為2b01時(shí)選擇in2,為2b00時(shí)選擇in4。第3章 Verilog HDL常用建模方法 7. 移位運(yùn)算符移位運(yùn)算符移位運(yùn)算符包括左移位運(yùn)算符()。其使用方法如下:a n 或 a n其中,a代表要進(jìn)行移位的操作數(shù),n代表要移幾位。這兩種移位運(yùn)算都用0來(lái)填補(bǔ)移出的空位。第3章 Verilog HDL常用建模方法 【例3-13】 采用移位運(yùn)算符實(shí)現(xiàn)2個(gè)3位數(shù)的乘法。解題指引:設(shè)a為3位乘數(shù),用a2a1a0表示,設(shè)b為3位被乘數(shù),用b2b1b0表示,乘法運(yùn)算過(guò)程如圖3-10所示。 圖3-10 乘法的運(yùn)算過(guò)程第3章 Verilog HDL常用建模方法 乘法的最后是把5列分別

39、求和得到5位的積。根據(jù)以上運(yùn)算過(guò)程可以看出,乘法的最后也可以這樣進(jìn)行,將最后3行代表的3個(gè)數(shù)相加,當(dāng)然第2行相對(duì)第1行要左移1位,第3行相對(duì)第1行要左移2位。Verilog HDL實(shí)現(xiàn)代碼如下: 第3章 Verilog HDL常用建模方法 module mul_3bit(a,b,mul);input 2:0 a,b;output5:0 mul;wire5:0 mul1,mul2,mul3;assign mul=mul3;assign mul1= b0? a : 0;assign mul2= b1? (mul1+(a1) : mul1;assign mul3= b2? (mul2+(a2) :

40、mul2;endmodule第3章 Verilog HDL常用建模方法 程序說(shuō)明:(1) wire5:0 mul1,mul2,mul3;定義了3個(gè)中間變量,mul1用于存放第1行的值,mul2用于存放第1行和第2行的和,mul3用于存放所有3行的和。(2) 本例為2個(gè)3位數(shù)相乘,我們可以采用數(shù)據(jù)流建模方式來(lái)完成。如果位數(shù)較多,比如位數(shù)為64位,采用數(shù)據(jù)流建模則顯得繁瑣,此時(shí)可采用循環(huán)語(yǔ)句來(lái)完成此算法,即采用更高抽象級(jí)的行為建模。第3章 Verilog HDL常用建模方法 (3) 從本例可看出,由于移位運(yùn)算符可以用來(lái)實(shí)現(xiàn)移位操作、乘法算法的移位相加以及其他許多有用的操作,因此在具體設(shè)計(jì)中是很有用

41、處的。另外,進(jìn)行移位運(yùn)算時(shí)應(yīng)注意移位前后變量的位數(shù),例如:4b10011=5b10010,4b10012 = 6b100100,12;(2) y=3+22;計(jì)算結(jié)果為: x=1,y=1程序說(shuō)明: 第3章 Verilog HDL常用建模方法 (1) x=(a=2) ? a|b : b2; 用到了相等運(yùn)算符(=)、按位運(yùn)算符(、|)、移位運(yùn)算符()和條件運(yùn)算符(?:)。小括號(hào)優(yōu)先級(jí)最高,在計(jì)算時(shí)首先計(jì)算小括號(hào)內(nèi)的表達(dá)式的值,然后再按優(yōu)先級(jí)求其他表達(dá)式的值。按照其優(yōu)先級(jí)先求a,因a=1且為4位wire類(lèi)型,所以a=4b1110,然后可求出條件運(yùn)算符的一個(gè)操作數(shù)a|b的值為4b1111;而條件運(yùn)算符的

42、另一個(gè)操作數(shù)b2的結(jié)果為4b0001。根據(jù)題意,條件運(yùn)算符的條件為假,所以x的值為4b0001。第3章 Verilog HDL常用建模方法 (2) y=3+22; 用到了算術(shù)運(yùn)算符(+)和移位運(yùn)算符()。根據(jù)優(yōu)先級(jí),y=3+22; 等價(jià)于y=(3+2)2;,所以y的值為4b0001。(3) 事實(shí)上,由于運(yùn)算符的優(yōu)先級(jí)被忽視或混淆而造成錯(cuò)誤的情況經(jīng)常發(fā)生。為了避免源于運(yùn)算符優(yōu)先級(jí)的運(yùn)算錯(cuò)誤,在不確定運(yùn)算符優(yōu)先級(jí)的情況下,建議讀者使用小括號(hào)將各個(gè)表達(dá)式分開(kāi)。另外,使用括號(hào)也可以提高程序的可讀性,明確表達(dá)各運(yùn)算符間的優(yōu)先關(guān)系。 第3章 Verilog HDL常用建模方法 3.4 行行為為級(jí)級(jí)建建模模

43、Verilog HDL支持從算法的角度,即從電路外部行為的角度對(duì)其進(jìn)行描述,因此行為級(jí)建模是從一個(gè)很高的抽象層次來(lái)表示電路的。在這個(gè)層次上進(jìn)行數(shù)字系統(tǒng)設(shè)計(jì)類(lèi)似于使用C語(yǔ)言編程,而且Verilog HDL行為建模的語(yǔ)法結(jié)構(gòu)和C語(yǔ)言相當(dāng)類(lèi)似。Verilog HDL提供了許多行為級(jí)建模語(yǔ)法結(jié)構(gòu),為設(shè)計(jì)者提供了很大的靈活性。第3章 Verilog HDL常用建模方法 3.4.1 結(jié)構(gòu)化過(guò)程語(yǔ)句結(jié)構(gòu)化過(guò)程語(yǔ)句alwaysalways語(yǔ)句是行為建模的基本語(yǔ)句,每個(gè)always語(yǔ)句代表一個(gè)獨(dú)立的執(zhí)行過(guò)程,也稱(chēng)為進(jìn)程。與C語(yǔ)言不同,Verilog HDL的各個(gè)always進(jìn)程是并發(fā)執(zhí)行的,而不是順序執(zhí)行的。第

44、3章 Verilog HDL常用建模方法 always語(yǔ)句包括的所有行為語(yǔ)句構(gòu)成了一個(gè)always語(yǔ)句塊。每個(gè)always語(yǔ)句塊在滿(mǎn)足一定的條件后即執(zhí)行其中的第一條語(yǔ)句,然后順序執(zhí)行隨后的語(yǔ)句,直到最后一條語(yǔ)句執(zhí)行完后,再次等待always語(yǔ)句塊的執(zhí)行條件,等條件滿(mǎn)足后又從第一條語(yǔ)句開(kāi)始執(zhí)行,循環(huán)往復(fù)。因此,always語(yǔ)句通常用于對(duì)數(shù)字電路中一組反復(fù)執(zhí)行的活動(dòng)進(jìn)行建模。 第3章 Verilog HDL常用建模方法 【例3-15】 使用always語(yǔ)句描述D觸發(fā)器。module mydff(q, clk, d);input clk, d;output q; reg q;always (pose

45、dge clk) q=d;endmodule程序說(shuō)明:第3章 Verilog HDL常用建模方法 (1) 本程序的功能是在時(shí)鐘上升沿時(shí)刻,將數(shù)據(jù)d賦予觸發(fā)器輸出q,其功能同D觸發(fā)器一樣。(2) always語(yǔ)句由于其不斷重復(fù)執(zhí)行的特性,只有和一定的時(shí)序控制結(jié)合在一起才有用。always (posedge clk)語(yǔ)句表示只有在clk上升沿時(shí)才開(kāi)始執(zhí)行always語(yǔ)句塊,否則不執(zhí)行。這種時(shí)序控制是always語(yǔ)句最常用的。(3) always 的時(shí)序控制除沿觸發(fā)時(shí)序控制外,還可以是電平觸發(fā)的,也可以是單個(gè)信號(hào)或多個(gè)信號(hào),中間需要用關(guān)鍵字or 或“,”連接,如: 第3章 Verilog HDL常用

46、建模方法 always (posedge clock or posedge reset) /由兩個(gè)沿觸發(fā)的always塊 begin endalways ( a or b or c ) /由多個(gè)電平觸發(fā)的always塊 begin end第3章 Verilog HDL常用建模方法 沿觸發(fā)的always塊常用來(lái)描述時(shí)序邏輯,如果符合可綜合風(fēng)格要求,則可用綜合工具將其自動(dòng)轉(zhuǎn)換為表示時(shí)序邏輯的寄存器組和門(mén)級(jí)邏輯;而電平觸發(fā)的always塊常用來(lái)描述一般組合邏輯和帶鎖存器的組合邏輯,如果符合可綜合風(fēng)格要求,則可轉(zhuǎn)換為表示組合邏輯的門(mén)級(jí)邏輯或帶鎖存器的組合邏輯。一個(gè)模塊中可以有多個(gè)always塊,它們都

47、是并行運(yùn)行的。第3章 Verilog HDL常用建模方法 (4) 本例的綜合結(jié)果如圖3-12所示。圖3-12 例3-15的綜合結(jié)果從綜合結(jié)果來(lái)看,本例實(shí)現(xiàn)了一個(gè)上升沿觸發(fā)的D觸發(fā)器。第3章 Verilog HDL常用建模方法 3.4.2 過(guò)程賦值語(yǔ)句過(guò)程賦值語(yǔ)句過(guò)程賦值語(yǔ)句的更新對(duì)象是寄存器、整數(shù)等。這些類(lèi)型的變量在被賦值后,其值將保持不變,直到被其他過(guò)程賦值語(yǔ)句賦予新值。過(guò)程賦值語(yǔ)句與數(shù)據(jù)流建模中的連續(xù)賦值語(yǔ)句是不同的。首先,連續(xù)賦值語(yǔ)句總是處于活動(dòng)狀態(tài),任意一個(gè)操作數(shù)的變化都會(huì)導(dǎo)致表達(dá)式的重新計(jì)算以及重新賦值,但過(guò)程賦值語(yǔ)句只有在執(zhí)行到的時(shí)候才會(huì)起作用。其次,更新對(duì)象不同,連續(xù)賦值語(yǔ)句的更

48、新對(duì)象是線網(wǎng),而過(guò)程賦值語(yǔ)句的更新對(duì)象是寄存器、整數(shù)等。最后,從形式上看,過(guò)程賦值語(yǔ)句不使用assign。 第3章 Verilog HDL常用建模方法 但過(guò)程賦值語(yǔ)句與連續(xù)賦值語(yǔ)句又有相同之處,即兩者可以使用的運(yùn)算符是完全相同的。連續(xù)賦值語(yǔ)句中使用的運(yùn)算符在過(guò)程賦值語(yǔ)句中同樣適用,而且含義完全相同。Verilog HDL包括兩種類(lèi)型的過(guò)程賦值語(yǔ)句:阻塞賦值語(yǔ)句和非阻塞賦值語(yǔ)句。下面通過(guò)5個(gè)例題來(lái)說(shuō)明兩種賦值方式的不同。這5個(gè)例題的設(shè)計(jì)目標(biāo)都是實(shí)現(xiàn)3位移位寄存器,它們分別采用了阻塞賦值方式和非阻塞賦值方式。第3章 Verilog HDL常用建模方法 【例3-16】 阻塞賦值方式描述的移位寄存器1

49、。module block1(Q0,Q1,Q2,D,clk);output Q0,Q1,Q2;input clk,D;reg Q0,Q1,Q2;always (posedge clk) begin第3章 Verilog HDL常用建模方法 Q2=Q1; /注意賦值語(yǔ)句的順序Q1=Q0;Q0=D;endendmodule綜合結(jié)果如圖3-13所示。第3章 Verilog HDL常用建模方法 圖3-13 例3-16綜合出來(lái)的電路圖第3章 Verilog HDL常用建模方法 【例3-17】 阻塞賦值方式描述的移位寄存器2。module block2(Q0,Q1,Q2,D,clk);output Q0,

50、Q1,Q2;input clk,D;reg Q0,Q1,Q2;always (posedge clk) begin第3章 Verilog HDL常用建模方法 Q1=Q0; /該句與下句的順序與例3-16顛倒Q2=Q1;Q0=D; endendmodule綜合結(jié)果如圖3-14所示。 第3章 Verilog HDL常用建模方法 圖3-14 例3-17綜合出來(lái)的電路圖第3章 Verilog HDL常用建模方法 【例3-18】 阻塞賦值方式描述的移位寄存器3。module block3(Q0,Q1,Q2,D,clk);output Q0,Q1,Q2;input clk,D;reg Q0,Q1,Q2;a

51、lways (posedge clk) begin第3章 Verilog HDL常用建模方法 Q0=D; /3條賦值語(yǔ)句的順序與例3-16完全顛倒Q1=Q0;Q2=Q1; endendmodule綜合結(jié)果如圖3-15所示。 第3章 Verilog HDL常用建模方法 圖3-15 例3-18綜合出來(lái)的電路圖第3章 Verilog HDL常用建模方法 【例3-19】 非阻塞賦值方式描述的移位寄存器1。module non_block1(Q0,Q1,Q2,D,clk);output Q0,Q1,Q2;input clk,D;reg Q0,Q1,Q2;always (posedge clk) 第3章

52、Verilog HDL常用建模方法 beginQ1=Q0;Q2=Q1;Q0=D; endendmodule第3章 Verilog HDL常用建模方法 【例3-20】 非阻塞賦值方式描述的移位寄存器2。module non_block2(Q0,Q1,Q2,D,clk);output Q0,Q1,Q2;input clk,D;reg Q0,Q1,Q2;always (posedge clk) begin第3章 Verilog HDL常用建模方法 Q0=D; /3條賦值語(yǔ)句的順序與例3-19完全顛倒Q2=Q1;Q1=Q0; endendmodule第3章 Verilog HDL常用建模方法 例3-1

53、9和例3-20的綜合結(jié)果是一樣的,如圖3-16所示。圖3-16 例3-19和例3-20綜合出來(lái)的電路圖第3章 Verilog HDL常用建模方法 例3-16例3-20的程序說(shuō)明:(1) 5個(gè)例題的設(shè)計(jì)目標(biāo)均是實(shí)現(xiàn)3位移位寄存器,但從綜合結(jié)果可以看出例3-17和例3-18沒(méi)有實(shí)現(xiàn)設(shè)計(jì)目標(biāo)。(2) Q2=Q1; 這種賦值方式稱(chēng)為阻塞賦值,Q2的值在賦值語(yǔ)句執(zhí)行完成后立刻就改變,而且隨后的語(yǔ)句必須在賦值語(yǔ)句執(zhí)行完成后才能繼續(xù)執(zhí)行。所以當(dāng)例3-18中的三條語(yǔ)句Q0=D; Q1=Q0; Q2=Q1; 執(zhí)行完后,Q0、Q1、Q2的值都變化為D的值,也就是說(shuō),D的值同時(shí)賦給了Q0、Q1、Q2,參照其綜合結(jié)果

54、能更清晰地看到這一點(diǎn)。例3-16和例3-17可通過(guò)同樣的分析得出與綜合結(jié)果一致的結(jié)論。 第3章 Verilog HDL常用建模方法 (3) Q2=Q1; 這種賦值方式稱(chēng)為非阻塞賦值,Q2的值在賦值語(yǔ)句執(zhí)行完后并不會(huì)立刻就改變,而是等到整個(gè)always語(yǔ)句塊結(jié)束后才完成賦值操作。所以當(dāng)例3-20中的三條語(yǔ)句Q0=D; Q2=Q1;Q1=Q0;執(zhí)行完后,Q0、Q1、Q2的值并沒(méi)有立刻更新,而是保持了原來(lái)的值,直到always語(yǔ)句塊結(jié)束后才同時(shí)進(jìn)行賦值,因此Q0的值變?yōu)榱薉的值,Q2的值變?yōu)榱嗽瓉?lái)Q1的值,Q1的值變?yōu)榱嗽瓉?lái)Q0的值(而不是剛剛更新的Q0的值D),參照其綜合結(jié)果能更清晰地看到這一點(diǎn)。

55、例3-19可通過(guò)同樣的分析得出與綜合結(jié)果一致的結(jié)論。 第3章 Verilog HDL常用建模方法 (4) 例3-16例3-18采用的是阻塞賦值方式,可以看出阻塞賦值語(yǔ)句在always塊語(yǔ)句中的位置對(duì)其結(jié)果有影響;例3-19和例3-20采用的是非阻塞賦值方式,可以看出非阻塞賦值語(yǔ)句在always塊語(yǔ)句中的位置對(duì)其結(jié)果沒(méi)有影響。因此,在使用賦值語(yǔ)句時(shí)要注意兩者的區(qū)別與聯(lián)系。第3章 Verilog HDL常用建模方法 3.4.3 塊語(yǔ)句塊語(yǔ)句塊語(yǔ)句通常用來(lái)將兩條或多條語(yǔ)句組合在一起,使它們更像一條語(yǔ)句,類(lèi)似于C語(yǔ)言中的復(fù)合語(yǔ)句。Verilog HDL中可綜合的塊語(yǔ)句為順序塊,關(guān)鍵字begin和end

56、用于將多條語(yǔ)句組成順序塊,前面有許多例子用到了順序塊。第3章 Verilog HDL常用建模方法 順序塊具有以下特點(diǎn):(1) 順序塊中的語(yǔ)句是一條接一條按順序執(zhí)行的;只有前面的語(yǔ)句執(zhí)行完之后才能執(zhí)行后面的語(yǔ)句(非阻塞賦值語(yǔ)句除外)。(2) 嵌套塊:塊可以嵌套使用。(3) 命名塊:塊可以具有自己的名字,我們稱(chēng)之為命名塊。在命名塊中可以聲明局部變量;命名塊是設(shè)計(jì)層次的一部分,命名塊中聲明的變量可以通過(guò)層次名引用進(jìn)行訪問(wèn)。 第3章 Verilog HDL常用建模方法 下面是一個(gè)使用命名塊的例子?!纠?-21】 完成以下兩個(gè)功能:(1) 使用異或運(yùn)算符對(duì)D完成縮位異或運(yùn)算;(2) 檢測(cè)D中1的個(gè)數(shù)。V

57、erilog HDL實(shí)現(xiàn)代碼如下:module named_block(D,xnor_D,CountOnes);input3:0 D;output reg xnor_D;output reg2:0 CountOnes;第3章 Verilog HDL常用建模方法 always (D) begin:block1xnor_D = 0;CountOnes = 0;begin : xor_blockinteger I;for (I = 0; I 4; I = I + 1)xnor_D = xnor_D DI;end / 循環(huán)第3章 Verilog HDL常用建模方法 begin : Count_bloc

58、kinteger J;for (J=0; Jb) out1 b) out1=int1;else out1b) out1=int1;else if(a=b) out1=int2;else out1=int3;下面是一個(gè)使用if語(yǔ)句的例子。 第3章 Verilog HDL常用建模方法 【例3-22】 使用always語(yǔ)句描述具有同步復(fù)位和同步置位功能的D觸發(fā)器。module mydff(q, clk, set, clr, d);input clk, d, set, clr;output q; reg q;always (posedge clk) begin 第3章 Verilog HDL常用建模方

59、法 if(set) q=1; else if (!clr) q=0; else qb)begin out1=int1; out2=int2; 第3章 Verilog HDL常用建模方法 endelsebegin out1=int2; out2=int1;end注意在end后不需要再加分號(hào)。因?yàn)閎eginend內(nèi)是一個(gè)完整的復(fù)合語(yǔ)句,不需再附加分號(hào)。 第3章 Verilog HDL常用建模方法 (4) if語(yǔ)句的嵌套。在if語(yǔ)句中又包含一個(gè)或多個(gè)if語(yǔ)句稱(chēng)為if語(yǔ)句的嵌套。一般形式如下:if(expression1)if(expression2) 語(yǔ)句1else 語(yǔ)句2elseif(expres

60、sion3) 語(yǔ)句3else 語(yǔ)句4第3章 Verilog HDL常用建模方法 應(yīng)當(dāng)注意if與else的配對(duì)關(guān)系,else總是與它上面最近的if配對(duì)。如果if與else的數(shù)目不一樣,為了實(shí)現(xiàn)程序設(shè)計(jì)者的企圖,可以用beginend塊語(yǔ)句來(lái)確定配對(duì)關(guān)系。例如:if()beginif() 語(yǔ)句1endelse語(yǔ)句2這時(shí)begin_end塊語(yǔ)句限定了內(nèi)嵌if語(yǔ)句的范圍,因此else與第一個(gè)if配對(duì)。注意begin_end塊語(yǔ)句在if_else語(yǔ)句中的使用。第3章 Verilog HDL常用建模方法 3.4.5 多路分支語(yǔ)句多路分支語(yǔ)句基本的if語(yǔ)句只有兩個(gè)分支可供選擇,而實(shí)際問(wèn)題中常常需要用到多分支選擇,Verilog HDL提供的case語(yǔ)句可直接處理多分支選擇。case語(yǔ)句的一般形式如下:case(表達(dá)式)endcasecase分支項(xiàng)的一般格式如下:分支表達(dá)式: 語(yǔ)句;缺省項(xiàng)(default項(xiàng)): 語(yǔ)句;第3章 Veril

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論