在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

    
    
    <address id="vxupu"><td id="vxupu"></td></address>

      <pre id="vxupu"><small id="vxupu"></small></pre>
      <dfn id="vxupu"></dfn>
      <div id="vxupu"><small id="vxupu"></small></div>
    1. 新聞中心

      Verilog表達(dá)式

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

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

      操作數(shù)

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

      1.1 常數(shù)

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

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

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

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

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

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

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

      1.2 參數(shù)

        參數(shù)類(lèi)似于常量,并且使用參數(shù)聲明進(jìn)行說(shuō)明。下面是參數(shù)說(shuō)明實(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)說(shuō)明實(shí)例。

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

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

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

      1.4 寄存器

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

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

         整型寄存器中的值被解釋為有符號(hào)的二進(jìn)制補(bǔ)碼數(shù),而reg寄存器或時(shí)間寄存器中的值被解釋為無(wú)符號(hào)數(shù)。實(shí)數(shù)和實(shí)數(shù)時(shí)間類(lèi)型寄存器中的值被解釋為有符號(hào)浮點(diǎn)數(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)部分選擇。
      選擇范圍越界或?yàn)閤、z時(shí),部分選擇的值為x。

      1.7 存儲(chǔ)器單元

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

      memory [word_address]

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

         不允許對(duì)存儲(chǔ)器變量值部分選擇或位選擇。例如,

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

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

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

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

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

      操作符

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

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

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

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

      2.1 算術(shù)操作符

         算術(shù)操作符有:

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

         整數(shù)除法截?cái)嗳魏涡?shù)部分。例如:

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

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

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

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

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

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

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

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

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

      本文引用地址:http://www.biyoush.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è)賦值相同的值。這是因?yàn)锽ar只存儲(chǔ)無(wú)符號(hào)數(shù)。在第四個(gè)賦值中,Bar被賦于十進(jìn)制值-3。
         下面是另一些例子:

      Bar = 4 - 6;
      Tab = 4 - 6;
      Bar被賦于十進(jìn)制值62(-2的二進(jìn)制補(bǔ)碼),而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)系操作符的結(jié)果為真(1)或假(0)。如果操作數(shù)中有一位為X或Z,那么結(jié)果為X。例如:

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

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

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

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

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

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

         如果操作數(shù)的長(zhǎng)度不相等,長(zhǎng)度較小的操作數(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 (假)
      對(duì)于向量操作, 非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。
      如果任意一個(gè)操作數(shù)包含x,結(jié)果也為x。
      !x 結(jié)果為x

      2.5 按位操作符

         按位操作符有:

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

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

         例如,假定,
      A = 'b0110;
      B = 'b0100;
      那么:
      A | B 結(jié)果為0110
      A B 結(jié)果為0100
      如果操作數(shù)長(zhǎng)度不相等, 長(zhǎng)度較小的操作數(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ù)個(gè)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語(yǔ)句檢測(cè):

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

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

      2.7 移位操作符

         移位操作符有:

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

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

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

         Verilog HDL中沒(méi)有指數(shù)操作符。但是,移位操作符可用于支持部分指數(shù)操作。例如,如果要計(jì)算ZNumBits的值,可以使用移位操作實(shí)現(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;

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

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

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

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

      {expr1, expr2, . . .,exprN}

         實(shí)例如下所示:

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

      表達(dá)式種類(lèi)

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

      parameter RED = 4'b1110;

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



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

      評(píng)論


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

      關(guān)閉