<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          Verilog表達(dá)式

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

          表達(dá)式由操作數(shù)和操作符組成。表達(dá)式可以在出現(xiàn)數(shù)值的任何地方使用。

          操作數(shù)

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

          1.1 常數(shù)

            下面是一些實例。

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

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

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

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

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

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

          1.2 參數(shù)

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

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

          1.3 線網(wǎng)

             可在表達(dá)式中使用標(biāo)量線網(wǎng)(1位)和向量線網(wǎng)(多位)。下面是線網(wǎng)說明實例。

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

             線網(wǎng)中的值被解釋為無符號數(shù)。在連續(xù)賦值語句中,

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

          1.4 寄存器

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

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

             整型寄存器中的值被解釋為有符號的二進(jìn)制補(bǔ)碼數(shù),而reg寄存器或時間寄存器中的值被解釋為無符號數(shù)。實數(shù)和實數(shù)時間類型寄存器中的值被解釋為有符號浮點數(shù)。

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

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

          1.5 位選擇

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

          net_or_reg_vector [bit_select_expr]

             下面是表達(dá)式中應(yīng)用位選擇的例子。

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

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

          1.6 部分選擇

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

          net_or_reg_vector [msb_const_expr:1sb_const_expr]

             其中范圍表達(dá)式必須為常數(shù)表達(dá)式。例如。

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

          1.7 存儲器單元

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

          memory [word_address]

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

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

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

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

          1.8 函數(shù)調(diào)用

             表達(dá)式中可使用函數(shù)調(diào)用。函數(shù)調(diào)用可以是系統(tǒng)函數(shù)調(diào)用(以$字符開始)或用戶定義的函數(shù)調(diào)用。例如:

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

          操作符

             Verilog HDL中的操作符可以分為下述類型:

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

             下表顯示了所有操作符的優(yōu)先級和名稱。操作符從最高優(yōu)先級(頂行)到最低優(yōu)先級(底行)排列。同一行中的操作符優(yōu)先級相同。
             除條件操作符從右向左關(guān)聯(lián)外,其余所有操作符自左向右關(guān)聯(lián)。下面的表達(dá)式:

          A + B - C
          等價于:
          (A + B ) - C //自左向右
          而表達(dá)式:
          A ? B : C ? D : F
          等價于:
          A ? B : (C ? D : F) //從右向左
          圓擴(kuò)號能夠用于改變優(yōu)先級的順序,如以下表達(dá)式:
          (A ? B : C) ? D : F

          2.1 算術(shù)操作符

             算術(shù)操作符有:

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

             整數(shù)除法截斷任何小數(shù)部分。例如:

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

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

          'b10x1 + 'b01111 結(jié)果為不確定數(shù)'bxxxxx

          1. 算術(shù)操作結(jié)果的長度
             算術(shù)表達(dá)式結(jié)果的長度由最長的操作數(shù)決定。在賦值語句下,算術(shù)操作結(jié)果的長度由操作符左端目標(biāo)長度決定。考慮如下實例:

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

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

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

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

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

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

          -4'd12 / 4 //結(jié)果是1073741821。
          -12 / 4 //結(jié)果是-3

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

          本文引用地址:http://www.ex-cimer.com/article/201706/349519.htm


             下面為具體實例:

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

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

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

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

             下面為另一個實例:

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

          2.2 關(guān)系操作符

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

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

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

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

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

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

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

             如果比較結(jié)果為假,則結(jié)果為0;否則結(jié)果為1。在全等比較中,值x和z嚴(yán)格按位比較。也就是說,不進(jìn)行解釋,并且結(jié)果一定可知。而在邏輯比較中,值x和z具有通常的意義,且結(jié)果可以不為x。也就是說,在邏輯比較中,如果兩個操作數(shù)之一包含x或z,結(jié)果為未知的值(x)。
             如下例,假定:

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

             如果操作數(shù)的長度不相等,長度較小的操作數(shù)在左側(cè)添0補(bǔ)位,例如:

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

          2.4 邏輯操作符

             邏輯操作符有:

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

             這些操作符在邏輯值0或1上操作。邏輯操作的結(jié)構(gòu)為0或1。例如, 假定:

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

          2.5 按位操作符

             按位操作符有:

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

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

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

          2.6 歸約操作符

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

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

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

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

          2.7 移位操作符

             移位操作符有:

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

             移位操作符左側(cè)操作數(shù)移動右側(cè)操作數(shù)表示的次數(shù),它是一個邏輯移位??臻e位添0補(bǔ)位。如果右側(cè)操作數(shù)的值為x或z, 移位操作的結(jié)果為x。假定:

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

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

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

          2.8 條件操作符

             條件操作符根據(jù)條件表達(dá)式的值選擇表達(dá)式,形式如下:

          cond_expr ? expr1 : expr2

          如果cond_expr 為真(即值為1),選擇expr1;如果cond_expr為假(值為0),選擇expr2。 如果cond_expr 為x或z,結(jié)果將是按以下邏輯expr1和expr2按位操作的值: 0與0得0,1與1得1,其余情況為x。
          如下所示:

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

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

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

          2.9 連接和復(fù)制操作

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

          {expr1, expr2, . . .,exprN}

             實例如下所示:

          wire [7:0] Dbus;
          wire [11:0] Abus;

          assign Dbus [7:4] = {Dbus [0], Dbus [1], Dbus[2], Dbus[3]};
          //以反轉(zhuǎn)的順序?qū)⒌投?位賦給高端4位。
          assign Dbus = {Dbus [3:0], Dbus [7:4]};
          //高4位與低4位交換。
          由于非定長常數(shù)的長度未知, 不允許連接非定長常數(shù)。例如, 下列式子非法:
          {Dbus,5} //不允許連接操作非定長常數(shù)。
          復(fù)制通過指定重復(fù)次數(shù)來執(zhí)行操作。形式如下:
          {repetition_number {expr1, expr2, ...,exprN}}
          以下是一些實例:
          Abus = {3{4'b1011}}; //位向量12'b1011_1011_1011)
          Abus = {{4{Dbus[7]}}, Dbus}; /*符號擴(kuò)展*/
          {3{1'b1}} 結(jié)果為111
          {3{Ack}} 結(jié)果與{Ack, Ack, Ack}相同。

          表達(dá)式種類

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

          parameter RED = 4'b1110;

             標(biāo)量表達(dá)式是計算結(jié)果為1位的表達(dá)式。



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

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();