版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
VerilogHDL歷史1983年,GatewayDesignAutomation公司推出Verilog語言,開發(fā)了仿真與驗證工具;1985年,GDA推出Verilog仿真器Verilog-XL:仿真速度快,處理能力強,具有交互式調試手段;1987年,Synopsys公司的綜合軟件開始接受Verilog輸入;1989年,Cadence公司收購GDA,進一步擴大Verilog的影響;1990年,OpenVerilogInternational(OVI)成立,推廣VerilogHDL和Veriog-XL被廣泛推廣;1993年,OVI推出Verilog2.0,作為IEEE提案提出申請;2019年,IEEE(InstituteofElectricalandElectronicsEngineers)通過VerilogHDL標準IEEEStd.1364-2019;2019年,IEEE發(fā)布了VerilogIEEE1364-2019標準。本課程以IEEEStd.1364-2019為主VerilogHDL現(xiàn)狀VerilogHDL是最廣泛使用的、具有國際標準支持的硬件描述語言,絕大多數(shù)的EDA廠商都支持;在工業(yè)界和ASIC設計領域,VerilogHDL應用更加廣泛。VerilogHDL與VHDLVHDLVery-High-SpeedIntegratedCircuitHardwareDescriptionLanguage誕生于1982年;1987年底被IEEE和美國國防部確認為標準硬件描述語言。IEEE1076(1983)IEEE1076-2019……VerilogHDL與VHDL建模層次系統(tǒng)級(system):用高級語言結構實現(xiàn)設計模塊的外部性能的模型。算法級(algorithmic):用高級語言結構實現(xiàn)設計算法的模型。
RTL級(RegisterTransferLevel):描述數(shù)據(jù)在寄存器之間流動和如何處理這些數(shù)據(jù)的模型。
門級(gate-level):描述邏輯門以及邏輯門之間的連接的模型。開關級(switch-level):描述器件中三極管和儲存節(jié)點以及它們之間連接的模型。VerilogHDL與VHDL相同點:都能形式化抽象表示電路行為和結構;支持邏輯設計中層次與范圍的描述;具有電路仿真和驗證機制;與工藝無關。不專門面向FPGA設計不同點:Verilog與C語言相似,語法靈活;VHDL源于Ada語言,語法嚴格;Verilog更適合ASIC設計。SystemVerilog與SystemCSystemVerilog:IEEE1364Verilog-2019標準的擴展增強,兼容Verilog2019,將硬件描述語言(HDL)與現(xiàn)代的高層級驗證語言(HVL)結合。SystemC:一種軟/硬件協(xié)同設計語言,既是系統(tǒng)級語言,也是硬件描述語言。系統(tǒng)建模設計方法學自頂向下自底向上混合式描述方式數(shù)據(jù)流描述:描述電路數(shù)據(jù)流行為:assign行為描述:描述功能:initial,always結構化描述:描述元器件間連接關系:例化混合描述: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調用模塊mytri的實例元件tri_inst;通過這種結構性模塊構造可構成特大型模塊。簡單的Verilog程序三態(tài)門(綜合)簡單的Verilog程序VerilogHDL程序是由模塊構成的;每個模塊要進行端口定義,并說明輸入輸出口,然后對模塊的功能進行邏輯描述;VerilogHDL程序的書寫格式自由,一行可以寫幾個語句,一個語句也可以分寫多行;除了endmodule語句外,每個語句和數(shù)據(jù)定義的最后必須有分號。同一電路的多種描述方法二選一的選擇器門級(結構化)描述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
同一電路的多種描述方法二選一的選擇器(綜合)混合描述混合設計方式的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混合描述混合設計方式的1位全加器實例(綜合)模塊基本結構module模塊名(端口列表);端口I/O說明 內部信號聲明 功能定義endmodule時延VerilogHDL模型中的所有時延都根據(jù)時間單位定義。下面是帶時延的連續(xù)賦值語句實例。
assign
#2Sum=A^B;#2指2個時間單位。使用編譯指令將時間單位與物理時間相關聯(lián)。這樣的編譯器指令需在模塊描述前定義,如下所示:
`timescale
1ns/100ps此語句說明時,延時間單位為1ns并且時間精度為100ps(時間精度是指所有的時延必須被限定在0.1ns內)。如果此編譯器指令所在的模塊包含上面的連續(xù)賦值語句,#2代表2ns。如果沒有這樣的編譯器指令,VerilogHDL模擬器會指定一個缺省時間單位。IEEEVerilogHDL標準中沒有規(guī)定缺省時間單位。語言要素:標識符所謂標識別符就是用戶為程序描述中的Verilog對象所起的名字。模塊名、變量名、常量名、函數(shù)名、任務名標識符必須以英語字母(a-z,A-Z)起頭,或者用下橫線符(_)起頭。其中可以包含數(shù)字、$符和下劃線符。標識符最長可以達到1023個字符。模塊名、端口名和實例名都是標識符。Verilog語言大小寫敏感,sel和SEL是兩個不同的標識符。所有的關鍵詞都是小寫的。語言要素:系統(tǒng)任務和函數(shù)以$字符開始的標識符表示系統(tǒng)任務或系統(tǒng)函數(shù)。任務可以返回0個或多個值,函數(shù)除只能返回一個值以外與任務相同。函數(shù)在0時刻執(zhí)行,即不允許延遲,而任務可以帶有延遲。常用于測試模擬,一般不用于源代碼設計。$display
("Hi,youhavereachedLTtoday"); /*$display系統(tǒng)任務在新的一行中顯示。*/$time //該系統(tǒng)任務返回當前的模擬時間。語言要素:編譯指令以`(反引號)開始的某些標識符是編譯器指令。`define和`undef,很像C語言中的宏定義指令`ifdef、`else和`endif,用于條件編譯`include文件既可以用相對路徑名定義,也可以絕對路徑`timescale編譯器指令將時間單位與實際時間相關聯(lián)。該指令用于定義時延的單位和時延精度。語言要素:值集合VerilogHDL有下列四種基本的值:0:邏輯0或“假”1:邏輯1或“真”x:未知z:高阻(x,z不區(qū)分大小寫)VerilogHDL中有三類常量:整型實數(shù)型字符串型語言要素:常量1.整數(shù)表達方式:<位寬>’<進制><數(shù)字>:標準方式’<進制><數(shù)字>:默認位寬,與機器類型有關<數(shù)字>:不指明進制默認為十進制進制二進制(b或B):8’b10101100,’b1010十進制(d或D):4’d1543,512十六進制(h或H):8’ha2八進制(o或O):6’O41x和z值x:不確定:4’b100xz:高阻:16’hzzzz,沒有驅動元件連接到線網(wǎng),線網(wǎng)的缺省值為z。語言要素:常量負數(shù):在位寬表達式前加一個減號,如-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科學計數(shù)法;23_5.1e2其值為23510.0,忽略下劃線3.6E2其值為360.0(e與E相同)
實數(shù)通常不用于FPGA源代碼的常量語言要素:常量3.字符串字符串是雙引號內的字符序列。字符串不能分成多行書寫。例如:
"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設計中,通常只用wire型triwortriorwandtriandtriregtri1tri0supply0supply1msb和lsb定義了范圍,并且均為常數(shù)值表達式。范圍定義是可選的;如果沒有定義范圍,缺省值為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設計中,通常只用reg型,默認初始值eger//其他類型用于仿真timerealrealtimemsb和lsb定義了范圍,并且均為常數(shù)值表達式。范圍定義是可選的;如果沒有定義范圍,缺省值為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)任務賦值reg
[3:0]RomB[7:0];$readmemb
("ram.patt",RomB);
Romb是存儲器。文件“ram.patt”必須包含二進制值。文件也可以包含空白空間和注釋。下面是文件中可能內容的實例。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ù)值語言要素:空白符、注釋除了字符串中的空白符,其他空白符編譯被忽略注釋多行注釋/**/(不允許嵌套)單行注釋//習題11使用`timescale編譯器指令的目的是什么?2寫出產生下圖所示波形的變量BullsEye的初始化語句。3使用數(shù)據(jù)流描述方式編寫下圖所示的異或邏輯的VerilogHDL描述,并使用規(guī)定的時延。4下列表達式的位模式是什么? 7'o44,'Bx0,5'bx110,'hA0,10'd2,'hzF
表達式表達式由操作數(shù)和操作符組成;表達式可以在出現(xiàn)數(shù)值的任何地方使用;表達式是數(shù)據(jù)流描述的基礎。A&BAddr1[3:0]+Addr2[3:0]Count+1(a[0]^b[0])|(a[1]&~b[1])表達式:操作數(shù)操作數(shù)可以是以下類型中的一種:常數(shù)參數(shù)線網(wǎng)寄存器位選擇部分選擇存儲器單元函數(shù)調用表達式:操作數(shù)常數(shù)表達式中的整數(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。表達式:操作數(shù)線網(wǎng)
線網(wǎng)中的值被解釋為無符號數(shù),表達式中可使用:標量線網(wǎng)(1位)和向量線網(wǎng)(多位)。wire[3:0]led; //4位向量線網(wǎng)。wireline; //標量線網(wǎng)。assignled=4‘ha;//被賦于位向量1010,為十進制10。表達式:操作數(shù)寄存器 integer型的值被解釋為有符號的二進制補碼數(shù),
reg型或time型的值被解釋為無符號數(shù), real型和realtime的值被解釋為有符號浮點數(shù)。
reg[4:0]state;State=5‘b01011;//值為位向量01011,十進制值11。State=9; //值為位向量01001,十進制值9。為何沒有用assign語句賦值?表達式:操作數(shù)位選擇 位選擇從向量中抽取特定的位。形式如下: net_or_reg_vector[bit_select_expr]State[1]&&State[4] //寄存器位選擇。led[0]|line //線網(wǎng)位選擇。如果選擇表達式的值為x、z或越界,則位選擇的值為State[x]值為x。(FPGA設計中禁用)表達式:操作數(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ù)存儲器單元存儲器單元從存儲器中選擇一個memory[word_address] reg[7:0]Dram[63:0]; Dram[60]; //存儲器的第61個單元。不允許對存儲器變量值部分選擇或位選擇。
(思考:在存儲器中讀取一個位或部分選擇一個字?)函數(shù)調用
表達式中可使用函數(shù)調用。
$time+SumOfEvents(A,B) /*$time是系統(tǒng)函數(shù),并且SumOfEvents是在別處定義的用戶自定義函數(shù)。*/表達式:操作符VerilogHDL中的操作符可以分為下述類型:算術操作符關系操作符相等操作符邏輯操作符按位操作符歸約操作符移位操作符條件操作符連接和復制操作符表達式:操作符操作符從最高優(yōu)先級到最低優(yōu)先級排列。同一行中的操作符優(yōu)先級相同。表達式:操作符除條件操作符從右向左關聯(liá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表達式:操作符算術運算符+(加)-(減)*(乘) /(除)%(取模)1)后三種不常用,是具體設計結構而定;2)任意操作數(shù)是X或Z,那么整個結果為X;3)結果的長度由最長的操作數(shù)決定;4)reg和wire保存無符號數(shù)。表達式:操作符關系操作符有:>(大于)<(小于)>=(不小于)<=(不大于)1)關系操作符的結果為真(1)或假(0);2)如果操作數(shù)中有一位為X或Z,那么結果為X。習題:求下列表達式真值23>4552<8'hxFF'b1000>='b01110表達式:操作符等式運算符(相等關系運算符)==(邏輯相等)!=(邏輯不等)===(全等)!==(非全等)1)如果比較結果為假則結果為0,為真結果為1;2)在全等比較中,值x和z嚴格按位比較。===01xz==01xz01000010xx10100101xxx0010xxxxxz0001zxxxx習題:求下列表達式真值假定 Data=‘b11x0; Addr=‘b11x0;求 Data==Addr
Data===Addr表達式:操作符邏輯操作符有:&&(邏輯與)||(邏輯或)!(邏輯非)1)只對邏輯值運算,結果一位,邏輯值1、0或x;2)對于向量操作,非0向量作為1處理;3)如果任意一個操作數(shù)包含x,結果也為x。習題:求下列表達式真值假定: 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表達式:操作符按位操作符有:?~(一元非)?&(二元與)?|(二元或)?^(二元異或)?~^或^~(二元異或非)操作數(shù)對應位上按位操作,并產生向量結果。習題:求下列表達式真值假定 A='b0110; B='b0100;求 A|B A&B表達式:操作符歸約操作符有:&(歸約與)~&(歸約與非)| (歸約或)~|(歸約或非)^(歸約異或)~^(歸約異或非)在單一操作數(shù)的所有位上操作,并產生1位結果。習題:求下列表達式真值假定: A=‘b0110; B=‘b0100;
MyReg=4‘b01x0;求 ~&A ^A |B &B |MyReg ^MyReg
表達式:操作符移位操作符有:?<<(左移)>>(右移)1)左側操作數(shù)移動右側操作數(shù)表示的次數(shù),邏輯移位,空閑位添0補位;2)如果右側操作數(shù)的值為x或z,移位操作的結果為x。應用實例:使用移位操作為2-4解碼器建模wire[3:0]DecodeOut;assignDecodeOut=4'b1<<Address[1:0];習題:求Qreg的值假定: reg[7:0]Qreg;
Qreg=4'b0111;移位 Qreg>>2
表達式:操作符條件操作符根據(jù)條件表達式的值選擇表達式,形式: cond_expr?expr1:expr2三目運算符wire[2:0]Student;assignStudent=Marks>18?Grade_A:Grade_C;表達式:操作符位拼接運算符(連接和復制操作)連接操作:將小表達式合并形成大表達式的操作。形式: {expr1,expr2,...,exprN}復制操作:指定重復次數(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}; /*符號擴展*/習題21.說明參數(shù)GATE_DELAY,參數(shù)值為5。2.假定長度為64個字的存儲器,每個字8位,編寫Verilog代碼,按逆序交換存儲器的內容。即將第0個字與第63個字交換,第1個字與第62個字交換,依此類推。3.假定32位總線Address_Bus,編寫一個表達式,計算從第11位到第20位的歸約與非。4.假定一條總線Control_Bus[15:0],編寫賦值語句將總線分為兩條總線:Abus[0:9]和Bbus[6:1]。5.編寫一個表達式,執(zhí)行算術移位,將Qparity中包含的8位有符號數(shù)算術移位。6.使用條件操作符,編寫賦值語句選擇NextState的值。如果CurrentState的值為RESET,那么NextState的值為GO;如果CurrentState的值為GO,則NextState的值為BUSY;如果CurrentState的值為BUSY;則NextState的值為RESET。7.如何從標量變量A,B,C和D中產生總線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);信號端口可以通過位置或名稱關聯(lián);但是關聯(lián)方式不能夠混合使用。端口官廉形式 port_expr //通過位置,隱式關聯(lián) .PortName(port_expr) //通過名稱,顯示關聯(lián),強烈推薦! port_expr可以是以下的任何類型:1)標識符(reg型或wire型)2)位選擇3)部分選擇4)上述類型的合并5)表達式(只適用于input型信號)MicroM1
(
UdIn[3:0],{WrN,RdN},Status[0],Status[1],
&UdOut[0:7],TxData);模塊與端口使用兩個半加器模塊構造全加器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); //通過位置關聯(lián)。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//通過端口與信號的名字關聯(lián)。orO1(Cout,C1,C2); //或門實例語句endmodule考慮如何模塊參數(shù)化?模塊與端口使用兩個半加器模塊構造全加器(模塊參數(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); //通過位置關聯(lián)。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//通過端口與信號的名字關聯(lián)。or
#OR_DELAYO1(Cout,C1,C2); //或門實例語句endmodule模塊與端口懸空端口通過將端口表達式表示為空白來指定為懸空端口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習題31.模塊實例語句與門實例語句的區(qū)別是什么?2.當端口懸空時,即端口沒有被連接時,端口的值是什么?3.用本章講述的模塊FA編寫執(zhí)行加法和減法的4位ALU的結構模型。門級建模FPGA設計中較少使用VerilogHDL中提供下列內置基本門:1)多輸入門:
and,nand,or,nor,xor,xnor2)多輸出門:
buf,not3)三態(tài)門:
bufif0,bufif1,notif0,notif14)上拉、下拉電阻:
pullup,pulldown5)MOS開關:
cmos,nmos,pmos,rcmos,rnmos,rpmos6)雙向開關:
tran,tranif0,tranif1,rtran,rtranif0,rtranif1用戶定義原語(UDP)FPGA設計中通常不使用;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; //忽略時鐘負邊沿: (?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í)行呢?
只要在右端表達式的操作數(shù)上有事件發(fā)生(值變化),表達式立即被計算,新結果就賦給左邊的線網(wǎng)。連續(xù)賦值的目標類型(左側操作數(shù)類型)1)標量線網(wǎng) assignZ1=…;2)向量線網(wǎng) assigndata_tmp=…;3)向量的常數(shù)型位選擇assigndata_tmp[2]=…;4)向量的常數(shù)型部分選擇assigndata_tmp[7:0]=…;5)上述類型的任意的拼接運算結果
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ā)的,與其書寫的順序無關;2)線網(wǎng)的賦值可以在聲明時賦值,例如wireSum=A^B^Cin;數(shù)據(jù)流建模數(shù)據(jù)流建模的時延 assign
#2Sum=A^B^Cin;#2表示右側表達式的值延遲兩個時間單位賦給Sum;時間單位是多少?由誰來決定?`timescale1ns/100psFPGA設計中的時延僅在功能仿真時有效,不影響實際電路生成。數(shù)據(jù)流建模數(shù)據(jù)流建模注意事項:1)wire型變量如果不賦值,默認值為z;2)數(shù)據(jù)流建模沒有存儲功能,不能保存數(shù)據(jù);3)wire型變量只能在聲明時賦值或者assing語句賦值;4)assign語句并發(fā)執(zhí)行,實際的延遲又物理芯片的布線結果決定。5)最基本的FPGA設計源代碼描述語句之一,用于生成組合邏輯,定制LUT的邏輯功能。常作為中間信號的描述用于控制寄存器的輸入輸出。習題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í)行順序與其在模塊中書寫順序無關。行為建模: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(相當于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 //順序過程的標記,如果沒有局部聲明,則不需要integerIndex;RibReg=0;for(Index=0;Index<SIZE;Index=Index+1) RAM[Index]=0;end行為建模:initial語句initial語句在仿真文件產生時鐘和構造數(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語句重復執(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(相當于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型,但綜合的結果是組合電路;(2)等同于數(shù)據(jù)流描述
wirec;
assignc=sel?a:b;(3)FPGA設計中不建議使用;此外,容易產生鎖存器行為建模: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源程序、測試文件塊內語句順序執(zhí)行并行語句塊fork…join測試文件塊內語句并行執(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) …//寄存器復位
else
if(…)
begin a=1‘b1; b=a;
endend非阻塞過程賦值always(posedgeclkor
negedgerst)begin
if(~rst) …//寄存器復位
else
if(…)
begin a<=1‘b1; b<=a;
endendb=?常見過程語句結論:源代碼設計推薦使用非阻塞過程賦值“<=”可以有效綜合為寄存器邏輯電路符合實際,時序分析簡單語句之間并行執(zhí)行,不再有順序關系阻塞過程賦值“=”多用于仿真測試文件適合構造仿真模型和仿真行為不容易直接綜合為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后面的表達式的值只有為1時才按“真”處理。常見過程語句if語句的嵌套
if(表達式1)
if(表達式2)語句1;
else語句2;
else
if(表達式3)語句3;
else語句4;
注: 1)else總是與它最上面的最近的if配對;2)如果if與else的數(shù)目不一樣,為了實現(xiàn)程序設計者的目的,可以用begin…end語句確定配對關系;
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分支表達式
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中的時鐘產生:1)在100ns出開始;2)周期10ns。習題51.描述電路行為:該電路在每一個時鐘下跳沿(負沿)檢查輸入數(shù)據(jù),當輸入數(shù)據(jù)Usg為1011時,輸出Asm被置為1。2.描述電路行為:輸入為12位的向量。如果其中1的數(shù)量超過0的數(shù)量,輸出設置為1。當Data_Ready為1時,才對輸入數(shù)據(jù)進行檢查。提示:輸入信號均有clk和rst,采用時序邏輯設計(always語句)VerilogHDL源代碼設計基于本章內容,可以設計FPGA可實現(xiàn)的Verilog源代碼;自頂向下設計;采用數(shù)據(jù)流建模、行為建模、結構化建模三種方式;開始你的第一個Verilog功能模塊源代碼設計!VerilogHDL源代碼設計基本設計流程1)根據(jù)需求,進行模塊功能劃分,自頂向下設計;2)定義各個模塊的接口信號(包括方向、類型、寬度);3)定義全局時鐘信號和全局復位信號;4)編寫頂層模塊,例化子模塊;5)子模塊功能設計,以時序邏輯設計為主;與軟件源代碼設計最大的不同:時序的嚴格性!VerilogHDL源代碼設計如何驗證源代碼設計的正確性?功能仿真(前仿真)進行語法檢查,error和warning設計testbench,根據(jù)激勵輸入驗證邏輯功能邏輯綜合……Testbench驗證Testbench模擬實際環(huán)境的輸入激勵和輸出校驗的一種“虛擬平臺”以輸入激勵為主,輸出校驗可以通過波形觀測1)Testbench和源代碼都是.v文件2)Testbench和源代碼都是module3)Testbench不能綜合成FPGA內部電路Testbench驗證接口信號定義被測試模塊的輸入激勵設置為reg型;被測試模塊的輸出設置為wire型;雙向端口inout在測試中需要進行特殊處理。為什么信號方向與類型的對應關系與之前的要求不同?源代碼看作testbench子模塊源代碼頂層的輸入是testbench的輸出源代碼頂層的輸出是testbench的輸入Testbench驗證Testbench中inout信號的使用本質上是三態(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的結構moduletestbench();//信號類型定義(wire或者reg),注意testench沒有輸入輸出?!?/例化頂層模塊…//激勵行為描述,通常都包含clk和rst的產生描述initial… //可使用各種合法語句always…assign…task… //類似于函數(shù)endmoduleTestbench驗證Testbench自動生成模板XilinxISE工具提供testbench的自動生成模板在同一項目中的VerilogTestFixture與哪個源代碼文件關聯(lián)就生成對應層次的TestbenchTestbench驗證空模板樣例需增加clk的產生rst的使能描述輸入信號的行為描述Testbench驗證值序列產生產生值序列的最簡單是使用initial語句。例如:initialbeginReset=0;#100Reset=1;#80Reset=0;#30Reset=1;endTestbench驗證值序列產生重復序列可由always語句產生,例如:parameterREPEAT_DELAY=35;integerCoinValue;always
begin CoinValue=0; #7CoinValue=25; #2CoinValue=5; #8CoinValue=10; #6CoinValue=5; #REPEAT_DELAY;
endTestbench驗證重復模式(例如時鐘信號)wireClock;assign#(PERIOD/2)Clock=~Clock;初值多少?initial
Clock
=0;Clock數(shù)據(jù)類型是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 正規(guī)足浴加盟合同協(xié)議
- 工業(yè)自動化材料采購合同
- 地毯物流配送合同
- 全面升級旅游服務合同模板
- 石灰石購銷合同格式
- 學生個人衛(wèi)生保證書
- 電力設備招標文件示范文本
- 補充協(xié)議勞工合同細節(jié)
- 專業(yè)電腦維護保養(yǎng)
- 抹灰分包工程勞務合同
- SWOT-CLPV理論(常用理論)
- JT∕T 860.1-2013 瀝青混合料改性添加劑 第1部分:抗車轍劑
- 《紅樓夢》十二講智慧樹知到期末考試答案章節(jié)答案2024年安徽師范大學
- 項目介紹書范文
- 2024年巴西玩具市場機會及渠道調研報告
- 2024年《建筑節(jié)能》理論考試題庫(濃縮500題)
- 2024廚具采購合同
- 酶工程智慧樹知到期末考試答案章節(jié)答案2024年華南理工大學、暨南大學、華南農業(yè)大學
- 會計師事務所的年度工作總結
- 2024年中考作文十二大高頻熱點主題9-家國情懷(素材)
- 中國裝備智慧樹知到期末考試答案章節(jié)答案2024年上海電機學院
評論
0/150
提交評論