




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章verilog的基本語法天津大學電子科學與技術系史再峰shizaifeng@verilog2011--TJU.ASICCenter---ArnoldShi3.1數據類型及其常量及變量天津大學電子科學與技術系史再峰shizaifeng@verilog2011--TJU.ASICCenter---ArnoldShi
0、低、偽、邏輯低、地、VSS、負插入01XZ0bufbufbufbufif11、高、真、邏輯高、電源、VDD、正插入X、不確定:邏輯沖突無法確定其邏輯值HiZ、高阻抗、三態、無驅動源Verilog
的四種邏輯值x和X、z和Z不區別大小寫。Z有時候也用?代替verilog2011--TJU.ASICCenter---ArnoldShi數據類型VerilogHDL中共有19種數據類型,分成常量和變量最基本最常用的4種:寄存器型reg線網型wire整形
integer參數型parameter其余的包括:large\medium\scalared\time\small\tri\trio\tri1\triand\trior\trireg\vectored\wand\wor型,主要與基本單元庫有關,設計時很少使用verilog2011--TJU.ASICCenter---ArnoldShi一、常量在程序運行中,其值不能被改變的量叫常量兩類最基本的常量:數字型常量和參數(parameter)數字型常量:整型數可以按如下兩種方式書寫簡單的十進制數格式
基數格式verilog2011--TJU.ASICCenter---ArnoldShi基數表示法(一)格式:[位寬]’進制
值無符號數。位寬是按照二進制數來計算的。進制可以為b或B(二進制)、o或O(八進制)、d或D(十進制)、h或H(十六進制)。值是基于進制的數字序列。如:
3’b001,3’B110三位二進制
6’o12,6’O12六位八進制
4’d9,4’D9十位十進制
8’hBF,8’HBF八位十六進制verilog2011--TJU.ASICCenter---ArnoldShi基數表示法(二)基數格式計數形式的數通常為無符號數。這種形式的整型數的長度定義是可選的。如果沒有定義一個整數型的長度,數的長度為相應值中定義的位數。下面是兩個例子:'o7219位八進制數'hAF8位十六進制數verilog2011--TJU.ASICCenter---ArnoldShi基數表示法(三)如果定義的長度比為常量指定的長度長,通常在左邊填0補位。但是如果數最左邊一位為x或z,就相應地用x或z在左邊補位。例如:10'b10左邊添0占位,000000001010'bx0x1左邊添x占位,xxxxxxx0x1如果長度定義得更小,那么最左邊的位相應地被截斷。例如:3'b1001_0011與3'b011相等5'H0FFF與5'H1F相等?字符在數中可以代替值z在值z被解釋為不分大小寫的情況下提高可讀性verilog2011--TJU.ASICCenter---ArnoldShi下劃線下劃線可以用來分割數的表達式以提高程序的可讀性,但不能用在位寬和進制處,只能用于具體的數字之間比如16’b1010_1011_11111_000//合法格式8’b_0011_1011//非法格式verilog2011--TJU.ASICCenter---ArnoldShi負數一個數字可以被定義成負數,只要在位寬表達式前加一個減號
-8’d5//合法格式
8’d-5//非法格式verilog2011--TJU.ASICCenter---ArnoldShi簡單的十進制格式這種形式的整數定義為帶有一個可選的“+”(一元)或“-”(一元)運算符的數字序列。這種形式的整數值代表一個有符號的數。負數使用補碼形式表示。例如
15 相當于二進制01111-15 相當于二進制10001
verilog2011--TJU.ASICCenter---ArnoldShi實數類型實數可以用下列兩種形式定義十進制記數法,例如:2.0;
-0.1等
科學記數法,例如:235.1e2 等于23510.0234_12e2 等于2341200.0實數小數通過四舍五入被隱式地轉換為最相近的整數。例如:42.446,42.45轉換為整數4292.5,92.699轉換為整數93-5.62轉換為整數-6-26.22轉換為整數-6verilog2011--TJU.ASICCenter---ArnoldShi常量的位數,x(或z)在十六進制值中代表4位x(或z),在八進制中代表3位x(或z),在二進制中代表1位x(或z)當常量不說明位數時候默認是32位,每個字母用8位ASCII碼來表示10=32’d10=32’b10101=32’d1=32’b1-1=-32’d1=32’hFFFF_FFFF‘BX=32’BX=32’BXXXXXXXXXX...“AB”=16’B010000001_01000010A的ASCII值是85,B的值是86verilog2011--TJU.ASICCenter---ArnoldShi字符串字符串是雙引號內的字符串列。一個字符可用八位二進制表示。如:“INTEGER”需要8*7位。 例: reg[8*14:1]Message;
Message=“INTERNALERROR”;verilog2011--TJU.ASICCenter---ArnoldShi課堂練習下列表達式的位模式是什么?寫出其具體的二進制表示值7'o44,'Bx0,5'bx110,'hA0,10'd2,'hzFVerilog描述實際的二進制值7'o44
100100'Bx0x05'bx110xx110'hA01010_000010'd20000_0000_10'hzFzzzz1111verilog2011--TJU.ASICCenter---ArnoldShi參數參數是一個常量。用parameter定義一個標識符來代表一個常量。參數經常用于定義時延和變量的寬度。格式:parameterparam1=const_expr1,param2=const_expr2, …,
paramN=const_exprN;
如:parameterDelay=1;
parameterA=32,B=4’b0001;
parameterstring=“exec_command”;verilog2011--TJU.ASICCenter---ArnoldShi參數的傳遞參數值也可以在編譯時被改變。改變參數值可以使用參數定義語句或通過在模塊初始化語句中定義參數值當某個模塊在另一個模塊內被引用時,高層模塊能夠改變低層模塊的參數值。模塊參數值的改變可采用下述兩種方式:參數定義語句(defparam);帶參數值的模塊引用。verilog2011--TJU.ASICCenter---ArnoldShidefparam舉例module
TOP(NewA,NewB,NewS,NewC);input
NewA,NewB;output
NewS,NewC;defparam
Ha1.XOR_DELAY=5,//實例Ha1中的參數XOR_DELAY。
Ha1.AND_DELAY=2;//實例Ha1中參數的AND_DELAY。HAHa1(NewA,NewB,NewS,NewC);endmodulemoduleHA(A,B,S,C);inputA,B;outputS,C;parameterAND_DELAY=1,XOR_DELAY=2;assign#XOR_DELAYS=A^B;assign#AND_DELAYC=A&B;endmoduleHATOPverilog2011--TJU.ASICCenter---ArnoldShi參數值的模塊引用module
TOP3(NewA,NewB,NewS,NewC);input
NewA,NewB;output
NewS,NewC;HA
#(5,2)Ha1(NewA,NewB,NewS,NewC);//第1個值5賦給參數AND_DELAY,該參數在模塊HA中說明。//第2個值2賦給參數XOR_DELAY,該參數在模塊HA中說明。endmoduleverilog2011--TJU.ASICCenter---ArnoldShi課堂練習-參數傳遞假定一個模塊為BK,內部兩個參數P1,P2;另外一個模塊為HA,內部參數P3,P4其在TOP模塊中實例化調用的名稱分別為U1,U2請嘗試在top模塊中用兩種不同的方法改變其參數值p1-p4分別為1,2,3,4verilog2011--TJU.ASICCenter---ArnoldShi二、變量在Verilog中有兩大主要數據類型:線網類型(wire)、寄存器類型(reg)。線網類型
包含下述不同種類的線網子類型。
wire,tri
用于連線的最常見的線網類型
wor,trior
線或
wand,triand
線與
trireg
此線網存儲數值,用于電容節點的建模
tri1,tri0
用于線邏輯的建模,上拉或下拉驅動
supply0,supply1supply0用于對“地”建模,supply1對電源建模verilog2011--TJU.ASICCenter---ArnoldShinets(網絡連線)nets(網絡連線):由模塊或門驅動的連線。驅動端信號的改變會立刻傳遞到輸出的連線上。例如:右圖上,selb的改變,會自動地立刻影響或門的輸出。
netsabslselbselansloutverilog2011--TJU.ASICCenter---ArnoldShiNets(線網型)例:
wire
BpW;
assign
BpW=Error&Wait;
assign
BpW=Valid|Clear;BpW電路圖verilog2011--TJU.ASICCenter---ArnoldShiNets(網絡連線,線網類型)簡單的線網類型定義說明語句為:
net_kind[msb:lsb]net1,net2,….netN;
當一個線形有兩個或多個驅動時,線網的有效值按如下表確定。verilog2011--TJU.ASICCenter---ArnoldShi補充:CMOSNORABF001010100110A+BABABABverilog2011--TJU.ASICCenter---ArnoldShi補充:CMOSNANDABA?BABABF001011101110ABverilog2011--TJU.ASICCenter---ArnoldShiNets(網絡連線)verilog2011--TJU.ASICCenter---ArnoldShi補充知識:連續賦制值語句連續賦制語句用于把值賦給線網型變量(不能為寄存器型變量賦值)語句形式為:assignA=B&C;連續賦值語句在什么時候執行呢?只要在右端表達式的操作數上有事件(事件為值的變化)發生時,表達式即被計算;如果結果值有變化,新結果就賦給左邊的線網。verilog2011--TJU.ASICCenter---ArnoldShi連續賦值的目標類型標量線網向量線網向量的常數型位選擇,如a[1]
向量的常數型部分選擇如:a[3:1]
上述類型的任意的拼接運算結果verilog2011--TJU.ASICCenter---ArnoldShi連續賦值語句舉例module
FA_Df(A,B,Cin,Sum,Cout
);input
A,B,Cin;output
Sum,Cout
;assign
Sum=A^B^Cin;assign
Cout=(A&Cin)|(B&Cin)|(A&B);endmodule在本例中,有兩個連續賦值語句。這些賦值語句是并發的,與其書寫的順序無關verilog2011--TJU.ASICCenter---ArnoldShi數據流描述方式例:
wor
BpW;wand
BpR;
assign
BpW=Error&Wait;
assign
BpW=Valid|Clear;
assign
BpR=Error^Valid;
assign
BpR=!Clear;BpW和BpR電路圖verilog2011--TJU.ASICCenter---ArnoldShi寄存器(register)類型變量寄存器(register)類型變量register型變量能保持其值,直到它被賦于新的值。register型變量常用于行為建模,產生測試的激勵信號。常用行為語句結構來給寄存器類型的變量賦值。abslselbselansloutreg_areg_selreg_bverilog2011--TJU.ASICCenter---ArnoldShireg型寄存器是數據存儲單元的抽象reg型數據常用來表示always塊內的指定信號,常代表觸發器reg型數據用initial或者always塊中指定信號reg型數據的缺省值是x。可以被賦正值或者負值。當它作為一個表達式中的操作數時候,作為無符號數。reg數據類型定義格式為reg[n-1:0]數據名1,....;或者reg[n:1]數據名1,....;verilog2011--TJU.ASICCenter---ArnoldShi寄存器陣列
Verilog
語言支持寄存器陣列的聲明:integerNUMS[7:0];//8個整型變量的寄存器陣列time
t_vals[3:0];//4個時間變量的寄存器陣列數據類型為reg
的陣列常稱為存儲器(即memory):reg[15:0]MEM[0:1023];//1Kx16位的存儲器reg[7:0]PREP[‘hfffe:‘hffff];//2x8位的存儲器可以用參數來表示存儲器的大小:parameter
wordsize=16;parameter
memsize=1024;reg[wordsize-1:0]MEM3[memsize-1:0];只能一次選擇一個字,不允許對存儲器變量值部分進行部分選擇或位選擇.如dram[60][2:4]是錯誤的verilog2011--TJU.ASICCenter---ArnoldShi存儲器memory型變量存儲器memory型用一個寄存器數組來對存儲器建模。格式:reg[msb:lsb]存儲器名
[upper1:lower1];
如:
reg[3:0]MyMem[63:0];//64個四位寄存器組
verilog2011--TJU.ASICCenter---ArnoldShi其他類型變量integer
整數寄存器有符號數。主要用來高層次建模。如:integerA; //整形寄存器,32位
integerB[1023:0];//10位time
時間類型寄存器如:timeCurrentTime;//CurrentTime存儲一個時間值
CurrentTime=$time;verilog2011--TJU.ASICCenter---ArnoldShi輸入端口(input)可以由寄存器(reg)或線網(wire)連接驅動,但它本身只能驅動網絡連接。輸出端口(output)可以由寄存器或線網連接驅動,但它本身只能驅動線網連接。輸入/輸出端口(inout)只可以由線網連接驅動,但它本身只能驅動線網連接。如果信號變量是在過程塊(initial塊或always塊)中被賦值的,必須把它聲明為寄存器類型變量
如何選擇正確的數據類型?verilog2011--TJU.ASICCenter---ArnoldShimoduletop;wirey;
rega,b;DUTu1(y,a,b);
initial
begina=0;b=0;#10a=1;….
endendmodule
模塊DUT的邊界輸入口輸出口輸出/入口netnetnet/registernetnet/registernetinoutmoduleDUT(Y,A,B_);outputY;inputA,B:wireY,A,B;and(Y,A,B);endmodule舉例說明數據類型的選擇verilog2011--TJU.ASICCenter---ArnoldShi在過程塊(alwaysinitial)中對變量賦值時,忘了把它定義為寄存器類型(reg)或已把它定義為連接類型了(wire)把實例的輸出連接出去時,把它定義為寄存器類型把模塊的輸入信號定義為寄存器類型。這是經常犯的三個錯誤!!!選擇數據類型時常犯的錯誤verilog2011--TJU.ASICCenter---ArnoldShi3.2運算符及表達式天津大學電子科學與技術系史再峰shizaifeng@verilog2011--TJU.ASICCenter---ArnoldShi3.2運算符(操作符)及表達式VerilogHDL中的運算符可以分為下述類型:算術運算符關系運算符相等運算符邏輯運算符按位運算符縮減(歸約)運算符移位運算符條件運算符連接和復制運算符verilog2011--TJU.ASICCenter---ArnoldShi按所帶操作數的個數分類單目運算符(unaryoperator)帶一個操作數,操作數在運算符的右邊如~clock雙目運算符(binaryoperator)帶兩個操作數,操作數分別在運算符的兩邊如a|b三目運算符(ternaryoperator)帶三個操作數,用三目運算符隔開verilog2011--TJU.ASICCenter---ArnoldShi3.2.1算術運算符算術運算符有:
+(一元加和二元加)
-(一元減和二元減)*(乘)
/(除)
%(取模)整數除法截斷任何小數部分。例如:7/4結果為1取模運算符求出與第一個運算符符號相同的余數。7%4結果為3而-7%4結果為-3verilog2011--TJU.ASICCenter---ArnoldShi課堂練習以下表達式在verilogHDL中的值是多少?(結果用16位hex表示表示)5/3(-9)/6(-9)%611%(-5)12/(-7)答案是5/3=16’h0001(-9)/6=16’hFFFF(-9)%6=16’hFFFD11%(-5)=16’h000112/(-7)=16’hFFFFverilog2011--TJU.ASICCenter---ArnoldShi3.2.2按位運算符按位運算符有:~(一元非)
&(二元與)
|(二元或)
^(二元異或)
~^,^~(二元異或非)這些運算符在輸入操作數的對應位上按位操作,并產生向量結果。不同長度操作符運算時,會右端對齊,左端補0verilog2011--TJU.ASICCenter---ArnoldShi按位非運算符verilog2011--TJU.ASICCenter---ArnoldShi按位與運算符verilog2011--TJU.ASICCenter---ArnoldShi按位或運算符verilog2011--TJU.ASICCenter---ArnoldShi按位異或運算符verilog2011--TJU.ASICCenter---ArnoldShi按位異或非運算符verilog2011--TJU.ASICCenter---ArnoldShi按位操作符舉例假定A='b0110;B='b0100;那么:A|B結果為0110A&B結果為01004'b1011^4'bx010=4'bx001如果操作數長度不相等,長度較小的操作數在最左側添0補位。例如,'b0110^'b10000與如下式的操作相同:'b00110^'b10000結果為'b10110。verilog2011--TJU.ASICCenter---ArnoldShi3.2.3邏輯運算符邏輯運算符有:&&(邏輯與)||(邏輯或)
!(一元邏輯非)這些運算符在邏輯值0或1上運算。邏輯運算的結構為0或1。verilog2011--TJU.ASICCenter---ArnoldShi邏輯與運算舉例assigna=8'haa;assignb=8'hff;assign
c_out=a&b;assignc_out2=a&&b;c_out2結果是0000_0001verilog2011--TJU.ASICCenter---ArnoldShi課堂練習以下表達式在verilogHDL中的值是多少?(結果用8位表示)assignd_0=4'b1101^8'h0a;assignd_1=4'b1101^~8'h0a;assignd_2=4'b1z01|8'h0a;assignd_3=4'b1101&&8'h0a;assignd_4=!4'b1x01;assignd_5=4'b1010||8'h55;答案是#hexd_0is07#hexd_1isF8#binaryd_2is0000_1x11#hexd_3is01#hexd_4is00#hexd_5is01verilog2011--TJU.ASICCenter---ArnoldShi3.2.4關系運算符關系運算符有:
>(大于)
<(小于)
>=(不小于)
<=(不大于)關系運算符的結果為真(1)或假(0)。如果操作數中有一位為X或Z,那么結果為X。例如:23>45結果為假(0)52<8‘hxFF結果為x。verilog2011--TJU.ASICCenter---ArnoldShi關系運算符語法如果操作數長度不同,長度較短的操作數在最重要的位方向(左方)添0補齊。例如:'b1000>='b01110等價于:'b01000>='b01110結果為假(0)verilog2011--TJU.ASICCenter---ArnoldShi3.2.5相等關系運算符相等關系運算符有:==(邏輯相等)
!=(邏輯不等)
===(全等)
!==(非全等)如果比較結果為假,則結果為0;否則結果為1。在全等比較中,值x和z嚴格按位比較。verilog2011--TJU.ASICCenter---ArnoldShi相等關系運算舉例Data='b11x0;Addr='b11x0;那么(Data==Addr)不定,值為x,但:Data===Addr為真,值為1。如果操作數的長度不相等,長度較小的操作數在左側添0補位,例如:2'b10==4'b0010與下面的表達式相同:4'b0010==4'b0010結果為真(1)。verilog2011--TJU.ASICCenter---ArnoldShi關系及相等關系運算符練習判斷以下表達式中的d值是多少
assignd_relation1=(4'b1011>=4'b10x1);
assignd_relation2=(4'b1011==4'b10x1);
assignd_relation3=(4'b10x1==4'b10x1);
assignd_relation4=(4'b10z1===4'b10x1);assignd_relation5=(4'b10x1!==4'b10x1);assignd_relation6=(4'b10x1!=4'b10x1);答案是:#bind_relation1is1'bx#bind_relation2is1'bx#bind_relation3is1'bx#bind_relation4is1'b0#bind_relation5is1'b0#bind_relation6is1'bxverilog2011--TJU.ASICCenter---ArnoldShi3.2.6縮減(歸約)運算符歸約運算符在單一操作數的所有位上操作,并產生1位結果。歸約運算符有:&(歸約與):如果存在位值為0,那么結果為0;若如果存在位值為x或z,結果為x;否則結果為1。~&(歸約與非):與歸約運算符&相反。
|(歸約或):如果存在位值為1,那么結果為1;如果存在位x或z,結果為x;否則結果為0。
~|(歸約或非):與歸約運算符|相反。
^(歸約異或):如果存在位值為x或z,那么結果為x;否則如果操作數中有偶數個1,結果為0;否則結果為1。
~^(歸約異或非):與歸約運算符^正好相反。verilog2011--TJU.ASICCenter---ArnoldShi縮減(歸約)運算符練習判斷以下表達式中的d值是多少
assignd_reduction1=&8'b1011_0011;
assignd_reduction2=~|8'b1011_0011;
assignd_reduction3=~&8'b1011_0011;assignd_reduction4=~^8'b1011_0011;
assignd_reduction5=^8'b1011_0011;assignd_reduction6=~|8'b1011_00x1;
assignd_reduction7=^8'b10z1_0011;
assignd_reduction8=&8'b1011_00x1;assign
d_reduction8=&~8'b1011_00x1;modelsim仿真驗證的答案是#bind_reduction1is1'b0#bind_reduction2is1'b0#bind_reduction3is1'b1#bind_reduction4is1'b0#bind_reduction5is1'b1#bind_reduction6is1'b0#bind_reduction7is1'bx#bind_reduction8is1'b0
Error:./vlog_test.v(57):near"~":syntaxerror,
verilog2011--TJU.ASICCenter---ArnoldShi3.2.7移位運算符移位運算符有:<<(左移)
>>(右移)移位運算符左側操作數移動右側操作數表示的次數,它是一個邏輯移位。空閑位添0補位。如果右側操作數的值為x或z,移位操作的結果為x。假定:reg
[0:7]Qreg;...Qreg
=4'b0111;那么:Qreg
>>2是8'b0000_0001verilog2011--TJU.ASICCenter---ArnoldShi3.2.8條件運算符條件運算符根據條件表達式的值選擇表達式,形式如下:cond_expr
?expr1:expr2如果cond_expr
為真(即值為1),選擇expr1;如果cond_expr為假(值為0),選擇expr2。如果cond_expr
為x或z,結果將是按以下邏輯expr1和expr2按位操作的值:0與0得0,1與1得1,其余情況為x。verilog2011--TJU.ASICCenter---ArnoldShi條件運算符舉例wire
[0:2]Student=Marks>18?GA:GC;計算表達式Marks>18;如果真,GA賦值給Student;如果Marks<=18,GC賦值給Student。再例如:
always#5Ctr
=(Ctr
!=25)?(Ctr
+1):5;過程賦值中的表達式表明如果Ctr不等于25,則加1;否則如果Ctr值為25時,將Ctr值重新置為5。verilog2011--TJU.ASICCenter---ArnoldShi3.3.8連接和復制操作連接操作是將小表達式合并形成大表達式的操作。形式如:{expr1,expr2,...,exprN}實例如下所示:wire[7:0]Dbus;wire[11:0]Abus;assign
Dbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};//以反轉的順序將低端4位賦給高端4位。assign
Dbus={Dbus[3:0],Dbus[7:4]};//高4位與低4位交換。verilog2011--TJU.ASICCenter---ArnoldShi復制運算符通過指定重復次數來執行操作。形式如下:{repetition_number
{expr1,expr2,...,exprN
}}以下是一些實例:Abus={3{4'b1011}};/位向量12'b1011_1011_1011)Abus={{4{Dbus[7]}},Dbus};/*符號擴展*/verilog2011--TJU.ASICCenter---ArnoldShi運算符的優先級verilog2011--TJU.ASICCenter---ArnoldShi3.2.10關鍵詞所有關鍵詞都是事先定義好的確認符,用于組織語言結構,全部是小寫定義。常用的有assignalwaysinitialbeginendbufbufif0bufif1casex
casez
cmos
deassigndefaultdefparamdisableedgecaseifelseendcasejoinlargeforkjoinnotnotif0notif1xorwirereg
wor
xor
xnorwhiletritri0tri1triand
triorrepeattaskfunctionforeverendtask
等等verilog2011--TJU.ASICCenter---ArnoldShi作業練習題假定32位總線Address_Bus,編寫一個表達式,計算從第11位到第20位的歸約與非。假定一條總線Control_Bus
[15:0],編寫賦值語句將總線分為兩條總線:Abus
[0:9]和Bbus[6:1]。編寫一個表達式,執行算術移位,將Qparity
中包含的8位有符號數算術移位。使用條件運算符,編寫賦值語句選擇NextState的值。如果CurrentState的值為RESET,那么NextState的值為GO;如果CurrentState的值為GO,則NextState
的值為BUSY;如果CurrentState的值為BUSY;則NextS
tate的值為RESET。verilog2011--TJU.ASICCenter---ArnoldShi習題解答錯誤解答:assign
CurrentState==RESET?NextState=Go:(CurrentState==Go?NextState=BUSY:(CurrentState==BUSY?NextState=RESET:))正確解答:assignnextstate=(currentstate==RESET)?GO:((currentstate==GO)?BUSY:((currentstate==BUSY)?RESET:1’bz));verilog2011--TJU.ASICCenter---ArnoldShi3.3數據流建模天津大學電子科學與技術系史再峰shizaifeng@verilog2011--TJU.ASICCenter---ArnoldShi一、連續賦制值語句連續賦制語句用于把值賦給線網型變量(不能為寄存器型變量賦值)語句形式為:assignA=B&C;只要在右端表達式的操作數上有事件(事件為值的變化)發生時,表達式即被計算;如果計算的結果值有變化,新結果就賦給左邊的線網。verilog2011--TJU.ASICCenter---ArnoldShi數據流的模型化連續賦值語句將值賦給線網(連續賦值不能為reg)例如assign
Mux
=(S==0)?A:1'bz;assign
Mux
=(S==1)?B:1'bz;assign
Mux
=(S==2)?C:1'bz;assign
Mux
=(S==3)?D:1'bz;assign
Mux
=(S==0)?A:1‘bz,//也可以這樣在一個語句中寫Mux
=(S==1)?B:1‘bz,
Mux
=(S==2)?C:1‘bz,
Mux
=(S==3)?D:1'bz;verilog2011--TJU.ASICCenter---ArnoldShi連續賦值的目標類型標量線網wirea;
向量線網wire[7:0]a;
向量線網的常數型位選擇,如a[1]
向量線網的常數型部分選擇如:a[3:1]
上述類型的任意的拼接運算結果{3a[2],a[2:1]}verilog2011--TJU.ASICCenter---ArnoldShi連續賦值語句舉例module
FA_Df
(A,B,Cin,Sum,Cout
);input
A,B,Cin;output
Sum,Cout
;assign
Sum=A^B^Cin;assign
Cout
=(A&Cin)|(B&Cin)|(A&B);endmodule在本例中,有兩個連續賦值語句。這些賦值語句是并發的,與其書寫的順序無關verilog2011--TJU.ASICCenter---ArnoldShi對應的電路連接關系verilog2011--TJU.ASICCenter---ArnoldShi賦值給向量線網的拼接wire
Cout,Cin;wire[3:0]Sum,A,B;assign{Cout,Sum}=A+B+Cin;verilog2011--TJU.ASICCenter---ArnoldShi數據流描述方式例:
wor
BpW;wand
BpR;
assign
BpW=Error&Wait;
assign
BpW=Valid|Clear;
assign
BpR=Error^Valid;
assign
BpR=!Clear;BpW和BpR電路圖verilog2011--TJU.ASICCenter---ArnoldShi用數據流描述對2-4解碼器電路的建模verilog2011--TJU.ASICCenter---ArnoldShi參考答案`timescale1ns/1nsmoduleDecoder2x4(A,B,EN,Z);inputA,B,EN;output[0:3]Z;wire
Abar,Bbar;assign
Abar=~A;assign
Bbar=~B;assignZ[0]=~(Abar&Bbar&EN);assignZ[1]=~(Abar&B&EN);assignZ[2]=~(A&Bbar&EN);assignZ[3]=~(A&B&EN);endmoduleverilog2011--TJU.ASICCenter---ArnoldShi課堂練習題使用連續賦值語句,描述圖示的優先編碼器電路的行為2bar02bar12bar2verilog2011--TJU.ASICCenter---ArnoldShi某同學的解答module(Data,Encode,Valid);input[3:0]Data;output[1:0]Encode;wire2bar0,2bar1,0bar;assign2bar0=~Data[2];assign2bar1=2bar0&Data[1];assign0bar=Data[0]|Data[1];assignEncode[0]=Data[3]|2bar1;assignEncode[1]=Data[3]|Data[2];assignValid=Data[3]|Data[2]|0bar;endmodule
程序基本沒有問題,但是:第1行module沒有命名,這是不可以的第4行變量定義的時候,標識符的首字母應該是字母或者下劃線verilog2011--TJU.ASICCenter---ArnoldShi正確解答module
encoder(Data,Encode,Valid);input[3:0]Data;output[1:0]Encode;wirebar0,bar1,bar;assignbar0=~Data[2];assignbar1=2bar0&Data[1];assignbar=Data[0]|Data[1];assignEncode[0]=Data[3]|2bar1;assignEncode[1]=Data[3]|Data[2];assignValid=Data[3]|Data[2]|0bar;endmodule
verilog2011--TJU.ASICCenter---ArnoldShi二、線網說明賦值連續賦值可作為線網說明本身的一部分。這樣的賦值被稱為線網說明賦值。如:wire[3:0]Sum=4'b0;wireClear='b1;wireA_GT_B=A>B,B_GT_A=B>A;等價于
wireclear;
assignclear=‘b1;不允許在同一個線網上出現多個線網說明賦值。如果多個賦值是必需的,則必須使用連續賦值語句。verilog2011--TJU.ASICCenter---ArnoldShi隱式線網如果在VerilogHDL模型中一個線網沒有被特別說明,那么它被缺省聲明為1位線網。但是`
default_nettype編譯指令能夠用于取代缺省線網類型.例:`default_nettypewand
//根據此編譯指令,所有后續未說明的線網都是wand類型再例:`default_nettype
wiremoduleAND4to1(Z,D0,D1,D2,D3,S0);outputZ;inputD0,D1,D2,D3,S0;
assignZ=S0?(D0&D1&D2&D3):1’b0;
endmodule
verilog2011--TJU.ASICCenter---ArnoldShi數據流建模課堂練習verilog2011--TJU.ASICCenter---ArnoldShi數據流建模參考答案moduleMSDFF_DF(D,C,Q,Qbar);inputD,C;outputQ,Qbar;//wireNotC,NotD,NotY,Y,D1,D2,Ybar,Y1,;Y2assignNotD=~D;assignNotC=~C;assignNotY=~Y;assignD1=~(D&C);assignD2=~(C&NotD);assignY=~(D1&Ybar);assignYbar=~(Y&D2);assignY1=~(Y&NotC);assignY2=~(NotY&NotC);assignQ=~(Qbar&Y1);assignQbar=~(Y2&Q);endmoduleverilog2011--TJU.ASICCenter---ArnoldShi三、時延說明assign#6Ask=Quiet||Late;規定右邊表達式結果的計算到其賦給左邊目標需經過6個時間單位時延。例如,如果在時刻5,Late值發生變化,則賦值的右端表達式被計算,并且Ask在時刻11(=5+6)被賦于新值verilog2011--TJU.ASICCenter---ArnoldShi時延VerilogHDL模型中的所有時延都根據時間單位定義使用編譯指令將時間單位與物理時間相關聯。這樣的編譯器指令需在模塊描述前定義,如下所示:`timescale
1ns/100ps此語句說明時延時間單位為1ns并且時間精度為100ps(時間精度是指所有的時延必須被限定在0.1ns內)。如果此編譯器指令所在的模塊包含上面的連續賦值語句,#2代表2ns。如果沒有這樣的編譯器指令,VerilogHDL模擬器會指定一個缺省時間單位。IEEEVerilogHDL
標準中沒有規定缺省時間單位。verilog2011--TJU.ASICCenter---ArnoldShi為什么會有延時?以下兩個最基本的電路單元verilog2011--TJU.ASICCenter---ArnoldShiCMOSNANDABA?BABABF001011101110ABverilog2011--TJU.ASICCenter---ArnoldShiCMOSNORABF001010100110A+BABABABverilog2011--TJU.ASICCenter---ArnoldShiMOSFET的結構verilog2011--TJU.ASICCenter---ArnoldShiMOS電容verilog2011--TJU.ASICCenter---ArnoldShi靜態CMOS的開關模型AReqARpARpARnCLACLBRnARpBRpARnCintBRpARpARnBRnCLCintNAND2INVNOR2verilog2011--TJU.ASICCenter---ArnoldShi關于時延探討如果右端在傳輸給左端之前變化,右端發生在時延間隔內的變化被濾掉。 例如:assign#4Cab=Drm;這也同樣適用于慣性時延行為:即右端值變化在能夠傳播到左端前必須至少保持時延間隔;如果在時延間隔內右端值變化,則前面的值不能傳輸到輸出。verilog2011--TJU.ASICCenter---ArnoldShi三類時延值對于每個時延定義,總共能夠指定三類時延值:
上升時延下降時延關閉時延assign#(rise,fall,turn-off)LHS=RHS_expr;如果右端從非0向量變化到0向量,那么就使用下降時延。如果右端值到達z,那么使用下降時延;否則使用上升時延。assign#4Ask=Quiet||Late;//Onedelayvalue.assign#(4,8)Ask=Quick;//Twodelayvalues.assign#(4,8,6)Arb=&DataBus;//Threedelayvalues.assignBus=MemAddr[7:4];//Nodelayvalue.verilog2011--TJU.ASICCenter---ArnoldShi帶時延的譯碼器建模`timescale1ns/1nsmoduleDecoder2x4(A,B,EN,Z);inputA,B,EN;output[0:3]Z;wire
Abar,Bbar;assign#1Abar=~A;assign#1Bbar=~B;assign#2Z[0]=~(Abar&Bbar&EN);assign#2Z[1]=~(Abar&B&EN);assign#2Z[2]=~(A&Bbar&EN);assign#2Z[3]=~(A&B&EN);endmoduleverilog2011--TJU.ASICCenter---ArnoldShi結果波形verilog2011--TJU.ASICCenter---ArnoldShi3.4.3線網時延時延也可以在線網說明中定義,如:wire#5Arb;線網時延效果如圖線網時延Textassign時延assign時延驅動2驅動2驅動1RHS表達式RHS表達式線網目標verilog2011--TJU.ASICCenter---ArnoldShi線網時延舉例wire#5Arb;assign#2Arb=Bod⋒因為定義了線網時延,實際對Arb的賦值發生在時刻17(=10+2+5)。verilog2011--TJU.ASICCenter---ArnoldShi課后作業數據流建模以下的奇偶發生器verilog2011--TJU.ASICCenter---ArnoldShi3.4門級結構建模天津大學電子科學與技術系史再峰shizaifeng@verilog2011--TJU.ASICCenter---ArnoldShi3.4門級結構建模moduleaddbit(a,b,ci,sum,co);inputa,b,ci;outputsum,co;wirea,b,ci,sum,co,n1,n2,n3;
xor(n1,a,b,);xor(sum,n1,ci);and(n2,a,b);and(n3,n1,ci);or(co,n2,n3);endmodule
由一些Verilog原型列出結構化的元件并按網表連接verilog2011--TJU.ASICCenter---ArnoldShi3.4.1內置的基本門VerilogHDL為門級電路建模的能力.提供下列內置基本門:
多輸入門:and,nand,or,nor,xor,xnor
多輸出門:buf,not
三態門:bufif0,bufif1,notif0,notif1
上拉、下拉電阻:pullup,pulldownMOS開關:cmos,nmos,pmos,rcmos,rnmos,rpmos
雙向開關:tran,tranif0,tranif1,rtran,rtranif0,rtranif1verilog2011--TJU.ASICCenter---ArnoldShi門級結構建模語法語句形式gate_type[instance_name](term1,term2,...,termN);注意,instance_name是可選的;
gate_type為前面列出的某種門類型。各term用于表示與門的輸入/輸出端口相連的線網或寄存器.同一門類型的多個實例能夠在一個結構形式中定義gate_type[instance_name1](term1,term2,...,termN),
[instance_name2](term1,term2,...,termN),
[instance_name3](term1,term2,...,termN),
[instance_name4](term1,term2,...,termN);verilog2011--TJU.ASICCenter---ArnoldShi3.4.2多輸入門內置的多輸入門包括:andnandnororxor
xnor這些邏輯門只有單個輸出,1個或多個輸入。門實例語句的語法如:multi_input_gate_type[instance_name](OutputA,Input1,Input2,...,InputN);第一個端口是輸出,其它端口是輸入多輸入門input1input2inputNOutputAverilog2011--TJU.ASICCenter---ArnoldShi多輸入門語法舉例andA1(Out1,In1,In2);andRBX(Sty,Rib,Bro,Qit,Fi)x;xor(Bar,Bud[0],Bud[1],Bud[2]),(Car,Cut[0],Cut[1]),(Sar,Sut[2],Sut[1],Sut[0],Sut[3]);verilog2011--TJU.ASICCenter---ArnoldShi多輸入門的真值表(一)nand01XZ01111110XXX1XXXZ1XXXand01XZ00000101XXX0XXXZ0XXXverilog2011--TJU.ASICCenter---ArnoldShi多輸入門的真值表(二)nor01XZ010XX10000XX0XXZX0XXor01XZ001XX11111XX1XXZX1XXverilog2011--TJU.ASICCenter---ArnoldShi多輸入門的真值表(三)xnor01XZ010XX101XXXXXXXZXXXXxor01XZ001XX110XXXXXXXZXXXXverilog2011--TJU.ASICCenter---ArnoldShi3.4.3多輸出門多輸出門有:bufnot這些門都只有單個輸入,一個或多個輸出。多輸出門的實例語句的基本語法如:multi_output_gate_type[instance_name](Out1,Out2,...OutN,InputA);多輸出門output1output2outputNInputAverilog2011--TJU.ASICCenter---ArnoldShi多輸出門語法舉例buf
B1(Fan[0],Fan[1],Fan[2],Fan[3],Clk);notN1(PhA,PhB,Ready);真值表01XZbuf01XXnot10XXverilog2011--TJU.ASICCenter---ArnoldShi3.4.4三態門三態門有:bufif0bufif1notif0notif1這些門用于對三態驅動器建模。這些門有一個輸出、一個數據輸入和一個控制輸入。三態門實例語句的基本語法如下:
tristate_gate[instance_name](OutputA,InputB,ControlC);第一個端口OutputA是輸出端口,第二個端口InputB是數據輸入,ControlC是控制輸入。inputAoutputAControlC三態門verilog2011--TJU.ASICCenter---ArnoldShi三態門的真值表bufif0控制信號01XZ數據輸入00Z0/z0/z11Z1/z1/zXXZXxZXZXxbufif1控制信號01XZ數據輸入0Z00/z0/z1Z11/z1/zXZXXxZZXXxnotif0控制信號01XZ數據輸入01Z1/z1/z10Z0/z0/zXXZXxZXZXxnotif1控制信號01XZ數據輸入0Z11/z1/z1Z00/z0/zXZXXxZZXXxverilog2011--TJU.ASICCenter---ArnoldShi門級結構建模例題verilog2011--TJU.ASICCenter---ArnoldShimodule
flop(data,clock,clear,q,qb);input
data,clock,clear;output
q,qb;nand
#10 nd1(a,data,clock,clear),nd2(b,ndata,clock),nd4(d,c,b,clear),nd5(e,c,nclock),nd6(f,d,nclock),nd8(qb,q,f,clear);nand
#9 nd3(c,a,d),nd7(q,e,qb);not
#10 iv1(ndata,data),iv2(nclock,clock);endmoduleverilog2011--TJU.ASICCenter---ArnoldShi課堂練習用verilog的內置基本門結構建模以下電路verilog2011--TJU.ASICCenter---ArnoldShi參考答案
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 成華區2011-2012下九年級數學一診試題
- 2025年藝術市場數字化交易新趨勢研究報告
- 2025年海上風力發電場運維管理創新與實踐案例分析報告
- 2025年遠程醫療服務在分級診療中的醫療資源配置優化策略報告
- 2025年K2教育STEM課程實施關注學生個性發展效果評估報告
- 冰雪旅游項目投資可行性研究及經濟效益評估報告
- 2025年消費金融在下沉市場的金融科技與農村金融市場融合報告
- java基礎面試題及答案6
- java的js面試題及答案
- java編程考試試題及答案
- 少先隊的測試題及答案
- 煤炭工業礦井建設巖土工程勘察規范
- 風力發電吊裝合同協議
- 太原高考三模試題及答案
- 2024年黑龍江省三支一扶考試真題
- GA/T 2185-2024法庭科學步態信息采集通用技術規范
- 2025至2030中國聚苯并咪唑(PBI)行業供需態勢及未來發展潛力報告
- 速度輪滑講解課件
- 財務風險管理基本知識試題及答案
- DBJT45-全過程工程咨詢服務績效評價標準
- 鎂合金半固態注射成型技術的研究與發展
評論
0/150
提交評論