![模擬電路與數(shù)字電路:Verilog HDL 硬件描述語言_第1頁](http://file4.renrendoc.com/view/77fbd38052c91f8803523126b5d2972c/77fbd38052c91f8803523126b5d2972c1.gif)
![模擬電路與數(shù)字電路:Verilog HDL 硬件描述語言_第2頁](http://file4.renrendoc.com/view/77fbd38052c91f8803523126b5d2972c/77fbd38052c91f8803523126b5d2972c2.gif)
![模擬電路與數(shù)字電路:Verilog HDL 硬件描述語言_第3頁](http://file4.renrendoc.com/view/77fbd38052c91f8803523126b5d2972c/77fbd38052c91f8803523126b5d2972c3.gif)
![模擬電路與數(shù)字電路:Verilog HDL 硬件描述語言_第4頁](http://file4.renrendoc.com/view/77fbd38052c91f8803523126b5d2972c/77fbd38052c91f8803523126b5d2972c4.gif)
![模擬電路與數(shù)字電路:Verilog HDL 硬件描述語言_第5頁](http://file4.renrendoc.com/view/77fbd38052c91f8803523126b5d2972c/77fbd38052c91f8803523126b5d2972c5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
VerilogHDL硬件描述語言
[1].(美)J.Bhasker著徐振林等譯,VerilogHDL硬件描述語言,機(jī)械工業(yè)出版社,2000.7[2].王金明楊吉斌編著,數(shù)字系統(tǒng)設(shè)計與VerilogHDL,電子工業(yè)出版社,2002.2[3].夏宇聞編著,從算法設(shè)計到硬線邏輯的實(shí)現(xiàn)-復(fù)雜數(shù)字邏輯系統(tǒng)的VerilogHDL設(shè)計技術(shù)和方法,高等教學(xué)出版社,2000.9參考書
VerilogHDL是一種用于數(shù)字邏輯電路設(shè)計的硬件描述語言,可用于從算法級、門級到開關(guān)級的多種抽象層次的數(shù)字系統(tǒng)設(shè)計。
VerilogHDL語言最初是于1983年由GatewayDesignAutomation公司開發(fā)的邏輯模擬器——Verilog-XL及其硬件描述語言。1989年,該公司被Cadence公司收購。1990年,Cadence公司公開發(fā)表了VerilogHDL語言。由于這種語言具有簡捷、高效、易學(xué)易用、功能強(qiáng)等優(yōu)點(diǎn),因此逐漸為眾多設(shè)計者所接受和喜愛。引言引言
VerilogHDL語言于1995年成為IEEE標(biāo)準(zhǔn),稱為IEEEStandard1364-1995。
從語法結(jié)構(gòu)上看,VerilogHDL語言與C語言有許多相似之處,并繼承和借鑒了C語言的多種操作符和語法結(jié)構(gòu)。它具有以下一些主要特點(diǎn):能形式化地表示電路的結(jié)構(gòu)和行為。借用高級語言的結(jié)構(gòu)和語句,例如條件語句、賦值語句和循環(huán)語句等,在VerilogHDL中都可以使用,既簡化了電路的描述,又方便了設(shè)計人員的學(xué)習(xí)和使用。引言
能夠在多個層次上對所設(shè)計的系統(tǒng)加以描述,從開關(guān)級、門級、寄存器級(RTL)到功能級和系統(tǒng)級,都可以描述。設(shè)計規(guī)??梢允侨我獾?,語言不對設(shè)計的規(guī)模施加任何限制。
VerilogHDL具有混合建模能力,即在一個設(shè)計中各個模塊可以在不同設(shè)計層次上建模和描述?;具壿嬮T,例如and、or和nand等都內(nèi)置在語言中;開關(guān)級結(jié)構(gòu)模型,例如pmos和nmos等也內(nèi)置在語言中,用戶可以直接調(diào)用。引言
用戶定義原語(UDP)創(chuàng)建的靈活性。用戶定義的原語既可以是組合邏輯原語,也可以是時序邏輯原語。VerilogHDL還具有內(nèi)置邏輯函數(shù)。
VerilogHDL語言最大的特點(diǎn)是易學(xué)易用,通過學(xué)習(xí)和使用,可以在短時間內(nèi)掌握該語言。另外,該語言功能強(qiáng),可以滿足各個層次設(shè)計人員的需要,從高層的系統(tǒng)描述到低層的版圖設(shè)計,都能很好地支持。由于VerilogHDL巨大的優(yōu)越性,使得它廣泛流行,尤其是在ASIC設(shè)計領(lǐng)域,更是處于主流地位。2.VerilogHDL基本結(jié)構(gòu)1.簡單的VerilogHDL例子(1)一個4位全加器的VerilogHDL源代碼:moduleadder4(cout,sum,a,b,cin);outputcout;output[3:0]sum;input[3:0]a,b;inputcin;assign{cout,sum}=a+b+cin;endmodule簡單的VerilogHDL例子(2)一個比較器的VerilogHDL源代碼:
modulecompare(equal,a,b);outputequal;//聲明輸出信號equalinput[1:0]a,b;//聲明輸入信號a,bassignequal=(a==b)?1:0;
/*如果兩個輸入信號相等,輸出為1,否則為0*/
endmodule簡單的VerilogHDL例子(3)一個8位計數(shù)器的VerilogHDL源代碼:modulecounter8(out,cout,data,load,clk);output[7:0]out;outputcout;input[7:0]data;inputload,clk;reg[7:0]out;always@(posedgeclk)beginif(load)out=data;elseout=out+1;endassigncout=&out;endmodule
從上面的例子可以看出:1.VerilogHDL程序是由模塊構(gòu)成的。每個模塊的內(nèi)容都是嵌在module和endmodule兩個語句之間,每個模塊實(shí)現(xiàn)特定的功能。模塊是可以進(jìn)行層次嵌套的。2.每個模塊首先要進(jìn)行端口定義,并說明輸入(input)和輸出(output),然后對模塊的功能進(jìn)行邏輯描述。3.
VerilogHDL程序的書寫格式自由,一行可以寫幾個語句,一個語句也可以分多行寫。4.
除了endmodule語句和begin/end語句外,每個語句和數(shù)據(jù)定義的最后必須有分號“;”。5.可以用/*……*/和//……對VerilogHDL程序的任何部分作注釋。(一個完整的源程序都應(yīng)當(dāng)加上必要的注釋,以增強(qiáng)程序的可讀性和可維護(hù)性。)
Verilog
是大小寫敏感的(即區(qū)分大小寫)。所有的Verilog關(guān)鍵詞都是小寫的。VerilogHDL模塊的結(jié)構(gòu)
Verilog的基本設(shè)計單元是“模塊”(block)。一個模塊是由兩部分組成的:一)描述接口;二)描述邏輯功能,即定義輸入是如何影響輸出的。下面舉例說明:
module
block
(a,b,c,d);input
a,b;output
c,d;assign
c=
a
|
b
;assign
d=
a
&
b;endmodule
abcd
VerilogHDL模塊的結(jié)構(gòu)從上面的例子可以看出:-Verilog模塊結(jié)構(gòu)完全嵌在module和endmodule聲明語句之間;-每個Verilog程序包括四個主要部分:端口定義、I/O說明、信號類型聲明、功能描述。1.模塊的端口定義
模塊的端口聲明了模塊的輸入和輸出口。其格式如下:
module模塊名(口1,口2,口3,……);2.模塊內(nèi)容
模塊內(nèi)容包括I/O說明,信號類型聲明和功能定義。(1)I/O說明的格式如下:
輸入口:input端口名1,端口名2,……,端口名N;
輸出口:output端口名1,端口名2,……,端口名N;
I/O說明也可以寫在端口聲明語句里。其格式如下:
modulemodule-name(inputport1,inputport2,……outputport1,outputport2,……);(2)信號類型聲明:它是說明邏輯描述中所用信號的數(shù)據(jù)類型及函數(shù)聲明。如前面計數(shù)器模塊中:reg[7:0]out;//定義out的數(shù)據(jù)類型為reg(寄存器)型
對于端口信號的缺省定義類型為wire(連線)型。邏輯功能定義模塊中最重要的部分是邏輯功能定義。有3種方法可在模塊中描述邏輯。1.用“assign”語句如:assignF=~((A&B)|(C&D));
這種方法的句法很簡單,只須寫一個“assign”,后面在加一個方程式即可。“assign”語句一般適合于對組合邏輯進(jìn)行賦值,稱為連續(xù)賦值方式。2.用實(shí)例元件
如:andmyand3(f,a,b,c);
這個語句利用VerilogHDL提供的與門庫,定義了一個三輸入的與門。采用實(shí)例元件的方法象在電路圖輸入方式下,調(diào)入庫元件一樣,鍵入元件的名字和引腳的名字即可。其中:實(shí)例名“myand3”是可選的。如果使用實(shí)例名,名字必須唯一。邏輯功能定義3.用“always”塊語句在前面的計數(shù)器模塊中:
always@(posedgeclk)//每當(dāng)時鐘上升沿到來時執(zhí)行一遍塊內(nèi)語句
beginif(load)out=data;elseout=out+1;end“always”塊可用于產(chǎn)生各種邏輯,常用于描述時序邏輯。這個例子中用“always”塊生成了一個帶同步置數(shù)的計數(shù)器。數(shù)據(jù)類型及常量、變量
VerilogHDL中總共有19種數(shù)據(jù)型。數(shù)據(jù)類型是用來表示數(shù)字電路中的數(shù)據(jù)存儲和傳送單元的。其中4個最基本的數(shù)據(jù)類型是:reg型、wire型、integer型、parameter型。
VerilogHDL語言中也有常量和變量之分,它們分別屬于以上這些類型。下面對最常用的幾種進(jìn)行介紹。常量在程序運(yùn)行過程中,其值不能被改變的量稱為常量。
1.數(shù)字(1)整數(shù)
在VerilogHDL中,整數(shù)型常量即整常數(shù)有以下4種進(jìn)制表示形式:1)二進(jìn)制整數(shù)(b或B);2)十進(jìn)制整數(shù)(d或D);3)十六進(jìn)制整數(shù)(h或H);4)
八進(jìn)制整數(shù)(o或O)。數(shù)字完整的數(shù)字表達(dá)式為:
<位寬>’<進(jìn)制><數(shù)字>位寬為對應(yīng)二進(jìn)制數(shù)的寬度,如:8’b11000101//位寬為8的數(shù)的二進(jìn)制表示,’b表示二進(jìn)制8’hc5//位寬為8的數(shù)的十六進(jìn)制,’h表示十六進(jìn)制十進(jìn)制的數(shù)可以缺省位寬和進(jìn)制說明,如:197//代表十進(jìn)制數(shù)197(2)x和z值
x代表不定值,z代表高阻值。每個字符代表的寬度取決于所用的進(jìn)制,例如:8’b1001xxxx
等價于8’h9x8’b1010zzzz等價于8’haz
在case語句中使用x進(jìn)行匹配,可增強(qiáng)程序的可讀性。在較長的數(shù)之間可用下劃線分開,如16’b1010_1101_0010_1001。當(dāng)變量不說明位數(shù)時,默認(rèn)值為32位。此外,“?”是高阻態(tài)z的另一種表示符號。Parameter常量
在VerilogHDL中,用parameter來定義常量,即用parameter來定義一個標(biāo)識符,代表一個常量,稱為符號常量。其說明格式如下:
parameter
參數(shù)名1=表達(dá)式,參數(shù)名2=表達(dá)式,……,參數(shù)名n=表達(dá)式;
例如:parametersel=8,code=8’ha3;//分別定義參數(shù)sel為常數(shù)8(十進(jìn)制),參數(shù)code為常數(shù)a3(十六進(jìn)制)又如:parameterdatawidth=8,
addrwidth=datawidth*2;變量
變量是在程序運(yùn)行過程中其值可以改變的量。變量分為兩種:網(wǎng)絡(luò)型(nets)和寄存器型(register)。1.nets型變量
nets型變量指輸出始終根據(jù)輸入的變化而更新其值的變量,它一般指的是硬件電路中的各種物理連接。VerilogHDL中提供了多種nets型變量,具體見下表:類型功能說明wire,tri連線類型wor,trior具有線或特性的連線wand,triand具有線與特性的連線tri1,tri0分別為上拉電阻和下拉電阻supply1,supply2分別為電源(邏輯1)和地(邏輯0)Nets型變量
這里著重介紹wire型變量。Wire是一種最常用的nets型變量,wire型數(shù)據(jù)常用來表示以assign語句賦值的組合邏輯信號。VerilogHDL模塊中的輸入/輸出信號類型缺省時自動定義為wire型。wire型信號可以用作任何方程式的輸入,也可以用作“assign”語句和實(shí)例元件的輸出。對于綜合而言,其取值為0,1,x,z。wire型變量的定義格式如下:
wire數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;Wire型變量例如:
wirea,b;//定義了兩個wire型變量a,b
上面兩個變量a,b的寬度為1位,若定義一個向量(vectors),可按以下方式:
wire[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;wire[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;
它們定義了數(shù)據(jù)寬度為n位。如下面定義了8位寬的數(shù)據(jù)總線,20位寬的地址總線:
wire[7:0]databus;wire[19:0]addrbus;或
wire[8:1]databus;wire[20:1]addrbus;register型變量
register型變量對應(yīng)的是具有狀態(tài)保持作用的電路元件,如觸發(fā)器、寄存器等。register型變量與nets變量的根本區(qū)別在于:register型變量需要被明確地賦值,并且在被重新賦值前一直保持原值。在設(shè)計中必須將寄存器型變量放在過程塊語句(如initial,always)中,通過過程賦值語句賦值。在always,initial等過程塊內(nèi)被賦值的每一個信號都必須定義成寄存器型。
VerilogHDL中,有4種寄存器型變量,具體見下表:類型reg常用的寄存器型變量integer32位帶符號整數(shù)型變量real64位帶符號實(shí)數(shù)型變量time無符號時間變量register型變量
integer、real、time3種寄存器型變量都是純數(shù)學(xué)的抽象描述,不對應(yīng)任何具體的硬件電路。reg型變量是最常用的一種寄存器型變量,下面著重對其進(jìn)行介紹。
reg型變量的定義格式類似于wire型,具體格式為:
reg
數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;例如:
rega,b;//定義了兩個reg型變量a,b下面的語句定義了8位寬的數(shù)據(jù):
reg[7:0]data;
//定義data為8位寬的reg型向量
或reg[8:1]data;數(shù)組
若干個相同寬度的向量構(gòu)成數(shù)組,reg型數(shù)組變量即為memory型變量,即可定義存儲器型數(shù)據(jù)。如:
reg[7:0]mymem[1023:0];
上面的語句定義了一個1024個字節(jié)、每個字節(jié)寬度為8位的存儲器。通常,存儲器采用如下方式定義:
parameterwordwidth=8,memsize=1024;
reg[wordwidth-1:0]mymem[memsize-1:0];運(yùn)算符及表達(dá)式
VerilogHDL的運(yùn)算符范圍很廣,其運(yùn)算符按其功能可分為以下幾類:1.算術(shù)運(yùn)算符
+,-,×,/,%
以上的算術(shù)運(yùn)算符都屬于雙目運(yùn)算符。前面4種用于常用的加、減、乘、除四則運(yùn)算,%是求模運(yùn)算符,或稱為求余運(yùn)算符。2.邏輯運(yùn)算符
&&邏輯與||邏輯或!邏輯非運(yùn)算符及表達(dá)式3.位運(yùn)算符位運(yùn)算符是將兩個操作數(shù)按對應(yīng)位進(jìn)行邏輯運(yùn)算,位運(yùn)算符包括:~按位取反&按位與|按位或^按位異或^~,~^按位同或(^~與~^是等價的)要注意的一點(diǎn)是兩個不同長度的數(shù)據(jù)進(jìn)行位運(yùn)算時,會自動將兩個操作數(shù)按右端對齊,位數(shù)少的操作數(shù)會在高位用0補(bǔ)齊。運(yùn)算符及表達(dá)式4.關(guān)系運(yùn)算符
< 小于
<= 小于或等于 > 大于 >= 大于或等于在進(jìn)行關(guān)系運(yùn)算時,如果聲明的關(guān)系是假,則返回值是0;如果聲明的關(guān)系是真,則返回值是1;如果某個操作數(shù)的值不確定,則其結(jié)果是模糊的,返回值是不確定的。運(yùn)算符及表達(dá)式5.等式運(yùn)算符 == 等于
!= 不等于 === 全等 !== 不全等這4種運(yùn)算符都是雙目運(yùn)算符,得到的結(jié)果是1位的邏輯值。如果得到1,說明聲明的關(guān)系為真;如得到0,說明聲明的關(guān)系為假?!?==”和“==”運(yùn)算符的不同是,它在對操作數(shù)進(jìn)行比較時對某些位的不定值x和高阻值z也進(jìn)行比較,兩個操作數(shù)必需完全一致,其結(jié)果才是1,否則為0。比如:a=4’b1x01,b=4’b1x01,則“a==b”的結(jié)果為不定值x,而“a===b”的結(jié)果為1。運(yùn)算符及表達(dá)式6.縮減運(yùn)算符縮減運(yùn)算符是單目運(yùn)算符,它有:& 與~& 與非| 或~| 或非^ 異或~^,^~ 同或縮減運(yùn)算符與位運(yùn)算符的邏輯運(yùn)算法則一樣,但縮減運(yùn)算符是單個操作數(shù)逐位進(jìn)行與、或、異或等遞推運(yùn)算。運(yùn)算符及表達(dá)式7.移位運(yùn)算符>>右移<<左移
VerilogHDL的移位運(yùn)算符只有左移和右移兩個,其用法為:A>>n或A<<n,表示把操作數(shù)A右移或左移n位,同時用0填補(bǔ)移出的位。例:A=5’b11001
則A>>2的值為5’b00110。運(yùn)算符及表達(dá)式8.條件運(yùn)算符?:它是一個三目運(yùn)算符,對3個操作數(shù)進(jìn)行運(yùn)算,其意義同C語言中的定義一樣,方式如下:信號=條件?表達(dá)式1:表達(dá)式2;當(dāng)條件成立時,信號取表達(dá)式1的值,反之取表達(dá)式2的值。例如:對2選1的MUX可描述如下:
out=sel?in1:in0;
即sel=1時out=in1;sel=0時out=in0。運(yùn)算符及表達(dá)式9.位拼接運(yùn)算符{}它將兩個或多個信號的某些位拼接起來。用法如下:{信號1的某幾位,信號2的某幾位,......,信號n的某幾位}
如:{a,b[3:0],w,3’b101}也可以寫成為{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}
位拼接還可以用重復(fù)法來簡化表達(dá)式。如:{4{w}}//等同于{w,w,w,w}
位拼接還可以用嵌套的方式來表達(dá)。如:{b,{3{a,b}}}//這等同于{b,a,b,a,b,a,b}
運(yùn)算符的優(yōu)先級
優(yōu)先級別
!~高優(yōu)先級別*/%+—<<>><<=>>===!====!==&~&^^~|~|&&||?:低優(yōu)先級別語句
賦值語句1.連續(xù)賦值語句
assign為連續(xù)賦值語句,它用于對wire型變量進(jìn)行賦值。如:
assignc=a&b;
在上面的賦值中,a、b、c三個變量皆為wire型變量,a和b信號的任何變化,都將隨時反映到c上來,因此稱為連續(xù)賦值方式。2.過程賦值語句過程賦值語句用于對寄存器類型(reg)的變量進(jìn)行賦值,主要用在“always”模塊內(nèi)。過程賦值有兩種方式:(1)非阻塞賦值<=如b<=a;
非阻塞賦值在塊結(jié)束時才完成賦值操作,即b的值并不是立即就改變的。(2)阻塞賦值=如b=a;
阻塞賦值在該語句結(jié)束時就完成賦值操作,即b的值在該賦值語句結(jié)束后立刻改變。非阻塞賦值和阻塞賦值的區(qū)別例:非阻塞賦值:阻塞賦值:
modulenon_block(c,b,a,clk);
moduleblock(c,b,a,clk);outputc,b;
outputc,b;inputclk,a;inputclk,a;
regc,b;regc,b;always@(posedgeclk)
always@(posedgeclk)
begin
beginb<=a;
b=a;c<=b;
c=b;endend
endmoduleendmoduleclkbDQCLKDQCLKacbDQCLKaclkcif語句條件語句有if-else語句和case語句兩種。它們都是順序語句,應(yīng)放在“always”塊內(nèi)。1.if-else語句其格式與C語言中的if-else語句類似,有3種:①if(表達(dá)式)語句1;②if(表達(dá)式)語句1;
else語句2;③if(表達(dá)式1)語句1;
elseif(表達(dá)式2)
語句2;
elseif(表達(dá)式3)語句3;……
elseif(表達(dá)式n)語句n;else語句n+1;如執(zhí)行的語句為多句時,要用“begin-end”語句括起來。case語句2.case語句相對if語句只有兩個分支而言,case語句是一種多分支語句,故case語句多用于多條件譯碼電路,如描述譯碼器、數(shù)據(jù)選擇器、狀態(tài)機(jī)及微處理器的指令譯碼等。case有case、casez、casex三種表示方式。(1)case語句
case(敏感表達(dá)式)值1:語句1;//case分支項值2:語句2;……值n:語句n;default:語句n+1;//default語句可以省略
endcase說明:與C語言不同,這里case語句的每個分支不需要用break語句跳出。VerilogHDL中沒有break語句。casez與casex語句(2)casez與casex語句在casez與casex語句中,值1~值n中的某些位可以是z和x,比較時對這些位不予考慮。另外,還可以用無關(guān)值“?”來表示z。
casez與casex語句的格式與case語句相同。循環(huán)語句在verilogHDL中有4種類型的循環(huán)語句,用來控制語句的執(zhí)行次數(shù),這4種語句分別是:(1)forever連續(xù)地執(zhí)行語句,多用在“initial”塊中,以生成周期性輸入波形。(2)repeat
連續(xù)執(zhí)行一條語句n次。(3)while
執(zhí)行一條語句,直到某個條件不滿足。(4)for語句。1.for語句,格式同C語言:
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句即for(循環(huán)變量賦初值;循環(huán)結(jié)束條件;循環(huán)變量增值)執(zhí)行語句循環(huán)語句12.repeat語句
repeat(循環(huán)次數(shù)表達(dá)式)語句;或repeat(循環(huán)次數(shù)表達(dá)式)begin……end3.while語句
while(循環(huán)執(zhí)行條件表達(dá)式)語句;或while(循環(huán)執(zhí)行條件表達(dá)式)begin
……
end4.forever語句
forever語句;或foreverbegin
……
end結(jié)構(gòu)說明語句1
VerilogHDL中的任何過程模塊都從屬于以下4種結(jié)構(gòu)說明語句:initialalwaystaskfunction
在一個模塊(module)中,使用initial和always語句的次數(shù)是不受限制的。Initial說明語句一般用于仿真中的初始化,僅執(zhí)行一次;always塊內(nèi)的語句則是不斷重復(fù)執(zhí)行的;task和function語句可以在程序模塊中的一處或多處調(diào)用。always塊語句格式:always@(<敏感信號表達(dá)式event-expression>)
begin
//過程賦值//if語句//case語句//while,repeat,for循環(huán)//task,function調(diào)用
end敏感信號表達(dá)式“event-expression”
敏感信號表達(dá)式又稱事件表達(dá)式或敏感表,當(dāng)該表達(dá)式的值改變時,就會執(zhí)行一遍塊內(nèi)語句。因此在敏感信號表達(dá)式中應(yīng)列出影響塊內(nèi)取值的所有信號,若有兩個或兩個以上信號時,它們之間用“or”連接。always塊語句posedge與negedge關(guān)鍵字對于時序電路,事件是由時鐘邊沿觸發(fā)的。為表達(dá)邊沿這個概念,verilogHDL提供了posedge與negedge兩個關(guān)鍵字來描述,分別表示信號的上升沿和下降沿。如:always@(posedge
clk)//表示時鐘信號clk的上升沿
always@(negedge
clk)//表示時鐘信號clk的下降沿initial語句格式:initialbegin
語句1;語句2;……
end例:initialbeginreg1=0;for(addr=0;addr<size;addr=addr+1)memory[addr]=0;end
在上面的例子中,使用initial語句首先將一個變量reg1初始化為0,然后又用for循環(huán)語句將memory存儲器進(jìn)行初始化,將其所有的存儲單元都置為“0”。task和function語句
task和function語句分別用來定義任務(wù)和函數(shù)。利用任務(wù)和函數(shù)可以把一個大的程序模塊分解成許多小的任務(wù)和函數(shù),以方便調(diào)試,并且能使寫出的程序清晰易懂。1.任務(wù)(task)
定義:task<任務(wù)名>;端口及數(shù)據(jù)類型聲明語句;其他語句;
endtask
調(diào)用:<任務(wù)名>(端口1,端口2,……);說明:①任務(wù)的定義和調(diào)用須在一個module模塊內(nèi)。②定義任務(wù)時,沒有端口名列表,但需要在后面進(jìn)行端口和數(shù)據(jù)類型的說明。③當(dāng)任務(wù)被調(diào)用時,任務(wù)被激活。任務(wù)的調(diào)用與模塊調(diào)用一樣通過任務(wù)名調(diào)用實(shí)現(xiàn),調(diào)用時,需列出端口名列表,端口名的排序和類型必須與任務(wù)定義中的排序和類型一致。④一個任務(wù)可以調(diào)用別的任務(wù)和函數(shù),調(diào)用的個數(shù)不限。task和function語句2.函數(shù)(function)
定義:function<返回值位寬和類型說明>函數(shù)名;端口聲明;局部變量定義;其他語句;
endfunction
<返回值位寬和類型說明>是一個可選的項,如果省略,則返回值為一位關(guān)于寄存器類型的數(shù)據(jù)。函數(shù)的定義中蘊(yùn)含了一個與函數(shù)同名的、函數(shù)內(nèi)部的寄存器。在函數(shù)定義時,將函數(shù)返回值所使用的寄存器設(shè)為與函數(shù)同名的內(nèi)部變量,因此函數(shù)名被賦予的值就是函數(shù)的返回值。函數(shù)的調(diào)用是通過將函數(shù)作為表達(dá)式中的操作數(shù)來實(shí)現(xiàn)的。調(diào)用格式如下:
<函數(shù)名>(<表達(dá)式><表達(dá)式>);函數(shù)的使用與任務(wù)相比有更多的限制和約束。例如,函數(shù)不能啟動任務(wù),在函數(shù)中不能包含有任何的時間控制語句,同時定義函數(shù)時至少要有一個輸入?yún)⒘康?。這些需要在使用時注意。task和function語句3.任務(wù)與函數(shù)的區(qū)別任務(wù)(task)函數(shù)(function)輸入與輸出可有任意個各種類型的參數(shù)至少有一個輸入,不能將inout類型作為輸出調(diào)用任務(wù)只可在過程語句中調(diào)用,不能在連續(xù)賦值語句assign中調(diào)用函數(shù)可作為表達(dá)式中的一個操作數(shù)來調(diào)用,在過程賦值和連續(xù)賦值語句中均可調(diào)用調(diào)用其他任務(wù)和函數(shù)任務(wù)可調(diào)用其他任務(wù)和函數(shù)函數(shù)可調(diào)用其他函數(shù),但不可以調(diào)用其他任務(wù)返回值任務(wù)不向表達(dá)式返回值函數(shù)向調(diào)用它的表達(dá)式返回一個值上面介紹了VerilogHDL的結(jié)構(gòu)說明語句。在使用這些語句時,另外需要注意的一點(diǎn)是有的編譯器對某些結(jié)構(gòu)說明語句是不支持的。如MAX+PLUSII,該軟件支持always、function語句,但不支持task和initial語句。編譯預(yù)處理語句VerilogHDL語言和C語言一樣也提供了編譯預(yù)處理功能。編譯引導(dǎo)語句用主鍵盤左上角小寫鍵“`”起頭。在編譯時,先對這些特殊語句進(jìn)行“預(yù)處理”,然后再將預(yù)處理的結(jié)果和源程序一起進(jìn)行編譯。常用的編譯預(yù)處理語句有:
`define`include`timescale`define語句使用`define編譯預(yù)處理語句能提供簡單的文本替代功能,其形式為:`define<宏名><宏文本>
在編譯時會用宏文本來替代源代碼中的宏名。合理地使用`define可以提高程序的可讀性舉例說明:`defineon1’b1`defineoff1’b0`defineand_delay#3
在程序中可以用有含義的文字來表示沒有意思的數(shù)碼,提高了程序的可讀性,上面程序中用`on,`off,`and_delay分別表示1,0,和#3。宏定義語句行末不加分號。在引用已定義的宏名時,前面要加符號“`”。`include語句`include是文件包含語句,它可將一個文件全部包含到另一個文件中。其形式為:`include“文件名”舉例說明:`include“global.v”`include“parts/counter.v”`include“../../library/mux.v”合理地使用`include可以使程序簡潔、清晰、條理清楚、易于查錯。一個`include語句只能指定一個被包含的文件。`include語句可以出現(xiàn)在源程序的任何地方。文件包含允許多重包含。比如文件1包含文件2,文件2包含文件3等。MAX+PLUSII軟件不支持`include語句。
`timescale語句`timescale用于定義模塊中的時間單位和精度,其格式如下:`timescale<時間單位>/<時間精度>時間單位有:s、ms、us、ns、ps和fs,分別表示秒、10-3秒、10-6秒、10-9秒、10-12秒和10-15秒。舉例說明:`timescale1ns/100ps
上面的語句表示時間單位是1ns,精度為100ps。`timescale語句必須放在模塊邊界前面如:
`timescale1ns/100psmoduleMUX2_1(out,a,b,sel);……not#1not1(nsel,sel);and#2and1(a1,a,nsel);……
endmodule盡可能地使精度與時間單位接近,只要滿足設(shè)計的實(shí)際需要就行。在上例中所有的時間單位都是1ns的整數(shù)倍。語句的順序執(zhí)行與并行執(zhí)行
用VerilogHDL模塊來設(shè)計電路,首先應(yīng)該清楚哪些操作是同時發(fā)生的,哪些是順序發(fā)生的。在“always”模塊內(nèi),邏輯是按照指定的順序執(zhí)行的,“always”塊內(nèi)的語句稱為順序語句,因為這些語句完全按照書寫的順序來執(zhí)行?!癮lways”模塊之間,是同時執(zhí)行的,或者說是并行執(zhí)行的。兩個或更多個“always”模塊、“assign”語句、實(shí)例元件等是同時執(zhí)行的。
下面通過例子進(jìn)行說明。語句的順序執(zhí)行與并行執(zhí)行舉例例1.順序執(zhí)行模塊1例2.順序執(zhí)行模塊2
moduleserial1(q,a,clk);moduleserial2(q,a,clk);outputq,a;outputq,a;inputclk;inputclk;
regq,a;regq,a;always@(posedge
clk)always@(posedgeclk)beginbeginq=~q;a=~q;a=~q;q=~q;endend
endmoduleendmodule語句的順序執(zhí)行與并行執(zhí)行舉例
上面的兩個例子,其區(qū)別只是在“always”模塊內(nèi),把兩個賦值語句的順序相互顛倒。分別對上面的兩個模塊用MAX+PLUSII軟件進(jìn)行仿真,得到的波形分別如圖1和圖2所示。圖1圖2語句的順序執(zhí)行與并行執(zhí)行舉例
如果將上述兩句賦值語句分別放在兩個“always”模塊中,如例3和例4兩個程序,經(jīng)過仿真可以發(fā)現(xiàn):這兩個“always”模塊放置的順序?qū)Y(jié)果并沒有影響,因為這兩個模塊是并行執(zhí)行的。波形如圖2。
例3.并行模塊1例4.并行模塊2
moduleparal1(q,a,clk);moduleparal2(q,a,clk);outputq,a;outputq,a;inputclk;inputclk;regq,a;regq,a;always@(posedgeclk)always@(posedgeclk)
beginbegin
q=~q;a=~q;end
endalways@(posedgeclk)always@(posedgeclk)beginbegina=~q;q=~q;endend
endmoduleendmodule不同抽象級別的VerilogHDL模型
VerilogHDL既是一種行為描述語言,也是一種結(jié)構(gòu)描述語言。也就是說,既可以用電路的邏輯功能描述也可以用元器件和它們之間的連接來建立所設(shè)計電路的VerilogHDL模型。
VerilogHDL是一種能夠在多個級別對數(shù)字電路和數(shù)字系統(tǒng)進(jìn)行描述的高級語言,VerilogHDL模型可以是對實(shí)際電路的不同級別的抽象。這些抽象級別一般可分為5級:1.系統(tǒng)級(SystemLevel)2.算法級(AlgorithmLevel)3.寄存器傳輸級(RTL,RegisterTransferLevel)4.門級(GateLevel)5.開關(guān)級(SwitchLevel)
其中,前3種屬于高級別的描述方法,又稱為行為級的描述。門級模型是描述邏輯門以及邏輯門之間連接關(guān)系的模型。而開關(guān)級的模型則是描述器件中三極管和存儲節(jié)點(diǎn)以及它們之間連接關(guān)系的模型。對于數(shù)字系統(tǒng)的設(shè)計而言,主要掌握高層描述方法。在這里,我們主要討論基于行為
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6 我們神圣的國土 第三課時 (說課稿)-部編版道德與法治五年級上冊
- 7-1《短歌行》說課稿 2024-2025學(xué)年統(tǒng)編版高中語文必修上冊
- 2025年企業(yè)招標(biāo)承包經(jīng)營合同
- 《7 剪紙藝術(shù)》(說課稿)-2023-2024學(xué)年四年級下冊綜合實(shí)踐活動粵教版
- Module 8 Unit 1 Were going to visit Hainan.(說課稿)-2024-2025學(xué)年外研版(三起)英語四年級上冊
- Unit 2 My week Period 4 Get ready for the new school year(說課稿)-2024-2025學(xué)年人教PEP版英語五年級上冊
- 19海濱小城 (說課稿)-2024-2025學(xué)年三年級上冊語文統(tǒng)編版
- 2025農(nóng)副產(chǎn)品買賣合同書模板(合同版本)
- 2023八年級語文上冊 第五單元 口語交際 復(fù)述與轉(zhuǎn)述配套說課稿 新人教版
- 2024年春八年級歷史下冊 第10課 社會主義民主與法制的加強(qiáng)說課稿1(pdf) 川教版
- 2025-2030全球廢棄食用油 (UCO) 轉(zhuǎn)化為可持續(xù)航空燃料 (SAF) 的催化劑行業(yè)調(diào)研及趨勢分析報告
- 山東省臨沂市蘭山區(qū)2024-2025學(xué)年七年級上學(xué)期期末考試生物試卷(含答案)
- 湖北省武漢市2024-2025學(xué)年度高三元月調(diào)考英語試題(含答案無聽力音頻有聽力原文)
- 商務(wù)星球版地理八年級下冊全冊教案
- (正式版)SHT 3551-2024 石油化工儀表工程施工及驗收規(guī)范
- JTGT H21-2011 公路橋梁技術(shù)狀況評定標(biāo)準(zhǔn)
- 資源循環(huán)科學(xué)和工程專業(yè)建設(shè)探討
- 中國營養(yǎng)師培訓(xùn)教材1
- 《民航服務(wù)溝通技巧》教案第13課內(nèi)部溝通基礎(chǔ)知識
- 2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(語文)試題庫含答案解析
- FZ/T 54024-2019錦綸6預(yù)取向絲
評論
0/150
提交評論