<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

Verilog表達式

作者: 時(shí)間:2017-06-06 來(lái)源:網(wǎng)絡(luò ) 收藏

表達式由操作數和操作符組成。表達式可以在出現數值的任何地方使用。

操作數

   操作數可以是以下類(lèi)型中的一種:
   1) 常數
   2) 參數
   3) 線(xiàn)網(wǎng)
   4) 寄存器
   5) 位選擇
   6) 部分選擇 
   7) 存儲器單元
   8) 函數調用

1.1 常數

  下面是一些實(shí)例。

256,7 //非定長(cháng)的十進(jìn)制數。
4'b10_11, 8'h0A //定長(cháng)的整型常量。
'b1, 'hFBA //非定長(cháng)的整數常量。
90.00006 //實(shí)數型常量。
BOND //串常量;每個(gè)字符作為8位ASCII值存儲。

   表達式中的整數值可被解釋為有符號數或無(wú)符號數。如果表達式中是十進(jìn)制整數,例如,12被解釋為有符號數。如果整數是基數型整數(定長(cháng)或非定長(cháng)),那么該整數作為無(wú)符號數對待。下面舉例說(shuō)明。

12是01100的5位向量形式(有符號)
-12是10100的5位向量形式(有符號)
5'b01100是十進(jìn)制數12(無(wú)符號)
5'b10100是十進(jìn)制數20(無(wú)符號)
4'd12是十進(jìn)制數12(無(wú)符號)

   更為重要的是對基數表示或非基數表示的負整數處理方式不同。非基數表示形式的負整數作為有符號數處理,而基數表示形式的負整數值作為無(wú)符號數。因此-44和-6'o54 (十進(jìn)制的44等于八進(jìn)制的54)在下例中處理不同。

integer Cone;
. . .
Cone = -44/4
Cone = -6'o54/ 4;

   注意-44和-6'o54以相同的位模式求值;但是-44作為有符號數處理,而-6'o54作為無(wú)符號數處理。因此第一個(gè)字符中Cone的值為-11,而在第二個(gè)賦值中Cone的值為1073741813。

1.2 參數

  參數類(lèi)似于常量,并且使用參數聲明進(jìn)行說(shuō)明。下面是參數說(shuō)明實(shí)例。

parameter LOAD = 4'd12, STORE = 4'd10;
LOAD 和STORE為參數的例子,值分別被聲明為12和10。

1.3 線(xiàn)網(wǎng)

   可在表達式中使用標量線(xiàn)網(wǎng)(1位)和向量線(xiàn)網(wǎng)(多位)。下面是線(xiàn)網(wǎng)說(shuō)明實(shí)例。

wire [0:3] Prt; //Prt 為4位向量線(xiàn)網(wǎng)。
wire Bdq; //Bbq 是標量線(xiàn)網(wǎng)。

   線(xiàn)網(wǎng)中的值被解釋為無(wú)符號數。在連續賦值語(yǔ)句中,

assign Prt = -3;
Prt被賦于位向量1101,實(shí)際上為十進(jìn)制的13。在下面的連續賦值中,
assign Prt = 4'HA;
Prt被賦于位向量1010,即為十進(jìn)制的10。

1.4 寄存器

   標量和向量寄存器可在表達式中使用。寄存器變量使用寄存器聲明進(jìn)行說(shuō)明。例如:

integer TemA, TemB;
reg [1:5] State;
time Que [1:5];

   整型寄存器中的值被解釋為有符號的二進(jìn)制補碼數,而reg寄存器或時(shí)間寄存器中的值被解釋為無(wú)符號數。實(shí)數和實(shí)數時(shí)間類(lèi)型寄存器中的值被解釋為有符號浮點(diǎn)數。

TemA = -10; //TemA值為位向量10110,是10的二進(jìn)制補碼。
TemA = 'b1011; //TemA值為十進(jìn)制數11。

State = -10; //State值為位向量10110,即十進(jìn)制數22。
State = 'b1011; //State值為位向量01011,是十進(jìn)制值11。

1.5 位選擇

   位選擇從向量中抽取特定的位。形式如下:

net_or_reg_vector [bit_select_expr]

   下面是表達式中應用位選擇的例子。

State [1] State [4] //寄存器位選擇。
Prt [0] | Bbq //線(xiàn)網(wǎng)位選擇。

   如果選擇表達式的值為x、z,或越界,則位選擇的值為x。例如State [x]值為x。

1.6 部分選擇

   在部分選擇中,向量的連續序列被選擇。形式如下:

net_or_reg_vector [msb_const_expr:1sb_const_expr]

   其中范圍表達式必須為常數表達式。例如。

State [1:4] //寄存器部分選擇。
Prt [1:3] //線(xiàn)網(wǎng)部分選擇。
選擇范圍越界或為x、z時(shí),部分選擇的值為x。

1.7 存儲器單元

   存儲器單元從存儲器中選擇一個(gè)字。形式如下:

memory [word_address]

例如:
reg [1:8] Ack, Dram [0:63];
. . .
Ack = Dram [60]; //存儲器的第60個(gè)單元。

   不允許對存儲器變量值部分選擇或位選擇。例如,

Dram [60] [2] 不允許。
Dram [60] [2:4] 也不允許。

   在存儲器中讀取一個(gè)位或部分選擇一個(gè)字的方法如下:將存儲器單元賦值給寄存器變量,然后對該寄存器變量采用部分選擇或位選擇操作。例如,Ack [2] 和Ack [2:4]是合法的表達式。

1.8 函數調用

   表達式中可使用函數調用。函數調用可以是系統函數調用(以$字符開(kāi)始)或用戶(hù)定義的函數調用。例如:

$time + SumOfEvents (A, B)
/*$time是系統函數,并且SumOfEvents是在別處定義的用戶(hù)自定義函數。*/

操作符

   Verilog HDL中的操作符可以分為下述類(lèi)型:

   1) 算術(shù)操作符
   2) 關(guān)系操作符
   3) 相等操作符
   4) 邏輯操作符
   5) 按位操作符
   6) 歸約操作符
   7) 移位操作符
   8) 條件操作符
   9) 連接和復制操作符

   下表顯示了所有操作符的優(yōu)先級和名稱(chēng)。操作符從最高優(yōu)先級(頂行)到最低優(yōu)先級(底行)排列。同一行中的操作符優(yōu)先級相同。
   除條件操作符從右向左關(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) //從右向左
圓擴號能夠用于改變優(yōu)先級的順序,如以下表達式:
(A ? B : C) ? D : F

2.1 算術(shù)操作符

   算術(shù)操作符有:

* +(一元加和二元加)
* -(一元減和二元減)
* *(乘)
* /(除)
* %(取模)

   整數除法截斷任何小數部分。例如:

7/4 結果為 1
取模操作符求出與第一個(gè)操作符符號相同的余數。
7%4 結果為 3
而:
- 7%4 結果為 -3

   如果算術(shù)操作符中的任意操作數是X或Z,那么整個(gè)結果為X。例如:

'b10x1 + 'b01111 結果為不確定數'bxxxxx

1. 算術(shù)操作結果的長(cháng)度
   算術(shù)表達式結果的長(cháng)度由最長(cháng)的操作數決定。在賦值語(yǔ)句下,算術(shù)操作結果的長(cháng)度由操作符左端目標長(cháng)度決定??紤]如下實(shí)例:

reg [0:3] Arc, Bar, Crt;
reg [0:5] Frx;
. . .
Arc = Bar + Crt;
Frx = Bar + Crt;

   第一個(gè)加的結果長(cháng)度由Bar,Crt和Arc長(cháng)度決定,長(cháng)度為4位。第二個(gè)加法操作的長(cháng)度同樣由Frx的長(cháng)度決定(Frx、Bat和Crt中的最長(cháng)長(cháng)度),長(cháng)度為6位。在第一個(gè)賦值中,加法操作的溢出部分被丟棄;而在第二個(gè)賦值中,任何溢出的位存儲在結果位Frx[1]中。
   在較大的表達式中,中間結果的長(cháng)度如何確定?在Verilog HDL中定義了如下規則:表達式中的所有中間結果應取最大操作數的長(cháng)度(賦值時(shí),此規則也包括左端目標)??紤]另一個(gè)實(shí)例:

wire [4:1] Box, Drt;
wire [1:5] Cfg;
wire [1:6] Peg;
wire [1:8] Adt;
. . .
assign Adt = (Box + Cfg) + (Drt + Peg);

   表達式左端的操作數最長(cháng)為6,但是將左端包含在內時(shí),最大長(cháng)度為8。所以所有的加操作使用8位進(jìn)行。例如:Box和Cfg相加的結果長(cháng)度為8位。

2. 無(wú)符號數和有符號數
   執行算術(shù)操作和賦值時(shí),注意哪些操作數為無(wú)符號數、哪些操作數為有符號數非常重要。無(wú)符號數存儲在:
* 線(xiàn)網(wǎng)
* 一般寄存器
* 基數格式表示形式的整數
   有符號數存儲在:
* 整數寄存器
* 十進(jìn)制形式的整數
   下面是一些賦值語(yǔ)句的實(shí)例:

reg [0:5] Bar;
integer Tab;
. . .
Bar = -4'd12; //寄存器變量Bar的十進(jìn)制數為52,向量值為110100。
Tab = -4'd12; //整數Tab的十進(jìn)制數為-12,位形式為110100。

-4'd12 / 4 //結果是1073741821。
-12 / 4 //結果是-3

   因為Bar是普通寄存器類(lèi)型變量,只存儲無(wú)符號數。右端表達式的值為'b110100(12的二進(jìn)制補碼)。因此在賦值后,Bar存儲十進(jìn)制值52。在第二個(gè)賦值中,右端表達式相同,值為'b110100,但此時(shí)被賦值為存儲有符號數的整數寄存器。Tab存儲十進(jìn)制值-12(位向量為110100)。注意在兩種情況下,位向量存儲內容都相同;但是在第一種情況下,向量被解釋為無(wú)符號數,而在第二種情況下,向量被解釋為有符號數。

本文引用地址:http://dyxdggzs.com/article/201706/349519.htm


   下面為具體實(shí)例:

Bar = - 4'd12/4;
Tab = - 4'd12 /4;

Bar = - 12/4
Tab = - 12/4

   在第一次賦值中,Bar被賦于十進(jìn)制值61(位向量為111101)。而在第二個(gè)賦值中,Tab被賦于與十進(jìn)制1073741821(位值為0011...11101)。Bar在第三個(gè)賦值中賦于與第一個(gè)賦值相同的值。這是因為Bar只存儲無(wú)符號數。在第四個(gè)賦值中,Bar被賦于十進(jìn)制值-3。
   下面是另一些例子:

Bar = 4 - 6;
Tab = 4 - 6;
Bar被賦于十進(jìn)制值62(-2的二進(jìn)制補碼),而Tab被賦于十進(jìn)制值-2(位向量為111110)。

   下面為另一個(gè)實(shí)例:

Bar = -2 + (-4);
Tab = -2 + (-4);
Bar被賦于十進(jìn)制值58(位向量為111010),而Tab被賦于十進(jìn)制值-6(位向量為111010)。

2.2 關(guān)系操作符

   關(guān)系操作符有:

* >(大于)
* (小于)
* >=(不小于)
* =(不大于)

   關(guān)系操作符的結果為真(1)或假(0)。如果操作數中有一位為X或Z,那么結果為X。例如:

23 > 45
結果為假(0),而:
52 8'hxFF
結果為x。如果操作數長(cháng)度不同,長(cháng)度較短的操作數在最重要的位方向(左方)添0補齊。例如:
'b1000 > = 'b01110
等價(jià)于:
'b01000 > = 'b01110
結果為假(0)。

2.3 相等關(guān)系操作符

   相等關(guān)系操作符有:

* = =(邏輯相等)
* !=(邏輯不等)
* = = =(全等)
* != =(非全等)

   如果比較結果為假,則結果為0;否則結果為1。在全等比較中,值x和z嚴格按位比較。也就是說(shuō),不進(jìn)行解釋?zhuān)⑶医Y果一定可知。而在邏輯比較中,值x和z具有通常的意義,且結果可以不為x。也就是說(shuō),在邏輯比較中,如果兩個(gè)操作數之一包含x或z,結果為未知的值(x)。
   如下例,假定:

Data = 'b11x0;
Addr = 'b11x0;
那么:
Data = = Addr
不定,也就是說(shuō)值為x,但:
Data = = = Addr
為真,也就是說(shuō)值為1。

   如果操作數的長(cháng)度不相等,長(cháng)度較小的操作數在左側添0補位,例如:

2'b10 = = 4'b0010
與下面的表達式相同:
4'b0010 = = 4'b0010
結果為真(1)。

2.4 邏輯操作符

   邏輯操作符有:

* (邏輯與)
* || (邏輯或)
* !(邏輯非)

   這些操作符在邏輯值0或1上操作。邏輯操作的結構為0或1。例如, 假定:

Crd = 'b0; //0為假
Dgs = 'b1; //1為真
那么:
Crd Dgs 結果為0 (假)
Crd || Dgs 結果為1 (真)
! Dgs 結果為0 (假)
對于向量操作, 非0向量作為1處理。例如,假定:
A_Bus = 'b0110;
B_Bus = 'b0100;
那么:
A_Bus || B_Bus 結果為1
A_Bus B_Bus 結果為 1
并且:
! A_Bus 與! B_Bus的結果相同。
結果為0。
如果任意一個(gè)操作數包含x,結果也為x。
!x 結果為x

2.5 按位操作符

   按位操作符有:

* ~(一元非)
* (二元與)
* |(二元或)
* ^(二元異或)
* ~^, ^~(二元異或非)

   這些操作符在輸入操作數的對應位上按位操作,并產(chǎn)生向量結果。下表顯示對于不同操作符按步操作的結果。

   例如,假定,
A = 'b0110;
B = 'b0100;
那么:
A | B 結果為0110
A B 結果為0100
如果操作數長(cháng)度不相等, 長(cháng)度較小的操作數在最左側添0補位。例如,
'b0110 ^ 'b10000
與如下式的操作相同:
'b00110 ^ 'b10000
結果為'b10110。

2.6 歸約操作符

   歸約操作符在單一操作數的所有位上操作,并產(chǎn)生1位結果。歸約操作符有:

* (歸約與)
如果存在位值為0, 那么結果為0;若如果存在位值為x或z,結果為x;否則結果為1。
* ~ (歸約與非)
與歸約操作符相反。
* | (歸約或)
如果存在位值為1,那么結果為1;如果存在位x或z,結果為x;否則結果為0。
* ~| (歸約或非)
與歸約操作符|相反。
* ^ (歸約異或)
如果存在位值為x或z,那么結果為x;否則如果操作數中有偶數個(gè)1, 結果為0;否則結果為1。
* ~^ (歸約異或非)
與歸約操作符^正好相反。
如下所示。假定,
A = 'b0110;
B = 'b0100;
那么:
|B 結果為1
B 結果為0
~ A 結果為1
歸約異或操作符用于決定向量中是否有位為x。假定,
MyReg = 4'b01x0;
那么:
^MyReg 結果為x
   上述功能使用如下的if語(yǔ)句檢測:

if (^MyReg = = = 1'bx)
$ display (There is an unknown in the vector MyReg !)

注意邏輯相等(==)操作符不能用于比較;邏輯相等操作符比較將只會(huì )產(chǎn)生結果x。全等操作符期望的結果為值1。

2.7 移位操作符

   移位操作符有:

* (左移)
* >> (右移)

   移位操作符左側操作數移動(dòng)右側操作數表示的次數,它是一個(gè)邏輯移位??臻e位添0補位。如果右側操作數的值為x或z, 移位操作的結果為x。假定:

reg [0:7] Qreg;
. . .
Qreg = 4'b0111;
那么:
Qreg >> 2 是 8'b0000_0001

   Verilog HDL中沒(méi)有指數操作符。但是,移位操作符可用于支持部分指數操作。例如,如果要計算ZNumBits的值,可以使用移位操作實(shí)現,例如:

32'b1 NumBits //NumBits必須小于32。
同理,可使用移位操作為2-4解碼器建模,如
wire [0:3] DecodeOut = 4'b1 Address [0:1];
Address[0:1] 可取值0,1,2和3。與之相應,DecodeOut可以取值4'b0001、4'b0010、4'b0100和4'b1000,從而為解碼器建模。

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。
如下所示:

wire [0:2] Student = Marks > 18 ? Grade_A : Grade_C;

計算表達式Marks > 18; 如果真, Grade_A 賦值為Student; 如果Marks =18, Grade_C 賦值為Student。下面為另一實(shí)例:

always
#5 Ctr = (Ctr != 25) ? (Ctr + 1) : 5;
過(guò)程賦值中的表達式表明如果Ctr不等于25, 則加1;否則如果Ctr值為25時(shí), 將Ctr值重新置為5。

2.9 連接和復制操作

   連接操作是將小表達式合并形成大表達式的操作。形式如下:

{expr1, expr2, . . .,exprN}

   實(shí)例如下所示:

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位交換。
由于非定長(cháng)常數的長(cháng)度未知, 不允許連接非定長(cháng)常數。例如, 下列式子非法:
{Dbus,5} //不允許連接操作非定長(cháng)常數。
復制通過(guò)指定重復次數來(lái)執行操作。形式如下:
{repetition_number {expr1, expr2, ...,exprN}}
以下是一些實(shí)例:
Abus = {3{4'b1011}}; //位向量12'b1011_1011_1011)
Abus = {{4{Dbus[7]}}, Dbus}; /*符號擴展*/
{3{1'b1}} 結果為111
{3{Ack}} 結果與{Ack, Ack, Ack}相同。

表達式種類(lèi)

   常量表達式是在編譯時(shí)就計算出常數值的表達式。通常,常量表達式可由下列要素構成:
   1) 表示常量文字, 如'b10和326。
   2) 參數名,如RED的參數表明:

parameter RED = 4'b1110;

   標量表達式是計算結果為1位的表達式。



關(guān)鍵詞: Verilog表達式

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>