第二章、Verilog HDL及數(shù)字電路入門_第1頁(yè)
第二章、Verilog HDL及數(shù)字電路入門_第2頁(yè)
第二章、Verilog HDL及數(shù)字電路入門_第3頁(yè)
第二章、Verilog HDL及數(shù)字電路入門_第4頁(yè)
第二章、Verilog HDL及數(shù)字電路入門_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第二章、數(shù)字電路與Verilog HDL入門本章主要講授Verilog的基礎(chǔ)知識(shí)以及與數(shù)字電路的關(guān)系。本章內(nèi)容:基本verilog HDL的語(yǔ)法構(gòu)成 基本的組合電路設(shè)計(jì)及語(yǔ)法組成 基本的時(shí)序電路設(shè)計(jì)及語(yǔ)法構(gòu)成 Verilog HDL的基本語(yǔ)句Verilog HDL是硬件描述語(yǔ)言的一種,故它是用來(lái)描述硬件電路的,而現(xiàn)階段Verilog HDL主要描述的是數(shù)字電路。注意:這里是描述,而不是其它的“編程”語(yǔ)言。所以,從這個(gè)角度講硬件描述語(yǔ)言與數(shù)字電路之間會(huì)有著不可分割的聯(lián)系。以下主要通過(guò)HDL與數(shù)字電路的比對(duì)來(lái)講述基本的Verilog語(yǔ)法。在Verilog HDL語(yǔ)言中,Verilog所描述的符號(hào)及

2、邏輯在數(shù)字電路中均有相應(yīng)的符號(hào)與邏輯相對(duì)應(yīng)。下面是常見(jiàn)的一些符號(hào):數(shù)字電路的符號(hào)Verilog HDL描述的符號(hào)電路符號(hào)的名字cdbfuncamodule func(a, b, c, d);module關(guān)鍵字后面的func稱為模塊名endmodule端口上圖中的a、b、c、d稱為該電路func的端口。在模塊名后面的括號(hào)中都是端口,端口之間用“,”隔開(kāi)。端口的方向假設(shè)圖中a b為輸入端口,c d為輸出端口。input a;用input聲明的端口為輸入端口input b;output c;用output聲明的端口為輸出端口output d;此外,用inout聲明的端口為雙向端口。端口的類型在數(shù)字電

3、路中,通常具有兩類數(shù)據(jù)類型,能保持?jǐn)?shù)值的寄存器型(比如觸發(fā)器)和不能保持?jǐn)?shù)值的連線型。dclkqD QCPwire a;用wire聲明的端口為連線型reg c;用reg聲明的端口為寄存器型。通常,輸入一般都為wire型,而輸出可以為wire型也可以為reg型。wire d;wire clk;reg q;功能實(shí)現(xiàn)由內(nèi)部硬件電路實(shí)現(xiàn),此處以與非門為例:abc&使用always或者assign或者例化語(yǔ)句實(shí)現(xiàn)如: always c = !(a & b); assign c = !(a & b); NAND2 func(c,a,b);這里要求掌握的用法,的用法后面章節(jié)將詳細(xì)講述

4、。被賦值對(duì)象為wire型時(shí),使用assign語(yǔ)句進(jìn)行賦值被賦值對(duì)象為reg型時(shí),使用always語(yǔ)句進(jìn)行賦值邊沿?cái)?shù)字電路中有上升沿和下降沿posedge 信號(hào) 表示信號(hào)的上升沿negedge 信號(hào) 表示信號(hào)的下降沿posedge和negedge關(guān)鍵字都是配合always使用的。總線假設(shè)有8位數(shù)據(jù)總線D0D7用D7:0或者D0:7或者D8:1或者D1:8等表示。也可以用D4:-3之類的表示方式。其他高電平低電平高阻態(tài)不確定態(tài)10Z 或 zX 或 x Verilog HDL通常的結(jié)構(gòu)構(gòu)成模塊的結(jié)構(gòu)如下:module <模塊名>( <端口列表>);<定義><

5、內(nèi)部功能的實(shí)現(xiàn)>endmodule一個(gè)完整的Verilog HDL通常由4部分構(gòu)成:(1)模塊聲明部分,包含關(guān)鍵字module 和endmodule,在module后面的是模塊名稱和端口名列表,注意,端口名列表的括號(hào)后面有個(gè)分號(hào)(2)端口方向定義,指明所有的端口是輸入還是輸出或者是雙向(關(guān)鍵字為inout,后面會(huì)學(xué)習(xí)到)的。(3)端口(和內(nèi)部變量)類型,一般來(lái)說(shuō),所有的輸入都是wire型,輸出端一般要根據(jù)是組合電路還是時(shí)序電路分別定義成wire型和reg型。(4)功能實(shí)現(xiàn)部分,這部分通常是設(shè)計(jì)的核心,大型的設(shè)計(jì)重點(diǎn)就在這里,通常由always、assign和元件例化(后面會(huì)學(xué)習(xí)到)構(gòu)成。

6、任何一個(gè)電路的描述都必須由這4部分構(gòu)成,不論設(shè)計(jì)多么簡(jiǎn)單或者多么復(fù)雜。例:一個(gè)簡(jiǎn)單的組合邏輯電路的Verilog HDL實(shí)現(xiàn)用Verilog HDL實(shí)現(xiàn)一與門。module andgate2(a,b,c);/-input a;/- input b;/- output c;/- wire a;/- wire b;/- wire c;/-assign c=a&b;/-endmodule/-模塊聲明部分端口方向定義部分端口類型部分功能實(shí)現(xiàn)部分代碼注釋:使用module關(guān)鍵字定一個(gè)模塊,模塊名為andgate2,它有三個(gè)端口,端口名分別為a,b,c。使用input關(guān)鍵字將a端口聲明為輸入端口。

7、 使用input關(guān)鍵字將b端口也聲明為輸入端口。使用output關(guān)鍵字將c端口聲明為輸出端口。使用wire聲明端口a是連線型。 使用wire聲明端口b是連線型。 使用wire聲明端口c是連線型。模塊功能實(shí)現(xiàn)部分,使用assign賦值語(yǔ)句將c的值賦值為a與上(“&”是與運(yùn)算符號(hào))b的結(jié)果。模塊結(jié)束關(guān)鍵字endmodule,注意:end和module中間沒(méi)有空格,endmodule是一個(gè)整體。以上代碼具有verilog的基本特征,須熟記。由此Verilog HDL生成的對(duì)應(yīng)的電路圖符號(hào)如下:注:此圖使用altera公司的FPGA/CPLD集成開(kāi)發(fā)環(huán)境Quartus II 9.0 sp2綜合

8、實(shí)現(xiàn),有關(guān)Quartus II的操作見(jiàn)附錄。例:一個(gè)簡(jiǎn)單的時(shí)序電路的設(shè)計(jì)-4位計(jì)數(shù)器的Verilog HDL實(shí)現(xiàn)。4位計(jì)數(shù)器對(duì)應(yīng)的電路符號(hào)如下:它有一個(gè)時(shí)鐘輸入端口(clock),一個(gè)四位的計(jì)數(shù)輸出端口(q)。功能說(shuō)明:當(dāng)clock端輸入上升沿脈沖時(shí)候,計(jì)數(shù)器的輸出端Q進(jìn)行加1動(dòng)作。Verilog HDL代碼如下:module counter4(clock,q);/-input clock;/-output 3:0 q;/-wire clock;/-reg 3:0 q;/-always(posedge clock)/-q=q+1; /-endmodule/-代碼注釋:使用module關(guān)鍵字定一

9、個(gè)模塊,模塊名為counter4,它有兩個(gè)端口,端口名分別為clock,q。使用input關(guān)鍵字將clock端口聲明為輸入端口。 使用output關(guān)鍵字將q端口聲明為4位的輸出端口,3:0表示有四個(gè)口線。使用wire聲明端口clock是連線型。使用reg關(guān)鍵字聲明q為寄存器型。注:通常在always中被賦值的對(duì)象都要聲明為reg型。用always進(jìn)程塊(后面章節(jié)會(huì)詳細(xì)講解)實(shí)現(xiàn)模塊的功能,表示檢測(cè)到括號(hào)內(nèi)的信號(hào)的變化才會(huì)觸發(fā)always執(zhí)行,posedge clock表示clock信號(hào)的上升沿。表示將q的值進(jìn)行加1。和一起表示:當(dāng)clock上升沿到來(lái)的時(shí)候,q的值變?yōu)閝+1。模塊結(jié)束關(guān)鍵字en

10、dmodule。基本的數(shù)值表示Verilog能夠支持綜合的數(shù)只有整數(shù),而小數(shù)、字符等不支持綜合。所謂綜合,就是指能夠直接形成硬件電路的語(yǔ)句和語(yǔ)法。Verilog中整數(shù)的構(gòu)成 +/- <位寬><進(jìn)制>值其中:位寬是指該整數(shù)對(duì)應(yīng)的二進(jìn)制的寬度 進(jìn)制有4種類型,分別是 二進(jìn)制:B或者b 八進(jìn)制:O或者o 十進(jìn)制:D或者d 十六進(jìn)制:H或者h(yuǎn) < >表示可以省略。當(dāng)位寬省略時(shí)候,實(shí)際的位寬為該數(shù)值對(duì)應(yīng)的二進(jìn)制位寬 當(dāng)進(jìn)制省略時(shí)候,默認(rèn)為十進(jìn)制 如果值本身很長(zhǎng),可以在值中間用下劃線“_”隔開(kāi),使程序看起來(lái)更加清楚。 例如: 4d7,表示對(duì)應(yīng)二進(jìn)制寬度是4位的十進(jìn)制數(shù)7

11、(二進(jìn)制數(shù)為0111,即4b0111) 12b1011_0110_0001,表示位寬為12位的二進(jìn)制數(shù)101101100001。 默認(rèn)情況下,這種方式定義的數(shù)都是無(wú)符號(hào)數(shù), Verilog還可以定義有符號(hào)數(shù)。方法為在 進(jìn)制之間使用s,即: +/- <位寬><s進(jìn)制>值 例如: 16sh8c01 為一個(gè)16位的有符號(hào)16進(jìn)制數(shù)。有符號(hào)數(shù)和無(wú)符號(hào)數(shù)可以相互轉(zhuǎn)換,通過(guò)使用系統(tǒng)函數(shù)$signed和$unsigned實(shí)現(xiàn)。例如:reg 63:0 a;/無(wú)符號(hào)數(shù)據(jù)類型使用運(yùn)算 result1=a/2;進(jìn)行的是無(wú)符號(hào)的算術(shù)運(yùn)算而result=$signed(a)/2; 進(jìn)行的則是有符

12、號(hào)算術(shù)運(yùn)算。有符號(hào)數(shù)還可以通過(guò)關(guān)鍵字signed來(lái)定義:例如: reg signed 63:0 data; /則,data即為一個(gè)64位的有符號(hào)數(shù)。補(bǔ)充語(yǔ)法:整數(shù)的表示形式必須講了,其余詳細(xì)語(yǔ)法可以做個(gè)附錄,詳細(xì)介紹1 模塊的聲明2 端口定義a) input b) output c) inout :雙向端口,即:既可以作為輸入端口,有可以作為輸出端口。3 信號(hào)類型(Verilog中共有19種信號(hào)類型,這里只需要掌握三種)a) wireb) regc) integer4 邏輯功能定義a) assign 持續(xù)賦值語(yǔ)句,通常對(duì)連線型變量賦值。例如:assign c = !(a & b);b)

13、 元件例化語(yǔ)句(實(shí)例化)例如:and a1(out,a,b,c); and為verilog內(nèi)含的元件,此處表示生成一個(gè)與門,這個(gè)與門有一個(gè)輸出端out,三個(gè)輸入端a,b,c。具體解釋參見(jiàn)后面其他章節(jié)。c) Always過(guò)程塊 一般用于描述時(shí)序邏輯,always內(nèi)部被賦值的對(duì)象一般設(shè)置成reg型。5 空白符和注釋6 標(biāo)識(shí)符、運(yùn)算符、關(guān)鍵字7 Verilog HDL支持的邏輯值狀態(tài)8 Verilog HDL中整數(shù)的表示9 數(shù)據(jù)類型和變量10 寄存器和存儲(chǔ)器由于VerilogHDL語(yǔ)言是由C語(yǔ)言演變過(guò)來(lái)的,所以C語(yǔ)言的很多關(guān)鍵字、運(yùn)算符都可以直接用于Verilog中,需要注意的是一些c語(yǔ)言的運(yùn)算符和

14、關(guān)鍵字及符號(hào)在verilog中的含義有所改變,這些關(guān)鍵字主要包括,在以后的內(nèi)容中會(huì)逐一說(shuō)明。以上內(nèi)容放到第一章里面?2. 條件語(yǔ)句(?:)-基本組合邏輯電路設(shè)計(jì)組合電路是數(shù)字電路的最基本類型,通常在數(shù)字系統(tǒng)中大量應(yīng)用,比較典型的有二選一、多選一、3-8譯碼器,8-3編碼器等。2選1電路設(shè)計(jì):2選1的模塊圖形如下My2_1MuxABYSEL如上圖所示,模塊名為My2_1Mux。二選一有3個(gè)輸入端口,分別是A、B、SEL和一個(gè)輸出端口Y。當(dāng)給SEL施加一個(gè)高電平時(shí),Y端輸出的是A的電平值,否則,Y端輸出的是B的電平值。此處使用條件語(yǔ)句實(shí)現(xiàn)。即c語(yǔ)言中的 “? :”。核心語(yǔ)句如下: assign Y

15、=SEL?A:B;詞句解釋:如果SEL為高電平,就把A端口直接賦給Y,否則把B端口賦給Y。即:SEL端在這里起到了一個(gè)選擇Y輸出誰(shuí)的作用,也即2選1。完整代碼如下:module My2_1Mux (A, B, SEL, Y);input A;input B; input SEL; /-output Y; wire A;wire B; wire SEL; wire Y;/-assign Y=SEL?A:B;endmodule代碼注釋:可以把多條語(yǔ)句寫在一行,像C語(yǔ)言的語(yǔ)句用法一樣。當(dāng)然,也可以分成三行寫。格式比較自由。此處訓(xùn)練使用if else語(yǔ)句的使用。If else 是選擇語(yǔ)句,verilo

16、g中的用法與c語(yǔ)言用法相同。基本代碼如下3-8譯碼器的設(shè)計(jì)3-8譯碼器的電路圖形如下My3_8CircuitABCY0Y1Y2Y3Y4Y5Y6Y7其中ABC是三個(gè)輸入,Y0Y7是8個(gè)輸出。為了研究問(wèn)題方便和代碼書(shū)寫的方便,這里將原本的3-8譯碼器的輸入輸出名稱更換成總線的表示形式(原來(lái)的表示形式也可以用Verilog描述,但會(huì)用到新的語(yǔ)法),新的3-8譯碼器的電路圖形式如下:My3_8Circuit2SEL2.0Y7.0其中SEL2.0表示A、B、C三個(gè)輸入端,Y7.0表示Y7Y0八個(gè)輸出端。使用上面的條件語(yǔ)句表示如下:module My3_8Circuit2(SEL,Y);input 2:0

17、 SEL; output7:0 Y; wire 2:0 SEL; wire 7:0 Y;assign Y= (SEL=3'b000)?8'b11111110: /-(1) (SEL=3'b001)?8'b11111101: /-(2) (SEL=3'b010)?8'b11111011: (SEL=3'b011)?8'b11110111: (SEL=3'b100)?8'b11101111: (SEL=3'b101)?8'b11011111: (SEL=3'b110)?8'b101111

18、11: (SEL=3'b111)?8'b01111111: 8'b11111111; /-(3)endmodule代碼注釋(1)如果輸入端都為低電平,則輸出Y0為0,其余均為高電平1。否則(2)。(2)如果輸入端為二進(jìn)制的001,則輸出Y1為0,其余均為高電平1。依次類推。(3)如果是其他值的情況,比如某個(gè)輸入為高阻態(tài)之類的(實(shí)際電路中不應(yīng)該出現(xiàn)的情況),輸出全高電平,即:不讓譯碼器工作。注意:圖中的Y總線表示用Y7.0,而代碼中用的是Y7:0,請(qǐng)注意它們的區(qū)別。If else語(yǔ)句的使用?;镜臅r(shí)序電路的實(shí)現(xiàn),D觸發(fā)器是時(shí)序電路中最簡(jiǎn)答的時(shí)序電路了,它的電路圖如下:My

19、DffCPQCLRPRED這里,CP是時(shí)鐘輸入端,PRE是異步置位端,CLR是異步復(fù)位端,Q為輸出,Qbar為輸出的取反,為了徹底描述D觸發(fā)器的特性,我們分步驟進(jìn)行設(shè)計(jì),首先,從最基本的功能開(kāi)始,為此,我們將設(shè)計(jì)的D觸發(fā)器進(jìn)行簡(jiǎn)化,PRE、CLR和Qbar的功能我們暫不實(shí)現(xiàn)。D觸發(fā)器設(shè)計(jì)實(shí)例1:最簡(jiǎn)單的D觸發(fā)器設(shè)計(jì)。簡(jiǎn)化后的D觸發(fā)器如下圖:MyDff1CPQD功能描述:當(dāng)CP端出現(xiàn)一個(gè)上升沿脈沖時(shí),將D輸入端信號(hào)傳遞至輸出Q端。代碼如下:module MyDff(cp,d,q);input cp;input d;output q;wire cp; reg q;always(posedge cp

20、) /-(1) q=d; endmodule代碼注釋:(1)當(dāng)cp上升沿到達(dá)時(shí),always模塊動(dòng)作一次,將d的值賦給q。注意在輸出類型中,我們將q端定義成reg型,是因?yàn)槲覀冊(cè)O(shè)計(jì)了一個(gè)輸出端q,它賦值的時(shí)候是在always功能塊中進(jìn)行的。也就是說(shuō),所有在always功能塊中被賦值的對(duì)象都要定義成reg類型。從物理意義上將,此處設(shè)計(jì)的是一個(gè)能保存數(shù)據(jù)的端口,故此需要定義成reg型。QuartusII 可以將綜合后的電路進(jìn)行展示出來(lái),通過(guò)菜單Tools->NetlistViewers->RTL Viewer可以查看生成的電路視圖,見(jiàn)下圖:并且可以通過(guò)仿真驗(yàn)證D觸發(fā)器工作的正確性。見(jiàn)下

21、圖從上圖可以看出,盡管d輸入端在74.8ns時(shí)刻之前的就變?yōu)榱烁唠娖?。但是只有?4.8ns時(shí)刻時(shí)鐘上升沿到達(dá)的時(shí)候輸出端q才變?yōu)楦叨ㄆ?,也就是?dāng)時(shí)鐘上升沿到達(dá)的時(shí)候輸入端d的值才傳遞給輸出端q。同理可以推導(dǎo)其他時(shí)刻q端的變化情況。并行同時(shí)電路設(shè)計(jì)Verilog HDL硬件描述語(yǔ)言的特長(zhǎng)是并行同時(shí)執(zhí)行。即可以在CPLD/ FPGA中用硬件描述語(yǔ)言Verilog同時(shí)實(shí)現(xiàn)多個(gè)相互獨(dú)立的硬件電路,這些電路之間相互可以獨(dú)立的運(yùn)行。例如:設(shè)計(jì)一個(gè)電路,該電路內(nèi)部同時(shí)具有一個(gè)D觸發(fā)器和一個(gè)與非門電路。為了研究簡(jiǎn)便,采用最簡(jiǎn)方式的D觸發(fā)器。電路圖如下MyCustomCircuitCPQDABC此電路具有D、

22、CP、Q、A、B、C等端口,其功能如虛線所示,D、CP、Q表達(dá)的是一個(gè)D觸發(fā)器,A、B、C表示一個(gè)與非門。電路代碼如下module MyCustomCircuit(D,CP,Q,A,B,C); input D,CP,A,B; wire D,CP,A,B; output Q; reg Q; output C; wire C; always(posedge CP) Q=D; /-(1) assign C=!(A&B); /-(2)endmodule代碼注釋:設(shè)計(jì)個(gè)作業(yè)題,讓學(xué)生把D觸發(fā)器的Qbar端的功能補(bǔ)上本代碼中功能實(shí)現(xiàn)部分采用了兩個(gè)語(yǔ)句,分別是always和assign,其中alwa

23、ys描述的語(yǔ)句是時(shí)序電路D觸發(fā)器;assign描述的語(yǔ)句是組合電路與非門,這兩個(gè)電路即與非門和D觸發(fā)器是同時(shí)并存的,他們之間執(zhí)行沒(méi)有先后順序,是同時(shí)運(yùn)行的,與代碼的書(shū)寫順序無(wú)關(guān),也就是說(shuō),如果把(1)和(2)調(diào)換一下順序,不影響生成電路的結(jié)果。學(xué)習(xí)Verilog時(shí)候要特別注意這一點(diǎn),它和普通的程序設(shè)計(jì)語(yǔ)言的先后執(zhí)行順序在本質(zhì)上有著天壤之別!(2) 中的“! ”是取反運(yùn)算符號(hào)。作業(yè)題2,把前面設(shè)計(jì)的4位計(jì)數(shù)器的進(jìn)位輸出功能加上帶有中間變量的編程實(shí)例在具有一定復(fù)雜性的設(shè)計(jì)中,往往單靠一條功能性語(yǔ)句并不能很好地描述電路的功能,引入中間變量則是個(gè)較好的方法,可以改變?cè)O(shè)計(jì)的復(fù)雜性。以下通過(guò)半加器的兩種不

24、同設(shè)計(jì)方式來(lái)對(duì)比中間變量使用的好處。半加器1,傳統(tǒng)方式的設(shè)計(jì)。無(wú)中間變量的Verilog HDL描述方式。在數(shù)字電路中,半加器的電路實(shí)現(xiàn)如下圖HalfAdderSABC在以往的數(shù)字線路教學(xué)中,根據(jù)卡諾圖等工具可以推導(dǎo)出半加器內(nèi)部是由與門和異或門構(gòu)成,如上圖所示。其中A和B為半加器的兩個(gè)輸入端,S為半加器的和輸出端,C為輸出進(jìn)位端。這里使用2個(gè)assign語(yǔ)句就可以實(shí)現(xiàn),參照下面代碼:module HalfAdder1(A,B,C,S); input A,B; wire A,B; output C,S; wire C,S; assign S= AB; /-(1) assign C= A&B; /-(2)endmodule代碼注釋:(1)“”符號(hào)為異或運(yùn)算符,和c語(yǔ)言中的異或運(yùn)算符相同(2) 與門功能和(1)的異或功能是同時(shí)并存于電路中的,并行執(zhí)行。(1)和(2)語(yǔ)句的順序可以顛倒,功能不變。通過(guò)Quartus II綜合可以看出半加器的實(shí)現(xiàn)是正

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論