第二章-Verilog-HDL基礎(chǔ)課件_第1頁(yè)
第二章-Verilog-HDL基礎(chǔ)課件_第2頁(yè)
第二章-Verilog-HDL基礎(chǔ)課件_第3頁(yè)
第二章-Verilog-HDL基礎(chǔ)課件_第4頁(yè)
第二章-Verilog-HDL基礎(chǔ)課件_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

VerilogHDL歷史1983年,GatewayDesignAutomation公司推出Verilog語(yǔ)言,開(kāi)發(fā)了仿真與驗(yàn)證工具;1985年,GDA推出Verilog仿真器Verilog-XL:仿真速度快,處理能力強(qiáng),具有交互式調(diào)試手段;1987年,Synopsys公司的綜合軟件開(kāi)始接受Verilog輸入;1989年,Cadence公司收購(gòu)GDA,進(jìn)一步擴(kuò)大Verilog的影響;1990年,OpenVerilogInternational(OVI)成立,推廣VerilogHDL和Veriog-XL被廣泛推廣;1993年,OVI推出Verilog2.0,作為IEEE提案提出申請(qǐng);2019年,IEEE(InstituteofElectricalandElectronicsEngineers)通過(guò)VerilogHDL標(biāo)準(zhǔn)IEEEStd.1364-2019;2019年,IEEE發(fā)布了VerilogIEEE1364-2019標(biāo)準(zhǔn)。本課程以IEEEStd.1364-2019為主VerilogHDL歷史1983年,GatewayDes1VerilogHDL現(xiàn)狀VerilogHDL是最廣泛使用的、具有國(guó)際標(biāo)準(zhǔn)支持的硬件描述語(yǔ)言,絕大多數(shù)的EDA廠商都支持;在工業(yè)界和ASIC設(shè)計(jì)領(lǐng)域,VerilogHDL應(yīng)用更加廣泛。VerilogHDL現(xiàn)狀VerilogHDL是最廣泛使用2VerilogHDL與VHDLVHDLVery-High-SpeedIntegratedCircuitHardwareDescriptionLanguage誕生于1982年;1987年底被IEEE和美國(guó)國(guó)防部確認(rèn)為標(biāo)準(zhǔn)硬件描述語(yǔ)言。IEEE1076(1983)IEEE1076-2019……VerilogHDL與VHDLVHDL3VerilogHDL與VHDL建模層次系統(tǒng)級(jí)(system):用高級(jí)語(yǔ)言結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)模塊的外部性能的模型。算法級(jí)(algorithmic):用高級(jí)語(yǔ)言結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)算法的模型。

RTL級(jí)(RegisterTransferLevel):描述數(shù)據(jù)在寄存器之間流動(dòng)和如何處理這些數(shù)據(jù)的模型。

門(mén)級(jí)(gate-level):描述邏輯門(mén)以及邏輯門(mén)之間的連接的模型。開(kāi)關(guān)級(jí)(switch-level):描述器件中三極管和儲(chǔ)存節(jié)點(diǎn)以及它們之間連接的模型。VerilogHDL與VHDL建模層次4VerilogHDL與VHDL相同點(diǎn):都能形式化抽象表示電路行為和結(jié)構(gòu);支持邏輯設(shè)計(jì)中層次與范圍的描述;具有電路仿真和驗(yàn)證機(jī)制;與工藝無(wú)關(guān)。不專(zhuān)門(mén)面向FPGA設(shè)計(jì)不同點(diǎn):Verilog與C語(yǔ)言相似,語(yǔ)法靈活;VHDL源于Ada語(yǔ)言,語(yǔ)法嚴(yán)格;Verilog更適合ASIC設(shè)計(jì)。VerilogHDL與VHDL相同點(diǎn):5SystemVerilog與SystemCSystemVerilog:IEEE1364Verilog-2019標(biāo)準(zhǔn)的擴(kuò)展增強(qiáng),兼容Verilog2019,將硬件描述語(yǔ)言(HDL)與現(xiàn)代的高層級(jí)驗(yàn)證語(yǔ)言(HVL)結(jié)合。SystemC:一種軟/硬件協(xié)同設(shè)計(jì)語(yǔ)言,既是系統(tǒng)級(jí)語(yǔ)言,也是硬件描述語(yǔ)言。SystemVerilog與SystemCSystemVer6系統(tǒng)建模設(shè)計(jì)方法學(xué)自頂向下自底向上混合式描述方式數(shù)據(jù)流描述:描述電路數(shù)據(jù)流行為:assign行為描述:描述功能:initial,always結(jié)構(gòu)化描述:描述元器件間連接關(guān)系:例化混合描述:Verilog允許多描述方式共存于同一模塊。系統(tǒng)建模設(shè)計(jì)方法學(xué)7簡(jiǎn)單的Verilog程序moduletrist1(out,in,enable);

outputout; /*輸出信號(hào)*/

inputin,enable;//輸入信號(hào)mytritri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);

outputout;

inputin,enable;

assignout=enable?in:'bz;endmodule三態(tài)門(mén)模塊trist1調(diào)用模塊mytri的實(shí)例元件tri_inst;通過(guò)這種結(jié)構(gòu)性模塊構(gòu)造可構(gòu)成特大型模塊。簡(jiǎn)單的Verilog程序moduletrist1(out,8簡(jiǎn)單的Verilog程序三態(tài)門(mén)(綜合)簡(jiǎn)單的Verilog程序三態(tài)門(mén)(綜合)9簡(jiǎn)單的Verilog程序VerilogHDL程序是由模塊構(gòu)成的;每個(gè)模塊要進(jìn)行端口定義,并說(shuō)明輸入輸出口,然后對(duì)模塊的功能進(jìn)行邏輯描述;VerilogHDL程序的書(shū)寫(xiě)格式自由,一行可以寫(xiě)幾個(gè)語(yǔ)句,一個(gè)語(yǔ)句也可以分寫(xiě)多行;除了endmodule語(yǔ)句外,每個(gè)語(yǔ)句和數(shù)據(jù)定義的最后必須有分號(hào)。簡(jiǎn)單的Verilog程序VerilogHDL程序是由模塊構(gòu)10同一電路的多種描述方法二選一的選擇器門(mén)級(jí)(結(jié)構(gòu)化)描述modulemuxtwo(out,a,b,sl);

inputa,b,sl;

outputout;

wirensl,sela,selb;

not#1u1(nsl,sl); //#1是仿真延遲

and#1u2(sela,a,nsl);

and#1u3(selb,b,sl);

or#1u4(out,sela,selb);endmodule

RTL級(jí)行為描述modulemuxtwo(out,a,b,sl);

inputa,b,sl;

outputout;

regout;

always(sloraorb)

if(!sl)out=a;

elseout=b;endmodule

布爾代數(shù)級(jí)行為描述modulemuxtwo(out,a,b,sl);

inputa,b,sl;

outputout; assignout=sel?b:a;endmodule

同一電路的多種描述方法二選一的選擇器RTL級(jí)行為描述布爾代數(shù)11同一電路的多種描述方法二選一的選擇器(綜合)同一電路的多種描述方法二選一的選擇器(綜合)12混合描述混合設(shè)計(jì)方式的1位全加器實(shí)例moduleFA_Mix(A,B,Cin,Sum,Cout);

inputA,B,Cin;

outputSum,Cout;

regCout;

regT1,T2,T3;

wireS1;

xorX1(S1,A,B); //門(mén)實(shí)例語(yǔ)句。

always(AorBorCin) //always語(yǔ)句。

begin T1=A&Cin; T2=B&Cin; T3=A&B; Cout=(T1|T2)|T3;

end

assignSum=S1^Cin; //連續(xù)賦值語(yǔ)句。endmodule混合描述混合設(shè)計(jì)方式的1位全加器實(shí)例13混合描述混合設(shè)計(jì)方式的1位全加器實(shí)例(綜合)混合描述混合設(shè)計(jì)方式的1位全加器實(shí)例(綜合)14模塊基本結(jié)構(gòu)module模塊名(端口列表);端口I/O說(shuō)明 內(nèi)部信號(hào)聲明 功能定義endmodule模塊基本結(jié)構(gòu)module模塊名(端口列表);端口I/O說(shuō)明15時(shí)延VerilogHDL模型中的所有時(shí)延都根據(jù)時(shí)間單位定義。下面是帶時(shí)延的連續(xù)賦值語(yǔ)句實(shí)例。

assign

#2Sum=A^B;#2指2個(gè)時(shí)間單位。使用編譯指令將時(shí)間單位與物理時(shí)間相關(guān)聯(lián)。這樣的編譯器指令需在模塊描述前定義,如下所示:

`timescale

1ns/100ps此語(yǔ)句說(shuō)明時(shí),延時(shí)間單位為1ns并且時(shí)間精度為100ps(時(shí)間精度是指所有的時(shí)延必須被限定在0.1ns內(nèi))。如果此編譯器指令所在的模塊包含上面的連續(xù)賦值語(yǔ)句,#2代表2ns。如果沒(méi)有這樣的編譯器指令,VerilogHDL模擬器會(huì)指定一個(gè)缺省時(shí)間單位。IEEEVerilogHDL標(biāo)準(zhǔn)中沒(méi)有規(guī)定缺省時(shí)間單位。時(shí)延VerilogHDL模型中的所有時(shí)延都根據(jù)時(shí)間單位定義16語(yǔ)言要素:標(biāo)識(shí)符所謂標(biāo)識(shí)別符就是用戶(hù)為程序描述中的Verilog對(duì)象所起的名字。模塊名、變量名、常量名、函數(shù)名、任務(wù)名標(biāo)識(shí)符必須以英語(yǔ)字母(a-z,A-Z)起頭,或者用下橫線(xiàn)符(_)起頭。其中可以包含數(shù)字、$符和下劃線(xiàn)符。標(biāo)識(shí)符最長(zhǎng)可以達(dá)到1023個(gè)字符。模塊名、端口名和實(shí)例名都是標(biāo)識(shí)符。Verilog語(yǔ)言大小寫(xiě)敏感,sel和SEL是兩個(gè)不同的標(biāo)識(shí)符。所有的關(guān)鍵詞都是小寫(xiě)的。語(yǔ)言要素:標(biāo)識(shí)符所謂標(biāo)識(shí)別符就是用戶(hù)為程序描述中的Veril17語(yǔ)言要素:系統(tǒng)任務(wù)和函數(shù)以$字符開(kāi)始的標(biāo)識(shí)符表示系統(tǒng)任務(wù)或系統(tǒng)函數(shù)。任務(wù)可以返回0個(gè)或多個(gè)值,函數(shù)除只能返回一個(gè)值以外與任務(wù)相同。函數(shù)在0時(shí)刻執(zhí)行,即不允許延遲,而任務(wù)可以帶有延遲。常用于測(cè)試模擬,一般不用于源代碼設(shè)計(jì)。$display

("Hi,youhavereachedLTtoday"); /*$display系統(tǒng)任務(wù)在新的一行中顯示。*/$time //該系統(tǒng)任務(wù)返回當(dāng)前的模擬時(shí)間。語(yǔ)言要素:系統(tǒng)任務(wù)和函數(shù)以$字符開(kāi)始的標(biāo)識(shí)符表示系統(tǒng)任務(wù)或系18語(yǔ)言要素:編譯指令以`(反引號(hào))開(kāi)始的某些標(biāo)識(shí)符是編譯器指令。`define和`undef,很像C語(yǔ)言中的宏定義指令`ifdef、`else和`endif,用于條件編譯`include文件既可以用相對(duì)路徑名定義,也可以絕對(duì)路徑`timescale編譯器指令將時(shí)間單位與實(shí)際時(shí)間相關(guān)聯(lián)。該指令用于定義時(shí)延的單位和時(shí)延精度。語(yǔ)言要素:編譯指令以`(反引號(hào))開(kāi)始的某些標(biāo)識(shí)符是編譯器指令19語(yǔ)言要素:值集合VerilogHDL有下列四種基本的值:0:邏輯0或“假”1:邏輯1或“真”x:未知z:高阻(x,z不區(qū)分大小寫(xiě))VerilogHDL中有三類(lèi)常量:整型實(shí)數(shù)型字符串型語(yǔ)言要素:值集合VerilogHDL有下列四種基本的值:20語(yǔ)言要素:常量1.整數(shù)表達(dá)方式:<位寬>’<進(jìn)制><數(shù)字>:標(biāo)準(zhǔn)方式’<進(jìn)制><數(shù)字>:默認(rèn)位寬,與機(jī)器類(lèi)型有關(guān)<數(shù)字>:不指明進(jìn)制默認(rèn)為十進(jìn)制進(jìn)制二進(jìn)制(b或B):8’b10101100,’b1010十進(jìn)制(d或D):4’d1543,512十六進(jìn)制(h或H):8’ha2八進(jìn)制(o或O):6’O41x和z值x:不確定:4’b100xz:高阻:16’hzzzz,沒(méi)有驅(qū)動(dòng)元件連接到線(xiàn)網(wǎng),線(xiàn)網(wǎng)的缺省值為z。語(yǔ)言要素:常量1.整數(shù)21語(yǔ)言要素:常量負(fù)數(shù):在位寬表達(dá)式前加一個(gè)減號(hào),如-8’d5減號(hào)不可以放在位寬和進(jìn)制之間,也不可以放在進(jìn)制和具體的數(shù)之間,如8’d-5下劃線(xiàn):只能用在具體的數(shù)字之間,如16’b1010_1111_1010位數(shù)指的是二進(jìn)制位數(shù)。數(shù)位擴(kuò)展:(定義的長(zhǎng)度比為常量指定的長(zhǎng)度長(zhǎng))最高位是0、1,高位用0擴(kuò)展:8’b1111等于8’b00001111最高位是z、x,高位自動(dòng)擴(kuò)展:4’bz等于4’bzzzz數(shù)位截?cái)啵喝绻L(zhǎng)度定義得更小,最左邊的位被截?cái)啵纾?‘b1001_0011等于3’b011,5'H0FFF等于5'H1F語(yǔ)言要素:常量負(fù)數(shù):22語(yǔ)言要素:常量2.實(shí)數(shù)十進(jìn)制計(jì)數(shù)法;例如 2.0 5.68科學(xué)計(jì)數(shù)法;23_5.1e2其值為23510.0,忽略下劃線(xiàn)3.6E2其值為360.0(e與E相同)

實(shí)數(shù)通常不用于FPGA源代碼的常量語(yǔ)言要素:常量2.實(shí)數(shù)23語(yǔ)言要素:常量3.字符串字符串是雙引號(hào)內(nèi)的字符序列。字符串不能分成多行書(shū)寫(xiě)。例如:

"INTERNALERROR"

"REACHED->HERE“用8位ASCII值表示的字符可看作是無(wú)符號(hào)整數(shù)。為存儲(chǔ)字符串“INTERNALERROR”,變量需要8*14位。reg

[1:8*14]Message;(Message=“INTERNALERROR“)字符串較少用于FPGA源代碼的常量語(yǔ)言要素:常量3.字符串24語(yǔ)言要素:數(shù)據(jù)類(lèi)型兩大類(lèi)數(shù)據(jù)類(lèi)型線(xiàn)網(wǎng)型寄存器型線(xiàn)網(wǎng)型包含下述不同種類(lèi)的線(xiàn)網(wǎng)子類(lèi)型wire //FPGA設(shè)計(jì)中,通常只用wire型triwortriorwandtriandtriregtri1tri0supply0supply1msb和lsb定義了范圍,并且均為常數(shù)值表達(dá)式。范圍定義是可選的;如果沒(méi)有定義范圍,缺省值為1位線(xiàn)網(wǎng)wireReset;wire[3:0]data_in;wire[3:2]select;wire[0:2]point;wire

[msb:lsb]reg1,reg2,...regN;語(yǔ)言要素:數(shù)據(jù)類(lèi)型兩大類(lèi)數(shù)據(jù)類(lèi)型msb和lsb定義了范圍,25語(yǔ)言要素:數(shù)據(jù)類(lèi)型寄存器型5種不同的寄存器類(lèi)型。reg

//FPGA設(shè)計(jì)中,通常只用reg型,默認(rèn)初始值x。integer//其他類(lèi)型用于仿真timerealrealtimemsb和lsb定義了范圍,并且均為常數(shù)值表達(dá)式。范圍定義是可選的;如果沒(méi)有定義范圍,缺省值為1位寄存器reg

Reset;reg[3:0]data_in;reg[3:2]select;reg[0:2]point;reg

[msb:lsb]reg1,reg2,...regN;語(yǔ)言要素:數(shù)據(jù)類(lèi)型寄存器型msb和lsb定義了范圍,并且均26語(yǔ)言要素:數(shù)據(jù)類(lèi)型存儲(chǔ)器存儲(chǔ)器是一個(gè)寄存器數(shù)組。存儲(chǔ)器使用如下方式說(shuō)明reg[msb:lsb]memory1[upper1:lower1], memory2[upper2:lower2],...;reg[3:0]MyMem[63:0]//MyMem為64個(gè)4位寄存器的數(shù)組。regBog[1:5]//Bog為5個(gè)1位寄存器的數(shù)組。存儲(chǔ)器賦值不能在一條賦值語(yǔ)句中完成,寄存器可以。存儲(chǔ)器常用于FPGA外圍器件的仿真建模語(yǔ)言要素:數(shù)據(jù)類(lèi)型存儲(chǔ)器27語(yǔ)言要素:數(shù)據(jù)類(lèi)型存儲(chǔ)器賦值2)系統(tǒng)任務(wù)賦值reg

[3:0]RomB[7:0];$readmemb

("ram.patt",RomB);

Romb是存儲(chǔ)器。文件“ram.patt”必須包含二進(jìn)制值。文件也可以包含空白空間和注釋。下面是文件中可能內(nèi)容的實(shí)例。11011110100001110000100100110001語(yǔ)言要素:數(shù)據(jù)類(lèi)型存儲(chǔ)器賦值28語(yǔ)言要素:數(shù)據(jù)類(lèi)型存儲(chǔ)器賦值1)對(duì)每個(gè)單元逐一賦值reg[0:3]Xrom[0:2];...Xrom[0]=4'hA;Xrom[1]=4'h8;Xrom[2]=4‘hF;語(yǔ)言要素:數(shù)據(jù)類(lèi)型存儲(chǔ)器賦值29語(yǔ)言要素:參數(shù)參數(shù)是一個(gè)常量,常用于定義時(shí)延和變量的寬度。parameterLINELENGTH=132;parameterALL_X_S=16'bx;parameterBIT=1,BYTE=8,PI=3.14;parameterSTROBE_DELAY=(BYTE+BIT)/2;參數(shù)值也可以在編譯時(shí)被改變。改變參數(shù)值可以使用參數(shù)定義語(yǔ)句或通過(guò)在模塊初始化語(yǔ)句中定義參數(shù)值語(yǔ)言要素:參數(shù)參數(shù)是一個(gè)常量,常用于定義時(shí)延和變量的寬度。30語(yǔ)言要素:空白符、注釋除了字符串中的空白符,其他空白符編譯被忽略注釋多行注釋/**/(不允許嵌套)單行注釋//語(yǔ)言要素:空白符、注釋除了字符串中的空白符,其他空白符編譯被31第二章-Verilog-HDL基礎(chǔ)課件32第二章-Verilog-HDL基礎(chǔ)課件33第二章-Verilog-HDL基礎(chǔ)課件34第二章-Verilog-HDL基礎(chǔ)課件35第二章-Verilog-HDL基礎(chǔ)課件36習(xí)題11使用`timescale編譯器指令的目的是什么?2寫(xiě)出產(chǎn)生下圖所示波形的變量BullsEye的初始化語(yǔ)句。3使用數(shù)據(jù)流描述方式編寫(xiě)下圖所示的異或邏輯的VerilogHDL描述,并使用規(guī)定的時(shí)延。4下列表達(dá)式的位模式是什么? 7'o44,'Bx0,5'bx110,'hA0,10'd2,'hzF

習(xí)題11使用`timescale編譯器指令的目的是什么?37表達(dá)式表達(dá)式由操作數(shù)和操作符組成;表達(dá)式可以在出現(xiàn)數(shù)值的任何地方使用;表達(dá)式是數(shù)據(jù)流描述的基礎(chǔ)。A&BAddr1[3:0]+Addr2[3:0]Count+1(a[0]^b[0])|(a[1]&~b[1])表達(dá)式表達(dá)式由操作數(shù)和操作符組成;38表達(dá)式:操作數(shù)操作數(shù)可以是以下類(lèi)型中的一種:常數(shù)參數(shù)線(xiàn)網(wǎng)寄存器位選擇部分選擇存儲(chǔ)器單元函數(shù)調(diào)用表達(dá)式:操作數(shù)操作數(shù)可以是以下類(lèi)型中的一種:39表達(dá)式:操作數(shù)常數(shù)表達(dá)式中的整數(shù)值可被解釋為有符號(hào)數(shù)或無(wú)符號(hào)數(shù);如果整數(shù)是基數(shù)型整數(shù),作為無(wú)符號(hào)數(shù)對(duì)待。12 01100的5位向量形式 (有符號(hào))-12 10100的5位向量形式 (有符號(hào))5‘b01100 十進(jìn)制數(shù)12 (無(wú)符號(hào))參數(shù)參數(shù)類(lèi)似于常量,并且使用參數(shù)聲明進(jìn)行說(shuō)明。例如parameter

LOAD=4'd12,STORE=4'd10;LOAD和STORE為參數(shù),值分別被聲明為12和10。表達(dá)式:操作數(shù)常數(shù)40表達(dá)式:操作數(shù)線(xiàn)網(wǎng)

線(xiàn)網(wǎng)中的值被解釋為無(wú)符號(hào)數(shù),表達(dá)式中可使用:標(biāo)量線(xiàn)網(wǎng)(1位)和向量線(xiàn)網(wǎng)(多位)。wire[3:0]led; //4位向量線(xiàn)網(wǎng)。wireline; //標(biāo)量線(xiàn)網(wǎng)。assignled=4‘ha;//被賦于位向量1010,為十進(jìn)制10。表達(dá)式:操作數(shù)線(xiàn)網(wǎng)41表達(dá)式:操作數(shù)寄存器 integer型的值被解釋為有符號(hào)的二進(jìn)制補(bǔ)碼數(shù),

reg型或time型的值被解釋為無(wú)符號(hào)數(shù), real型和realtime的值被解釋為有符號(hào)浮點(diǎn)數(shù)。

reg[4:0]state;State=5‘b01011;//值為位向量01011,十進(jìn)制值11。State=9; //值為位向量01001,十進(jìn)制值9。為何沒(méi)有用assign語(yǔ)句賦值?表達(dá)式:操作數(shù)寄存器42表達(dá)式:操作數(shù)位選擇 位選擇從向量中抽取特定的位。形式如下: net_or_reg_vector[bit_select_expr]State[1]&&State[4] //寄存器位選擇。led[0]|line //線(xiàn)網(wǎng)位選擇。如果選擇表達(dá)式的值為x、z或越界,則位選擇的值為State[x]值為x。(FPGA設(shè)計(jì)中禁用)表達(dá)式:操作數(shù)位選擇43表達(dá)式:操作數(shù)部分選擇net_or_reg_vector[msb_const_expr:lsb_const_expr]State[4:1] //寄存器部分選擇。 reg[4:0]state;led[2:0] //線(xiàn)網(wǎng)部分選擇。 wire[3:0]led;選擇范圍越界或?yàn)閤、z時(shí),部分選擇的值為x。(FPGA設(shè)計(jì)中禁用越界)表達(dá)式:操作數(shù)部分選擇44表達(dá)式:操作數(shù)存儲(chǔ)器單元存儲(chǔ)器單元從存儲(chǔ)器中選擇一個(gè)memory[word_address] reg[7:0]Dram[63:0]; Dram[60]; //存儲(chǔ)器的第61個(gè)單元。不允許對(duì)存儲(chǔ)器變量值部分選擇或位選擇。

(思考:在存儲(chǔ)器中讀取一個(gè)位或部分選擇一個(gè)字?)函數(shù)調(diào)用

表達(dá)式中可使用函數(shù)調(diào)用。

$time+SumOfEvents(A,B) /*$time是系統(tǒng)函數(shù),并且SumOfEvents是在別處定義的用戶(hù)自定義函數(shù)。*/表達(dá)式:操作數(shù)存儲(chǔ)器單元45表達(dá)式:操作符VerilogHDL中的操作符可以分為下述類(lèi)型:算術(shù)操作符關(guān)系操作符相等操作符邏輯操作符按位操作符歸約操作符移位操作符條件操作符連接和復(fù)制操作符表達(dá)式:操作符VerilogHDL中的操作符可以分為下述類(lèi)46表達(dá)式:操作符操作符從最高優(yōu)先級(jí)到最低優(yōu)先級(jí)排列。同一行中的操作符優(yōu)先級(jí)相同。表達(dá)式:操作符操作符從最高優(yōu)先級(jí)到最低優(yōu)先級(jí)排列。同一行中的47表達(dá)式:操作符除條件操作符從右向左關(guān)聯(lián)外,其余所有操作符自左向右關(guān)聯(lián)。A+B-C 等價(jià)于:(A+B)-C //自左向右A?B:C?D:F 等價(jià)于:A?B:(C?D:F) //從右向左圓擴(kuò)號(hào)能夠用于改變優(yōu)先級(jí)(A?B:C)?D:F表達(dá)式:操作符除條件操作符從右向左關(guān)聯(lián)外,其余所有操作符自左48表達(dá)式:操作符算術(shù)運(yùn)算符+(加)-(減)*(乘) /(除)%(取模)1)后三種不常用,是具體設(shè)計(jì)結(jié)構(gòu)而定;2)任意操作數(shù)是X或Z,那么整個(gè)結(jié)果為X;3)結(jié)果的長(zhǎng)度由最長(zhǎng)的操作數(shù)決定;4)reg和wire保存無(wú)符號(hào)數(shù)。表達(dá)式:操作符算術(shù)運(yùn)算符49表達(dá)式:操作符關(guān)系操作符有:>(大于)<(小于)>=(不小于)<=(不大于)1)關(guān)系操作符的結(jié)果為真(1)或假(0);2)如果操作數(shù)中有一位為X或Z,那么結(jié)果為X。習(xí)題:求下列表達(dá)式真值23>4552<8'hxFF'b1000>='b01110表達(dá)式:操作符關(guān)系操作符有:習(xí)題:求下列表達(dá)式真值50表達(dá)式:操作符等式運(yùn)算符(相等關(guān)系運(yùn)算符)==(邏輯相等)!=(邏輯不等)===(全等)!==(非全等)1)如果比較結(jié)果為假則結(jié)果為0,為真結(jié)果為1;2)在全等比較中,值x和z嚴(yán)格按位比較。===01xz==01xz01000010xx10100101xxx0010xxxxxz0001zxxxx習(xí)題:求下列表達(dá)式真值假定 Data=‘b11x0; Addr=‘b11x0;求 Data==Addr

Data===Addr表達(dá)式:操作符等式運(yùn)算符(相等關(guān)系運(yùn)算符)===01xz==51表達(dá)式:操作符邏輯操作符有:&&(邏輯與)||(邏輯或)!(邏輯非)1)只對(duì)邏輯值運(yùn)算,結(jié)果一位,邏輯值1、0或x;2)對(duì)于向量操作,非0向量作為1處理;3)如果任意一個(gè)操作數(shù)包含x,結(jié)果也為x。習(xí)題:求下列表達(dá)式真值假定: C='b0;//0為假 D=‘b1;//1為真

A_Bus='b0110; B_Bus='b0110;求 C&&D C||D !D A_Bus&&B_Bus A_Bus||B_Bus !A_Bus表達(dá)式:操作符邏輯操作符有:習(xí)題:求下列表達(dá)式真值52表達(dá)式:操作符按位操作符有:?~(一元非)?&(二元與)?|(二元或)?^(二元異或)?~^或^~(二元異或非)操作數(shù)對(duì)應(yīng)位上按位操作,并產(chǎn)生向量結(jié)果。習(xí)題:求下列表達(dá)式真值假定 A='b0110; B='b0100;求 A|B A&B表達(dá)式:操作符按位操作符有:習(xí)題:求下列表達(dá)式真值53表達(dá)式:操作符歸約操作符有:&(歸約與)~&(歸約與非)| (歸約或)~|(歸約或非)^(歸約異或)~^(歸約異或非)在單一操作數(shù)的所有位上操作,并產(chǎn)生1位結(jié)果。習(xí)題:求下列表達(dá)式真值假定: A=‘b0110; B=‘b0100;

MyReg=4‘b01x0;求 ~&A ^A |B &B |MyReg ^MyReg

表達(dá)式:操作符歸約操作符有:習(xí)題:求下列表達(dá)式真值54表達(dá)式:操作符移位操作符有:?<<(左移)>>(右移)1)左側(cè)操作數(shù)移動(dòng)右側(cè)操作數(shù)表示的次數(shù),邏輯移位,空閑位添0補(bǔ)位;2)如果右側(cè)操作數(shù)的值為x或z,移位操作的結(jié)果為x。應(yīng)用實(shí)例:使用移位操作為2-4解碼器建模wire[3:0]DecodeOut;assignDecodeOut=4'b1<<Address[1:0];習(xí)題:求Qreg的值假定: reg[7:0]Qreg;

Qreg=4'b0111;移位 Qreg>>2

表達(dá)式:操作符移位操作符有:習(xí)題:求Qreg的值55表達(dá)式:操作符條件操作符根據(jù)條件表達(dá)式的值選擇表達(dá)式,形式: cond_expr?expr1:expr2三目運(yùn)算符wire[2:0]Student;assignStudent=Marks>18?Grade_A:Grade_C;表達(dá)式:操作符條件操作符56表達(dá)式:操作符位拼接運(yùn)算符(連接和復(fù)制操作)連接操作:將小表達(dá)式合并形成大表達(dá)式的操作。形式: {expr1,expr2,...,exprN}復(fù)制操作:指定重復(fù)次數(shù)來(lái)執(zhí)行操作。如下: {repetition_number{expr1,expr2,...,exprN}實(shí)例:wire[7:0]Dbus,[11:0]Abus;assignDbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};assignAbus={3{4'b1011}}; //位向量12'b1011_1011_1011)assignAbus={{4{Dbus[7]}},Dbus}; /*符號(hào)擴(kuò)展*/表達(dá)式:操作符位拼接運(yùn)算符(連接和復(fù)制操作)57習(xí)題21.說(shuō)明參數(shù)GATE_DELAY,參數(shù)值為5。2.假定長(zhǎng)度為64個(gè)字的存儲(chǔ)器,每個(gè)字8位,編寫(xiě)Verilog代碼,按逆序交換存儲(chǔ)器的內(nèi)容。即將第0個(gè)字與第63個(gè)字交換,第1個(gè)字與第62個(gè)字交換,依此類(lèi)推。3.假定32位總線(xiàn)Address_Bus,編寫(xiě)一個(gè)表達(dá)式,計(jì)算從第11位到第20位的歸約與非。4.假定一條總線(xiàn)Control_Bus[15:0],編寫(xiě)賦值語(yǔ)句將總線(xiàn)分為兩條總線(xiàn):Abus[0:9]和Bbus[6:1]。5.編寫(xiě)一個(gè)表達(dá)式,執(zhí)行算術(shù)移位,將Qparity中包含的8位有符號(hào)數(shù)算術(shù)移位。6.使用條件操作符,編寫(xiě)賦值語(yǔ)句選擇NextState的值。如果CurrentState的值為RESET,那么NextState的值為GO;如果CurrentState的值為GO,則NextState的值為BUSY;如果CurrentState的值為BUSY;則NextState的值為RESET。7.如何從標(biāo)量變量A,B,C和D中產(chǎn)生總線(xiàn)BusQ[0:3]?如何從兩條總線(xiàn)BusA[0:3]和BusY[20:15]形成新的總線(xiàn)BusR[10:1]?習(xí)題21.說(shuō)明參數(shù)GATE_DELAY,參數(shù)值為5。58模塊與端口模塊:基本單元定義成模塊形式modulemodule_name(port_list); Declarations_and_Statementsendmodule端口隊(duì)列port_list列出了該模塊通過(guò)哪些端口與外部模塊通信。模塊與端口模塊:基本單元定義成模塊形式59模塊與端口端口模塊的端口可以是

input(輸入端口)、output

(輸出端口)或者inout

(雙向端口);缺省的端口類(lèi)型為wire型;output或inout能夠被重新聲明為reg型,但是input不可以;線(xiàn)網(wǎng)或寄存器必須與端口說(shuō)明中指定的長(zhǎng)度相同。模塊與端口端口60模塊與端口例:moduleMicro(PC,Instr,NextAddr);//端口說(shuō)明input[3:1]PC;output[1:8]Instr;inout[16:1]NextAddr;//重新說(shuō)明端口類(lèi)型:wire[16:1]NextAddr;//該說(shuō)明是可選的,但如果指定了,就必須與它的端口說(shuō)明保持相同長(zhǎng)度。reg[1:8]Instr;//Instr已被重新說(shuō)明為reg型,因此能在always語(yǔ)句或在initial語(yǔ)句中賦值。...endmodule模塊與端口例:61模塊與端口模塊實(shí)語(yǔ)句一個(gè)模塊能夠在另外一個(gè)模塊中被引用,這樣就建立了描述的層次。模塊實(shí)例語(yǔ)句形式 module_nameinstance_name(port_associations);信號(hào)端口可以通過(guò)位置或名稱(chēng)關(guān)聯(lián);但是關(guān)聯(lián)方式不能夠混合使用。端口官廉形式 port_expr //通過(guò)位置,隱式關(guān)聯(lián) .PortName(port_expr) //通過(guò)名稱(chēng),顯示關(guān)聯(lián),強(qiáng)烈推薦! port_expr可以是以下的任何類(lèi)型:1)標(biāo)識(shí)符(reg型或wire型)2)位選擇3)部分選擇4)上述類(lèi)型的合并5)表達(dá)式(只適用于input型信號(hào))MicroM1

(

UdIn[3:0],{WrN,RdN},Status[0],Status[1],

&UdOut[0:7],TxData);模塊與端口模塊實(shí)語(yǔ)句62模塊與端口使用兩個(gè)半加器模塊構(gòu)造全加器moduleHA(A,B,S,C);inputA,B;outputS,C;assignS=A^B;assignC=A&B;endmodulemoduleFA(P,Q,Cin,Sum,Cout);inputP,Q,Cin;outputSum,Cout;wireS1,C1,C2;HAh1(P,Q,S1,C1); //通過(guò)位置關(guān)聯(lián)。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//通過(guò)端口與信號(hào)的名字關(guān)聯(lián)。orO1(Cout,C1,C2); //或門(mén)實(shí)例語(yǔ)句endmodule考慮如何模塊參數(shù)化?模塊與端口使用兩個(gè)半加器模塊構(gòu)造全加器63模塊與端口使用兩個(gè)半加器模塊構(gòu)造全加器(模塊參數(shù)化)moduleHA(A,B,S,C);inputA,B;outputS,C;parameterAND_DELAY=1,XOR_DELAY=2;assign

#XOR_DELAYS=A^B;assign

#AND_DELAYC=A&B;endmodulemoduleFA(P,Q,Cin,Sum,Cout);inputP,Q,Cin;outputSum,Cout;parameterOR_DELAY=1;wireS1,C1,C2;HAh1(P,Q,S1,C1); //通過(guò)位置關(guān)聯(lián)。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//通過(guò)端口與信號(hào)的名字關(guān)聯(lián)。or

#OR_DELAYO1(Cout,C1,C2); //或門(mén)實(shí)例語(yǔ)句endmodule模塊與端口使用兩個(gè)半加器模塊構(gòu)造全加器(模塊參數(shù)化)64模塊與端口懸空端口通過(guò)將端口表達(dá)式表示為空白來(lái)指定為懸空端口DFFd1(.Q(QS),.Qbar(),.Data(D),.Preset(),.Clock(CK));端口長(zhǎng)度不同通過(guò)無(wú)符號(hào)數(shù)的右對(duì)齊或截?cái)喾绞竭M(jìn)行匹配moduleChild(Pba,Ppy);input[5:0]Pba;output[2:0]Ppy;...endmodulemoduleTop;wire[1:2]Bdl;wire[2:6]Mpr;ChildC1(.Pba(Bdl),.Ppy(Mpr));endmodule模塊與端口懸空端口65模塊與端口模塊參數(shù)值改變1)參數(shù)定義語(yǔ)句(defparam)moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC;defparamHa1.XOR_DELAY=5,//實(shí)例Ha1中的參數(shù)XOR_DELAY。Ha1.AND_DELAY=2;//實(shí)例Ha1中參數(shù)的AND_DELAY。HAHa1(NewA,NewB,NewS,NewC);endmodule模塊與端口模塊參數(shù)值改變66模塊與端口模塊參數(shù)值改變2)帶參數(shù)值的模塊引用moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC; HA#(5,2)Ha1(NewA,NewB,NewS,NewC);//第1個(gè)值5賦給參數(shù)AND_DELAY,該參數(shù)在模塊HA中說(shuō)明。//第2個(gè)值2賦給參數(shù)XOR_DELAY,該參數(shù)在模塊HA中說(shuō)明。endmodule模塊與端口模塊參數(shù)值改變67模塊與端口外部端口顯式地指定外部端口。(較少使用)moduleScram_B(.Data(Arb),.Control(Ctrl),.Mem_Word(Mem_Blk),.Addr(Byte));input[0:3]Arb;inputCtrl;input[8:0]Mem_Blk;output[0:3]Byte;...endmodule模塊與端口外部端口68習(xí)題31.模塊實(shí)例語(yǔ)句與門(mén)實(shí)例語(yǔ)句的區(qū)別是什么?2.當(dāng)端口懸空時(shí),即端口沒(méi)有被連接時(shí),端口的值是什么?3.用本章講述的模塊FA編寫(xiě)執(zhí)行加法和減法的4位ALU的結(jié)構(gòu)模型。習(xí)題31.模塊實(shí)例語(yǔ)句與門(mén)實(shí)例語(yǔ)句的區(qū)別是什么?69門(mén)級(jí)建模FPGA設(shè)計(jì)中較少使用VerilogHDL中提供下列內(nèi)置基本門(mén):1)多輸入門(mén):

and,nand,or,nor,xor,xnor2)多輸出門(mén):

buf,not3)三態(tài)門(mén):

bufif0,bufif1,notif0,notif14)上拉、下拉電阻:

pullup,pulldown5)MOS開(kāi)關(guān):

cmos,nmos,pmos,rcmos,rnmos,rpmos6)雙向開(kāi)關(guān):

tran,tranif0,tranif1,rtran,rtranif0,rtranif1門(mén)級(jí)建模FPGA設(shè)計(jì)中較少使用70用戶(hù)定義原語(yǔ)(UDP)FPGA設(shè)計(jì)中通常不使用;UDP實(shí)例語(yǔ)句的語(yǔ)法與基本門(mén)的實(shí)例語(yǔ)句語(yǔ)法一致;UDP中可以描述組合電路和時(shí)序電路。PrimitiveD_Edge_FF(Q,Clk,Data);outputQ;regQ;inputData,Clk;initialQ=0;table //ClkDataQ(State)Q(next) (01)0:?:0;(01)1:?:1;(0x)1:1:1;(0x)0:0:0; //忽略時(shí)鐘負(fù)邊沿: (?0)?:?:-; //忽略在穩(wěn)定時(shí)鐘上的數(shù)據(jù)變化(??)?:?:-;endtableendprimitive用戶(hù)定義原語(yǔ)(UDP)FPGA設(shè)計(jì)中通常不使用;Primit71數(shù)據(jù)流建模連續(xù)賦值用于數(shù)據(jù)流建模(描述),生成組合邏輯電路。連續(xù)賦值使用連續(xù)賦值語(yǔ)句assign語(yǔ)句,格式為:assignLHS_target=RHS_expression;例如wireZ1,Preset,Clear;//線(xiàn)網(wǎng)說(shuō)明assignZ1=Preset&Clear;//連續(xù)賦值語(yǔ)句wire[15:0]data_in;wire[15:0]data_tmp;wiredata_tmp={data_in[7:0],data_in[15:8]};數(shù)據(jù)流建模連續(xù)賦值用于數(shù)據(jù)流建模(描述),生成組合邏輯電路。72數(shù)據(jù)流建模連續(xù)賦值語(yǔ)句在什么時(shí)候執(zhí)行呢?

只要在右端表達(dá)式的操作數(shù)上有事件發(fā)生(值變化),表達(dá)式立即被計(jì)算,新結(jié)果就賦給左邊的線(xiàn)網(wǎng)。連續(xù)賦值的目標(biāo)類(lèi)型(左側(cè)操作數(shù)類(lèi)型)1)標(biāo)量線(xiàn)網(wǎng) assignZ1=…;2)向量線(xiàn)網(wǎng) assigndata_tmp=…;3)向量的常數(shù)型位選擇assigndata_tmp[2]=…;4)向量的常數(shù)型部分選擇assigndata_tmp[7:0]=…;5)上述類(lèi)型的任意的拼接運(yùn)算結(jié)果

assign{Z1,data_tmp[15]}=2’b10;數(shù)據(jù)流建模連續(xù)賦值語(yǔ)句在什么時(shí)候執(zhí)行呢?73數(shù)據(jù)流建模例:數(shù)據(jù)流描述的一位全加器moduleFA_Df(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;assignSum=A^B^Cin;assignCout=(A&Cin)|(B&Cin)|(A&B);endmodule1)assign語(yǔ)句之間是并發(fā)的,與其書(shū)寫(xiě)的順序無(wú)關(guān);2)線(xiàn)網(wǎng)的賦值可以在聲明時(shí)賦值,例如wireSum=A^B^Cin;數(shù)據(jù)流建模例:數(shù)據(jù)流描述的一位全加器74數(shù)據(jù)流建模數(shù)據(jù)流建模的時(shí)延 assign

#2Sum=A^B^Cin;#2表示右側(cè)表達(dá)式的值延遲兩個(gè)時(shí)間單位賦給Sum;時(shí)間單位是多少?由誰(shuí)來(lái)決定?`timescale1ns/100psFPGA設(shè)計(jì)中的時(shí)延僅在功能仿真時(shí)有效,不影響實(shí)際電路生成。數(shù)據(jù)流建模數(shù)據(jù)流建模的時(shí)延75數(shù)據(jù)流建模數(shù)據(jù)流建模注意事項(xiàng):1)wire型變量如果不賦值,默認(rèn)值為z;2)數(shù)據(jù)流建模沒(méi)有存儲(chǔ)功能,不能保存數(shù)據(jù);3)wire型變量只能在聲明時(shí)賦值或者assing語(yǔ)句賦值;4)assign語(yǔ)句并發(fā)執(zhí)行,實(shí)際的延遲又物理芯片的布線(xiàn)結(jié)果決定。5)最基本的FPGA設(shè)計(jì)源代碼描述語(yǔ)句之一,用于生成組合邏輯,定制LUT的邏輯功能。常作為中間信號(hào)的描述用于控制寄存器的輸入輸出。數(shù)據(jù)流建模數(shù)據(jù)流建模注意事項(xiàng):76習(xí)題41.使用assign語(yǔ)句描述一個(gè)時(shí)鐘信號(hào)clk,頻率為100MHz。

assign#5clk=~clk;2.請(qǐng)指出下列語(yǔ)句是否合法?描述了怎樣的功能?assignMux=(S==0)?A:'bz;assignMux=(S==1)?B:'bz;assignMux=(S==2)?C:'bz;assignMux=(S==3)?D:'bz;習(xí)題41.使用assign語(yǔ)句描述一個(gè)時(shí)鐘信號(hào)clk,頻率77行為建模過(guò)程賦值用于行為建模(描述)行為建模的主要機(jī)制:1)initial語(yǔ)句 主要用于仿真文件(模擬)2)always語(yǔ)句 用于源文件和仿真文件所有initial語(yǔ)句和always語(yǔ)句之間都是并發(fā)執(zhí)行;執(zhí)行順序與其在模塊中書(shū)寫(xiě)順序無(wú)關(guān)。行為建模過(guò)程賦值用于行為建模(描述)78行為建模:initial語(yǔ)句initial語(yǔ)句只執(zhí)行一次;在模擬開(kāi)始時(shí)執(zhí)行,即在0時(shí)刻開(kāi)始執(zhí)行;不能嵌套使用。 initial[timing_control]procedural_statementprocedural_statement可以是: procedural_continuous_assignment過(guò)程賦值(阻塞或者非阻塞) conditional_statement -> if case_statement -> caseloop_statement -> for,forever,repeat,whilewait_statement -> waitdisable_statement -> disable(相當(dāng)于C中的break)event_trigger -> (event)sequential_block -> begin...endparallel_block -> fork...jointask_enable(userorsystem)行為建模:initial語(yǔ)句initial語(yǔ)句只執(zhí)行一次;79行為建模:initial語(yǔ)句例:regCurt;...initial#2Curt=1;例:parameterSIZE=1024;reg[7:0]RAM[0:SIZE-1];regRibReg;Initialbegin:SEQ_BLK_A //順序過(guò)程的標(biāo)記,如果沒(méi)有局部聲明,則不需要integerIndex;RibReg=0;for(Index=0;Index<SIZE;Index=Index+1) RAM[Index]=0;end行為建模:initial語(yǔ)句例:80行為建模:initial語(yǔ)句initial語(yǔ)句在仿真文件產(chǎn)生時(shí)鐘和構(gòu)造數(shù)據(jù)簡(jiǎn)單示例parameterAPPLY_DELAY=5;reg[0:7]port_A;regclk;...initialbeginPort_A='h20;#APPLY_DELAYPort_A='hF2;#APPLY_DELAYPort_A='h41;#APPLY_DELAYPort_A='h0A;initialbeginclk=0;

while(1) //或者forever

clk=#5~clk; //或者#5clk=~clk;end行為建模:initial語(yǔ)句initial語(yǔ)句在仿真文件產(chǎn)生81行為建模:always語(yǔ)句always語(yǔ)句重復(fù)執(zhí)行,語(yǔ)法和initial語(yǔ)句相同:always[timing_control]procedural_statement

procedural_statement可以是:

procedural_continuous_assignment過(guò)程賦值(阻塞或者非阻塞)

conditional_statement -> if case_statement -> caseloop_statement -> for,forever,repeat,

whilewait_statement -> waitdisable_statement -> disable(相當(dāng)于C中的break)event_trigger -> (event)sequential_block -> begin...endparallel_block -> fork...jointask_enable(userorsystem)行為建模:always語(yǔ)句always語(yǔ)句重復(fù)執(zhí)行,語(yǔ)法和i82行為建模:always語(yǔ)句兩種典型的always語(yǔ)句1)組合邏輯(電平觸發(fā))regc;always(aorborsel) c=sel?a:b;說(shuō)明:(1)雖然c是reg型,但綜合的結(jié)果是組合電路;(2)等同于數(shù)據(jù)流描述

wirec;

assignc=sel?a:b;(3)FPGA設(shè)計(jì)中不建議使用;此外,容易產(chǎn)生鎖存器行為建模:always語(yǔ)句兩種典型的always語(yǔ)句83行為建模:always語(yǔ)句兩種典型的always語(yǔ)句2)時(shí)序邏輯(時(shí)鐘沿觸發(fā))reg[8:0]count;always(posedgeclkornegedgereset)

begin

if(~reset) count=0;

else

begin

if(count==511) count=0;

else

count=count+1;

end

end說(shuō)明:(1)在always語(yǔ)句中所有被賦值的信號(hào)必須是reg型; (2)綜合為觸發(fā)器,推薦使用; (3)異步時(shí)序邏輯行為建模:always語(yǔ)句兩種典型的always語(yǔ)句說(shuō)明:84常見(jiàn)過(guò)程語(yǔ)句時(shí)序控制語(yǔ)句僅用于仿真測(cè)試1)時(shí)序控制regStream;initialBegin

Stream=0; #12Stream=1; #5Stream=0; #3Stream=1; #4Stream=0; #2Stream=1; #5Stream=0;end常見(jiàn)過(guò)程語(yǔ)句時(shí)序控制語(yǔ)句85常見(jiàn)過(guò)程語(yǔ)句時(shí)序控制語(yǔ)句2)事件控制邊沿觸發(fā)事件reg[9:0]addr;integeri;initialbegin

for(i=0;i<5;i=i+1) (posedgeclk) addr=addr+1;end電平觸發(fā)事件initialbegin

wait(Sum>22) Sum=0;end常見(jiàn)過(guò)程語(yǔ)句時(shí)序控制語(yǔ)句電平觸發(fā)事件86常見(jiàn)過(guò)程語(yǔ)句順序語(yǔ)句塊begin…end源程序、測(cè)試文件塊內(nèi)語(yǔ)句順序執(zhí)行并行語(yǔ)句塊fork…join測(cè)試文件塊內(nèi)語(yǔ)句并行執(zhí)行思考題:initial語(yǔ)句若使用fork…join如何描述右圖時(shí)序?常見(jiàn)過(guò)程語(yǔ)句順序語(yǔ)句塊并行語(yǔ)句塊思考題:87常見(jiàn)過(guò)程語(yǔ)句問(wèn)題:(1)時(shí)序電路的行為具有并行特性:寄存器都受到時(shí)鐘的控制,流水線(xiàn)… (2)既然fork…join不能在源文件中使用,在行為描述中如何描述并行語(yǔ)句? (3)begin…end中的語(yǔ)句是順序執(zhí)行,在同一時(shí)鐘邊沿觸發(fā)下,每個(gè)寄存器變量為何賦值有先有后?這與實(shí)際電路是否矛盾?常見(jiàn)過(guò)程語(yǔ)句問(wèn)題:88常見(jiàn)過(guò)程語(yǔ)句過(guò)程賦值語(yǔ)句定義:initial和always語(yǔ)句中的賦值語(yǔ)句區(qū)別于數(shù)據(jù)流描述的連續(xù)賦值語(yǔ)句(assign)分為阻塞過(guò)程賦值和非阻塞過(guò)程賦值兩種阻塞過(guò)程賦值always(posedgeclkor

negedgerst)begin

if(~rst) …//寄存器復(fù)位

else

if(…)

begin a=1‘b1; b=a;

endend非阻塞過(guò)程賦值always(posedgeclkor

negedgerst)begin

if(~rst) …//寄存器復(fù)位

else

if(…)

begin a<=1‘b1; b<=a;

endendb=?常見(jiàn)過(guò)程語(yǔ)句過(guò)程賦值語(yǔ)句阻塞過(guò)程賦值非阻塞過(guò)程賦值b=?89常見(jiàn)過(guò)程語(yǔ)句結(jié)論:源代碼設(shè)計(jì)推薦使用非阻塞過(guò)程賦值“<=”可以有效綜合為寄存器邏輯電路符合實(shí)際,時(shí)序分析簡(jiǎn)單語(yǔ)句之間并行執(zhí)行,不再有順序關(guān)系阻塞過(guò)程賦值“=”多用于仿真測(cè)試文件適合構(gòu)造仿真模型和仿真行為不容易直接綜合為FPGA資源常見(jiàn)過(guò)程語(yǔ)句結(jié)論:90常見(jiàn)過(guò)程語(yǔ)句initialbeginClr=#5 0;Clr=#4 1;Clr=#10 0;endinitialbeginClr<=#5 1;Clr<=#4 0;Clr<=#10 0;end常見(jiàn)過(guò)程語(yǔ)句initialinitial91常見(jiàn)過(guò)程語(yǔ)句過(guò)程賦值與連續(xù)賦值的比較常見(jiàn)過(guò)程語(yǔ)句過(guò)程賦值與連續(xù)賦值的比較92常見(jiàn)過(guò)程語(yǔ)句if語(yǔ)句與C語(yǔ)言類(lèi)似If

(condition_1)

procedural_statement_1{else

if(condition_2)

procedural_statement_2}{else

procedural_statement_3}注: 1)條件語(yǔ)句必須在過(guò)程塊語(yǔ)句中使用,不能單獨(dú)使用; 2)if后面的表達(dá)式的值只有為1時(shí)才按“真”處理。常見(jiàn)過(guò)程語(yǔ)句if語(yǔ)句93常見(jiàn)過(guò)程語(yǔ)句if語(yǔ)句的嵌套

if(表達(dá)式1)

if(表達(dá)式2)語(yǔ)句1;

else語(yǔ)句2;

else

if(表達(dá)式3)語(yǔ)句3;

else語(yǔ)句4;

注: 1)else總是與它最上面的最近的if配對(duì);2)如果if與else的數(shù)目不一樣,為了實(shí)現(xiàn)程序設(shè)計(jì)者的目的,可以用begin…end語(yǔ)句確定配對(duì)關(guān)系;

3)強(qiáng)烈建議保留else分支。常見(jiàn)過(guò)程語(yǔ)句if語(yǔ)句的嵌套94常見(jiàn)過(guò)程語(yǔ)句例:always(posedgeclkor

negedgerst)begin

if(~rst)

begin ctrl <=#12’b00; flag <=#10;

end

else

if(~flag)

begin ctrl <=#12’b01; flag <=#11;

endelse flag <=#10;end常見(jiàn)過(guò)程語(yǔ)句例:95常見(jiàn)過(guò)程語(yǔ)句綜合電路常見(jiàn)過(guò)程語(yǔ)句綜合電路96常見(jiàn)過(guò)程語(yǔ)句case語(yǔ)句類(lèi)似C語(yǔ)言的switchcase語(yǔ)句case(case_expr) case_item_expr{,case_item_expr}: procedural_statement...... [default:procedural_statement]endcase常見(jiàn)過(guò)程語(yǔ)句case語(yǔ)句97常見(jiàn)過(guò)程語(yǔ)句rege;always(posedgeclkor

negedgerst)beginif(~rst) e<=#10;

else case({a,b})2’b00:e<=#1d;2’b01:e<=#1~c;2’b11:e<=#11’b0;2’b11:e<=#11’b1;

default:; //空語(yǔ)句,強(qiáng)烈建議保留default分支表達(dá)式

endcaseend常見(jiàn)過(guò)程語(yǔ)句rege;98常見(jiàn)過(guò)程語(yǔ)句綜合電路常見(jiàn)過(guò)程語(yǔ)句綜合電路99常見(jiàn)過(guò)程語(yǔ)句casex語(yǔ)句和casez語(yǔ)句語(yǔ)法與case非常相似不建議使用casez(ir)8b’1???????:instruction1(ir);8b’01??????:instruction2(ir);8b’00010???:instruction3(ir);8b’000001??:instruction4(ir);endcase常見(jiàn)過(guò)程語(yǔ)句casex語(yǔ)句和casez語(yǔ)句100常見(jiàn)過(guò)程語(yǔ)句循環(huán)語(yǔ)句forever語(yǔ)句repeat語(yǔ)句while語(yǔ)句for語(yǔ)句(1)連續(xù)執(zhí)行的循環(huán);(2)只用于測(cè)試程序的initial塊中;(3)綜合工具很難綜合成FPGA的邏輯電路。思考題:用四種循環(huán)語(yǔ)句分別實(shí)現(xiàn)initial中的時(shí)鐘產(chǎn)生:1)在100ns出開(kāi)始;2)周期10ns。常見(jiàn)過(guò)程語(yǔ)句循環(huán)語(yǔ)句思考題:101習(xí)題51.描述電路行為:該電路在每一個(gè)時(shí)鐘下跳沿(負(fù)沿)檢查輸入數(shù)據(jù),當(dāng)輸入數(shù)據(jù)Usg為1011時(shí),輸出Asm被置為1。2.描述電路行為:輸入為12位的向量。如果其中1的數(shù)量超過(guò)0的數(shù)量,輸出設(shè)置為1。當(dāng)Data_Ready為1時(shí),才對(duì)輸入數(shù)據(jù)進(jìn)行檢查。提示:輸入信號(hào)均有clk和rst,采用時(shí)序邏輯設(shè)計(jì)(always語(yǔ)句)習(xí)題51.描述電路行為:該電路在每一個(gè)時(shí)鐘下跳沿(負(fù)沿)檢102VerilogHDL源代碼設(shè)計(jì)基于本章內(nèi)容,可以設(shè)計(jì)FPGA可實(shí)現(xiàn)的Verilog源代碼;自頂向下設(shè)計(jì);采用數(shù)據(jù)流建模、行為建模、結(jié)構(gòu)化建模三種方式;開(kāi)始你的第一個(gè)Verilog功能模塊源代碼設(shè)計(jì)!VerilogHDL源代碼設(shè)計(jì)基于本章內(nèi)容,可以設(shè)計(jì)FPG103VerilogHDL源代碼設(shè)計(jì)基本設(shè)計(jì)流程1)根據(jù)需求,進(jìn)行模塊功能劃分,自頂向下設(shè)計(jì);2)定義各個(gè)模塊的接口信號(hào)(包括方向、類(lèi)型、寬度);3)定義全局時(shí)鐘信號(hào)和全局復(fù)位信號(hào);4)編寫(xiě)頂層模塊,例化子模塊;5)子模塊功能設(shè)計(jì),以時(shí)序邏輯設(shè)計(jì)為主;與軟件源代碼設(shè)計(jì)最大的不同:時(shí)序的嚴(yán)格性!VerilogHDL源代碼設(shè)計(jì)基本設(shè)計(jì)流程104VerilogHDL源代碼設(shè)計(jì)如何驗(yàn)證源代碼設(shè)計(jì)的正確性?功能仿真(前仿真)進(jìn)行語(yǔ)法檢查,error和warning設(shè)計(jì)testbench,根據(jù)激勵(lì)輸入驗(yàn)證邏輯功能邏輯綜合……VerilogHDL源代碼設(shè)計(jì)如何驗(yàn)證源代碼設(shè)計(jì)的正確性?105Testbench驗(yàn)證Testbench模擬實(shí)際環(huán)境的輸入激勵(lì)和輸出校驗(yàn)的一種“虛擬平臺(tái)”以輸入激勵(lì)為主,輸出校驗(yàn)可以通過(guò)波形觀測(cè)1)Testbench和源代碼都是.v文件2)Testbench和源代碼都是module3)Testbench不能綜合成FPGA內(nèi)部電路Testbench驗(yàn)證Testbench1)Testbenc106Testbench驗(yàn)證接口信號(hào)定義被測(cè)試模塊的輸入激勵(lì)設(shè)置為reg型;被測(cè)試模塊的輸出設(shè)置為wire型;雙向端口inout在測(cè)試中需要進(jìn)行特殊處理。為什么信號(hào)方向與類(lèi)型的對(duì)應(yīng)關(guān)系與之前的要求不同?源代碼看作testbench子模塊源代碼頂層的輸入是testbench的輸出源代碼頂層的輸出是testbench的輸入Testbench驗(yàn)證接口信號(hào)定義107Testbench驗(yàn)證Testbench中inout信號(hào)的使用本質(zhì)上是三態(tài)門(mén)inout[15:0]data;wire[15:0]data;reg [15:0]data_out;reg data_enable;方法1:assigndata=data_enable?data_out:16‘hz;方法2:IOBUF(.I(data_out),.O(),.T(data_enable),.IO(data));Testbench驗(yàn)證Testbench中inout信號(hào)的使108Testbench驗(yàn)證Testbench的結(jié)構(gòu)moduletestbench();//信號(hào)類(lèi)型定義(wire或者reg),注意testench沒(méi)有輸入輸出。…//例化頂層模塊…//激勵(lì)行為描述,通常都包含clk和rst的產(chǎn)生描述initial… //可使用各種合法語(yǔ)句always…assign…task… //類(lèi)似于函數(shù)endmoduleTestbench驗(yàn)證Testbench的結(jié)構(gòu)109Testbench驗(yàn)證Testbench自動(dòng)生成模板X(qián)ilinxISE工具提供testbench的自動(dòng)生成模板在同一項(xiàng)目中的VerilogTestFixture與哪個(gè)源代碼文件關(guān)聯(lián)就生成對(duì)應(yīng)層次的TestbenchTestbench驗(yàn)證Testbench自動(dòng)生成模板110Testbench驗(yàn)證空模板樣例需增加clk的產(chǎn)生rst的使能描述輸入信號(hào)的行為描述Testbench驗(yàn)證空模板樣例111Testbench驗(yàn)證值序列產(chǎn)生產(chǎn)生值序列的最簡(jiǎn)單是使用initial語(yǔ)句。例如:initialbeginReset=0;#100Reset=1;#80Reset=0;#30Reset=1;endTestbench驗(yàn)證值序列產(chǎn)生112Testbench驗(yàn)證值序列產(chǎn)生重復(fù)序列可由always語(yǔ)句產(chǎn)生,例如:parameterREPEAT_DELAY=35;integerCoinValue;always

begin CoinValue=0; #7CoinValue=25; #2CoinValue=5; #8CoinValue=10; #6CoinValue=5; #REPEAT_DELAY;

endTestbench驗(yàn)證值序列產(chǎn)生113Testbench驗(yàn)證重復(fù)模式(例如時(shí)鐘信號(hào))wireClock;assign#(PERIOD/2)Clock=~Clock;初值多少?initial

Clock

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論