版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VerilogHDL硬件描述語(yǔ)言
[1].(美)J.Bhasker著徐振林等譯,VerilogHDL硬件描述語(yǔ)言,機(jī)械工業(yè)出版社,2000.7[2].王金明楊吉斌編著,數(shù)字系統(tǒng)設(shè)計(jì)與VerilogHDL,電子工業(yè)出版社,2002.2[3].夏宇聞編著,從算法設(shè)計(jì)到硬線邏輯的實(shí)現(xiàn)-復(fù)雜數(shù)字邏輯系統(tǒng)的VerilogHDL設(shè)計(jì)技術(shù)和方法,高等教學(xué)出版社,2000.9參考書
VerilogHDL是一種用于數(shù)字邏輯電路設(shè)計(jì)的硬件描述語(yǔ)言,可用于從算法級(jí)、門級(jí)到開關(guān)級(jí)的多種抽象層次的數(shù)字系統(tǒng)設(shè)計(jì)。
VerilogHDL語(yǔ)言最初是于1983年由GatewayDesignAutomation公司開發(fā)的邏輯模擬器——Verilog-XL及其硬件描述語(yǔ)言。1989年,該公司被Cadence公司收購(gòu)。1990年,Cadence公司公開發(fā)表了VerilogHDL語(yǔ)言。由于這種語(yǔ)言具有簡(jiǎn)捷、高效、易學(xué)易用、功能強(qiáng)等優(yōu)點(diǎn),因此逐漸為眾多設(shè)計(jì)者所接受和喜愛。引言引言
VerilogHDL語(yǔ)言于1995年成為IEEE標(biāo)準(zhǔn),稱為IEEEStandard1364-1995。
從語(yǔ)法結(jié)構(gòu)上看,VerilogHDL語(yǔ)言與C語(yǔ)言有許多相似之處,并繼承和借鑒了C語(yǔ)言的多種操作符和語(yǔ)法結(jié)構(gòu)。它具有以下一些主要特點(diǎn):能形式化地表示電路的結(jié)構(gòu)和行為。借用高級(jí)語(yǔ)言的結(jié)構(gòu)和語(yǔ)句,例如條件語(yǔ)句、賦值語(yǔ)句和循環(huán)語(yǔ)句等,在VerilogHDL中都可以使用,既簡(jiǎn)化了電路的描述,又方便了設(shè)計(jì)人員的學(xué)習(xí)和使用。引言
能夠在多個(gè)層次上對(duì)所設(shè)計(jì)的系統(tǒng)加以描述,從開關(guān)級(jí)、門級(jí)、寄存器級(jí)(RTL)到功能級(jí)和系統(tǒng)級(jí),都可以描述。設(shè)計(jì)規(guī)模可以是任意的,語(yǔ)言不對(duì)設(shè)計(jì)的規(guī)模施加任何限制。
VerilogHDL具有混合建模能力,即在一個(gè)設(shè)計(jì)中各個(gè)模塊可以在不同設(shè)計(jì)層次上建模和描述?;具壿嬮T,例如and、or和nand等都內(nèi)置在語(yǔ)言中;開關(guān)級(jí)結(jié)構(gòu)模型,例如pmos和nmos等也內(nèi)置在語(yǔ)言中,用戶可以直接調(diào)用。引言
用戶定義原語(yǔ)(UDP)創(chuàng)建的靈活性。用戶定義的原語(yǔ)既可以是組合邏輯原語(yǔ),也可以是時(shí)序邏輯原語(yǔ)。VerilogHDL還具有內(nèi)置邏輯函數(shù)。
VerilogHDL語(yǔ)言最大的特點(diǎn)是易學(xué)易用,通過(guò)學(xué)習(xí)和使用,可以在短時(shí)間內(nèi)掌握該語(yǔ)言。另外,該語(yǔ)言功能強(qiáng),可以滿足各個(gè)層次設(shè)計(jì)人員的需要,從高層的系統(tǒng)描述到低層的版圖設(shè)計(jì),都能很好地支持。由于VerilogHDL巨大的優(yōu)越性,使得它廣泛流行,尤其是在ASIC設(shè)計(jì)領(lǐng)域,更是處于主流地位。2.VerilogHDL基本結(jié)構(gòu)1.簡(jiǎn)單的VerilogHDL例子(1)一個(gè)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簡(jiǎn)單的VerilogHDL例子(2)一個(gè)比較器的VerilogHDL源代碼:
modulecompare(equal,a,b);outputequal;//聲明輸出信號(hào)equalinput[1:0]a,b;//聲明輸入信號(hào)a,bassignequal=(a==b)?1:0;
/*如果兩個(gè)輸入信號(hào)相等,輸出為1,否則為0*/
endmodule簡(jiǎn)單的VerilogHDL例子(3)一個(gè)8位計(jì)數(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)成的。每個(gè)模塊的內(nèi)容都是嵌在module和endmodule兩個(gè)語(yǔ)句之間,每個(gè)模塊實(shí)現(xiàn)特定的功能。模塊是可以進(jìn)行層次嵌套的。2.每個(gè)模塊首先要進(jìn)行端口定義,并說(shuō)明輸入(input)和輸出(output),然后對(duì)模塊的功能進(jìn)行邏輯描述。3.
VerilogHDL程序的書寫格式自由,一行可以寫幾個(gè)語(yǔ)句,一個(gè)語(yǔ)句也可以分多行寫。4.
除了endmodule語(yǔ)句和begin/end語(yǔ)句外,每個(gè)語(yǔ)句和數(shù)據(jù)定義的最后必須有分號(hào)“;”。5.可以用/*……*/和//……對(duì)VerilogHDL程序的任何部分作注釋。(一個(gè)完整的源程序都應(yīng)當(dāng)加上必要的注釋,以增強(qiáng)程序的可讀性和可維護(hù)性。)
Verilog
是大小寫敏感的(即區(qū)分大小寫)。所有的Verilog關(guān)鍵詞都是小寫的。VerilogHDL模塊的結(jié)構(gòu)
Verilog的基本設(shè)計(jì)單元是“模塊”(block)。一個(gè)模塊是由兩部分組成的:一)描述接口;二)描述邏輯功能,即定義輸入是如何影響輸出的。下面舉例說(shuō)明:
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聲明語(yǔ)句之間;-每個(gè)Verilog程序包括四個(gè)主要部分:端口定義、I/O說(shuō)明、信號(hào)類型聲明、功能描述。1.模塊的端口定義
模塊的端口聲明了模塊的輸入和輸出口。其格式如下:
module模塊名(口1,口2,口3,……);2.模塊內(nèi)容
模塊內(nèi)容包括I/O說(shuō)明,信號(hào)類型聲明和功能定義。(1)I/O說(shuō)明的格式如下:
輸入口:input端口名1,端口名2,……,端口名N;
輸出口:output端口名1,端口名2,……,端口名N;
I/O說(shuō)明也可以寫在端口聲明語(yǔ)句里。其格式如下:
modulemodule-name(inputport1,inputport2,……outputport1,outputport2,……);(2)信號(hào)類型聲明:它是說(shuō)明邏輯描述中所用信號(hào)的數(shù)據(jù)類型及函數(shù)聲明。如前面計(jì)數(shù)器模塊中:reg[7:0]out;//定義out的數(shù)據(jù)類型為reg(寄存器)型
對(duì)于端口信號(hào)的缺省定義類型為wire(連線)型。邏輯功能定義模塊中最重要的部分是邏輯功能定義。有3種方法可在模塊中描述邏輯。1.用“assign”語(yǔ)句如:assignF=~((A&B)|(C&D));
這種方法的句法很簡(jiǎn)單,只須寫一個(gè)“assign”,后面在加一個(gè)方程式即可。“assign”語(yǔ)句一般適合于對(duì)組合邏輯進(jìn)行賦值,稱為連續(xù)賦值方式。2.用實(shí)例元件
如:andmyand3(f,a,b,c);
這個(gè)語(yǔ)句利用VerilogHDL提供的與門庫(kù),定義了一個(gè)三輸入的與門。采用實(shí)例元件的方法象在電路圖輸入方式下,調(diào)入庫(kù)元件一樣,鍵入元件的名字和引腳的名字即可。其中:實(shí)例名“myand3”是可選的。如果使用實(shí)例名,名字必須唯一。邏輯功能定義3.用“always”塊語(yǔ)句在前面的計(jì)數(shù)器模塊中:
always@(posedgeclk)//每當(dāng)時(shí)鐘上升沿到來(lái)時(shí)執(zhí)行一遍塊內(nèi)語(yǔ)句
beginif(load)out=data;elseout=out+1;end“always”塊可用于產(chǎn)生各種邏輯,常用于描述時(shí)序邏輯。這個(gè)例子中用“always”塊生成了一個(gè)帶同步置數(shù)的計(jì)數(shù)器。數(shù)據(jù)類型及常量、變量
VerilogHDL中總共有19種數(shù)據(jù)型。數(shù)據(jù)類型是用來(lái)表示數(shù)字電路中的數(shù)據(jù)存儲(chǔ)和傳送單元的。其中4個(gè)最基本的數(shù)據(jù)類型是:reg型、wire型、integer型、parameter型。
VerilogHDL語(yǔ)言中也有常量和變量之分,它們分別屬于以上這些類型。下面對(duì)最常用的幾種進(jìn)行介紹。常量在程序運(yùn)行過(guò)程中,其值不能被改變的量稱為常量。
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ù)字>位寬為對(duì)應(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)制說(shuō)明,如:197//代表十進(jìn)制數(shù)197(2)x和z值
x代表不定值,z代表高阻值。每個(gè)字符代表的寬度取決于所用的進(jìn)制,例如:8’b1001xxxx
等價(jià)于8’h9x8’b1010zzzz等價(jià)于8’haz
在case語(yǔ)句中使用x進(jìn)行匹配,可增強(qiáng)程序的可讀性。在較長(zhǎng)的數(shù)之間可用下劃線分開,如16’b1010_1101_0010_1001。當(dāng)變量不說(shuō)明位數(shù)時(shí),默認(rèn)值為32位。此外,“?”是高阻態(tài)z的另一種表示符號(hào)。Parameter常量
在VerilogHDL中,用parameter來(lái)定義常量,即用parameter來(lái)定義一個(gè)標(biāo)識(shí)符,代表一個(gè)常量,稱為符號(hào)常量。其說(shuō)明格式如下:
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)行過(guò)程中其值可以改變的量。變量分為兩種:網(wǎng)絡(luò)型(nets)和寄存器型(register)。1.nets型變量
nets型變量指輸出始終根據(jù)輸入的變化而更新其值的變量,它一般指的是硬件電路中的各種物理連接。VerilogHDL中提供了多種nets型變量,具體見下表:類型功能說(shuō)明wire,tri連線類型wor,trior具有線或特性的連線wand,triand具有線與特性的連線tri1,tri0分別為上拉電阻和下拉電阻supply1,supply2分別為電源(邏輯1)和地(邏輯0)Nets型變量
這里著重介紹wire型變量。Wire是一種最常用的nets型變量,wire型數(shù)據(jù)常用來(lái)表示以assign語(yǔ)句賦值的組合邏輯信號(hào)。VerilogHDL模塊中的輸入/輸出信號(hào)類型缺省時(shí)自動(dòng)定義為wire型。wire型信號(hào)可以用作任何方程式的輸入,也可以用作“assign”語(yǔ)句和實(shí)例元件的輸出。對(duì)于綜合而言,其取值為0,1,x,z。wire型變量的定義格式如下:
wire數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;Wire型變量例如:
wirea,b;//定義了兩個(gè)wire型變量a,b
上面兩個(gè)變量a,b的寬度為1位,若定義一個(gè)向量(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型變量對(duì)應(yīng)的是具有狀態(tài)保持作用的電路元件,如觸發(fā)器、寄存器等。register型變量與nets變量的根本區(qū)別在于:register型變量需要被明確地賦值,并且在被重新賦值前一直保持原值。在設(shè)計(jì)中必須將寄存器型變量放在過(guò)程塊語(yǔ)句(如initial,always)中,通過(guò)過(guò)程賦值語(yǔ)句賦值。在always,initial等過(guò)程塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成寄存器型。
VerilogHDL中,有4種寄存器型變量,具體見下表:類型reg常用的寄存器型變量integer32位帶符號(hào)整數(shù)型變量real64位帶符號(hào)實(shí)數(shù)型變量time無(wú)符號(hào)時(shí)間變量register型變量
integer、real、time3種寄存器型變量都是純數(shù)學(xué)的抽象描述,不對(duì)應(yīng)任何具體的硬件電路。reg型變量是最常用的一種寄存器型變量,下面著重對(duì)其進(jìn)行介紹。
reg型變量的定義格式類似于wire型,具體格式為:
reg
數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;例如:
rega,b;//定義了兩個(gè)reg型變量a,b下面的語(yǔ)句定義了8位寬的數(shù)據(jù):
reg[7:0]data;
//定義data為8位寬的reg型向量
或reg[8:1]data;數(shù)組
若干個(gè)相同寬度的向量構(gòu)成數(shù)組,reg型數(shù)組變量即為memory型變量,即可定義存儲(chǔ)器型數(shù)據(jù)。如:
reg[7:0]mymem[1023:0];
上面的語(yǔ)句定義了一個(gè)1024個(gè)字節(jié)、每個(gè)字節(jié)寬度為8位的存儲(chǔ)器。通常,存儲(chǔ)器采用如下方式定義:
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)算符是將兩個(gè)操作數(shù)按對(duì)應(yīng)位進(jìn)行邏輯運(yùn)算,位運(yùn)算符包括:~按位取反&按位與|按位或^按位異或^~,~^按位同或(^~與~^是等價(jià)的)要注意的一點(diǎn)是兩個(gè)不同長(zhǎng)度的數(shù)據(jù)進(jìn)行位運(yùn)算時(shí),會(huì)自動(dòng)將兩個(gè)操作數(shù)按右端對(duì)齊,位數(shù)少的操作數(shù)會(huì)在高位用0補(bǔ)齊。運(yùn)算符及表達(dá)式4.關(guān)系運(yùn)算符
< 小于
<= 小于或等于 > 大于 >= 大于或等于在進(jìn)行關(guān)系運(yùn)算時(shí),如果聲明的關(guān)系是假,則返回值是0;如果聲明的關(guān)系是真,則返回值是1;如果某個(gè)操作數(shù)的值不確定,則其結(jié)果是模糊的,返回值是不確定的。運(yùn)算符及表達(dá)式5.等式運(yùn)算符 == 等于
!= 不等于 === 全等 !== 不全等這4種運(yùn)算符都是雙目運(yùn)算符,得到的結(jié)果是1位的邏輯值。如果得到1,說(shuō)明聲明的關(guān)系為真;如得到0,說(shuō)明聲明的關(guān)系為假?!?==”和“==”運(yùn)算符的不同是,它在對(duì)操作數(shù)進(jìn)行比較時(shí)對(duì)某些位的不定值x和高阻值z(mì)也進(jìn)行比較,兩個(gè)操作數(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)算符是單個(gè)操作數(shù)逐位進(jìn)行與、或、異或等遞推運(yùn)算。運(yùn)算符及表達(dá)式7.移位運(yùn)算符>>右移<<左移
VerilogHDL的移位運(yùn)算符只有左移和右移兩個(gè),其用法為:A>>n或A<<n,表示把操作數(shù)A右移或左移n位,同時(shí)用0填補(bǔ)移出的位。例:A=5’b11001
則A>>2的值為5’b00110。運(yùn)算符及表達(dá)式8.條件運(yùn)算符?:它是一個(gè)三目運(yùn)算符,對(duì)3個(gè)操作數(shù)進(jìn)行運(yùn)算,其意義同C語(yǔ)言中的定義一樣,方式如下:信號(hào)=條件?表達(dá)式1:表達(dá)式2;當(dāng)條件成立時(shí),信號(hào)取表達(dá)式1的值,反之取表達(dá)式2的值。例如:對(duì)2選1的MUX可描述如下:
out=sel?in1:in0;
即sel=1時(shí)out=in1;sel=0時(shí)out=in0。運(yùn)算符及表達(dá)式9.位拼接運(yùn)算符{}它將兩個(gè)或多個(gè)信號(hào)的某些位拼接起來(lái)。用法如下:{信號(hào)1的某幾位,信號(hào)2的某幾位,......,信號(hào)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ù)法來(lái)簡(jiǎn)化表達(dá)式。如:{4{w}}//等同于{w,w,w,w}
位拼接還可以用嵌套的方式來(lái)表達(dá)。如:{b,{3{a,b}}}//這等同于{b,a,b,a,b,a,b}
運(yùn)算符的優(yōu)先級(jí)
優(yōu)先級(jí)別
!~高優(yōu)先級(jí)別*/%+—<<>><<=>>===!====!==&~&^^~|~|&&||?:低優(yōu)先級(jí)別語(yǔ)句
賦值語(yǔ)句1.連續(xù)賦值語(yǔ)句
assign為連續(xù)賦值語(yǔ)句,它用于對(duì)wire型變量進(jìn)行賦值。如:
assignc=a&b;
在上面的賦值中,a、b、c三個(gè)變量皆為wire型變量,a和b信號(hào)的任何變化,都將隨時(shí)反映到c上來(lái),因此稱為連續(xù)賦值方式。2.過(guò)程賦值語(yǔ)句過(guò)程賦值語(yǔ)句用于對(duì)寄存器類型(reg)的變量進(jìn)行賦值,主要用在“always”模塊內(nèi)。過(guò)程賦值有兩種方式:(1)非阻塞賦值<=如b<=a;
非阻塞賦值在塊結(jié)束時(shí)才完成賦值操作,即b的值并不是立即就改變的。(2)阻塞賦值=如b=a;
阻塞賦值在該語(yǔ)句結(jié)束時(shí)就完成賦值操作,即b的值在該賦值語(yǔ)句結(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語(yǔ)句條件語(yǔ)句有if-else語(yǔ)句和case語(yǔ)句兩種。它們都是順序語(yǔ)句,應(yīng)放在“always”塊內(nèi)。1.if-else語(yǔ)句其格式與C語(yǔ)言中的if-else語(yǔ)句類似,有3種:①if(表達(dá)式)語(yǔ)句1;②if(表達(dá)式)語(yǔ)句1;
else語(yǔ)句2;③if(表達(dá)式1)語(yǔ)句1;
elseif(表達(dá)式2)
語(yǔ)句2;
elseif(表達(dá)式3)語(yǔ)句3;……
elseif(表達(dá)式n)語(yǔ)句n;else語(yǔ)句n+1;如執(zhí)行的語(yǔ)句為多句時(shí),要用“begin-end”語(yǔ)句括起來(lái)。case語(yǔ)句2.case語(yǔ)句相對(duì)if語(yǔ)句只有兩個(gè)分支而言,case語(yǔ)句是一種多分支語(yǔ)句,故case語(yǔ)句多用于多條件譯碼電路,如描述譯碼器、數(shù)據(jù)選擇器、狀態(tài)機(jī)及微處理器的指令譯碼等。case有case、casez、casex三種表示方式。(1)case語(yǔ)句
case(敏感表達(dá)式)值1:語(yǔ)句1;//case分支項(xiàng)值2:語(yǔ)句2;……值n:語(yǔ)句n;default:語(yǔ)句n+1;//default語(yǔ)句可以省略
endcase說(shuō)明:與C語(yǔ)言不同,這里case語(yǔ)句的每個(gè)分支不需要用break語(yǔ)句跳出。VerilogHDL中沒(méi)有break語(yǔ)句。casez與casex語(yǔ)句(2)casez與casex語(yǔ)句在casez與casex語(yǔ)句中,值1~值n中的某些位可以是z和x,比較時(shí)對(duì)這些位不予考慮。另外,還可以用無(wú)關(guān)值“?”來(lái)表示z。
casez與casex語(yǔ)句的格式與case語(yǔ)句相同。循環(huán)語(yǔ)句在verilogHDL中有4種類型的循環(huán)語(yǔ)句,用來(lái)控制語(yǔ)句的執(zhí)行次數(shù),這4種語(yǔ)句分別是:(1)forever連續(xù)地執(zhí)行語(yǔ)句,多用在“initial”塊中,以生成周期性輸入波形。(2)repeat
連續(xù)執(zhí)行一條語(yǔ)句n次。(3)while
執(zhí)行一條語(yǔ)句,直到某個(gè)條件不滿足。(4)for語(yǔ)句。1.for語(yǔ)句,格式同C語(yǔ)言:
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語(yǔ)句即for(循環(huán)變量賦初值;循環(huán)結(jié)束條件;循環(huán)變量增值)執(zhí)行語(yǔ)句循環(huán)語(yǔ)句12.repeat語(yǔ)句
repeat(循環(huán)次數(shù)表達(dá)式)語(yǔ)句;或repeat(循環(huán)次數(shù)表達(dá)式)begin……end3.while語(yǔ)句
while(循環(huán)執(zhí)行條件表達(dá)式)語(yǔ)句;或while(循環(huán)執(zhí)行條件表達(dá)式)begin
……
end4.forever語(yǔ)句
forever語(yǔ)句;或foreverbegin
……
end結(jié)構(gòu)說(shuō)明語(yǔ)句1
VerilogHDL中的任何過(guò)程模塊都從屬于以下4種結(jié)構(gòu)說(shuō)明語(yǔ)句:initialalwaystaskfunction
在一個(gè)模塊(module)中,使用initial和always語(yǔ)句的次數(shù)是不受限制的。Initial說(shuō)明語(yǔ)句一般用于仿真中的初始化,僅執(zhí)行一次;always塊內(nèi)的語(yǔ)句則是不斷重復(fù)執(zhí)行的;task和function語(yǔ)句可以在程序模塊中的一處或多處調(diào)用。always塊語(yǔ)句格式:always@(<敏感信號(hào)表達(dá)式event-expression>)
begin
//過(guò)程賦值//if語(yǔ)句//case語(yǔ)句//while,repeat,for循環(huán)//task,function調(diào)用
end敏感信號(hào)表達(dá)式“event-expression”
敏感信號(hào)表達(dá)式又稱事件表達(dá)式或敏感表,當(dāng)該表達(dá)式的值改變時(shí),就會(huì)執(zhí)行一遍塊內(nèi)語(yǔ)句。因此在敏感信號(hào)表達(dá)式中應(yīng)列出影響塊內(nèi)取值的所有信號(hào),若有兩個(gè)或兩個(gè)以上信號(hào)時(shí),它們之間用“or”連接。always塊語(yǔ)句posedge與negedge關(guān)鍵字對(duì)于時(shí)序電路,事件是由時(shí)鐘邊沿觸發(fā)的。為表達(dá)邊沿這個(gè)概念,verilogHDL提供了posedge與negedge兩個(gè)關(guān)鍵字來(lái)描述,分別表示信號(hào)的上升沿和下降沿。如:always@(posedge
clk)//表示時(shí)鐘信號(hào)clk的上升沿
always@(negedge
clk)//表示時(shí)鐘信號(hào)clk的下降沿initial語(yǔ)句格式:initialbegin
語(yǔ)句1;語(yǔ)句2;……
end例:initialbeginreg1=0;for(addr=0;addr<size;addr=addr+1)memory[addr]=0;end
在上面的例子中,使用initial語(yǔ)句首先將一個(gè)變量reg1初始化為0,然后又用for循環(huán)語(yǔ)句將memory存儲(chǔ)器進(jìn)行初始化,將其所有的存儲(chǔ)單元都置為“0”。task和function語(yǔ)句
task和function語(yǔ)句分別用來(lái)定義任務(wù)和函數(shù)。利用任務(wù)和函數(shù)可以把一個(gè)大的程序模塊分解成許多小的任務(wù)和函數(shù),以方便調(diào)試,并且能使寫出的程序清晰易懂。1.任務(wù)(task)
定義:task<任務(wù)名>;端口及數(shù)據(jù)類型聲明語(yǔ)句;其他語(yǔ)句;
endtask
調(diào)用:<任務(wù)名>(端口1,端口2,……);說(shuō)明:①任務(wù)的定義和調(diào)用須在一個(gè)module模塊內(nèi)。②定義任務(wù)時(shí),沒(méi)有端口名列表,但需要在后面進(jìn)行端口和數(shù)據(jù)類型的說(shuō)明。③當(dāng)任務(wù)被調(diào)用時(shí),任務(wù)被激活。任務(wù)的調(diào)用與模塊調(diào)用一樣通過(guò)任務(wù)名調(diào)用實(shí)現(xiàn),調(diào)用時(shí),需列出端口名列表,端口名的排序和類型必須與任務(wù)定義中的排序和類型一致。④一個(gè)任務(wù)可以調(diào)用別的任務(wù)和函數(shù),調(diào)用的個(gè)數(shù)不限。task和function語(yǔ)句2.函數(shù)(function)
定義:function<返回值位寬和類型說(shuō)明>函數(shù)名;端口聲明;局部變量定義;其他語(yǔ)句;
endfunction
<返回值位寬和類型說(shuō)明>是一個(gè)可選的項(xiàng),如果省略,則返回值為一位關(guān)于寄存器類型的數(shù)據(jù)。函數(shù)的定義中蘊(yùn)含了一個(gè)與函數(shù)同名的、函數(shù)內(nèi)部的寄存器。在函數(shù)定義時(shí),將函數(shù)返回值所使用的寄存器設(shè)為與函數(shù)同名的內(nèi)部變量,因此函數(shù)名被賦予的值就是函數(shù)的返回值。函數(shù)的調(diào)用是通過(guò)將函數(shù)作為表達(dá)式中的操作數(shù)來(lái)實(shí)現(xiàn)的。調(diào)用格式如下:
<函數(shù)名>(<表達(dá)式><表達(dá)式>);函數(shù)的使用與任務(wù)相比有更多的限制和約束。例如,函數(shù)不能啟動(dòng)任務(wù),在函數(shù)中不能包含有任何的時(shí)間控制語(yǔ)句,同時(shí)定義函數(shù)時(shí)至少要有一個(gè)輸入?yún)⒘康取_@些需要在使用時(shí)注意。task和function語(yǔ)句3.任務(wù)與函數(shù)的區(qū)別任務(wù)(task)函數(shù)(function)輸入與輸出可有任意個(gè)各種類型的參數(shù)至少有一個(gè)輸入,不能將inout類型作為輸出調(diào)用任務(wù)只可在過(guò)程語(yǔ)句中調(diào)用,不能在連續(xù)賦值語(yǔ)句assign中調(diào)用函數(shù)可作為表達(dá)式中的一個(gè)操作數(shù)來(lái)調(diào)用,在過(guò)程賦值和連續(xù)賦值語(yǔ)句中均可調(diào)用調(diào)用其他任務(wù)和函數(shù)任務(wù)可調(diào)用其他任務(wù)和函數(shù)函數(shù)可調(diào)用其他函數(shù),但不可以調(diào)用其他任務(wù)返回值任務(wù)不向表達(dá)式返回值函數(shù)向調(diào)用它的表達(dá)式返回一個(gè)值上面介紹了VerilogHDL的結(jié)構(gòu)說(shuō)明語(yǔ)句。在使用這些語(yǔ)句時(shí),另外需要注意的一點(diǎn)是有的編譯器對(duì)某些結(jié)構(gòu)說(shuō)明語(yǔ)句是不支持的。如MAX+PLUSII,該軟件支持always、function語(yǔ)句,但不支持task和initial語(yǔ)句。編譯預(yù)處理語(yǔ)句VerilogHDL語(yǔ)言和C語(yǔ)言一樣也提供了編譯預(yù)處理功能。編譯引導(dǎo)語(yǔ)句用主鍵盤左上角小寫鍵“`”起頭。在編譯時(shí),先對(duì)這些特殊語(yǔ)句進(jìn)行“預(yù)處理”,然后再將預(yù)處理的結(jié)果和源程序一起進(jìn)行編譯。常用的編譯預(yù)處理語(yǔ)句有:
`define`include`timescale`define語(yǔ)句使用`define編譯預(yù)處理語(yǔ)句能提供簡(jiǎn)單的文本替代功能,其形式為:`define<宏名><宏文本>
在編譯時(shí)會(huì)用宏文本來(lái)替代源代碼中的宏名。合理地使用`define可以提高程序的可讀性舉例說(shuō)明:`defineon1’b1`defineoff1’b0`defineand_delay#3
在程序中可以用有含義的文字來(lái)表示沒(méi)有意思的數(shù)碼,提高了程序的可讀性,上面程序中用`on,`off,`and_delay分別表示1,0,和#3。宏定義語(yǔ)句行末不加分號(hào)。在引用已定義的宏名時(shí),前面要加符號(hào)“`”。`include語(yǔ)句`include是文件包含語(yǔ)句,它可將一個(gè)文件全部包含到另一個(gè)文件中。其形式為:`include“文件名”舉例說(shuō)明:`include“global.v”`include“parts/counter.v”`include“../../library/mux.v”合理地使用`include可以使程序簡(jiǎn)潔、清晰、條理清楚、易于查錯(cuò)。一個(gè)`include語(yǔ)句只能指定一個(gè)被包含的文件。`include語(yǔ)句可以出現(xiàn)在源程序的任何地方。文件包含允許多重包含。比如文件1包含文件2,文件2包含文件3等。MAX+PLUSII軟件不支持`include語(yǔ)句。
`timescale語(yǔ)句`timescale用于定義模塊中的時(shí)間單位和精度,其格式如下:`timescale<時(shí)間單位>/<時(shí)間精度>時(shí)間單位有:s、ms、us、ns、ps和fs,分別表示秒、10-3秒、10-6秒、10-9秒、10-12秒和10-15秒。舉例說(shuō)明:`timescale1ns/100ps
上面的語(yǔ)句表示時(shí)間單位是1ns,精度為100ps。`timescale語(yǔ)句必須放在模塊邊界前面如:
`timescale1ns/100psmoduleMUX2_1(out,a,b,sel);……not#1not1(nsel,sel);and#2and1(a1,a,nsel);……
endmodule盡可能地使精度與時(shí)間單位接近,只要滿足設(shè)計(jì)的實(shí)際需要就行。在上例中所有的時(shí)間單位都是1ns的整數(shù)倍。語(yǔ)句的順序執(zhí)行與并行執(zhí)行
用VerilogHDL模塊來(lái)設(shè)計(jì)電路,首先應(yīng)該清楚哪些操作是同時(shí)發(fā)生的,哪些是順序發(fā)生的。在“always”模塊內(nèi),邏輯是按照指定的順序執(zhí)行的,“always”塊內(nèi)的語(yǔ)句稱為順序語(yǔ)句,因?yàn)檫@些語(yǔ)句完全按照書寫的順序來(lái)執(zhí)行?!癮lways”模塊之間,是同時(shí)執(zhí)行的,或者說(shuō)是并行執(zhí)行的。兩個(gè)或更多個(gè)“always”模塊、“assign”語(yǔ)句、實(shí)例元件等是同時(shí)執(zhí)行的。
下面通過(guò)例子進(jìn)行說(shuō)明。語(yǔ)句的順序執(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語(yǔ)句的順序執(zhí)行與并行執(zhí)行舉例
上面的兩個(gè)例子,其區(qū)別只是在“always”模塊內(nèi),把兩個(gè)賦值語(yǔ)句的順序相互顛倒。分別對(duì)上面的兩個(gè)模塊用MAX+PLUSII軟件進(jìn)行仿真,得到的波形分別如圖1和圖2所示。圖1圖2語(yǔ)句的順序執(zhí)行與并行執(zhí)行舉例
如果將上述兩句賦值語(yǔ)句分別放在兩個(gè)“always”模塊中,如例3和例4兩個(gè)程序,經(jīng)過(guò)仿真可以發(fā)現(xiàn):這兩個(gè)“always”模塊放置的順序?qū)Y(jié)果并沒(méi)有影響,因?yàn)檫@兩個(gè)模塊是并行執(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不同抽象級(jí)別的VerilogHDL模型
VerilogHDL既是一種行為描述語(yǔ)言,也是一種結(jié)構(gòu)描述語(yǔ)言。也就是說(shuō),既可以用電路的邏輯功能描述也可以用元器件和它們之間的連接來(lái)建立所設(shè)計(jì)電路的VerilogHDL模型。
VerilogHDL是一種能夠在多個(gè)級(jí)別對(duì)數(shù)字電路和數(shù)字系統(tǒng)進(jìn)行描述的高級(jí)語(yǔ)言,VerilogHDL模型可以是對(duì)實(shí)際電路的不同級(jí)別的抽象。這些抽象級(jí)別一般可分為5級(jí):1.系統(tǒng)級(jí)(SystemLevel)2.算法級(jí)(AlgorithmLevel)3.寄存器傳輸級(jí)(RTL,RegisterTransferLevel)4.門級(jí)(GateLevel)5.開關(guān)級(jí)(SwitchLevel)
其中,前3種屬于高級(jí)別的描述方法,又稱為行為級(jí)的描述。門級(jí)模型是描述邏輯門以及邏輯門之間連接關(guān)系的模型。而開關(guān)級(jí)的模型則是描述器件中三極管和存儲(chǔ)節(jié)點(diǎn)以及它們之間連接關(guān)系的模型。對(duì)于數(shù)字系統(tǒng)的設(shè)計(jì)而言,主要掌握高層描述方法。在這里,我們主要討論基于行為
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)維修手表合同范例
- ppp咨詢費(fèi)合同范本
- 分裝白糖采購(gòu)合同范本
- 內(nèi)墻抹灰工程合同范例
- 公司無(wú)償贈(zèng)與合同范例
- 喪葬工具出租合同范本
- 2025年度臨時(shí)活動(dòng)場(chǎng)地租賃合同
- 2025年度教育產(chǎn)業(yè)借款反擔(dān)保協(xié)議范本
- 2025年度客運(yùn)企業(yè)品牌戰(zhàn)略規(guī)劃與實(shí)施服務(wù)合同
- 2025年消毒滅菌設(shè)備器具項(xiàng)目投資分析及可行性報(bào)告
- 天津市河西區(qū)2024-2025學(xué)年四年級(jí)(上)期末語(yǔ)文試卷(含答案)
- 2025年空白離婚協(xié)議書
- 校長(zhǎng)在行政會(huì)上總結(jié)講話結(jié)合新課標(biāo)精神給學(xué)校管理提出3點(diǎn)建議
- T-CSUS 69-2024 智慧水務(wù)技術(shù)標(biāo)準(zhǔn)
- 2025年護(hù)理質(zhì)量與安全管理工作計(jì)劃
- 湖南大學(xué) 嵌入式開發(fā)與應(yīng)用(張自紅)教案
- 地下商業(yè)街的規(guī)劃設(shè)計(jì)
- 長(zhǎng)安大學(xué)《畫法幾何與機(jī)械制圖一》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024-2030年全球及中國(guó)低密度聚乙烯(LDPE)行業(yè)需求動(dòng)態(tài)及未來(lái)發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 醫(yī)院物業(yè)管理制度
- 初中數(shù)學(xué)思維訓(xùn)練雙十字相乘法因式分解練習(xí)100道及答案
評(píng)論
0/150
提交評(píng)論