本章講述在Verilog HDL中編寫表達式的基礎。
表達式由操作數和操作符組成。表達式可以在出現數值的任何地方使用。
4.1 操作數
操作數可以是以下類型中的一種:
1) 常數
2) 參數
3) 線網
4) 寄存器
5) 位選擇
6) 部分選擇
7) 存儲器單元
8) 函數調用
4.1.1 常數
前面的章節已講述了如何書寫常量。下面是一些實例。
256,7 // 非定長的十進制數。
4'b10_11, 8'h0A // 定長的整型常量。
'b1, 'hFBA // 非定長的整數常量。
90.00006 // 實數型常量。
"BOND" // 串常量;每個字符作為8位A S C I I值存儲。
表達式中的整數值可被解釋為有符號數或無符號數。如果表達式中是十進制整數,例如,12被解釋為有符號數。如果整數是基數型整數(定長或非定長),那么該整數作為無符號數對
待。下面舉例說明。
12是01100的5位向量形式(有符號)
- 12是10100的5位向量形式(有符號)
5 ' b 01100是十進制數1 2(無符號)
5 ' b 10100是十進制數2 0(無符號)
4 ' d12是十進制數1 2(無符號)
更為重要的是對基數表示或非基數表示的負整數處理方式不同。非基數表示形式的負整數作為有符號數處理,而基數表示形式的負整數值作為無符號數。因此-4 4和-6'o54 (十進制的4 4等于八進制的5 4)在下例中處理不同。
integerCone;
. . .
cone= -44/4
cone = -6'o54/ 4;
注意-4 4和-6 'o54以相同的位模式求值;但是-4 4作為有符號數處理,而-6 'o54作為無符號數處理。因此第一個字符中Cone的值-11,而在第二個賦值中Coe的值為1073741813
4.1.2 參數
前一章中已對參數作了介紹。參數類似于常量,并且使用參數聲明進行說明。下面是參數說明實例。
p a r a m e t e r L O A D = 4'd12, S T O R E = 4'd10;
L O A D 和S TO R E為參數的例子,值分別被聲明為1 2和1 0。
4.1.3 線網
可在表達式中使用標量線網(1位)和向量線網(多位)。下面是線網說明實例。
w i r e [0:3] P r t; //P r t 為4位向量線網。
w i r e B d q; //B b q 是標量線網。
線網中的值被解釋為無符號數。在連續賦值語句中,
a s s i g n P r t = -3;
P rt被賦于位向量11 0 1,實際上為十進制的1 3。在下面的連續賦值中,
a s s i g n P r t = 4'HA;
P rt被賦于位向量1 0 1 0,即為十進制的1 0。
4.1.4 寄存器
標量和向量寄存器可在表達式中使用。寄存器變量使用寄存器聲明進行說明。例如 :
i n t e g e r TemA, TemB;
r e g [1:5] S t a t e;
t i m e Q u e [ 1 : 5 ] ;
整型寄存器中的值被解釋為有符號的二進制補碼數,而 r e g寄存器或時間寄存器中的值被解釋為無符號數。實數和實數時間類型寄存器中的值被解釋為有符號浮點數。
TemA = -10; // T e m A值為位向量1 0 1 1 0,是1 0的二進制補碼。
TemA = 'b1011; // T e m A值為十進制數1 1。
State = -10; // S t a t e值為位向量1 0 1 1 0,即十進制數2 2。
State = 'b1011; // S t a t e值為位向量0 1 0 1 1,是十進制值1 1。
4.1.5 位選擇
位選擇從向量中抽取特定的位。形式如下:
n e t _ o r _ r e g _ v e c t o r [b i t _ s e l e c t _ e x p r]
下面是表達式中應用位選擇的例子。
S t a t e [1] && S t a t e [4] //寄存器位選擇。
P r t [0] | Bbq // 線網位選擇。
如果選擇表達式的值為x、z,或越界,則位選擇的值為x。例如S t a t e [x]值為x。
4.1.6 部分選擇
在部分選擇中,向量的連續序列被選擇。形式如下:
因為C o n e 為非定長整型變量,基數表示形式的負數在機內以補碼形式出現。— 譯者注
net_ or_ reg_ vector[msb _ const _ expr:1sb _ const _expr]
其中范圍表達式必須為常數表達式。例如。
state[1:4] // 寄存器部分選擇。
P r t [1:3] // 線網部分選擇。
選擇范圍越界或為x,z時,部分選擇的值為x。
4.1.7 存儲器單元
存儲器單元從存儲器中選擇一個字。形式如下:
memory [word _ address]
例如:
. . .
Ack =Dram [60]; //存儲器的第6 0個單元。
不允許對存儲器變量值部分選擇或位選擇。例如,
Dram[60] [2] 不允許。
Dram[60] [2:4] 也不允許。
在存儲器中讀取一個位或部分選擇一個字的方法如下:將存儲器單元賦值給寄存器變量,然后對該寄存器變量采用部分選擇或位選擇操作。例如, A c k [2] 和Ack [ 2 : 4 ]是合法的表達式。
4.1.8 函數調用
表達式中可使用函數調用。函數調用可以是系統函數調用(以 $字符開始)或用戶定義的函數調用。例如:
$t i m e + S u m O f E v e n t s (A, B)
/ * $t i m e是系統函數,并且S u m O f E v e n t s是在別處定義的用戶自定義函數。* /
4.2 操作符
Verilog HDL中的操作符可以分為下述類型:
1) 算術操作符
2) 關系操作符
3) 相等操作符
4) 邏輯操作符
5) 按位操作符
6) 歸約操作符
7) 移位操作符
8) 條件操作符
9) 連接和復制操作符
下表顯示了所有操作符的優先級和名稱。操作符從最高優先級(頂行)到最低優先級(底行)排列。同一行中的操作符優先級相同。
歸約操作符為一元操作符,對操作數的各位進行邏輯操作,結果為二進制數。
除條件操作符從右向左關聯外,其余所有
操作符自左向右關聯。下面的表達式:
A + B - C
等價于:
(A + B ) - C / /自左向右
而表達式:
A ? B : C ? D : F
等價于:
A ? B : (C ? D : F) //從右向左
圓擴號能夠用于改變優先級的順序,如以下表達式:
(A ? B : C) ? D : F
4.2.1 算術操作符
算術操作符有:
? +(一元加和二元加)
? -(一元減和二元減)
? *(乘)
? /(除)
? %(取模)
整數除法截斷任何小數部分。例如:
7/4 結果為 1
取模操作符求出與第一個操作符符號相同的余數。
7%4 結果為 3
而:
- 7%4 結果為 - 3
如果算術操作符中的任意操作數是 X或Z,那么整個結果為X。例如:
'b10x1 + 'b01111 結果為不確定數' bx x x x x
1. 算術操作結果的長度
算術表達式結果的長度由最長的操作數決定。在賦值語句下,算術操作結果的長度由操
作符左端目標長度決定。考慮如下實例:
reg [0:3] Arc, Bar, Crt ;
reg [0:5] F r x;
. . .
Arc = B a r + C r t;
F r x = B a r + C r t;
第一個加的結果長度由 B a r,C rt和A rc長度決定,長度為 4位。第二個加法操作的長度同樣由F rx的長度決定(F rx、B a t和C rt中的最長長度),長度為6位。在第一個賦值中,加法操
作的溢出部分被丟棄;而在第二個賦值中,任何溢出的位存儲在結果位 F r x [ 1 ]中。在較大的表達式中,中間結果的長度如何確定?在 Verilog HDL中定義了如下規則:表達式中的所有中間結果應取最大操作數的長度(賦值時,此規則也包括左端目標)。考慮另一個
實例:
w i r e [4:1] Box, Drt;
w i r e [1:5] C f g;
w i r e [1:6] P e g;
w i r e [1:8] A d t;
. . .
a s s i g n A d t = (B o x + C f g) + (D r t + P e g) ;
表達式左端的操作數最長為 6,但是將左端包含在內時,最大長度為 8。所以所有的加操作使用8位進行。例如:B o x和C f g相加的結果長度為8位。
2. 無符號數和有符號數
執行算術操作和賦值時,注意哪些操作數為無符號數、哪些操作數為有符號數非常重要。
無符號數存儲在:
? 線網
? 一般寄存器
? 基數格式表示形式的整數
有符號數存儲在:
? 整數寄存器
? 十進制形式的整數
下面是一些賦值語句的實例:
r e g [0:5] B a r;
i n t e g e r T a b;
. . .
B a r = -4'd12; //寄存器變量B a r的十進制數為5 2,向量值為1 1 0 1 0 0。
T a b = -4'd12; // 整數T a b的十進制數為- 1 2,位形式為1 1 0 1 0 0。
-4'd12 / 4 // 結果是1 0 7 3 7 4 1 8 2 1。
-12 / 4 // 結果是- 3
因為B a r是普通寄存器類型變量,只存儲無符號數。右端表達式的值為 ' b 11 0 1 0 0(1 2的二進制補碼)。因此在賦值后, B a r存儲十進制值5 2。在第二個賦值中,右端表達式相同,值為' b 11 0 1 0 0,但此時被賦值為存儲有符號數的整數寄存器。Ta b存儲十進制值- 1 2(位向量為11 0 1 0 0)。注意在兩種情況下,位向量存儲內容都相同;但是在第一種情況下,向量被解釋為無符號數,而在第二種情況下,向量被解釋為有符號數。
下面為具體實例:
B a r = - 4'd12/4;
T a b = - 4'd12 /4;
B a r = - 12/4
T a b = - 12/4
在第一次賦值中,B a r被賦于十進制值6 1(位向量為1111 0 1)。而在第二個賦值中,Ta b被賦于與十進制1 0 7 3 7 4 1 8 2 1(位值為0 0 11 . . . 111 0 1)。B a r在第三個賦值中賦于與第一個賦值相同的值。這是因為B a r只存儲無符號數。在第四個賦值中, B a r被賦于十進制值-3。
下面是另一些例子:
B a r = 4 - 6;
T a b = 4 - 6;
B a r被賦于十進制值6 2(-2的二進制補碼),而Ta b被賦于十進制值-2(位向量為11111 0)。
下面為另一個實例:
B a r = -2 + (-4);
T a b = -2 + (-4);
B a r被賦于十進制值5 8(位向量為111 0 1 0),而Ta b被賦于十進制值-6(位向量為111 0 1 0)。
4.2.2 關系操作符
關系操作符有:
? >(大于)
? <(小于)
? >=(不小于)
? <=(不大于)
關系操作符的結果為真( 1)或假(0)。如果操作數中有一位為 X或Z,那么結果為X。例
如:
23 > 45
結果為假(0),而:
52< 8'hxFF
結果為x。如果操作數長度不同,長度較短的操作數在最重要的位方向(左方)添 0補齊。例
如:
'b1000 > = 'b01110
等價于:
'b01000 > = 'b01110
結果為假(0)。
4.2.3 相等關系操作符
相等關系操作符有:
? = =(邏輯相等)
? !=(邏輯不等)
第4章 表 達 式 33
? = = =(全等)
? != =(非全等)
如果比較結果為假,則結果為 0;否則結果為 1。在全等比較中,值 x和z嚴格按位比較。也就是說,不進行解釋,并且結果一定可知。而在邏輯比較中,值 x和z具有通常的意義,且結果可以不為x。也就是說,在邏輯比較中,如果兩個操作數之一包含 x或z,結果為未知的值(x)。如下例,假定:
D a t a = 'b11x0;
A d d r = 'b11x0;
那么:
D a t a = = A d d r
不定,也就是說值為x,但:
D a t a = = = A d d r
為真,也就是說值為1。
如果操作數的長度不相等,長度較小的操作數在左側添 0補位,例如:
2'b10 = = 4'b0010
與下面的表達式相同:
4'b0010 = = 4'b0010
結果為真(1)。
4.2.4 邏輯操作符
邏輯操作符有:
? && (邏輯與)
? || (邏輯或)
? !(邏輯非)
這些操作符在邏輯值0或1上操作。邏輯操作的結構為0或1。例如, 假定:
C r d = 'b0; //0 為假
Dgs = 'b1; //1 為真
那么:
C r d && D g s 結果為0 (假)
C r d || D g s 結果為1 (真)
!D g s 結果為0 (假)
對于向量操作, 非0向量作為1處理。例如,假定:
A _ B u s = 'b0110;
B _ B u s = 'b0100;
那么:
A _ B u s || B _ B u s 結果為1
A _ B u s && B _ B u s 結果為 1
并且:
! A _ B u s 與! B _ B u s的結果相同。
結果為0。
如果任意一個操作數包含x,結果也為x。
34 Verilog HDL 硬件描述語言
下載
!x 結果為x
4.2.5 按位操作符
按位操作符有:
? ~(一元非)
? &(二元與)
? |(二元或)
? ^(二元異或)
? ~^, ^~(二元異或非)
這些操作符在輸入操作數的對應位上按位操作,并產生向量結果。下表顯示對于不同操作符按步操作的結果。
例如,假定,
A = 'b0110;
B = 'b0100;
那么:
A | B 結果為0 1 1 0
A & B 結果為0 1 0 0
如果操作數長度不相等, 長度較小的操作數在最左側添0補位。例如,
'b0110 ^ 'b10000
與如下式的操作相同:
'b00110 ^ 'b10000
結果為' b 1 0 11 0。
第4章 表 達 式 35
下載
與
或
異或 異或非
非
4.2.6 歸約操作符
歸約操作符在單一操作數的所有位上操作,并產生 1位結果。歸約操作符有:
? & (歸約與)
如果存在位值為0, 那么結果為0;若如果存在位值為 x或z,結果為x;否則結果為1。
? ~& (歸約與非)
與歸約操作符&相反。
? | (歸約或)
如果存在位值為1,那么結果為1;如果存在位 x或z,結果為x;否則結果為0。
? ~| (歸約或非)
與歸約操作符|相反。
? ^ (歸約異或)
如果存在位值為x或z,那么結果為x;否則如果操作數中有偶數個 1, 結果為0;否則結果
為1。
? ~^ (歸約異或非)
與歸約操作符^正好相反。
如下所示。假定,
A = 'b0110;
B = 'b0100;
那么:
|B 結果為1
& B 結果為0
~ A 結果為1
歸約異或操作符用于決定向量中是否有位為 x。假定,
M y R e g = 4'b01x0 ;
那么:
^M y R e g 結果為x
上述功能使用如下的i f語句檢測:
i f ( ^M y R e g = = = 1'bx)
$ d i s p l a y ("There is an unknown in the vector MyReg !")
注意邏輯相等( = = )操作符不能用于比較;邏輯相等操作符比較將只會產生結果 x。全等操作符期望的結果為值1。
4.2.7 移位操作符
移位操作符有:
? << (左移)
? >> (右移)
移位操作符左側操作數移動右側操作數表示的次數,它是一個邏輯移位。空閑位添 0補位。如果右側操作數的值為x或z, 移位操作的結果為x。假定:
r e g [ 0:7] Q r e g;
. . .
Q r e g = 4'b0111;
那么:
Q r e g >> 2 是 8 ' b 0 0 0 0 _ 0 0 0 1
V erilog H D L中沒有指數操作符。但是,移位操作符可用于支持部分指數操作。例如,如果要計算Z
N u m B i t s 的值,可以使用移位操作實現,例如:
32'b1 << N u m B i t s / /N u m B i t s必須小于3 2。
同理,可使用移位操作為2 - 4解碼器建模,如
w i r e [0:3] D e c o d e O u t = 4'b1 << A d d r e s s [ 0 : 1 ] ;
A d d re s s[0:1] 可取值0 , 1 , 2和3。與之相應,D e c o d e O u t可以取值4 ' b 0 0 0 1、4 ' b 0 0 1 0、4 ' b 0 1 0 0
和4 ' b 1 0 0 0,從而為解碼器建模。
4.2.8 條件操作符
條件操作符根據條件表達式的值選擇表達式,形式如下 :
c o n d_e x p r ? e x p r 1 : e x p r 2
如果c o n d _ e x p r 為真(即值為1 ),選擇e x p r 1;如果c o n d _ e x p r為假(值為0 ),選擇e x p r 2。如果c o n d _ e x p r 為x或z,結果將是按以下邏輯 e x p r 1和e x p r 2按位操作的值: 0與0得0,1與1得1,其余情況為x。
如下所示:
w i r e [0:2] S t u d e n t = M a r k s > 18 ? G r a d e _ A : G r a d e _ C;
計算表達式M a r k s > 18; 如果真, G r a d e _ A 賦值為S t u d e n t; 如果M a r k s < =18, G r a d e _ C 賦值為S t u d e n t。下面為另一實例:
a l w a y s
#5 C t r = (C t r != 25) ? (C t r + 1) : 5;
過程賦值中的表達式表明如果C t r不等于25, 則加1;否則如果C t r值為2 5時, 將C t r值重新置
為5。
4.2.9 連接和復制操作
連接操作是將小表達式合并形成大表達式的操作。形式如下 :
{e x p r 1, e x p r 2, . . .,e x p r N}
實例如下所示:
w i r e [7:0] D b u s;
w i r e [11:0] A b u s;
a s s i g n D b u s [7:4] = {D b u s [0], D b u s [1], D b u s[2], D b u s[ 3 ] } ;
/ /以反轉的順序將低端4位賦給高端4位。
a s s i g n D b u s = {Dbus [3:0], D b u s [ 7 : 4 ] } ;
/ /高4位與低4位交換。
由于非定長常數的長度未知, 不允許連接非定長常數。例如, 下列式子非法:
{D b u s,5} / /不允許連接操作非定長常數。
復制通過指定重復次數來執行操作。形式如下 :
{r e p e t i t i o n _ n u m b e r {expr1, expr2, ...,exprN } }
以下是一些實例:
A b u s = {3{4'b1011}}; // 位向量1 2 ' b 1 0 1 1 _ 1 0 1 1 _ 1 0 1 1)
A b u s = {{4{D b u s[7]}}, D b u s}; / * 符號擴展 * /
第4章 表 達 式 37
下載
{3{1'b1}} 結果為1 1 1
{3{Ack}} 結果與{A c k, A c k, A c k}相同。
4.3 表達式種類
常量表達式是在編譯時就計算出常數值的表達式。通常,常量表達式可由下列要素構成 :
1) 表示常量文字, 如' b 1 0和3 2 6。
2) 參數名,如R E D的參數表明:
p a r a m e t e r R E D = 4'b1110;
標量表達式是計算結果為 1位的表達式。如果希望產生標量結果 , 但是表達式產生的結果
為向量, 則最終結果為向量最右側的位值。
習題
1. 說明參數G AT E _ D E L AY, 參數值為5。
2. 假定長度為6 4個字的存儲器, 每個字8位,編寫Verilog 代碼,按逆序交換存儲器的內容。即
將第0個字與第6 3個字交換,第1個字與第6 2個字交換,依此類推。
3. 假定3 2位總線A d d re s s _ B u s, 編寫一個表達式,計算從第11位到第2 0位的歸約與非。
4. 假定一條總線C o n t ro l _ B u s [ 1 5 : 0 ],編寫賦值語句將總線分為兩條總線:A b u s [ 0 : 9 ]和B b u s
[ 6 : 1 ]。
5. 編寫一個表達式,執行算術移位,將 Qparity 中包含的8位有符號數算術移位。
6. 使用條件操作符 , 編寫賦值語句選擇 N e x t S t a t e的值。如果C u rre n t S t a t e的值為R E S E T, 那么N e x t S t a t e的值為 G O;如果 C u rre n t S t a t e的值為 G O,則 N e x t S t a t e 的值為 B U S Y;如果C u rre n t S t a t e的值為B U S Y;則N e x t S t a t e的值為R E S E T。
7. 使用單一連續賦值語句為圖2 - 2所示的2 - 4解碼器電路的行為建模。[提示:使用移位操作符、條件操作符和連接操作符。]
8. 如何從標量變量 A,B,C和D中產生總線 B u s Q[0:3]? 如何從兩條總線 B u s A [ 0 : 3 ]和B u s Y
[ 2 0 : 1 5 ]形成新的總線B u s R [ 1 0 : 1 ] ?
原文標題:Verilog入門4-Verilog表達式
文章出處:【微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
存儲器
+關注
關注
38文章
7452瀏覽量
163604 -
Verilog
+關注
關注
28文章
1343瀏覽量
109983
原文標題:Verilog入門4-Verilog表達式
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論