版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章VerilogHDL硬件描述語(yǔ)言4.1
Verilog的基本語(yǔ)法4.1.1簡(jiǎn)單的VerilogHDL模塊 VerilogHDL是以模塊(block)集合的形式來(lái)描述硬件系統(tǒng)的。模塊是VerilogHDL的基本單元,它用于描述某個(gè)設(shè)計(jì)的功能或結(jié)構(gòu)及其與其他模塊的外部接口。模塊可以代表從簡(jiǎn)單門(mén)元件到復(fù)雜系統(tǒng)的任何一個(gè)硬件電路。每一個(gè)模塊都有接口部分,用于描述與其他模塊之間的連接關(guān)系。VerilogHDL的各個(gè)模塊之間是并行運(yùn)行的。通常設(shè)計(jì)的硬件系統(tǒng)有一個(gè)頂層模塊,該頂層模塊的輸入/輸出分別代表系統(tǒng)的輸入/輸出。頂層模塊可以由若干個(gè)子模塊組成,每個(gè)子模塊代表著系統(tǒng)中具有特定功能的一個(gè)功能單元,各個(gè)子模塊通過(guò)端口相互連接起來(lái),從而實(shí)現(xiàn)分層設(shè)計(jì)。模塊的基本組成結(jié)構(gòu)如下:Module<模塊名>(<端口列表>);端口說(shuō)明(input,output,inout)參數(shù)定義(可選)(parameter)數(shù)據(jù)類(lèi)型定義(wire,reg等)連續(xù)賦值語(yǔ)句(assign)過(guò)程塊語(yǔ)句(initial和always)(包括條件、選擇、循環(huán)等行為描述語(yǔ)句或語(yǔ)句塊)底層模塊實(shí)例引用語(yǔ)句(moduleinstantiations)函數(shù)和任務(wù)(function,task)endmodule其中,<模塊名>是模塊唯一的標(biāo)識(shí)符;<端口列表>是由模塊各個(gè)端口組成的,根據(jù)端口信號(hào)的方向,端口具有三種類(lèi)型:輸入(input)端口、輸出(output)端口和雙向(inout)端口,這些端口用來(lái)與其他模塊進(jìn)行連接;端口說(shuō)明用來(lái)說(shuō)明各個(gè)端口的數(shù)據(jù)流向及數(shù)據(jù)寬度等;參數(shù)定義用來(lái)說(shuō)明系統(tǒng)設(shè)計(jì)中用到的有關(guān)參數(shù);數(shù)據(jù)類(lèi)型定義用來(lái)指定模塊內(nèi)各組件進(jìn)行信息交流所用的數(shù)據(jù)對(duì)象是寄存器型、存儲(chǔ)器型還是連線型。用于說(shuō)明系統(tǒng)的邏輯功能及組成的語(yǔ)句有三種,包括連續(xù)賦值語(yǔ)句(assign)、過(guò)程塊(initial和always)語(yǔ)句和底層模塊實(shí)例引用語(yǔ)句(moduleinstantiations),其中連續(xù)賦值語(yǔ)句(assign)用于數(shù)據(jù)流描述,過(guò)程塊語(yǔ)句用于行為描述,內(nèi)含各種行為描述語(yǔ)句,而底層模塊實(shí)例引用語(yǔ)句則進(jìn)行結(jié)構(gòu)描述。在always塊內(nèi),被賦值的每個(gè)信號(hào)都必須定義為reg(寄存器)型變量。在VerilogHDL中,output端口信號(hào)可定義成寄存器型變量,并在always塊內(nèi)被賦值使用,而inout型雙向端口信號(hào)不能被定義成reg型變量,因此在always塊內(nèi)不能被直接賦值使用,這一點(diǎn)與VHDL中雙向端口的使用方法有所不同。VerilogHDL程序是由模塊組成的,每個(gè)模塊的內(nèi)容都包含在“module”和“endmodule”兩個(gè)語(yǔ)句之間。VerilogHDL程序的書(shū)寫(xiě)格式與C語(yǔ)言類(lèi)似,一行可以寫(xiě)多條語(yǔ)句,也可以一條語(yǔ)句分成多行書(shū)寫(xiě),每條語(yǔ)句以英文輸入狀態(tài)下的分號(hào)結(jié)束,但endmodule語(yǔ)句后面不必寫(xiě)分號(hào)。初學(xué)者經(jīng)常忘記第一行語(yǔ)句后面的分號(hào),或輸入的是中文輸入狀態(tài)下的分號(hào),這都會(huì)導(dǎo)致程序編譯時(shí)報(bào)錯(cuò)。例4.1二選一選擇器。程序如下:moduleTwoSelOne(a,b,s,y);inputa,b;inputs;outputy;assigny=(s==0)?a:b;endmodule說(shuō)明:程序第一行需要分號(hào),而最后一行即endmodule語(yǔ)句后面不寫(xiě)分號(hào),程序中的逗號(hào)、分號(hào)等都應(yīng)該是在英文輸入狀態(tài)下輸入的,而不能在中文狀態(tài)下輸入;如果該模塊是頂層模塊,那么模塊名要與該工程名一致。在給模塊命名時(shí),不能使用VerilogHDL中的關(guān)鍵詞,并且最好能“顧名思義”,方便以后在閱讀到該模塊時(shí),看名字就能知道它的功能。一個(gè)模塊可以是一個(gè)元件或者一個(gè)設(shè)計(jì)單元。類(lèi)似于C語(yǔ)言中的函數(shù)調(diào)用,底層模塊通常被整合在高層模塊中提供某個(gè)通用功能。可以在設(shè)計(jì)中多處被使用。高層模塊通過(guò)調(diào)用、連接底層模塊的實(shí)例來(lái)實(shí)現(xiàn)復(fù)雜的功能。調(diào)用時(shí)只需要定義輸入/輸出接口,而不用關(guān)注底層模塊內(nèi)部如何實(shí)現(xiàn),這為程序的層次化、模塊化設(shè)計(jì)提供了便利,利于分工協(xié)作與維護(hù)。例4.2調(diào)用底層模塊實(shí)現(xiàn)二選一選擇器。程序如下:moduleTwoSelOne(a,b,s,y);inputa,b;inputs;outputy;wired,e,ns;notgate1(ns,s);andgate2(d,ns,a);andgate3(e,s,b);orgate4(y,d,e);endmodule4.1.2數(shù)據(jù)類(lèi)型及其常量、變量VerilogHDL數(shù)據(jù)類(lèi)型(DataTypes)主要用來(lái)說(shuō)明存儲(chǔ)在數(shù)字硬件或傳送于數(shù)字組件間的數(shù)據(jù)類(lèi)型。它不僅支持如整型、實(shí)型等抽象的數(shù)據(jù)類(lèi)型,而且也支持物理數(shù)據(jù)類(lèi)型來(lái)表示真實(shí)的硬件。物理數(shù)據(jù)類(lèi)型有連線型(wire、tri等)和寄存器型(reg)兩種,這兩種類(lèi)型的變量在定義時(shí)均要設(shè)置位寬,在缺省狀態(tài)時(shí),位寬默認(rèn)為1位。變量的每一位可以取0、1、x或z中的任意值。除了與具體的硬件電路對(duì)應(yīng)的物理數(shù)據(jù)類(lèi)型外,VerilogHDL還提供了整型(integer)、實(shí)型(real)、時(shí)間型(time)、參數(shù)型(parameter)等四種抽象的數(shù)據(jù)類(lèi)型,這些抽象數(shù)據(jù)類(lèi)型主要用于仿真。抽象數(shù)據(jù)類(lèi)型只是純數(shù)學(xué)的抽象描述,不與任何實(shí)際的物理硬件相對(duì)應(yīng)。1.連線型數(shù)據(jù)類(lèi)型連線型數(shù)據(jù)對(duì)應(yīng)于硬件電路中的物理信號(hào)連線,沒(méi)有電荷保持作用(trireg除外)。連線型數(shù)據(jù)必須由驅(qū)動(dòng)源驅(qū)動(dòng)。它有兩種驅(qū)動(dòng)方式:一種是在結(jié)構(gòu)描述中把它連接到一個(gè)門(mén)或模塊的輸出端;另一種是用連續(xù)賦值語(yǔ)句assign對(duì)其賦值。當(dāng)沒(méi)有驅(qū)動(dòng)源對(duì)其驅(qū)動(dòng)時(shí),它將保持高阻態(tài)。為了能夠精確地反映硬件電路中各種可能的物理信號(hào)的連接特性,VerilogHDL提供了多種連線型數(shù)據(jù),具體介紹如下。1)?wire和tri網(wǎng)絡(luò)連線(wire)和三態(tài)線(tri)的語(yǔ)法和功能基本一致。三態(tài)線(tri)可以用于描述多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)同一根線的線網(wǎng)類(lèi)型。多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)一個(gè)連線時(shí),線網(wǎng)的有效值如表4.1所示。表4.1多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)一個(gè)連線時(shí)線網(wǎng)的有效值wire(或tri)01xz00xx01x1x1xxxxxz01xz2)?wor和trior線網(wǎng)線或(wor)和三態(tài)線或(trior)的語(yǔ)法和功能基本一致。若驅(qū)動(dòng)源為1,線或線網(wǎng)值為1,則多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)這類(lèi)線網(wǎng)時(shí),線網(wǎng)的有效值如表4.2所示。表4.2多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)線或線網(wǎng)時(shí)的有效值wor(或trior)01xz001x011111xx1xxz01xz3)?wand和triand線網(wǎng)線與(wand)和三態(tài)線與(triand)的語(yǔ)法和功能基本一致。若驅(qū)動(dòng)源為0,線與線網(wǎng)值為0,則多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)這類(lèi)線網(wǎng)時(shí),線網(wǎng)的有效值如表4.3所示。wand(或triand)01xz00000101x1x0xxxz01xz表4.3多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)線與線網(wǎng)時(shí)的有效值4)?trireg線網(wǎng)trireg線網(wǎng)用于存儲(chǔ)數(shù)值,并且用于電容節(jié)點(diǎn)的建模。當(dāng)trireg的所有驅(qū)動(dòng)源都處于高阻態(tài)時(shí),trireg線網(wǎng)保存作用在線網(wǎng)上的最后一個(gè)值。trireg線網(wǎng)的初始值為x。5)?tri0和tri1線網(wǎng)tri0和tri1線網(wǎng)用于線邏輯的建模,其中,當(dāng)無(wú)驅(qū)動(dòng)源時(shí),tri0線網(wǎng)的值為0,tri1線網(wǎng)的值為1。多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)這類(lèi)線網(wǎng)時(shí),線網(wǎng)的有效值如表4.4所示。tri0(或tri1)01xz00xx01x1x1xxxxxz01x0(1)表4.4多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)tri0和tri1時(shí)線網(wǎng)的有效值6)?supply0和supply1線網(wǎng)supply0線網(wǎng)用于對(duì)低電平0的建模,supply1線網(wǎng)用于對(duì)電源,即高電平1的建模。連線型數(shù)據(jù)類(lèi)型的定義格式為<連線型數(shù)據(jù)的類(lèi)型><范圍><延遲時(shí)間><變量列表>;例如:
wiresignal1,signal2; //兩個(gè)連線型數(shù)據(jù)
tri[7:0]bus; //8位三態(tài)總線在VerilogHDL中,有的時(shí)候可以不需要聲明某種線網(wǎng)類(lèi)型,缺省的線網(wǎng)類(lèi)型為1位線與網(wǎng)。可以使用編譯器偽指令?'default_nettype來(lái)改變這個(gè)隱式的線網(wǎng)說(shuō)明方式。其調(diào)用格式為'default_nettypenet_kind向量線網(wǎng)是用關(guān)鍵詞scalared或者vectored來(lái)定義的。需要注意的是,vectored定義的向量線網(wǎng)必須整體進(jìn)行賦值。若沒(méi)有定義關(guān)鍵詞,缺省值為標(biāo)量。2.寄存器型數(shù)據(jù)類(lèi)型1)寄存器數(shù)據(jù)寄存器數(shù)據(jù)對(duì)應(yīng)于具有狀態(tài)保持作用的硬件電路元件,如觸發(fā)器、鎖存器等。若寄存器數(shù)據(jù)未初始化,它將為未知狀態(tài)x。寄存器數(shù)據(jù)的關(guān)鍵字為reg,缺省時(shí)為1位數(shù)。寄存器數(shù)據(jù)與連線型數(shù)據(jù)的區(qū)別在于:寄存器數(shù)據(jù)保持最后一次的賦值,而連線型數(shù)據(jù)需要有持續(xù)的驅(qū)動(dòng)。寄存器數(shù)據(jù)的驅(qū)動(dòng)可以通過(guò)過(guò)程賦值語(yǔ)句實(shí)現(xiàn),在always塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義為reg型,即賦值操作符的右端變量必須是reg型的。寄存器數(shù)據(jù)的定義格式為reg<范圍><變量列表>;例如:reg
d1; //1位寄存器reg[3:0]state; //4位寄存器reg[4:1]rega,regb;//定義2個(gè)4位的分別名為rega,regb的reg型的寄存器2)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)實(shí)際上是一個(gè)寄存器數(shù)組,Verilog通過(guò)reg型變量建立數(shù)組來(lái)對(duì)存儲(chǔ)器建模,可以描述RAM、ROM存儲(chǔ)器和reg文件。數(shù)組中的每一個(gè)單元通過(guò)一個(gè)整數(shù)索引進(jìn)行尋址。存儲(chǔ)器型數(shù)據(jù)通過(guò)擴(kuò)展reg型數(shù)據(jù)的地址范圍來(lái)達(dá)到二維數(shù)組的效果,其使用的格式如下:reg[msb:lsb]存儲(chǔ)器名[n-1:0];其中reg[msb:lsb]定義了存儲(chǔ)器中每一個(gè)存儲(chǔ)單元的大小,即該存儲(chǔ)器單元是一個(gè)n位位寬的寄存器;存儲(chǔ)器后面的[n-1:0]定義了存儲(chǔ)器的大小,即該存儲(chǔ)器中有多少個(gè)這樣的寄存器。若寄存器說(shuō)明中缺省[n-1:0],則是說(shuō)明寄存器。例如:reg[7:0]regc; //regc為一個(gè)8位寄存器regmemb[15:0];//memb為16個(gè)1位寄存器的數(shù)組,即存儲(chǔ)器reg[7:0]memc[15:0]; //memc為16個(gè)8位寄存器的數(shù)組需要注意的是,存儲(chǔ)器不能像寄存器那樣賦值。一個(gè)n位的寄存器可以在一條賦值語(yǔ)句里進(jìn)行賦值,而一個(gè)完整的存儲(chǔ)器則不行。例如:regc=0;//合法賦值語(yǔ)句memc=0;//非法賦值語(yǔ)句如果想對(duì)存儲(chǔ)器中的存儲(chǔ)單元進(jìn)行讀寫(xiě)操作,必須指定地址。例如:reg[7:0]memd[4:1];//定義4個(gè)字節(jié)的存儲(chǔ)器memdinitialbeginmemd[1]=0; //給存儲(chǔ)器單元memd[1]賦值為0memd[2]=1; //給存儲(chǔ)器單元memd[2]賦值為1memd[3]="Jan"; //給存儲(chǔ)器單元memd[3]賦值為字符串"Jan"memd[4]="Feb"; //給存儲(chǔ)器單元memd[4]賦值為字符串"Feb"end除此之外,還可以借助于系統(tǒng)函數(shù)$readmemb和$readmemh來(lái)將文件中的二進(jìn)制或十六進(jìn)制數(shù)據(jù)讀取到存儲(chǔ)器中。如:reg[7:0]mem[1:256] //先定義一個(gè)有256個(gè)地址的字節(jié)存儲(chǔ)器meminitial$readmemh("mem.data",mem);initial$readmemh("mem.data",mem,16);initial$readmemh("mem.data",mem128,1);上述第2條語(yǔ)句在仿真0時(shí)刻,將數(shù)據(jù)裝載到以地址為1的存儲(chǔ)器單元為起始存放單元的存儲(chǔ)器中去;第3條語(yǔ)句將數(shù)據(jù)裝載到以單元地址是16的存儲(chǔ)器單元為起始存放單元的存儲(chǔ)器中去,一直到地址是256的單元為止;第4條語(yǔ)句將從地址是128的單元開(kāi)始裝載數(shù)據(jù),一直到地址為1的單元。在最后這種情況下,當(dāng)裝載完畢后,系統(tǒng)要檢查在數(shù)據(jù)文件里是否有128個(gè)數(shù)據(jù),如果沒(méi)有,系統(tǒng)提示錯(cuò)誤信息。3.整型數(shù)據(jù)類(lèi)型整型(integer)數(shù)據(jù)常用于對(duì)循環(huán)變量進(jìn)行說(shuō)明,在算術(shù)運(yùn)算中被視為二進(jìn)制補(bǔ)碼形式的有符號(hào)數(shù)。除了寄存器型數(shù)據(jù)被當(dāng)作無(wú)符號(hào)數(shù)處理之外,整型數(shù)據(jù)與32位寄存器型數(shù)據(jù)在實(shí)際意義上相同。整型數(shù)據(jù)的聲明格式為integer<寄存器型變量列表>;整型數(shù)據(jù)可以是二進(jìn)制(b或B)、十進(jìn)制(D或d)、十六進(jìn)制(h或H)或八進(jìn)制(O或o)。整型數(shù)據(jù)可以有下面三種書(shū)寫(xiě)形式:(1)簡(jiǎn)單十進(jìn)制格式,這種格式是直接由0~9的數(shù)字串組成的十進(jìn)制數(shù),可以用符號(hào)“+”或“-”來(lái)表示數(shù)的正負(fù),如789。(2)缺省位寬的基數(shù)格式,這種格式的書(shū)寫(xiě)形式為'<base_format><number>其中,符號(hào)“'”為基數(shù)格式表示的固有字符,該字符不能省略,否則為非法表示形式;參數(shù)<base_format>用于說(shuō)明數(shù)值采用的進(jìn)制格式;參數(shù)<number>為相應(yīng)進(jìn)制格式下的一串?dāng)?shù)字;這種格式未指定位寬,其缺省值至少為32位。例如:'h137FF //缺省位寬的十六進(jìn)制數(shù)(3)指定位寬的基數(shù)格式,這種格式的書(shū)寫(xiě)形式為<size>'<base_format><number>其中,參數(shù)<size>用來(lái)指定所表示數(shù)的位寬,當(dāng)位寬小于數(shù)值的實(shí)際位數(shù)時(shí),相應(yīng)的高位部分被忽略;當(dāng)位寬大于數(shù)值的實(shí)際位數(shù)且數(shù)值的最高位是0或1時(shí),相應(yīng)的高位部分補(bǔ)0;當(dāng)位寬大于數(shù)值的實(shí)際位數(shù),但數(shù)值的最高位是x或z時(shí),相應(yīng)的高位部分補(bǔ)x或z。二進(jìn)制的一個(gè)x或z表示1位處于x或z;八進(jìn)制的一個(gè)x或z表示3位二進(jìn)制位都處于x或z;十六進(jìn)制的一個(gè)x或z表示4位二進(jìn)制位都處于x或z。另外,數(shù)值中的z還可以用“?”來(lái)代替。例如:
4'b1101//4位二進(jìn)制數(shù)4.實(shí)型數(shù)據(jù)類(lèi)型VerilogHDL支持實(shí)型(real)常量與變量。實(shí)型數(shù)據(jù)在機(jī)器碼表示法中是浮點(diǎn)型數(shù)值,可用于計(jì)算延遲時(shí)間。實(shí)型數(shù)據(jù)的聲明格式為real<變量列表>;例如:real
a;實(shí)型數(shù)據(jù)可以用十進(jìn)制與科學(xué)計(jì)數(shù)法兩種格式來(lái)表示,如果采用十進(jìn)制格式,小數(shù)點(diǎn)兩邊都必須是數(shù)字,否則為非法的表示形式,如:1.8、3.8E9。5.時(shí)間型數(shù)據(jù)類(lèi)型時(shí)間型(time)數(shù)據(jù)與整型數(shù)據(jù)類(lèi)似,只是它是64位無(wú)符號(hào)數(shù)。時(shí)間型數(shù)據(jù)主要用于對(duì)模擬時(shí)間的存儲(chǔ)與計(jì)算,常與系統(tǒng)函數(shù)?$time一起使用。時(shí)間型數(shù)據(jù)的聲明格式為time<寄存器型變量列表>;例如:timestart,stop;//聲明start和stop為兩個(gè)64位的時(shí)間變量6.參數(shù)型數(shù)據(jù)類(lèi)型參數(shù)型數(shù)據(jù)(parameter)是被命名的常量,在仿真前對(duì)其賦值,在整個(gè)仿真過(guò)程中其值保持不變,數(shù)據(jù)的具體類(lèi)型是由所賦的值來(lái)決定的。可以用參數(shù)型數(shù)據(jù)定義變量的位寬及延遲時(shí)間等,從而增加程序的可讀性與易修改性。參數(shù)型數(shù)據(jù)的聲明格式為parameter<賦值列表>;例如:parameter
size=8;parameter
width=6,x=8;4.1.3
VerilogHDL操作符VerilogHDL提供了各種不同的操作符,例如算術(shù)操作符、取模操作符、邏輯操作符、關(guān)系操作符、相等操作符、按位操作符、歸約操作符、移位操作符、條件操作符及連接操作符。操作符會(huì)將其操作數(shù)按照所定義的功能計(jì)算以產(chǎn)生新值。大部分操作符為單目操作符或雙目操作符。單目操作符使用一個(gè)操作數(shù);雙目操作符使用兩個(gè)操作數(shù);條件操作符使用三個(gè)操作數(shù);連接操作符則可以使用任何個(gè)數(shù)的操作數(shù)。表4.5所列為常用的操作符。表4.5中的各操作符在處理實(shí)數(shù)時(shí)需特別注意,僅有部分操作符處理實(shí)數(shù)表達(dá)式有效。這些有效的操作符列于表4.6中。操作符類(lèi)型操作符功能說(shuō)明算術(shù)操作符+,-,*,/加、減、乘、除算術(shù)運(yùn)算取模操作等%取模邏輯操作符!邏輯非&&邏輯與||邏輯或關(guān)系操作符<,>,<=,>=關(guān)系運(yùn)算:小于、大于、小于等于、大于等于相等操作符==相等!=不等===全等!==非全等按位操作符~按位非&按位與|按位或^按位異或^~?或?~^按位異或非歸約操作符&歸約與~&歸約與非|歸約或~|歸約或非^歸約異或~^?或?^~歸約異或非移位操作符<<左移位>>右移位條件操作符?:條件連接操作符{}連接表4.5
Verilog操作符操作符功能說(shuō)明+,-,*,/算術(shù)操作符>,>=,<,<=關(guān)系操作符!,&&,|邏輯操作符==,!=相等操作符?=條件操作符表4.6實(shí)數(shù)表達(dá)式中有效的操作符和其他高級(jí)語(yǔ)言一樣,VerilogHDL中的運(yùn)算符也是具有優(yōu)先級(jí)的。表4.7給出了運(yùn)算符優(yōu)先級(jí)從高到低的排列次序,同一行中的運(yùn)算符優(yōu)先級(jí)相同。1.算術(shù)操作符算術(shù)操作符包括單目操作符和雙目操作符。算術(shù)表達(dá)式結(jié)果的長(zhǎng)度由最長(zhǎng)的操作數(shù)決定。賦值語(yǔ)句中,其結(jié)果的長(zhǎng)度由操作符左端目標(biāo)長(zhǎng)度決定。算術(shù)表達(dá)式的所有中間結(jié)果長(zhǎng)度取最大操作數(shù)的長(zhǎng)度。若算術(shù)操作符中的任一操作數(shù)中含有x或者z,則表達(dá)式的結(jié)果為x。算術(shù)操作符中,無(wú)符號(hào)數(shù)存儲(chǔ)在線網(wǎng)、寄存器或者基數(shù)形式的整數(shù)中;有符號(hào)數(shù)存儲(chǔ)在整數(shù)寄存器或者十進(jìn)制形式的整數(shù)中。算術(shù)操作符的使用舉例如下:
//單目操作符integer[7:0]a,b;a=-8; //?-8(單目操作符) b=+10; //?+10
//雙目操作符reg[3:0]a,b,c,d;a=4'b0010;assignc=a+b; //變量+變量assignd=b+2; //變量+常數(shù)//----------------------integera,b,c,d;a=12/3; //a=4b=11%5; //b=1c=-11%3; //c=-2算術(shù)操作符在寄存器數(shù)據(jù)類(lèi)型中所產(chǎn)生的結(jié)果,與在整數(shù)數(shù)據(jù)類(lèi)型中所產(chǎn)生的結(jié)果不盡相同。對(duì)寄存器來(lái)說(shuō),VerilogHDL將其視為不帶符號(hào)的數(shù)值;對(duì)整數(shù)數(shù)據(jù)類(lèi)型來(lái)說(shuō),則為帶符號(hào)數(shù)值。例如,若將一個(gè)形式為<位寬><基底><數(shù)字>的負(fù)數(shù)賦值給一個(gè)寄存器,則此負(fù)數(shù)將以其2'S補(bǔ)碼存入寄存器:integera;reg[7:0]b;a=-8'd9; //a=-9(11110111)b=a/3; //b=-3(11111101),因?yàn)閍為整數(shù)a=b/3; //a=84,因?yàn)?53/32.關(guān)系操作符關(guān)系操作符為雙目操作符,它們將兩個(gè)操作數(shù)進(jìn)行比較:若結(jié)果為“真”,則設(shè)為邏輯值1;若結(jié)果為“假”,則設(shè)為邏輯值0。若兩個(gè)操作數(shù)中有未知值x,則其關(guān)系結(jié)果亦為未知值x。關(guān)系表達(dá)式中的操作數(shù)長(zhǎng)度不同時(shí),要在較短的操作數(shù)的左方補(bǔ)“0”,然后再進(jìn)行比較。例如,利用大于等于(>=)操作符求兩個(gè)數(shù)值的最大值的程序如下:modulemax(max_v,a,b)output[7:0]max_v;input[7:0]a,b;if(a>=b)max_v=a; //?a是最大值elsemax_v=b; //?b是最大值endmodule3.相等操作符對(duì)于相等操作符,如果兩個(gè)操作數(shù)所有的位值均相等,那么相等關(guān)系式成立,結(jié)果返回邏輯1,否則返回邏輯0。但若任何一個(gè)操作數(shù)中的某一位為未知數(shù)x或處于高阻態(tài),則結(jié)果為未知的。若兩個(gè)操作數(shù)的對(duì)應(yīng)位可取4個(gè)邏輯值,則相等運(yùn)算符的運(yùn)算規(guī)則可用表4.8來(lái)描述。如果兩個(gè)操作數(shù)的所有位取0或1,那么不等運(yùn)算符與相等運(yùn)算符的運(yùn)算規(guī)則正好相反。如果任一個(gè)操作數(shù)中含有未知數(shù)x或高阻態(tài),則不等運(yùn)算符與相等運(yùn)算符的運(yùn)算規(guī)則相同,如表4.9所示。對(duì)于全等操作符,其比較過(guò)程與相等操作符相同,但其返回結(jié)果只有邏輯1或邏輯0兩種狀態(tài),不存在未知數(shù),即全等操作符將未知數(shù)x與高阻態(tài)看做是邏輯狀態(tài)的一種參與比較,如果兩個(gè)操作數(shù)的相應(yīng)位均為x或z,那么全等關(guān)系成立,結(jié)果返回邏輯1。非全等操作符與全等操作符正好相反。表4.10給出了全等操作符的運(yùn)算規(guī)則。例4.3用等于操作符編寫(xiě)一個(gè)4位比較器。代碼如下:modulecompare1(a,b,comout);input[3:0]a,b;output[2:0]comout;reg[2:0]temp;always@(aorb)beginif(a>b)temp<=3'b100;elseif(a==b)temp<=3'b010;elsetemp<=3'b001;endassigncomout=temp;endmodule在對(duì)該程序進(jìn)行仿真時(shí),當(dāng)a?=?4'b0101,b?=?4'1000時(shí),輸出comout?=?3'b001,表示a?<?b;當(dāng)a?=?4'b1010,b?=?4'0101時(shí),輸出comout?=?3'b100,表示a?>?b;當(dāng)a?=?4'b1100,b?=?4'1100時(shí),輸出comout?=?3'b010,表示a?=?b。4.邏輯操作符VerilogHDL中存在三種邏輯運(yùn)算符:&&:邏輯與;||:邏輯或;!:邏輯非。其中“&&”和“||”是雙目操作符,它要求有兩個(gè)操作數(shù),如(a>b)&&(b>c),(a<b)||(b<c)?!埃 笔菃文坎僮鞣?,只要求一個(gè)操作數(shù),如?!(a>b)。表4.11為邏輯運(yùn)算的真值表,它表示當(dāng)a和b的值為不同的組合時(shí),各種邏輯運(yùn)算所得到的值。邏輯運(yùn)算符中“&&”和“||”的優(yōu)先級(jí)別低于關(guān)系運(yùn)算符,“!”的優(yōu)先級(jí)別高于算術(shù)運(yùn)算符。如:(a>b)&&(x>y)可寫(xiě)成:a>b&&x>y;(a==b)||(x==y)可寫(xiě)成:a==b||x==y;(!a)||(a>b)可寫(xiě)成:!a||a>b。當(dāng)然,為了提高程序的可讀性,明確表達(dá)各運(yùn)算符間的優(yōu)先關(guān)系,建議使用括號(hào)。5.按位操作符按位操作符對(duì)輸入操作數(shù)進(jìn)行按位操作,并且產(chǎn)生向量結(jié)果。若操作數(shù)的長(zhǎng)度不相等,則在較短的操作數(shù)的左方添“0”。Verilog中位操作符共有5個(gè)操作符:取反(?~?)、按位與(?&?)、按位或(?|?)、按位異或(?^?)、按位同或(?^~?)。各位操作的結(jié)果按表4.12給出。例如,若a=4'b0011,b=4'b1101,c=4'b1010,則$display(~a); //?display4'b1100=12$display(a&b); //?display4'b0001=1$display(a|c); //?display4'b1011=11$display(b^c); //?display4'b0111=7$display(a^~c); //?display4'b0110=66.歸約操作符歸約操作符是單目操作符,其運(yùn)算規(guī)則類(lèi)似于按位操作符的運(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é)果是1位二進(jìn)制數(shù)。若操作數(shù)中含有未知值x或者z,則表達(dá)式的結(jié)果為x。歸約運(yùn)算的運(yùn)算過(guò)程為:先將操作數(shù)的第1位與第2位進(jìn)行歸約運(yùn)算,然后將運(yùn)算結(jié)果與第3位進(jìn)行歸約運(yùn)算,依次類(lèi)推,直到最后一位。例如,a=4'b1111,b=4'1010,則&a的結(jié)果為1,∣b的結(jié)果為1。7.移位操作符移位操作符是一種邏輯操作,操作符右側(cè)的操作數(shù)表示將操作符左側(cè)的操作數(shù)移位的次數(shù),不夠則添0。若操作數(shù)中含有x或者z,則移位表達(dá)式的結(jié)果為x。移位操作符還可完成VerilogHDL中的指數(shù)操作。例如,assignqout=div>>sh_bit;語(yǔ)句表示將div右移sh_bit位后的結(jié)果連續(xù)賦值給qout,它實(shí)際上是一個(gè)除法運(yùn)算。8.條件操作符條件操作符為“?:”,其使用格式為cond_expression?expression_1:expression_2;若cond_expression為1(即為真),則表達(dá)式的值為expression_1;若cond_expression為0(即為假),則表達(dá)式的值為expression_2。若cond_expression為x或z,則表達(dá)式的值將是expression_1與expression_2按以下邏輯規(guī)則進(jìn)行按位操作后的結(jié)果:0與0得0,1與1得1,其余為x。例如:assigny=(sel)?a:b;//若條件sel=1,則y=a,否則y=b9.連接操作符連接操作符可將多個(gè)小的表達(dá)式合并形成一個(gè)大的表達(dá)式。VerilogHDL中,用符號(hào)“{}”實(shí)現(xiàn)多個(gè)表達(dá)式的連接運(yùn)算,各個(gè)表達(dá)式之間用“,”隔開(kāi),其使用格式為{expression_1,expression_2,…,expression_n}除了非定長(zhǎng)的常量外,任何表達(dá)式都可進(jìn)行連接運(yùn)算。同時(shí),連接運(yùn)算也可以對(duì)信號(hào)的某些位進(jìn)行。例如,若a=1'b1,b=2'b01,c=5'b10111,則{a,b}將產(chǎn)生一個(gè)3位數(shù)3'b101,{c[4:2],b}將產(chǎn)生一個(gè)5位數(shù)5'b10101。10.復(fù)制操作符復(fù)制操作符“{{}}”是將一個(gè)表達(dá)式放入雙重大括號(hào)中,而復(fù)制因子放在第一層括號(hào)中,用來(lái)指定復(fù)制的次數(shù),通過(guò)重復(fù)相同的操作符來(lái)實(shí)現(xiàn)表達(dá)式的變大,其使用格式為{repeat_number{expression_1,expression_2,…,expression_n}}復(fù)制操作符為復(fù)制一個(gè)常量或變量提供了簡(jiǎn)便方法。不過(guò)在多操作符的表達(dá)式中,需要考慮的問(wèn)題是操作符的優(yōu)先級(jí)。例如,若a=1'b1,則{3{a}}的結(jié)果為3'b111。4.1.4過(guò)程語(yǔ)句1.?Initial過(guò)程區(qū)塊Initial區(qū)塊中可包含一個(gè)語(yǔ)句或以begin…end為句式的句塊內(nèi)所包括的多個(gè)語(yǔ)句。在仿真過(guò)程中,起始時(shí)間為0時(shí),這個(gè)區(qū)塊內(nèi)部的語(yǔ)句僅執(zhí)行一次。若有多個(gè)initial區(qū)塊出現(xiàn)于模塊中,那么這些區(qū)塊各自獨(dú)立地并行執(zhí)行。initial區(qū)塊的目的是,在仿真時(shí)起始設(shè)定組件內(nèi)部的信號(hào)值,監(jiān)視信號(hào)動(dòng)作過(guò)程及顯示相關(guān)信號(hào)的波形或數(shù)值。2.?always過(guò)程區(qū)塊always區(qū)塊類(lèi)似initial區(qū)塊,二者不同之處是always區(qū)塊中的語(yǔ)句將重復(fù)地被執(zhí)行,形成一個(gè)無(wú)窮循環(huán),仿真時(shí)遇到?$finish或?$stop指令時(shí)才會(huì)停止。always區(qū)塊通常配合事件的表達(dá)式使用。所謂事件,就是某一信號(hào)發(fā)生狀態(tài)變化。例如,信號(hào)出現(xiàn)上升沿、下降沿或是數(shù)值改變時(shí)等,這些事件就是觸發(fā)條件。觸發(fā)條件寫(xiě)在敏感信號(hào)表達(dá)式中,只有當(dāng)觸發(fā)條件滿足時(shí),其后的“begin…end”塊語(yǔ)句才能被執(zhí)行。敏感信號(hào)表達(dá)式中應(yīng)列出影響塊內(nèi)取值的所有信號(hào)。若有兩個(gè)或兩個(gè)以上信號(hào)時(shí),它們之間用“or”連接,其格式為always@(事件表示式1or事件表示式2or…or事件表示式n)begin<語(yǔ)句區(qū)>end以下各形式的事件表示式均是合法的always區(qū)塊。(1)事件表示式中特定值改變時(shí):always@(clk)q=d; //當(dāng)clk的值改變時(shí),執(zhí)行q=d,電平觸發(fā)(2)時(shí)鐘信號(hào)上升沿觸發(fā)時(shí):always@(posedgeclk)q=d;//當(dāng)clk上升沿觸發(fā)時(shí),執(zhí)行q=d,邊沿觸發(fā)(3)時(shí)鐘信號(hào)下降沿觸發(fā)時(shí):always@(negedgeclk)q=d//當(dāng)clk下降沿觸發(fā)時(shí),執(zhí)行q=d,邊沿觸發(fā)(4)時(shí)鐘信號(hào)或一個(gè)異步事件:always@(posedgeclkornegedgeclk)beginif(!clr)q=1'b0; //清除qelseq=d //加載dend(5)時(shí)鐘信號(hào)或多個(gè)異步事件:always@(posedgeclkornegedgesetornegedgeclr)beginif(set)q=1'b1 //設(shè)定qelseif(!clr)q=1'b0; //清除qelseq=d; //加載dend4.1.5賦值語(yǔ)句1.持續(xù)賦值語(yǔ)句(ContinuousAssignments)assign為持續(xù)賦值語(yǔ)句,主要用于對(duì)wire型變量的賦值。比如:assignc=a&b;在上面的賦值中,a、b、c三個(gè)變量皆為wire型變量,a和b信號(hào)的任何變化,都將隨時(shí)反映到c上來(lái)。2.過(guò)程賦值語(yǔ)句(ProceduralAssignments)過(guò)程賦值語(yǔ)句多用于對(duì)reg型變量進(jìn)行賦值。過(guò)程賦值語(yǔ)句只能出現(xiàn)在過(guò)程語(yǔ)句后面的過(guò)程塊中。過(guò)程賦值有阻塞(blocking)賦值和非阻塞(non_blocking)賦值兩種方式。(1)非阻塞(non_blocking)賦值方式。其賦值符號(hào)為“<=”,如:b<=a;非阻塞賦值在整個(gè)過(guò)程塊結(jié)束時(shí)才完成賦值操作,即b的值并不是立刻就改變的。(2)阻塞(blocking)賦值方式。其賦值符號(hào)為“=”,如:b=a;阻塞賦值在該語(yǔ)句結(jié)束時(shí)立即完成賦值操作,即b的值在該條語(yǔ)句結(jié)束后立刻改變。如果在一個(gè)塊語(yǔ)句中有多條阻塞賦值語(yǔ)句,那么在前面的賦值語(yǔ)句沒(méi)有完成之前,后面的語(yǔ)句就不能被執(zhí)行,仿佛被阻塞了(blocking)一樣,因此稱為阻塞賦值方式。(3)應(yīng)用舉例。例4.4非阻塞賦值實(shí)例。modulenon_block(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk)beginb<=a;c<=b;endendmodule圖4.1為例4.4的功能仿真圖,從圖上可以看出,在時(shí)鐘第1次上跳變前a?=?0,b?=?0,這些值被賦值給該上升沿之后的b和c,所以緊隨該上升沿之后b?=?0,c?=?0;在時(shí)鐘第二次上跳變前a?=?1,b?=?0,這些值被賦值給該上升沿之后的b和c,所以緊隨該上升沿之后b?=?1,c?=?0,其他同理。例4.5阻塞賦值實(shí)例。moduleblock(c,b,a,clk);outputc,b;inputclk,a;regc,b;always@(posedgeclk)beginb=a;c=b;endendmodule圖4.2為例4.5的功能仿真圖,從圖上可以看出,始終有c=b,是因?yàn)樵谧枞x值語(yǔ)句中,首先將a的值賦給b,執(zhí)行完成后,再將b得到的結(jié)果賦值給c,這樣一來(lái),b和c的最終取值就一樣了。圖4.3和圖4.4分別為非阻塞賦值綜合結(jié)果和阻塞賦值綜合結(jié)果。比較二者可以發(fā)現(xiàn),實(shí)現(xiàn)阻塞賦值語(yǔ)句的電路中,b和c的輸出隨時(shí)都是一樣的,而非阻塞賦值中,b的現(xiàn)態(tài)為c的次態(tài)。圖4.1~圖4.4均為在QuartusⅡ8.1(32?bit)下得到的結(jié)果。4.1.6塊語(yǔ)句1.?begin…end區(qū)塊語(yǔ)句begin…end區(qū)塊用于將若干語(yǔ)句集合在一起,并且是順序(串行)執(zhí)行的,因此又稱為串行塊。串行塊的使用格式為begin:[塊名][塊內(nèi)部局部變量說(shuō)明;]時(shí)間控制1行為語(yǔ)句1;時(shí)間控制n行為語(yǔ)句n;end串行塊執(zhí)行時(shí)具有如下特點(diǎn):(1)串行塊內(nèi)的各條語(yǔ)句是按它們?cè)趬K內(nèi)出現(xiàn)的次序逐條順序執(zhí)行的,當(dāng)前面一條語(yǔ)句執(zhí)行完成后,下一條語(yǔ)句才能開(kāi)始執(zhí)行。(2)塊中每條語(yǔ)句的延時(shí)控制都是相對(duì)于前一條語(yǔ)句結(jié)束時(shí)刻的延時(shí)控制。(3)在進(jìn)行仿真時(shí),當(dāng)遇到串行塊時(shí),塊中第一條語(yǔ)句就開(kāi)始執(zhí)行;當(dāng)串行塊中最后一條語(yǔ)句執(zhí)行完畢時(shí),程序流程控制就跳出串行塊,串行塊執(zhí)行結(jié)束;整個(gè)串行塊的執(zhí)行時(shí)間等于其內(nèi)部各條語(yǔ)句執(zhí)行時(shí)間的總和。串行塊通常使用在if、case語(yǔ)句及for循環(huán)中。在區(qū)塊語(yǔ)句中可與disable語(yǔ)句配合使用,用于中途跳離區(qū)塊,并將硬件執(zhí)行轉(zhuǎn)移至緊接區(qū)塊的下一語(yǔ)句。2.?fork…join區(qū)塊語(yǔ)句fork…join語(yǔ)句提供了一個(gè)并行處理區(qū)塊的仿真環(huán)境,在此區(qū)塊中的所有語(yǔ)句并行地被執(zhí)行,因此在這個(gè)區(qū)塊中的語(yǔ)句,其排列的次序并不影響執(zhí)行結(jié)果。fork…join區(qū)塊語(yǔ)句與begin…end區(qū)塊語(yǔ)句的最大不同點(diǎn)在于begin…end區(qū)塊內(nèi)的語(yǔ)句為順序結(jié)構(gòu),而fork…join區(qū)塊內(nèi)的語(yǔ)句為并行結(jié)構(gòu)。并行塊的書(shū)寫(xiě)格式為fork:[塊名][塊內(nèi)部局部變量說(shuō)明;]時(shí)間控制1行為語(yǔ)句1;時(shí)間控制n行為語(yǔ)句n;join其中,塊內(nèi)部局部變量說(shuō)明可以是reg型變量說(shuō)明語(yǔ)句、integer型變量說(shuō)明語(yǔ)句、real型變量說(shuō)明語(yǔ)句、time型變量說(shuō)明語(yǔ)句及事件(event)說(shuō)明語(yǔ)句。并行塊執(zhí)行時(shí)具有如下特點(diǎn):(1)并行塊內(nèi)各條語(yǔ)句是同時(shí)并行執(zhí)行的,也就是說(shuō),當(dāng)程序流程控制進(jìn)入并行塊后,塊內(nèi)各條語(yǔ)句都各自獨(dú)立地同時(shí)開(kāi)始執(zhí)行,各條語(yǔ)句的起始執(zhí)行時(shí)間都等于程序流程控制進(jìn)入該并行塊的時(shí)間。(2)塊內(nèi)各條語(yǔ)句中指定的延時(shí)控制都是相對(duì)于程序流程控制進(jìn)入并行塊時(shí)刻的延時(shí),即相對(duì)于并行塊開(kāi)始執(zhí)行時(shí)刻的延時(shí)。(3)當(dāng)并行塊內(nèi)所有的語(yǔ)句都已經(jīng)執(zhí)行完后,也就是當(dāng)執(zhí)行時(shí)間最長(zhǎng)的那一條語(yǔ)句塊內(nèi)的語(yǔ)句執(zhí)行完后,程序流程控制才跳出并行塊,結(jié)束并行塊的執(zhí)行。整個(gè)并行塊的執(zhí)行時(shí)間等于執(zhí)行時(shí)間最長(zhǎng)的那條語(yǔ)句所需的執(zhí)行時(shí)間。3.應(yīng)用舉例例4.6表4.13是begin…end和fork…join區(qū)塊語(yǔ)句的比較實(shí)例。在并行區(qū)塊中,兩個(gè)或更多個(gè)“always”過(guò)程塊、“assign”持續(xù)賦值語(yǔ)句、實(shí)例元件調(diào)用等操作都是同時(shí)執(zhí)行的。在“always”模塊內(nèi)部,其語(yǔ)句如果是非阻塞式賦值,則語(yǔ)句是并發(fā)執(zhí)行的;而如果是阻塞式賦值,則語(yǔ)句是按照指定的順序執(zhí)行的,語(yǔ)句的書(shū)寫(xiě)順序?qū)Τ绦虻膱?zhí)行結(jié)果有著直接的影響。順序執(zhí)行模塊1:moduleserial1(q,a,clk);outputq,a;inputclk;regq,a;always@(posedgeclk)beginq=~q;a=~q;endendmodule順序執(zhí)行模塊2:moduleserial2(q,a,clk);outputq,a;inputclk;regq,a;always@(posedgeclk)begina=~q;q=~q;endendmodule順序執(zhí)行模塊1的仿真波形圖如圖4.5所示,順序執(zhí)行模塊2的仿真波形圖如圖4.6所示。順序執(zhí)行模塊1的綜合結(jié)果及順序執(zhí)行模塊2的綜合結(jié)果分別如圖4.7和圖4.8所示。4.1.7條件語(yǔ)句1.語(yǔ)句格式If…else條件語(yǔ)句的作用是根據(jù)判斷所給出的條件是否滿足來(lái)確定下一步要執(zhí)行的操作。通??筛鶕?jù)條件的多少采用如表4.14所示的四種不同的形式進(jìn)行判斷。2.應(yīng)用舉例例4.7計(jì)數(shù)器的設(shè)計(jì)。程序如下:moduleifelse(clock,reset,data,load,count);inputclock,reset,data,load;outputcount;regcount;always@(posedgeclockornegedgereset)beginif(!reset)//異步復(fù)位count<=0;elseif(!load)//同步置位count<=data;elsecount<=count+1;endendmodule4.1.8選擇語(yǔ)句1.?case語(yǔ)句case語(yǔ)句類(lèi)似于if…else條件語(yǔ)句,其語(yǔ)法格式如下:case(狀況表示式)狀況1:begin<語(yǔ)句區(qū)塊1>;end狀況2:begin<語(yǔ)句區(qū)塊2>;enddefault:begin<語(yǔ)句區(qū)塊n>;endendcase其語(yǔ)法由case…endcase所包括,依不同的狀況決定執(zhí)行哪一語(yǔ)句區(qū),每一個(gè)case狀況的表達(dá)式的值必須互不相同,否則就會(huì)出現(xiàn)矛盾。每一狀況中<語(yǔ)句區(qū)塊>包含了一個(gè)或多個(gè)語(yǔ)句。若只存在一個(gè)語(yǔ)句,則begin…end可以省略。根據(jù)狀況表示式,逐一對(duì)比所列狀況,當(dāng)找到適合的狀況后,隨即執(zhí)行對(duì)應(yīng)的<語(yǔ)句區(qū)塊>,執(zhí)行完后跳離case…endcase語(yǔ)句區(qū)。因此各狀況的優(yōu)先次序由上而下,依序遞減,若所有的狀況都不符合,則執(zhí)行default中的“語(yǔ)句區(qū)n”。2.?casez語(yǔ)句casez語(yǔ)句與case語(yǔ)句的語(yǔ)法結(jié)構(gòu)和執(zhí)行過(guò)程完全一樣,唯一不同的地方在于其狀況表示,當(dāng)出現(xiàn)z及???時(shí),其狀況判定可當(dāng)成don’tcare,亦即出現(xiàn)z或?位時(shí)不作比較。以下為正確的casez的語(yǔ)法結(jié)構(gòu)://優(yōu)先級(jí)選擇器case(sel)3'b??1:y=a; //第一優(yōu)先級(jí)3'b?10:y=b; //第二優(yōu)先級(jí)3'b100:y=c; //最低優(yōu)先級(jí)default:y=4'bzzzz;endcase在上例中,輸入為a、b、c,輸出為y。根據(jù)3位的選擇信號(hào)sel決定輸出,當(dāng)sel[0]?=?1時(shí),不管sel[1]?與sel[2]?為何,其輸出y?=?a;若sel[0]?=?0且sel[1]?=?1,則不管sel[2]?為何,其輸出y?=?b;最后,只有在sel[2]?=?1、sel[1]?=?0且sel[0]?=?0時(shí),輸出y才為c,亦即sel[0]?有最高決定權(quán),sel[1]?次之,而sel[2]?的決定權(quán)最低。3.?casex語(yǔ)句與case及casez語(yǔ)法相同,當(dāng)狀況表示式出現(xiàn)z、?及x時(shí),其狀況判定可當(dāng)成don’tcare狀態(tài)而不作比較。需要注意的是,在casez和casex語(yǔ)句中都是用endcase結(jié)束,而不是endcasex或endcasez結(jié)束。casez和casex聲明語(yǔ)句的表達(dá)式中x(不確定值)和z(高阻值)可以和任何值相等,這可能給仿真結(jié)果帶來(lái)混亂。4.應(yīng)用舉例例4.8普通的四選一選擇器。程序如下:modulemux4_1(out,in0,in1,in2,in3,sel);outputout;inputin0,in1,in2,in3;input[1:0]sel;regout;always@(in0orin1orin2orin3orsel)//敏感信號(hào)列表case(sel)2'b00: out=in0;2'b01: out=in1;2'b10: out=in2;2'b11: out=in3;default:out=2'bx;endcaseendmodule例4.9具有優(yōu)先權(quán)的四選一選擇器。程序如下://具有優(yōu)先權(quán)的四選一選擇器mux4_1.vmodulemux4_1(y,sel,a,b,c,d);output[4:0]y; //選擇輸出input[3:0]sel; //選擇信號(hào)input[4:0]a,b,c,d; //多路輸入,a~d的優(yōu)先級(jí)從低到高reg[4:0]y;always@(seloraorborcord)begincasez(sel)4'bzzz1:y=a;4'bzz10:y=b;4'bz100:y=c;4'b1000:y=d;default:y=4'bzzzzz;endcaseendendmodulecase語(yǔ)句與if…else…if語(yǔ)句的區(qū)別主要有兩點(diǎn):(1)與case語(yǔ)句中的控制表達(dá)式和分支表達(dá)式這種比較結(jié)構(gòu)相比,if-else-if結(jié)構(gòu)中的條件表達(dá)式更為直觀。(2)對(duì)于那些分支表達(dá)式中存在不定值x和高阻值z(mì)的情況,case語(yǔ)句提供了處理這種情況的手段,即采用casex和casez語(yǔ)句實(shí)現(xiàn)。需要指出的是,case語(yǔ)句的default分支雖然可以缺省,但是一般不要缺省,否則會(huì)和if語(yǔ)句中缺少else分支一樣,產(chǎn)生鎖存器。例如:always@(a[1:0]orb)begin case(a) 2'b00:q<=b; 2'b01:q<=b+1;end這樣就會(huì)生成鎖存器,一般為了使case語(yǔ)句可控,都需要加上default選項(xiàng)。如:always@(a[1:0]orb)begin case(a) 2'b00:q<=b; 2'b01:q<=b+1; default:q<=b+2;end所以在實(shí)際開(kāi)發(fā)中,要避免生成鎖存器的錯(cuò)誤發(fā)生。如果用if語(yǔ)句,最好寫(xiě)上else選項(xiàng);如果用case語(yǔ)句,最好寫(xiě)上default選項(xiàng)。遵循上面兩條原則,就可以避免發(fā)生這種錯(cuò)誤,使設(shè)計(jì)目標(biāo)明確,結(jié)果可控,同時(shí)也增加Verilog程序的可讀性。為此,在實(shí)際中如果有分支情況,則盡量選擇case語(yǔ)句,因?yàn)閏ase語(yǔ)句的分支是并行執(zhí)行的,各個(gè)分支沒(méi)有優(yōu)先級(jí)的區(qū)別。而if語(yǔ)句的選擇分支是串行執(zhí)行的,是按照書(shū)寫(xiě)順序逐次判斷的。如在設(shè)計(jì)中本沒(méi)有優(yōu)先級(jí)考慮,選用if語(yǔ)句會(huì)比選用case語(yǔ)句占用更多的硬件資源。4.1.9循環(huán)語(yǔ)句1.?for語(yǔ)句for循環(huán)的語(yǔ)法結(jié)構(gòu)為for(循環(huán)變量=低值;循環(huán)變量<高值;循環(huán)變量=循環(huán)變量+常量)begin<語(yǔ)句區(qū)塊>endfor語(yǔ)句的語(yǔ)法與計(jì)算機(jī)程序C語(yǔ)言中的for循環(huán)相似,其中高值必須大于或等于低值,每執(zhí)行完一次循環(huán),循環(huán)變量即加一次常數(shù),直到循環(huán)變量大于高值為止。在語(yǔ)句中,<語(yǔ)句區(qū)塊>可為一行以上的語(yǔ)句,若語(yǔ)句僅存在一行,則關(guān)鍵詞begin…end可以省略。2.?while循環(huán)while循環(huán)結(jié)構(gòu)的語(yǔ)法如下:while(條件判斷表示式)begin<語(yǔ)句區(qū)塊>;end若條件判斷表示式為真,則執(zhí)行<語(yǔ)句區(qū)塊>,直到條件判斷為假,才停止執(zhí)行。與C語(yǔ)句一樣,當(dāng)<語(yǔ)句區(qū)塊>僅存在一行語(yǔ)句時(shí),關(guān)鍵詞begin…end即可取消。3.?forever循環(huán)forever循環(huán)以無(wú)條件方式執(zhí)行語(yǔ)句區(qū)塊,直到遇到disable語(yǔ)句為止,其語(yǔ)句格式為foreverbegin<語(yǔ)句區(qū)塊>end4.?repeat循環(huán)repeat的循環(huán)語(yǔ)法為repeat(表示式)begin<語(yǔ)句區(qū)塊>;end與前面的循環(huán)語(yǔ)句一樣,<語(yǔ)句區(qū)塊>可為一行或多行語(yǔ)句。若為一行語(yǔ)句,則關(guān)鍵詞begin…end可取消。<表示式>必須為一已知正數(shù)值或一常數(shù),不可為變量。若<表示式>中出現(xiàn)x或z,將被當(dāng)成0,則<語(yǔ)句區(qū)塊>將不被執(zhí)行。當(dāng)<語(yǔ)句區(qū)塊>出現(xiàn)disable指令時(shí),不論循環(huán)次數(shù)是否執(zhí)行完畢,它都將自動(dòng)離開(kāi)循環(huán)。5.應(yīng)用舉例例4.10用for語(yǔ)句描述七人投票表決器,程序代碼如下:modulevoter7(pass,vote);outputpass;input[6:0]vote;reg[2:0]sum;integeri;regpass;always@(vote)beginsum=0;for(i=0;i<=6;I=i+1) //?for語(yǔ)句if(vote[i])sum=sum+1;if(sum[2])pass=1; //若超過(guò)4人贊成,則pass=1else pass=0;endendmodule例4.11用repeat循環(huán)設(shè)計(jì)一個(gè)計(jì)算字節(jié)中出現(xiàn)1的個(gè)數(shù)的電路。程序如下://用repeat循環(huán)計(jì)算字節(jié)中出現(xiàn)1的個(gè)數(shù)的電路repeat_1s.vmodulerepeat_1s(ones,din);output[3:0]ones; //?1的個(gè)數(shù)輸出parameterlength=8; //數(shù)據(jù)長(zhǎng)度input[length-1:0]din; //?8位數(shù)據(jù)輸入reg[length-1:0]temp;reg[3:0]ones;reg[3:0]cout;always@(din)begincout=4'b0000;
temp=din; repeat(length)beginif(temp[0])cout=cout+4'b0001;temp=temp>>1; //右移一位endones=cout;endendmodule例4.12用while語(yǔ)句實(shí)現(xiàn)4位乘法器。代碼如下:modulemultiply_4(a,b,result);parameters=4;input[s:1]a,b;output[2*s:1]result;reg[2*s:1]result,a_temp;reg[s:1]b_temp,c_temp;always@(aorb)begin
result=0;
a_temp={4'b0,a};
b_temp=b;
c_temp=s;
while(c_temp>0)
begin if(b_temp[1])result=result+a_temp;elseresult=result; beginc_temp=c_temp-1;a_temp=a_temp<<1;b_temp=b_temp>>1; end
end endendmodule 4.2
VerilogHDL的描述風(fēng)格VerilogHDL的描述風(fēng)格(或者說(shuō)描述方式)可分為三類(lèi):結(jié)構(gòu)型(Structural)描述、數(shù)據(jù)流型(DataFlow)描述、行為型(Behavioural)描述。4.2.1結(jié)構(gòu)型描述結(jié)構(gòu)型描述指描述實(shí)體連接的結(jié)構(gòu)方式,它通常通過(guò)實(shí)例進(jìn)行描述,將Verilog已定義的基元實(shí)例嵌入到語(yǔ)言中。在Verilog程序中可通過(guò)調(diào)用Verilog內(nèi)置門(mén)元件(門(mén)級(jí)結(jié)構(gòu)描述)、開(kāi)關(guān)級(jí)元件(晶體管級(jí)結(jié)構(gòu)描述)、用戶自定義元件UDP(也在門(mén)級(jí))、模塊化實(shí)例等方式描述電路的結(jié)構(gòu)。結(jié)構(gòu)化描述可以用不同類(lèi)型的結(jié)構(gòu)來(lái)完成多層次的工程,即從簡(jiǎn)單的門(mén)到非常復(fù)雜的元件(包括各種已完成的設(shè)計(jì)模塊)來(lái)描述整個(gè)系統(tǒng)。1.門(mén)級(jí)結(jié)構(gòu)描述門(mén)級(jí)結(jié)構(gòu)描述是指調(diào)用VerilogHDL內(nèi)部的基本門(mén)級(jí)元件來(lái)對(duì)硬件電路的結(jié)構(gòu)進(jìn)行描述,這種情況下模塊將由基本門(mén)級(jí)元件的實(shí)例組成。由于一個(gè)數(shù)字電路系統(tǒng)最終是由一個(gè)個(gè)邏輯門(mén)和開(kāi)關(guān)所組成的,因此用邏輯門(mén)單元和開(kāi)關(guān)單元來(lái)對(duì)硬件電路的組成結(jié)構(gòu)進(jìn)行描述是最直觀的??紤]到這一點(diǎn),VerilogHDL把一些常用的基本邏輯門(mén)單元和開(kāi)關(guān)單元的模型包含到語(yǔ)句內(nèi)部,這些模型被稱為基本門(mén)級(jí)元件(BasicGate-LevelPrimitives)和基本開(kāi)關(guān)級(jí)元件(BasicSwitch-LevelPrimitives)。在Verilog中的內(nèi)置基本門(mén)級(jí)元件如表4.15所示。調(diào)用門(mén)元件的格式為門(mén)元件名字<例化的門(mén)名字>(<端口列表>)其中普通門(mén)的端口列表按下面的順序列出:(輸出,輸入1,輸入2,輸入3…);比如:anda1(out,in1,in2,in3); //三輸入與門(mén)對(duì)于三態(tài)門(mén),則按如下順序列出輸入輸出端口:(輸出,輸入,使能控制端);比如:bufif1mytri1(out,in,enable); //高電平使能的三態(tài)門(mén)例4.13采用門(mén)級(jí)結(jié)構(gòu)描述實(shí)現(xiàn)一位全加器。代碼如下:modulefull_add1(a,b,cin,sum,cout);inputa,b,cin;outputsum,cout;wires1,m1,m2,m3;and(m1,a,b),(m2,b,cin),(m3,a,cin);xor(s1,a,b),(sum,s1,cin);or(cout,m1,m2,m3);endmodule圖4.9是該一位全加器綜合結(jié)果圖,圖中將兩個(gè)異或門(mén)綜合成一個(gè)3輸入的異或門(mén)。圖4.10是該一位全加器的功能仿真圖,從仿真結(jié)果看該程序設(shè)計(jì)正確。2.元件實(shí)例化元件實(shí)例化語(yǔ)句就是將預(yù)先設(shè)計(jì)好的模塊定義為一個(gè)元件,然后利用特定的語(yǔ)句將此元件與當(dāng)前設(shè)計(jì)中的指定端口相連接,從而為當(dāng)前設(shè)計(jì)模塊引入一個(gè)新的、低一級(jí)的設(shè)計(jì)層次。在這里,當(dāng)前設(shè)計(jì)模塊相當(dāng)于一個(gè)較大的電路系統(tǒng),所定義的實(shí)例化元件相當(dāng)于一個(gè)要插在這個(gè)電路系統(tǒng)板上的芯片,而當(dāng)前設(shè)計(jì)模塊中指定的端口則相當(dāng)于這塊電路板上準(zhǔn)備接受此芯片的一個(gè)插座。元件實(shí)例化語(yǔ)句是使VerilogHDL設(shè)計(jì)模塊構(gòu)成自上而下層次化設(shè)計(jì)的一種重要途徑。元件實(shí)例化語(yǔ)句的使用格式有兩種:(1)名字關(guān)聯(lián)方式:將實(shí)例化元件的端口名與關(guān)聯(lián)端口名通過(guò)“.實(shí)例化元件端口名(連接端口名)”的形式一一對(duì)應(yīng)地聯(lián)系起來(lái)的方式。其使用格式如下:實(shí)例化元件名元件實(shí)例化標(biāo)號(hào)(.實(shí)例化元件端口名(連接端口名),…);(2)位置關(guān)聯(lián)方式:按實(shí)例化元件端口的定義順序?qū)?shí)例化元件的對(duì)應(yīng)連接模塊端口名一一列出的一種關(guān)聯(lián)方式。其使用格式如下:實(shí)例化元件名元件實(shí)例化標(biāo)號(hào)(連接端口名,…);在位置關(guān)聯(lián)方式下,實(shí)例化元件名和元件實(shí)例化標(biāo)號(hào)的含義及使用要求同名字關(guān)聯(lián)方式;對(duì)于端口的映射關(guān)系,只要按實(shí)例化元件的端口定義順序列出當(dāng)前系統(tǒng)中的連接模塊端口名就行了。例4.14采用元件實(shí)例化語(yǔ)句設(shè)計(jì)一個(gè)2位級(jí)聯(lián)加法器。設(shè)計(jì)思路:2位加法器可以采用2個(gè)一位全加器級(jí)聯(lián)實(shí)現(xiàn),低位的進(jìn)位輸出作為高位的進(jìn)位輸入,其級(jí)聯(lián)結(jié)構(gòu)如圖4.11所示。程序如下:moduleadd_jl(sum,cout,a,b,cin);input[1:0]a,b;inputcin;output[1:0]sum;outputcout;full_add1f0(a[0],b[0],cin,sum[0],cin1);full_add1f1(a[1],b[1],cin1,sum[1],cout);endmodule圖4.12是該加法器在QuartusⅡ8.1開(kāi)發(fā)軟件中的RTL視圖。從圖中可以看出,元件實(shí)例化語(yǔ)句綜合后的電路結(jié)構(gòu)與設(shè)計(jì)預(yù)期一致,同時(shí),一個(gè)實(shí)例化語(yǔ)句對(duì)應(yīng)一個(gè)硬件。圖4.13是其功能仿真結(jié)果
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《家樂(lè)福模式分析》課件
- 管理顧問(wèn)工作總結(jié)
- 房地產(chǎn)行業(yè)客服經(jīng)驗(yàn)分享
- 服裝行業(yè)的保安工作總結(jié)
- 中央財(cái)經(jīng)大學(xué)財(cái)務(wù)管理課件-風(fēng)險(xiǎn)與報(bào)酬
- 銀行求職自我介紹(15篇)
- 2023-2024年項(xiàng)目部治理人員安全培訓(xùn)考試題(原創(chuàng)題)
- 《電子政務(wù)》課件
- 2024年公司項(xiàng)目部負(fù)責(zé)人安全教育培訓(xùn)試題含答案(模擬題)
- 銷(xiāo)售個(gè)人年度工作總結(jié)(7篇)
- 創(chuàng)意寫(xiě)作與文學(xué)欣賞
- 高空伐樹(shù)作業(yè)施工方案
- 新媒體用戶行為研究-洞察分析
- 醫(yī)療器械考試題及答案
- 初三家長(zhǎng)會(huì)數(shù)學(xué)老師發(fā)言稿
- 2025版國(guó)家開(kāi)放大學(xué)法學(xué)本科《知識(shí)產(chǎn)權(quán)法》期末紙質(zhì)考試總題庫(kù)
- 醫(yī)藥銷(xiāo)售培訓(xùn)課程
- 2022-2023學(xué)年北京市海淀區(qū)七年級(jí)(上)期末語(yǔ)文試卷
- 膝關(guān)節(jié)炎階梯治療
- 設(shè)備日常維護(hù)及保養(yǎng)培訓(xùn)
- 行業(yè)背景、經(jīng)濟(jì)運(yùn)行情況及產(chǎn)業(yè)未來(lái)發(fā)展趨勢(shì)分析
評(píng)論
0/150
提交評(píng)論