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

下載本文檔

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

文檔簡介

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

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

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

outputout; /*輸出信號*/

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

outputout;

inputin,enable;

assignout=enable?in:'bz;endmodule三態(tài)門模塊trist1調(diào)用模塊mytri的實例元件tri_inst;通過這種結(jié)構(gòu)性模塊構(gòu)造可構(gòu)成特大型模塊。簡單的Verilog程序三態(tài)門(綜合)簡單的Verilog程序VerilogHDL程序是由模塊構(gòu)成的;每個模塊要進行端口定義,并說明輸入輸出口,然后對模塊的功能進行邏輯描述;VerilogHDL程序的書寫格式自由,一行可以寫幾個語句,一個語句也可以分寫多行;除了endmodule語句外,每個語句和數(shù)據(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級行為描述modulemuxtwo(out,a,b,sl);

inputa,b,sl;

outputout;

regout;

always(sloraorb)

if(!sl)out=a;

elseout=b;endmodule

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

inputa,b,sl;

outputout; assignout=sel?b:a;endmodule

同一電路的多種描述方法二選一的選擇器(綜合)混合描述混合設(shè)計方式的1位全加器實例moduleFA_Mix(A,B,Cin,Sum,Cout);

inputA,B,Cin;

outputSum,Cout;

regCout;

regT1,T2,T3;

wireS1;

xorX1(S1,A,B); //門實例語句。

always(AorBorCin) //always語句。

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

end

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

assign

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

`timescale

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

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

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

"INTERNALERROR"

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

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

[msb:lsb]reg1,reg2,...regN;語言要素:數(shù)據(jù)類型寄存器型5種不同的寄存器類型。reg

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

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

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

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

("ram.patt",RomB);

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

表達(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á)式:操作數(shù)操作數(shù)可以是以下類型中的一種:常數(shù)參數(shù)線網(wǎng)寄存器位選擇部分選擇存儲器單元函數(shù)調(diào)用表達(dá)式:操作數(shù)常數(shù)表達(dá)式中的整數(shù)值可被解釋為有符號數(shù)或無符號數(shù);如果整數(shù)是基數(shù)型整數(shù),作為無符號數(shù)對待。12 01100的5位向量形式 (有符號)-12 10100的5位向量形式 (有符號)5‘b01100 十進制數(shù)12 (無符號)參數(shù)參數(shù)類似于常量,并且使用參數(shù)聲明進行說明。例如parameter

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

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

reg型或time型的值被解釋為無符號數(shù), real型和realtime的值被解釋為有符號浮點數(shù)。

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

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

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

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

Data===Addr表達(dá)式:操作符邏輯操作符有:&&(邏輯與)||(邏輯或)!(邏輯非)1)只對邏輯值運算,結(jié)果一位,邏輯值1、0或x;2)對于向量操作,非0向量作為1處理;3)如果任意一個操作數(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á)式:操作符按位操作符有:?~(一元非)?&(二元與)?|(二元或)?^(二元異或)?~^或^~(二元異或非)操作數(shù)對應(yīng)位上按位操作,并產(chǎn)生向量結(jié)果。習(xí)題:求下列表達(dá)式真值假定 A='b0110; B='b0100;求 A|B A&B表達(dá)式:操作符歸約操作符有:&(歸約與)~&(歸約與非)| (歸約或)~|(歸約或非)^(歸約異或)~^(歸約異或非)在單一操作數(shù)的所有位上操作,并產(chǎn)生1位結(jié)果。習(xí)題:求下列表達(dá)式真值假定: A=‘b0110; B=‘b0100;

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

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

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

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

input(輸入端口)、output

(輸出端口)或者inout

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

(

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

&UdOut[0:7],TxData);模塊與端口使用兩個半加器模塊構(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ān)聯(lián)。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//通過端口與信號的名字關(guān)聯(lián)。orO1(Cout,C1,C2); //或門實例語句endmodule考慮如何模塊參數(shù)化?模塊與端口使用兩個半加器模塊構(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ān)聯(lián)。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//通過端口與信號的名字關(guān)聯(lián)。or

#OR_DELAYO1(Cout,C1,C2); //或門實例語句endmodule模塊與端口懸空端口通過將端口表達(dá)式表示為空白來指定為懸空端口DFFd1(.Q(QS),.Qbar(),.Data(D),.Preset(),.Clock(CK));端口長度不同通過無符號數(shù)的右對齊或截斷方式進行匹配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模塊與端口模塊參數(shù)值改變1)參數(shù)定義語句(defparam)moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC;defparamHa1.XOR_DELAY=5,//實例Ha1中的參數(shù)XOR_DELAY。Ha1.AND_DELAY=2;//實例Ha1中參數(shù)的AND_DELAY。HAHa1(NewA,NewB,NewS,NewC);endmodule模塊與端口模塊參數(shù)值改變2)帶參數(shù)值的模塊引用moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC; HA#(5,2)Ha1(NewA,NewB,NewS,NewC);//第1個值5賦給參數(shù)AND_DELAY,該參數(shù)在模塊HA中說明。//第2個值2賦給參數(shù)XOR_DELAY,該參數(shù)在模塊HA中說明。endmodule模塊與端口外部端口顯式地指定外部端口。(較少使用)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習(xí)題31.模塊實例語句與門實例語句的區(qū)別是什么?2.當(dāng)端口懸空時,即端口沒有被連接時,端口的值是什么?3.用本章講述的模塊FA編寫執(zhí)行加法和減法的4位ALU的結(jié)構(gòu)模型。門級建模FPGA設(shè)計中較少使用VerilogHDL中提供下列內(nèi)置基本門:1)多輸入門:

and,nand,or,nor,xor,xnor2)多輸出門:

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

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

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

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

tran,tranif0,tranif1,rtran,rtranif0,rtranif1用戶定義原語(UDP)FPGA設(shè)計中通常不使用;UDP實例語句的語法與基本門的實例語句語法一致;UDP中可以描述組合電路和時序電路。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; //忽略時鐘負(fù)邊沿: (?0)?:?:-; //忽略在穩(wěn)定時鐘上的數(shù)據(jù)變化(??)?:?:-;endtableendprimitive數(shù)據(jù)流建模連續(xù)賦值用于數(shù)據(jù)流建模(描述),生成組合邏輯電路。連續(xù)賦值使用連續(xù)賦值語句assign語句,格式為:assignLHS_target=RHS_expression;例如wireZ1,Preset,Clear;//線網(wǎng)說明assignZ1=Preset&Clear;//連續(xù)賦值語句wire[15:0]data_in;wire[15:0]data_tmp;wiredata_tmp={data_in[7:0],data_in[15:8]};數(shù)據(jù)流建模連續(xù)賦值語句在什么時候執(zhí)行呢?

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

assign{Z1,data_tmp[15]}=2’b10;數(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語句之間是并發(fā)的,與其書寫的順序無關(guān);2)線網(wǎng)的賦值可以在聲明時賦值,例如wireSum=A^B^Cin;數(shù)據(jù)流建模數(shù)據(jù)流建模的時延 assign

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

assign#5clk=~clk;2.請指出下列語句是否合法?描述了怎樣的功能?assignMux=(S==0)?A:'bz;assignMux=(S==1)?B:'bz;assignMux=(S==2)?C:'bz;assignMux=(S==3)?D:'bz;行為建模過程賦值用于行為建模(描述)行為建模的主要機制:1)initial語句 主要用于仿真文件(模擬)2)always語句 用于源文件和仿真文件所有initial語句和always語句之間都是并發(fā)執(zhí)行;執(zhí)行順序與其在模塊中書寫順序無關(guān)。行為建模:initial語句initial語句只執(zhí)行一次;在模擬開始時執(zhí)行,即在0時刻開始執(zhí)行;不能嵌套使用。 initial[timing_control]procedural_statementprocedural_statement可以是: procedural_continuous_assignment過程賦值(阻塞或者非阻塞) 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語句例:regCurt;...initial#2Curt=1;例:parameterSIZE=1024;reg[7:0]RAM[0:SIZE-1];regRibReg;Initialbegin:SEQ_BLK_A //順序過程的標(biāo)記,如果沒有局部聲明,則不需要integerIndex;RibReg=0;for(Index=0;Index<SIZE;Index=Index+1) RAM[Index]=0;end行為建模:initial語句initial語句在仿真文件產(chǎn)生時鐘和構(gòu)造數(shù)據(jù)簡單示例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行為建模:always語句always語句重復(fù)執(zhí)行,語法和initial語句相同:always[timing_control]procedural_statement

procedural_statement可以是:

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

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語句兩種典型的always語句1)組合邏輯(電平觸發(fā))regc;always(aorborsel) c=sel?a:b;說明:(1)雖然c是reg型,但綜合的結(jié)果是組合電路;(2)等同于數(shù)據(jù)流描述

wirec;

assignc=sel?a:b;(3)FPGA設(shè)計中不建議使用;此外,容易產(chǎn)生鎖存器行為建模:always語句兩種典型的always語句2)時序邏輯(時鐘沿觸發(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說明:(1)在always語句中所有被賦值的信號必須是reg型; (2)綜合為觸發(fā)器,推薦使用; (3)異步時序邏輯常見過程語句時序控制語句僅用于仿真測試1)時序控制regStream;initialBegin

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

negedgerst)begin

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

else

if(…)

begin a=1‘b1; b=a;

endend非阻塞過程賦值always(posedgeclkor

negedgerst)begin

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

else

if(…)

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

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

(condition_1)

procedural_statement_1{else

if(condition_2)

procedural_statement_2}{else

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

if(表達(dá)式1)

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

else語句2;

else

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

else語句4;

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

3)強烈建議保留else分支。常見過程語句例: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常見過程語句綜合電路常見過程語句case語句類似C語言的switchcase語句case(case_expr) case_item_expr{,case_item_expr}: procedural_statement...... [default:procedural_statement]endcase常見過程語句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:; //空語句,強烈建議保留default分支表達(dá)式

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

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

endTestbench驗證重復(fù)模式(例如時鐘信號)wireClock;assign#(PERIOD/2)Clock=~Clock;初值多少?initial

Clock

=0;Clock數(shù)據(jù)類型是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論