版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第2章Verilog設(shè)計初步
主要內(nèi)容§2.1Verilog概述§2.2Verilog基本語法§2.3
Verilog行為語句§2.4
Verilog基本組合電路設(shè)計§2.5Verilog基本時序電路設(shè)計§2.1Verilog概述Verilog語言是1983年由GDA(GatewayDesignAutomation)公司的PhilMoorby首創(chuàng)的,之后Moorby又設(shè)計了Verilog-XL仿真器,Verilog-XL仿真器大獲成功,也使得Verilog語言得到推廣使用。1989年,Cadence收購了GDA,1990年,Cadence公開發(fā)表了VerilogHDL,并成立了OVI組織專門負責VerilogHDL的發(fā)展。Verilog于1995年成為IEEE標準,稱為IEEEStandard1364-1995(Verilog-1995)IEEE“1364-2001”標準(Verilog-2001)也獲得通過,多數(shù)綜合器、仿真器都已支持Verilog-2001標準1、Verilog發(fā)展2、Verilog語言的特點既適于可綜合的電路設(shè)計,也可勝任電路與系統(tǒng)的仿真。能在多個層次上對所設(shè)計的系統(tǒng)加以描述,從開關(guān)級、門級、寄存器傳輸級(RTL)到行為級,都可以勝任,同時語言不對設(shè)計規(guī)模施加任何限制。靈活多樣的電路描述風格,可進行行為描述,也可進行結(jié)構(gòu)描述;支持混合建模,在一個設(shè)計中各個模塊可以在不同的設(shè)計層次上建模和描述。Verilog的行為描述語句,如條件語句、賦值語句和循環(huán)語句等,類似于軟件高級語言,便于學(xué)習和使用。內(nèi)置各種基本邏輯門,便于進行門級結(jié)構(gòu)描述;內(nèi)置各種開關(guān)級元件,可進行開關(guān)級的建模。易學(xué)易用,功能強,可滿足各個層次設(shè)計人員的需要。3Verilog模塊的結(jié)構(gòu)
moduleaoi(a,b,c,d,f);/*模塊名為aoi,端口列表a,b,c,d,f*/inputa,b,c,d; //模塊的輸入端口為a,b,c,doutputf;//模塊的輸出端口為fwirea,b,c,d,f;//定義信號的數(shù)據(jù)類型assignf=~((a&b)|(~(c&d))); //邏輯功能描述endmodule“與-或-非”電路
3Verilog模塊的結(jié)構(gòu)Verilog程序是由模塊構(gòu)成的。每個模塊的內(nèi)容都嵌在module和endmodule兩個關(guān)鍵字之間;每個模塊實現(xiàn)特定的功能。每個模塊首先要進行端口定義,并說明輸入和輸出口(input、output或inout),然后對模塊的功能進行定義。Verilog程序書寫格式自由,一行可以寫幾個語句,一個語句也可以分多行寫。除了endmodule等少數(shù)語句外,每個語句的最后必須有分號。可用/*……*/和//……對Verilog程序作注釋。Verilong程序中的關(guān)鍵字必須小寫,其它字符區(qū)別大小寫,輸入程序時一定要注意?、拍K聲明模塊聲明包括模塊名字,模塊輸入、輸出端口列表。模塊定義格式如下:module模塊名(端口1,端口2,端口3,……);⑵端口(Port)定義對模塊的輸入輸出端口要明確說明,其格式為:input端口名1,端口名2,……端口名n; //輸入端口output端口名1,端口名2,……端口名n;
//輸出端口inout端口名1,端口名2,……端口名n; //輸入輸出端口⑶信號類型聲明對模塊中所用到的所有信號(包括端口信號、節(jié)點信號等)都必須進行數(shù)據(jù)類型的定義。Verilog語言提供了各種信號類型,分別模擬實際電路中的各種物理連接和物理實體。如果信號的數(shù)據(jù)類型沒有定義,則綜合器將其默認為是wire型。
⑷邏輯功能定義模塊中最核心的部分是邏輯功能定義。定義邏輯功能的幾種基本方法:(1)用assign持續(xù)賦值語句定義assign語句多用于組合邏輯的賦值,稱為持續(xù)賦值方式。若干連續(xù)賦值語句是并列執(zhí)行,與順序無關(guān)。(2)用always過程塊定義always過程語句既可以用來描述組合電路,也可以描述時序電路。過程塊反復(fù)依據(jù)條件執(zhí)行,相當無限循環(huán)執(zhí)行。多個always過程塊并行執(zhí)行,與順序無關(guān)。(3)調(diào)用元件(元件例化)調(diào)用元件的方法類似于在電路圖輸入方式下調(diào)入圖形符號來完成設(shè)計,這種方法側(cè)重于電路的結(jié)構(gòu)描述。
以上邏輯功能混合使用時,它們都是并行執(zhí)行的。⑸Verilog模塊的模板
module<頂層模塊名>(<輸入輸出端口列表>);output輸出端口列表;//輸出端口聲明input輸入端口列表;//輸入端口聲明/*定義數(shù)據(jù),信號的類型,函數(shù)聲明*/reg信號名;//邏輯功能定義assign<結(jié)果信號名>=<表達式>;
//使用assign語句定義邏輯功能//用always塊描述邏輯功能always@(<敏感信號表達式>)begin
//過程賦值//if-else,case語句//while,repeat,for循環(huán)語句//task,function調(diào)用end//調(diào)用其他模塊<調(diào)用模塊名module_name><例化模塊名>(<端口列表port_list>);//門元件例化
門元件關(guān)鍵字<例化門元件名>(<端口列表port_list>);endmodule⑹組合邏輯電路與時序邏輯電路特點組合邏輯電路:電路任意時刻的輸出狀態(tài)只由該時刻各輸入狀態(tài)組合決定,而與電路原狀態(tài)無關(guān)。modulecomp2_1(x,y,z,a,b);inputa,b;outputx,y,z;assignx=(a==b)?1:0//這些語句是并行執(zhí)行assigny=(a<b)?1:0assignz=(a>b)?1:0endmodule如下列數(shù)值比較器程序中a,b的輸入狀態(tài)決定x,y,z輸出結(jié)果。如在實驗中做過的兩路輸入選擇器和二進制半加器都是組合邏輯電路組合電路常采用連續(xù)賦值方式(即assign語句)進行設(shè)計,但采用過程賦值語句(一般用阻塞賦值語句“=”來賦值)和所有輸入信號的電平輸入激勵方式時也可實現(xiàn)組合邏輯電路設(shè)計,但要注意與時序邏輯中使用的賦值方式和激勵條件的不同。可以觀察到上下兩個圖輸入狀態(tài)完全決定輸出狀態(tài)!輸出同步跟隨輸入而變!時序邏輯電路:電路的任意時刻的輸出狀態(tài)不僅取決于該時刻的輸入狀態(tài),還與電路的原狀態(tài)有關(guān)。所以時序電路都有記憶功能。組合邏輯電路與時序邏輯電路特點下列的D觸發(fā)器程序,一般時序電路都由過程語句賦值(可用阻塞“=”或非阻塞賦值語句“<=”來表示)賦值)
,且有邊沿時鐘激勵條件??梢钥吹缴厦鎴D形中的輸入d,只有在CLK上升沿時才能決定輸出,其它時刻輸出都由觸發(fā)器的原狀態(tài)決定(即輸出不是同步跟隨輸入而變)?!?.2
Verilog基本語法概述1Verilog語言要素構(gòu)成2常量3變量4參數(shù)5向量6運算符1Verilog語言要素構(gòu)成Verilog程序由符號流構(gòu)成,符號包括空白符(Whitespace)注釋(Comments)操作符(Operators)數(shù)字(Numbers)字符串(Strings)標識符(Identifiers)關(guān)鍵字(Keywords)等例如:數(shù)碼顯示電路moduledecode4_7(decodeout,indec);output[6:0]decodeout;input[3:0]indec;reg[6:0]decodeout;always@(indec)
begin
case(indec)//用case語句進行譯碼4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;default:decodeout=7'bx;
endcaseendendmodule標識符數(shù)字操作符注釋關(guān)鍵字⑴空白符和注釋
空白符(Whitespace)空白符包括:空格、tab、換行和換頁。空白符使代碼錯落有致,閱讀起來更方便。在綜合時空白符被忽略。注釋(Comment)◆單行注釋:以“//”開始到本行結(jié)束◆多行注釋:多行注釋以“/*”開始,到“*/”結(jié)束例如:⑵標識符(Identifiers)標識符(Identifiers)Verilog中的標識符可以是任意一組字母、數(shù)字以及符號“$”和“_”(下劃線)的組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符是區(qū)分大小寫的。Examples:countCOUNT//COUNT與count是不同的_A1_d2//以下劃線開頭R56_68FIVE用于定義各種功能模塊、參數(shù)和變量的名字。⑶關(guān)鍵字(Keywords)Verilog語言內(nèi)部已經(jīng)使用的詞稱為關(guān)鍵字或保留字,這些保留字用戶不能作為變量或節(jié)點名字使用。關(guān)鍵字都是小寫的。
例如:◆
整數(shù)◆
實數(shù)◆
字符串2、常量及類型程序運行中,值不能被改變的量稱為常量(constants),Verilog中的常量主要有如下3種類型:
①簡單的十進制格式這種形式的整數(shù)數(shù)值代表一個可選的+或-的操作符的數(shù)字系列。并且是一個有符號的數(shù),在計算機內(nèi)將轉(zhuǎn)換為32位補碼形式。如32-15等⑴整數(shù)(integer)②基數(shù)格式表示法整數(shù)按如下方式書寫:<size>'<base><value>即<位寬>’<進制符號><數(shù)字串>size為對應(yīng)二進制數(shù)的寬度;base為進制;value是基于進制的數(shù)字序列。這種形式的表示可靈活控制整數(shù)在計算機內(nèi)位數(shù)。進制有如下4種表示形式:◆
二進制(b或B)◆
十進制(d或D或缺省)◆
十六進制(h或H)◆
八進制(o或O)整數(shù)(integer)Examples:8’b11000101//位寬為八位的二進制數(shù)110001018’hd5//位寬為八位的十六進制數(shù)d5;5’O27//5位八進制數(shù)4’D2//4位十進制數(shù)24’B1x_01//4位二進制數(shù)1x015’Hx//5位x(擴展的x),即xxxxx4’hZ//4位z,即zzzz8□’h□2A/*在位寬和’之間,以及進制和數(shù)值之間允許出現(xiàn)空格,但’和進制之間,數(shù)值間是不允許出現(xiàn)空格的,比如8’□h2A、8’h2□A等形式都是不合法的寫法*/整數(shù)(integer)“位寬”如果缺省則按數(shù)字串的實際位數(shù)計算,如指定的位寬與數(shù)字串的長度不相符,則首先保留右邊的低位,左邊超出的高位部分被截斷;若指定的位寬超過數(shù)字的實際長度,通常在數(shù)字系列的高位部分添0補位,若數(shù)字系列最左邊一位是X或Z,則用x或z在左邊補齊。<位寬>’<進制符號><數(shù)字串>“進制符號”如果缺省則默認為十進制?!皵?shù)字串”中除0~9和字母A~F(與十六進制對應(yīng)的數(shù)字)外還可以出現(xiàn)3種符號;x(表示不確定或隨機狀態(tài))、z(表示高阻狀態(tài))和_(下劃線,沒有實際意義,用于增強程序的可讀性)。每個字符所代表的寬度取決于所用的進制。使用中注意的問題:實數(shù)(Real)有下面兩種表示法?!簪偈M制表示法。這種表示時必須加小數(shù)點。例如:2.00.1 //以上2例是合法的實數(shù)表示形式2. //非法:小數(shù)點兩側(cè)都必須有數(shù)字◆②科學(xué)計數(shù)法。例如:43_5.1e2 //其值為43510.09.6E2 //960.0(e與E相同)5E-4 //0.0005⑵實數(shù)(Real)⑶字符串(Strings)字符串是雙引號內(nèi)的字符序列。字符串不能分成多行書寫。例如:"INTERNALERROR"是錯誤的字符串的作用主要是用于仿真時,顯示一些相關(guān)的信息,或者指定顯示的格式。
字符串是8位ASCⅡ值的系列,是無符號整數(shù)。用反斜杠\表示的字符是特殊的反義字符。如\n表示換行符\t制表符\\\*\2063、變量及數(shù)據(jù)類型
Verilog有下面四種基本的邏輯狀態(tài)?!?/p>
0:低電平、邏輯0或邏輯非◆
1:高電平、邏輯1或“真”◆x或X:不確定或未知的邏輯狀態(tài)◆z或Z:高阻態(tài)Verilog中的所有數(shù)據(jù)類型都在上述4類邏輯狀態(tài)中取值,其中x和z都不區(qū)分大小寫,也就是說,值0x1z與值0X1Z是等同的。變量是用來表示數(shù)字電路中的物理連線、數(shù)據(jù)存儲和傳輸單元等物理量,變量遵循標識符命名規(guī)則。
數(shù)據(jù)類型
Verilog中的變量分為如下兩種數(shù)據(jù)類型:◆net型◆variable型net型中常用的有wire、tri等;variable型包括reg、integer等。注意:在Verilog-1995標準中,variable型變量稱為register型;在Verilog-2001標準中將register一詞改為了variable,以避免初學(xué)者將register和硬件中的寄存器概念混淆起來。VerilogHDL有兩大類數(shù)據(jù)類型線網(wǎng)類型(net型)
nettype表示Verilog結(jié)構(gòu)化元件間的物理連線。它的值由驅(qū)動元件的值決定,例如連續(xù)賦值或門的輸出。如果沒有驅(qū)動元件連接到線網(wǎng),線網(wǎng)的缺省值為z。寄存器類型(variable型)
registertype表示一個抽象的數(shù)據(jù)存儲單元,它只能在always語句和initial語句中被賦值,并且它的值從一個賦值到另一個賦值被保存下來。寄存器類型的變量具有x的缺省值。*線網(wǎng)類型表示構(gòu)件間的物理連線,而寄存器類型表示抽象的數(shù)據(jù)存儲元件。⑴net型Net型數(shù)據(jù)相當于硬件電路中的各種物理連接,其特點是輸出的值緊跟輸入值的變化而變化。對連線型有兩種驅(qū)動方式,一種方式是在結(jié)構(gòu)描述中將其連接到一個門元件或模塊的輸出端;另一種方式是用持續(xù)賦值語句assign對其進行賦值。wire是最常用的Net型變量。變量默認是wire。wire型變量的定義格式如下:wire
[數(shù)據(jù)寬度]數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名n;
[數(shù)據(jù)寬度]:忽略時,后面的變量寬度為“1位”例如:
wirea,b;
//定義了兩個wire型變量a和b,寬度為1位。Examples:wire[7:0]databus;//databus的寬度是8位wire[19:0]addrbus;//addrbus的寬度是20位modulemux4_1a(out,in1,in2,in3,in4,s0,s1);inputin1,in2,in3,in4,s0,s1;outputout;wire
s0_n,s1_n,w,x,y,z;//可以省略not(s0_n,s0),(s1_n,s1);and(w,in1,s0_n,s1_n),(x,in2,s0_n,s1), (y,in3,s0,s1_n),(z,in4,s0,s1);or(out,w,x,y,z);endmodule這個4選1邏輯電路采用結(jié)構(gòu)描述方法,其中的s0_n、s1_n、w、x、y、z這6個信號代表器件之間的物理連接,定義為wire型,當然輸入與輸出口采用默認,也是wire型。【例2.1】Wire特性wire變量仿真時不需要占用存儲單元.⑵
Variable(或稱寄存器型)變量有5種不同的寄存器類型:
?reg
?integer
?time
?real
?realtime■variable型變量必須放在過程語句(如initial、always)中,通過過程賦值語句賦值;在always、initial等過程塊內(nèi)被賦值的信號必須定義成variable型。■注意:variable型變量并不意味著一定對應(yīng)著硬件上的一個觸發(fā)器或寄存器等存儲元件,但在仿真時需要占用一個存儲單元,在綜合器進行綜合時,variable型變量會根據(jù)具體情況來確定是映射成連線還是映射為觸發(fā)器或寄存器。
例如:同樣定義為reg型,但生成的電路單元不同。modulesel(a,b,s,y);inputa,b,s; outputy;regy;always@(a,b,s)
begin
if(s)y=b;
elsey=a;
end
endmoduley生成的為線型驅(qū)動的組合邏輯電路q生成的為寄存器型時序邏輯電路reg型變量■①reg型變量
是最常用的一種variable型變量。定義格式如下:
reg[msb:lsb]reg1,reg2,...regN;msb和lsb
定義了范圍,并且均為常數(shù)值表達式。范圍定義是可選的;如果沒有定義范圍,缺省值為1位寄存器。
例如:rega,b;//定義了兩個reg型變量a,b,長度1位reg[7:0]qout,a;//定義qout和a均為8位寬的reg型向量reg[1:8]qout;reg型變量寄存器可以取任意長度,寄存器中的值通常被解釋為無符號數(shù)。reg[1:4]
Comb;
...
Comb=-2;//Comb的值為14(1110),1110是2的補碼。
Comb=5;//Comb的值為5(0101)。
如:在過程語句中的被賦值變量必須定義為reg型例如:always語句中被賦值的變量定義為reg型②integer為整數(shù)型變量
一般整數(shù)型在計算機內(nèi)至少是32位長度,為補碼有符號數(shù),不能進行位操作,只能整體賦值,但可以通過賦值reg將其轉(zhuǎn)變?yōu)槲徊僮鳌?/p>
格式為:
integer
integer1,integer2,...intergerN[msb:1sb];
integer變量如:integera,b,c;定義了3個32位整型變量
integerhist[3:6];一個由4個整型數(shù)組成的32位數(shù)組msb和lsb是定義整數(shù)數(shù)組界限的常量表達式,數(shù)組界限的定義是可選的。注意容許無位界限的情況。一個整數(shù)最少容納32位。但是具體實現(xiàn)可提供更多的位。integer
J;
reg[3:0]
Bcq;
J=6;//J的值為32‘b0000...00110。
Bcq=J;//Bcq的值為4’b0110。
Bcq=4‘b0101.
J=Bcq;//J的值為32’b0000...00101。
J=-6;//J的值為32‘b1111...11010。
Bcq=J;//Bcq的值為4’b1010。
注意賦值總是從最右端的位向最左邊的位進行;任何多余的位被截斷。例如:integer與reg變量轉(zhuǎn)換reg[31:0]
Breg;integerBint;//Bint[6]和Bint[20:10]是不允許的。...
Breg=Bint;/*現(xiàn)在,Breg[6]和Breg[20:10]是允許的,并且從整數(shù)Bint獲取相應(yīng)的位值。*/
上例說明了如何通過簡單的賦值將整數(shù)轉(zhuǎn)換為位向量。類型轉(zhuǎn)換自動完成,不必使用特定的函數(shù)。從位向量到整數(shù)的轉(zhuǎn)換也可以通過賦值完成。③time類型time類型的寄存器用于存儲和處理時間。time類型的寄存器使用下述方式加以說明。
timetime_id1,time_id2,...,time_idN[msb:1sb];
msb和lsb是表明范圍界限的常量表達式。如果未定義界限,每個標識符存儲一個至少64位的時間值。時間類型的寄存器只存儲無符號數(shù)。
如:
time
Events[0:31];//為32個64位時間值數(shù)組。
timeCurrTime;//CurrTime
存儲一個64位時間。4參數(shù)(parameter)在Verilog語言中,用參數(shù)parameter來定義符號常量,即用parameter來定義一個標志符代表一個常量。參數(shù)常用來定義時延和變量的寬度。參數(shù)是局部的,只在其定義的模塊內(nèi)部起作用。其定義格式如下:parameter
參數(shù)名1=表達式1,參數(shù)名2=表達式2,參數(shù)名3=表達式3,……;
//表達式可以是數(shù)字和已定義的參數(shù)組成的表達式例如:parameterSEL=8,CODE=8'ha3;//分別定義參數(shù)SEL代表常數(shù)8(10進制),參數(shù)CODE代表常量a3(16進制)參數(shù)(parameter)【例2.2】采用參數(shù)定義的加法器moduleadd_w(a,b,sum);parameterMSB=15; //參數(shù)定義input[MSB:0]a,b;output[MSB+1:0]sum;assignsum=a+b;endmodule定義參數(shù)便于對程序中進行相關(guān)調(diào)試!5向量
⑴標量與向量寬度為1位的變量稱為標量,如果在變量聲明中沒有指定位寬,則默認為標量(1位)。舉例如下:
wirea; //a為標量
regclk; //clk為標量reg型變量線寬大于1位的變量(包括net型和variable型)稱為向量(vector)。向量的寬度用下面的形式定義:[msb:lsb]比如:
wire[3:0]bus;//4位的總線⑵位選擇和域選擇
在表達式中可任意選中向量中的一位或相鄰幾位,分別稱為位選擇和域選擇,這種使用方法方便靈活處理各種問題。例如:A=mybyte[6];//位選擇B=mybyte[5:2];//域選擇再比如:reg[7:0]a,b;reg[3:0]c;regd;d=a[7]&b[7]; //位選擇c=a[7:4]+b[3:0]; //域選擇5向量
5向量
⑶存儲器定義格式:reg[位線最高位序號:位線最低序號]信號名[字線最高位序號:字線最低序號];其中的[]內(nèi)的值可省略,默認1位。如:reg[7:0]mem[0:255]定義了一個有256個單元的寬度為8位的存儲器。Reg一維定義的是矢量寄存器,二維定義的是存儲器。5向量
在一個reg語句中既可以定義存儲器型又可以定義寄存器型變量與一維reg型變量不同的是,二維reg型變量在引用時只能以一個單元為單位,既不能同時選擇多個單元,也不能單獨操作單元中的某些位。猶如integer型變量本身就是32位的數(shù)據(jù),因此integer型數(shù)組也只能以一個整數(shù)為單位引用。如果想對位操作,可以先讀出對應(yīng)單元數(shù)據(jù)賦值給一個寄存器,這樣就可以對位操作。5向量
6運算符(Operators)
⑴算術(shù)運算符(Arithmeticoperators)常用的算術(shù)運算符包括:與通常算數(shù)運算相同。算術(shù)運算符⑵位運算符(Bitwiseoperators)位運算是將兩個操作數(shù)按對應(yīng)位分別進行邏輯運算(若長度不同要將位數(shù)少的操作數(shù)填零補齊)。~ 按位取反& 按位與| 按位或^ 按位異或^~,~^ 按位同或(符號^~與~^是等價的)運算符(Operators)⑶邏輯運算符(Logicaloperators)&& 邏輯與||
邏輯或! 邏輯非
同按位操作不同的是將整個操作數(shù)視為真、假或不確定進行邏輯運算(即1、0、x),運算結(jié)果也為這三種狀態(tài)。當操作數(shù)為向量時,邏輯操作符會自動強制其邏輯化,即非零向量當作“1”處理,全零向量當作“0”處理,相當于做了一個“或”規(guī)約。如果操作數(shù)中含有x或z,結(jié)果也為x。運算符(Operators)⑷關(guān)系運算符(Relationaloperators)< 小于<= 小于或等于> 大于>= 大于或等于
用于判斷兩個表達式的值之間的大小關(guān)系,皆為二元操作符,判斷結(jié)果為真、假和不確定(即1、0、x)三種狀態(tài)。運算符(Operators)modulecomp2_2(x,y,z,a,b);
inputa,b;
outputx,y,z;
regx,y,z;always@(a,b)begin
if(a==b)x<=1'b1;
elseif(a<b)y<=1'b1;
elsez<=1'b1;endendmodulemodulecomp2_2(x,y,z,a,b);
inputa,b;
outputx,y,z;
regx,y,z;always@(a,b)begin
if(a==b)beginx<=1'b1;y<=1'b0;z<=1'b0;end
elseif(a<b)beginy<=1'b1;x<=1'b0;z<=1'b0;end
elsebeginz<=1'b1;x<=1'b0;y<=1'b0;endendendmodule下面是數(shù)字比較器電路,判斷a、b大小,根據(jù)大小分別輸出給x、y、z。下面兩種編程方法哪一個正確?仿真結(jié)果⑸等式運算符(EqualityOperators)== 等于!= 不等于=== 全等!== 不全等用于判斷兩個表達式的值之間的大小關(guān)系,皆為二元操作符,判斷結(jié)果為真、假和不確定(即1、0、x)三種狀態(tài)。后兩個只能在仿真中應(yīng)用。運算符(Operators)等式運算符前兩個運算符其比較結(jié)果有三種可能值:真(1),假(0)和不定值(x);而后兩種運算符其比較結(jié)果只有二種可能值:真(1),假(0).運算符(Operators)⑹縮位運算符(Reductionoperators)& 與~& 與非| 或~| 或非^ 異或^~,~^ 同或它們與前面的按位操作符形式相同,但使用方法不同,它們是一元操作符,其作用是將操作數(shù)的各位逐個進行與(與、與非、或、或非、異或、同或等)操作,最終形成一位的邏輯值。運算符(Operators)⑺移位運算符(shiftoperators)>> 右移<< 左移功能與c語言邏輯移位指令一樣,空出的位添0補齊。操作數(shù)<<(>>)移動位數(shù)a=4’B0010;a<<2;a=4’B1000如【例2.3】采用參數(shù)定義的約翰遜計數(shù)器modulejohnson_w(clk,clr,qout);inputclk,clr;parameterWIDTH=8; //參數(shù)定義outputreg[(WIDTH-1):0]qout;always@(posedgeclkorposedgeclr)begin
if(clr)qout<=0;elsebeginqout<=qout<<1; qout[0]<=~qout[WIDTH-1];//靈活運用位賦值實現(xiàn)復(fù)雜邏輯功能endendendmodule0000000000000001000000110000011111111111仿真結(jié)果運算符(Operators)⑻條件運算符(conditionaloperators)三目運算符=?:,其定義方式如下:signal=condition?true_expression:false_expression;即:信號=條件?表達式1:表達式2;當條件成立時,信號取表達式1的值,反之取表達式2的值。modulecomp2_1(x,y,z,a,b);
parameterWIDTH=8;
//通過配置參數(shù)width來調(diào)節(jié)比較器的位寬input[WIDTH-1:0]a,b;
outputx,y,z;
assignx=(a==b)?1:0;//這些語句是并行執(zhí)行
assigny=(a<b)?1:0;
assignz=(a>b)?1:0;endmodule4位輸入,2位輸出的4-2二進制編碼器。當輸入編碼不是4中取一碼時,輸出編碼為全x。//example_4_9:4-2binaryencodermodulebinary_encoder_4_2(
input[3:0]i_dec,
output[1:0]o_dec);//利用數(shù)據(jù)流描述和條件運算符‘?:’進行建模
assigno_dec=(i_dec==4'b0001)?2'b00:(i_dec==4'b0010)?2'b01:(i_dec==4'b0100)?2'b10:(i_dec==4'b1000)?2'b11:2'bxx;endmodule4-2二進制編碼器運算符(Operators)⑼位拼接運算符(concatenationoperators){}該運算符將兩個或多個信號的某些位拼接起來。使用如下:{信號1的某幾位,信號2的某幾位,……,信號n的某幾位}如:assign{ci,si}=ai+bi
半加器求和賦值語句運算符的優(yōu)先級下列為默認的操作符優(yōu)先級排列,在書寫程序時建議用括號()來控制運算的優(yōu)先級。
參數(shù)(parameter)【例2.4】采用參數(shù)定義的數(shù)據(jù)比較器modulecompare_w(a,b,larger,equal,less);parameterSIZE=6; //參數(shù)定義input[SIZE-1:0]a,b;outputlarger,equal,less;wirelarger,equal,less;//可以省略assignlarger=(a>b);assignequal=(a==b);assignless=(a<b);endmodule參數(shù)(parameter)【例2.5】采用參數(shù)定義的二進制計數(shù)器modulecount_w(en,clk,reset,out);inputclk,reset,en;parameterWIDTH=8; //參數(shù)定義output[WIDTH-1:0]out;reg[WIDTH-1:0]out;always@(posedgeclkornegedgereset)if(!reset)out=0;elseif(en)out=out+1;endmodule
主要內(nèi)容◆過程語句(initial、always)◆塊語句(begin-end、fork-join)◆賦值語句(assign、=、<=)◆條件語句(if-else、case、casez、casex)◆循環(huán)語句(for、forever、repeat、while)◆編譯指示語句(`define、`include、`ifdef、`else、`endif)◆任務(wù)(task)與函數(shù)(function)◆順序執(zhí)行與并發(fā)執(zhí)行§2.3
Verilog行為描述語句VerilogHDL行為語句類別語句可綜合性過程語句initial
always√塊語句串行塊begin-end√并行塊fork-join
賦值語句持續(xù)賦值assign√過程賦值=、<=√條件語句if-else√case√
循環(huán)語句for√repeat
while
forever
編譯向?qū)дZ句`define√`include`ifdef,`else,`endif√1過程語句initialalways在一個模塊(module)中,使用initial和always語句的次數(shù)是不受限制的。initial語句常用于仿真中的初始化,initial過程塊中的語句僅執(zhí)行一次;always塊內(nèi)的語句則是不斷重復(fù)執(zhí)行的。并且模塊中的多個always和initial語句是同時并行運行。always過程語句使用模板always@(<敏感信號表達式event-expression>)begin//過程賦值//if-else,case,casex,casez選擇語句//while,repeat,for循環(huán)//task,function調(diào)用end“always”過程語句通常是帶有觸發(fā)條件的,觸發(fā)條件寫在敏感信號表達式中,只有當觸發(fā)條件滿足時,其后的“begin-end”塊內(nèi)語句才能按順序執(zhí)行。⑴敏感信號表達式:@(<敏感信號表達式event-expression>)敏感信號表達式又稱事件表達式或敏感信號列表,即當該表達式中變量的值改變時,就會引發(fā)塊內(nèi)語句的執(zhí)行。因此敏感信號表達式中應(yīng)列出影響塊內(nèi)取值的所有信號。若有兩個或兩個以上信號時,它們之間用“,”連接(或用“or”連接)。敏感信號列表可放在模塊內(nèi)任何位置,但一般放在always語句后。例如:@(a) //當信號a的值發(fā)生改變@(a,b) //當信號a或信號b的值發(fā)生改變@(posedgeclock)//當clock的上升沿到來時@(negedgeclock)//當clock的下降沿到來時@(posedgeclkornegedgereset) //當clk的上升沿到來或reset信號的下降沿到來敏感信號列表舉例modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always
@(in0,in1,in2,in3,sel)//敏感信號列表case(sel)2'b00: out=in0;2'b01: out=in1;2'b10: out=in2;2'b11: out=in3;
default:out=2'bx;endcaseendmodule4選1數(shù)據(jù)選擇器posedge和negedge關(guān)鍵字對于時序電路,事件通常是由時鐘邊沿觸發(fā)的,為表達邊沿這個概念,Verilog提供了posedge表示上升沿和negedge表示下降沿關(guān)鍵字來描述。比如:【例】同步置數(shù)、同步清零的計數(shù)器modulecount(out,data,load,reset,clk);output[7:0]out;input[7:0]data;inputload,clk,reset;reg[7:0]out;always
@(posedge
clk)//clk上升沿觸發(fā)
begin
if(!reset)out=8'h00;//同步清0,低電平有效
else
if(load)out=data;//同步預(yù)置
else out=out+1; //計數(shù)endendmodule⑵語句塊塊語句是包含在過程語句中,是由塊標志符begin-end或fork-join界定的一組語句,當塊語句只包含一條語句時,塊標志符可以缺省。begin-end串行塊中的語句按串行方式順序執(zhí)行。比如:
begin regb=rega; regc=regb; end由于begin-end塊內(nèi)的語句順序執(zhí)行,在最后,將regb、regc的值都更新為rega的值,該begin-end塊執(zhí)行完后,regb、regc的值是相同的。但要注意當賦值符“=”變?yōu)椤?lt;=”賦值符,則語句不是順序執(zhí)行,而是并行執(zhí)行(后面將進一步說明)。2賦值語句⑴持續(xù)賦值語句(ContinuousAssignments)assign為持續(xù)賦值語句,主要用于對wire型變量的賦值,并且用“=”進行賦值。比如:assignc=a&b;在上面的賦值中,a、b、c三個變量皆為wire型變量,a和b信號的任何變化,都將隨時反映到c上來。該語句不能放在過程語句塊中,并且同過程語句并行運行。過程賦值語句多用于對reg型變量進行賦值。并且放在過程語句initial和always中。(1)非阻塞(non_blocking)賦值方式賦值符號為“<=”,如:b<=a;非阻塞賦值在整個過程塊結(jié)束時才完成賦值操作,即b的值并不是立刻就改變的。多個這樣的語句是同時并行執(zhí)行的。(2)阻塞(blocking)賦值方式賦值符號為“=”,如:b=a;阻塞賦值在該語句結(jié)束時就立即完成賦值操作,即b的值在該條語句結(jié)束后立刻改變。如果在一個塊語句中,有多條阻塞賦值語句,那么在前面的賦值語句沒有完成之前,后面的語句就不能被執(zhí)行,仿佛被阻塞了(blocking)一樣,因此稱為阻塞賦值方式。所以這類賦值語句是順序執(zhí)行。⑵過程賦值語句阻塞賦值與非阻塞賦值硬件描述非阻塞賦值modulenon_block(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk) begin b<=a; c<=b; endendmodule阻塞賦值moduleblock(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk) begin b=a; c=b; endendmodule阻塞賦值與非阻塞賦值仿真波形非阻塞賦值仿真波形圖
阻塞賦值仿真波形圖阻塞賦值與非阻塞賦值生成的電路非阻塞賦值綜合結(jié)果阻塞賦值綜合結(jié)果在過程語句中采用不同的賦值語句將會得到不同結(jié)果,所以使用時要注意!持續(xù)賦值與過程賦值區(qū)別:觀察下列兩種方式賦值的語句,其實現(xiàn)的結(jié)果相同,但過程不同。regA_xor_xire生成的電路為:持續(xù)賦值與過程賦值區(qū)別:持續(xù)賦值與過程賦值區(qū)別:3條件語句⑴(if-else語句)if-else語句使用方法有以下3種:(1)if(表達式)語句塊;//單分支條件語句(2)if(表達式)語句塊;//雙分支條件語句
else語句塊;(3)if(表達式1)語句塊;//多分支條件語
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 錘擊樁施工工藝與案例分析
- 客戶關(guān)系管理案例分析報告
- 2025荷蘭綠色能源行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025荷蘭農(nóng)業(yè)科技行業(yè)市場詳盡分析及發(fā)展?jié)摿εc投資策略研究報告
- 2025芯片制造設(shè)備研磨分析及投資融資策略研究報告
- 2025航運物流行業(yè)市場分析突破趨勢覆蓋投資策略研究報告
- 2025山東臨沂高新區(qū)招聘10人備考考試題庫及答案解析
- 2026年西安市經(jīng)開第四學(xué)校校園招聘(23人)備考考試試題及答案解析
- 部編版八年級道德法治上冊《網(wǎng)絡(luò)生活新空間》教案(2025-2026學(xué)年)
- 冀教版五年級語文冀教上冊生命中最美好的時刻教案
- 2025四川成都東部新區(qū)招聘編外工作人員29人筆試考試參考試題及答案解析
- 《11845丨中國法律史(統(tǒng)設(shè)課)》機考題庫
- 2025年消防設(shè)施操作員中級理論考試1000題(附答案)
- 廣東省領(lǐng)航高中聯(lián)盟2025-2026學(xué)年高三上學(xué)期12月聯(lián)考地理試卷(含答案)
- 人工挖孔樁安全防護課件
- 2025年廣西普法考試題目及答案
- 防火門安裝驗收標準方案
- 甲狀腺手術(shù)術(shù)后護理指南
- 員工吸煙區(qū)管理規(guī)范培訓(xùn)
- 貨物運輸企業(yè)安全生產(chǎn)隱患排查治理制度
- 2024年郴州職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫附答案詳解
評論
0/150
提交評論