<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>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Verilog HDL基礎之:數據類(lèi)型和運算符

Verilog HDL基礎之:數據類(lèi)型和運算符

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

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

常用

Verilog HDL中總共有19種,是用來(lái)表示數字電路硬件中的數據儲存和傳送元素的。在本書(shū)中,我們先只介紹4個(gè)最基本的數據類(lèi)型,它們分別是:reg型,wire型,integer型和parameter型。

其他數據類(lèi)型在后面的章節里逐步介紹,讀者也可以查閱附錄中Verilog HDL語(yǔ)法參考書(shū)的有關(guān)章節逐步掌握。其他的類(lèi)型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型和wor型。

這些數據類(lèi)型除time型外都與基本邏輯單元建庫有關(guān),與系統設計沒(méi)有很大的關(guān)系。在一般電路設計自動(dòng)化的環(huán)境下,仿真用的基本部件庫是由半導體廠(chǎng)家和EDA工具廠(chǎng)家共同提供的。系統設計工程師不必過(guò)多地關(guān)心門(mén)級和開(kāi)關(guān)級的Verilog HDL語(yǔ)法現象。Verilog HDL語(yǔ)言中也有常量和變量之分,它們分別屬于以上這些類(lèi)型。下面對最常用的幾種進(jìn)行介紹。

常量

常量是在程序運行過(guò)程中其值不能被改變的量。下面首先對在Verilog HDL語(yǔ)言中使用的數字及其表示方式進(jìn)行介紹。

1.數字

(1)整數。

在Verilog HDL中,整型常量有以下4種進(jìn)制表示形式。

① 二進(jìn)制整數(b或B)。

② 十進(jìn)制整數(d或D)。

③ 十六進(jìn)制整數(h或H)。

④ 八進(jìn)制整數(o或O)。

數字表達方式有以下3種。

① 位寬>進(jìn)制>數字>,這是一種全面的描述方式。

② 進(jìn)制>數字>,在這種描述方式中,數字的位寬采用缺省位寬(這由具體的機器系統決定,但至少32位)。

③ 數字>,在這種描述方式中,采用缺省進(jìn)制十進(jìn)制。

在表達式中,位寬指明了數字的精確位數。例如:一個(gè)4位二進(jìn)制數數字的位寬為4,一個(gè)4位十六進(jìn)制數數字的位寬為16(因為每單個(gè)十六進(jìn)制數要用4位二進(jìn)制數來(lái)表示),如下例所示:

8b10101100 //位寬為8的數的二進(jìn)制表示,b表示二進(jìn)制

8ha2 //位寬為8的數的十六進(jìn)制,h表示十六進(jìn)制。

(2)x和z值。

在數字電路中,x代表不定值,z代表高阻值。一個(gè)x可以用來(lái)定義十六/八/二進(jìn)制數的四/三/一位二進(jìn)制數的狀態(tài)。z的表示方式同x類(lèi)似。z還有一種表達方式是可以寫(xiě)作?。在使用case表達式時(shí)建議使用這種寫(xiě)法,以提高程序的可讀性,如下例所示:

4b10x0 //位寬為4的二進(jìn)制數從低位數起第二位為不定值

4b101z //位寬為4的二進(jìn)制數從低位數起第一位為高阻值

12dz //位寬為12的十進(jìn)制數其值為高阻值(第一種表達方式)

12d? //位寬為12的十進(jìn)制數其值為高阻值(第二種表達方式)

8h4x //位寬為8的十六進(jìn)制數其低四位值為不定值

(3)負數。

一個(gè)數字可以被定義為負數,只需在位寬表達式前加一個(gè)減號,并且減號必須寫(xiě)在數字定義表達式的最前面。注意減號不可以放在位寬和進(jìn)制之間,也不可以放在進(jìn)制和具體的數之間,如下例所示:

-8d5 //這個(gè)表達式代表5的補數(用8位二進(jìn)制數表示)

8d-5 //非法格式

(4)下劃線(xiàn)(underscore_)。

下劃線(xiàn)可以用來(lái)分隔數字的表達以提高程序可讀性。但不可以用在位寬和進(jìn)制處,只能用在具體的數字之間,例如:

16b1010_1011_1111_1010 //合法格式

8b_0011_1010 //非法格式

當常量不聲明位數時(shí),默認值是32位,每個(gè)字母用8位的ASCII值表示,例如:

10=32d10=32b1010 //十進(jìn)制和二進(jìn)制

1=32d1=32b1 //十進(jìn)制和二進(jìn)制

-1=-32d1=32hFFFFFFFF //十進(jìn)制和十六進(jìn)制

BX=32BX=32BXXXXXXX…X //默認聲明為32位

AB=16B01000001_01000010 //每個(gè)字母用8位表示

2.參數(Parameter)

在Verilog HDL中用parameter來(lái)定義常量,即用parameter來(lái)定義一個(gè)標識符代表一個(gè)常量,稱(chēng)為符號常量,即標識符形式的常量。采用標識符代表一個(gè)常量可提高程序的可讀性和可維護性。parameter型數據是一種常數型的數據,其說(shuō)明格式如下:

Parameter 參數名1=表達式,參數名2=表達式, …, 參數名n=表達式;

parameter是參數型數據的確認符,確認符后跟著(zhù)一個(gè)用逗號分隔開(kāi)的賦值語(yǔ)句表。在每一個(gè)賦值語(yǔ)句的右邊必須是一個(gè)常數表達式。也就是說(shuō),該表達式只能包含數字或先前已定義過(guò)的參數,例如:

parameter msb=7; //定義參數msb為常量7

parameter e=25, f=29; //定義兩個(gè)常數參數

parameter r=5.7; //聲明r為一個(gè)實(shí)型參數

parameter byte_size=8, byte_msb=byte_size-1; //用常數表達式賦值

parameter average_delay = (r+f)/2; //用常數表達式賦值

參數型常數經(jīng)常用于定義延遲時(shí)間和變量寬度。在模塊或實(shí)例引用時(shí)可通過(guò)參數傳遞改變在被引用模塊或實(shí)例中已定義的參數。下面將通過(guò)一個(gè)例子進(jìn)一步說(shuō)明在層次調用的電路中改變參數常用的一些用法。

module Decode(A,F); //模塊聲明

parameter Width=1, Polarity=1; //參數聲明

……………

endmodule

module Top;

wire[3:0] A4; //連線(xiàn)資源聲明

wire[4:0] A5;

wire[15:0] F16;

wire[31:0] F32;

Decode #(4,0) D1(A4,F16); //模塊引用,并傳遞參數(4,0)

Decode #(5) D2(A5,F32); //模塊引用,并傳遞參數(5)

endmodule

在引用Decode實(shí)例時(shí),D1和D2的Width將采用不同的值,分別為4和5,且D1的Polarity將為0??捎美又兴玫姆椒▉?lái)改變參數,即用“#(4,0)”向D1中傳遞“Width=4,Polarity=0”,用“#(5)”向D2中傳遞“Width=5,Polarit=1”。

變量

變量是在程序運行過(guò)程中,其值可以改變的量。在Verilog HDL中變量類(lèi)型有很多種,這里只對常用的幾種變量進(jìn)行介紹。

1.

網(wǎng)絡(luò )類(lèi)型表示結構實(shí)體(例如門(mén))之間的物理連接。網(wǎng)絡(luò )類(lèi)型的變量不能儲存值,而且它必需受到驅動(dòng)器(例如門(mén)或連續賦值語(yǔ)句,assign)的驅動(dòng)。如果沒(méi)有驅動(dòng)器連接到網(wǎng)絡(luò )類(lèi)型的變量上,則該變量就是高阻的,即其值為z。

常用的包括wire型和tri型。這兩種變量都是用于連接器件單元,它們具有相同的語(yǔ)法格式和功能。之所以提供這兩種名字來(lái)表達相同的概念是為了與模型中所使用的變量的實(shí)際情況相一致。

wire型變量通常是用來(lái)表示單個(gè)門(mén)驅動(dòng)或連續賦值語(yǔ)句驅動(dòng)的網(wǎng)絡(luò )型數據,tri型變量則用來(lái)表示多驅動(dòng)器驅動(dòng)的網(wǎng)絡(luò )型數據。如果wire型或tri型變量沒(méi)有定義邏輯強度(logic strength),在多驅動(dòng)源的情況下,邏輯值會(huì )發(fā)生沖突,從而產(chǎn)生不確定值。

表1所示為在同等驅動(dòng)強度下,兩個(gè)驅動(dòng)源驅動(dòng)的wire型和tri型變量的真值表。

表1 wire/tri型變量真值表

wire/tri型變量雙驅動(dòng)源運算結果

驅動(dòng)源1

驅動(dòng)源2

0

1

x

z

0

0

x

x

0

1

1

x

1

x

x

x

x

x

z

0

1

x

z

wire型變量常用來(lái)表示用于以assign關(guān)鍵字指定的組合邏輯信號。Verilog程序模塊中輸入/輸出信號類(lèi)型缺省時(shí)自動(dòng)定義為wire型。wire型變量可以用作任何方程式的輸入,也可以用作“assign”語(yǔ)句或實(shí)例元件的輸出。wire型變量的聲明格式如下:

wire [n-1:0] 變量名1,變量名2,…,變量名i; //共有i條總線(xiàn),每條總線(xiàn)內有n條線(xiàn)路

也可以如下表示:

wire [n:1] 變量名1,變量名2,…,變量名i; //共有i條總線(xiàn),每條總線(xiàn)內有n條線(xiàn)路

其中,wire是wire型變量的確認符,[n-1:0]和[n:1]代表該變量的位寬,即該變量有幾位,最后跟著(zhù)的是變量的名字。如果一次定義多個(gè)變量,變量名之間用逗號隔開(kāi)。聲明語(yǔ)句的最后要用分號表示語(yǔ)句結束。如下所示:

wire a; //定義了一個(gè)一位的wire型變量

wire [7:0] b; //定義了一個(gè)八位的wire型變量

wire [4:1] c, d; //定義了兩個(gè)四位的wire型變量

2.寄存器型變量

寄存器是數據儲存單元的抽象。寄存器型變量的關(guān)鍵字是reg。通過(guò)賦值語(yǔ)句可以改變寄存器儲存的值,其作用與改變觸發(fā)器儲存的值相當。

Verilog HDL語(yǔ)言提供了功能強大的結構語(yǔ)句使設計者能有效地控制是否執行這些賦值語(yǔ)句。這些控制結構用來(lái)描述硬件觸發(fā)條件,例如時(shí)鐘的上升沿和多路器的選通信號。reg類(lèi)型變量的缺省初始值為不定值,即x。

reg型變量常用來(lái)表示用于“always”模塊內的指定信號,常代表觸發(fā)器。通常,在設計中要由“always”塊通過(guò)使用行為描述語(yǔ)句來(lái)表達邏輯關(guān)系。在“always”塊內被賦值的每一個(gè)信號都必須定義成reg型。和wire型變量類(lèi)似,reg型變量的聲明格式如下:

reg [n-1:0] 變量名1,變量名2,…,變量名i; //共有i條總線(xiàn),每條總線(xiàn)內有n條線(xiàn)路

也可以如下表示:

reg [n:1] 變量名1,變量名2,…,變量名i; //共有i條總線(xiàn),每條總線(xiàn)內有n條線(xiàn)路

其中,reg是reg型變量的確認標識符,[n-1:0]和[n:1]代表該變量的位寬,即該變量有幾位(bit),最后跟著(zhù)的是變量的名字。如果一次定義多個(gè)變量,變量名之間用逗號隔開(kāi)。聲明語(yǔ)句的最后要用分號表示語(yǔ)句結束。如下所示:

reg rega; //定義了一個(gè)一位的名為rega的reg型變量

reg [3:0] regb; //定義了一個(gè)四位的名為regb的reg型變量

reg [4:1] regc, regd; //定義了兩個(gè)四位的名為regc和regd的reg型變量

reg型變量可以賦正值,也可以賦負值。但當一個(gè)reg型變量是一個(gè)表達式中的操作數時(shí),它的值將被當作是無(wú)符號值,即正值。例如:當一個(gè)四位的寄存器用作表達式中的操作數時(shí),如果開(kāi)始寄存器被賦以值-1,則在表達式中進(jìn)行運算時(shí),其值被認為是+15。

3.存儲器型變量

Verilog HDL通過(guò)對reg型變量建立數組來(lái)對存儲器建模,用于描述RAM型存儲器、ROM存儲器和reg文件。數組中的每一個(gè)單元通過(guò)一個(gè)數組索引進(jìn)行尋址。由于在Verilog語(yǔ)言中沒(méi)有多維數組存在,因此memory型數據是通過(guò)擴展reg型數據的地址范圍來(lái)生成的。其格式如下:

reg [n-1:0] 存儲器名[m-1:0];

或:

reg [n-1:0] 存儲器名[m:1];

在這里,reg[n-1:0]定義了存儲器中每一個(gè)存儲單元的大小,即該存儲單元是一個(gè)n位的寄存器。存儲器名后的[m-1:0]或[m:1]則定義了該存儲器中有多少個(gè)這樣的寄存器。最后用分號結束定義語(yǔ)句。下面舉例說(shuō)明:

reg [7:0] mema[255:0]; //定義一個(gè)名為mema的256×8的存儲器

這個(gè)例子定義了一個(gè)名為mema的存儲器,該存儲器有256個(gè)8位的存儲器。該存儲器的地址范圍是0~255。需要注意的是,對存儲器進(jìn)行地址索引的表達式必須是常數表達式。

另外,在同一個(gè)數據類(lèi)型聲明語(yǔ)句里,可以同時(shí)定義存儲器型數據和reg型數據。 例如:

parameter wordsize=16, memsize=256; //定義兩個(gè)參數

reg [wordsize-1:0] mem[memsize-1:0],writereg, readreg; //使用可變參數來(lái)定義存儲器

盡管memory型數據和reg型數據的定義格式很相似,但要注意其不同之處。如一個(gè)由n個(gè)1位寄存器構成的存儲器組是不同于一個(gè)n位的寄存器的,如下所示:

reg [n-1:0] rega; //一個(gè)n位的寄存器

reg mema [n-1:0]; //一個(gè)由n個(gè)1位寄存器構成的存儲器組

一個(gè)n位的寄存器可以在一條賦值語(yǔ)句里進(jìn)行賦值,而一個(gè)完整的存儲器則不行,例如:

rega =0; //合法賦值語(yǔ)句

mema =0; //非法賦值語(yǔ)句

如果想對memory中的存儲單元進(jìn)行讀寫(xiě)操作,必須指定該單元在存儲器中的地址。下面的寫(xiě)法是正確的。

mema[3]=0; //給memory中的第3個(gè)存儲單元賦值為0。

進(jìn)行尋址的地址索引可以是表達式,這樣就可以對存儲器中的不同單元進(jìn)行操作。表達式的值可以取決于電路中其他的寄存器的值。例如可以用一個(gè)加法計數器來(lái)做RAM的地址索引。

常用

Verilog HDL語(yǔ)言的范圍很廣,其按其功能可分為以下幾類(lèi)。

  • 算術(shù)運算符:(+,-,×,/,%)。
  • 賦值運算符:(=,=)。
  • 關(guān)系運算符:(>,,>=,=)。
  • 邏輯運算符:(,||,!)。
  • 條件運算符:(?:)。
  • 位運算符:(~,|,^,,^~)。
  • 移位運算符:(,>>)。
  • 拼接運算符:({ })。
  • 其他

在Verilog HDL語(yǔ)言中運算符所帶的操作數是不同的,按其所帶操作數的個(gè)數運算符可分為以下3種。

單目運算符(unary operator):可以帶一個(gè)操作數,操作數放在運算符的右邊。

二目運算符(binary operator):可以帶兩個(gè)操作數,操作數放在運算符的兩邊。

三目運算符(ternary operator):可以帶三個(gè)操作數,這三個(gè)操作數用三目運算符分隔開(kāi)。

例如:

clock = ~clock; // ~ 是一個(gè)單目取反運算符,clock是操作數。

c = a | b; // | 是一個(gè)二目按位或運算符,a 和 b是操作數。

r = s ? t : u; // ?: 是一個(gè)三目條件運算符,s,t,u是操作數。

下面對常用的幾種運算符進(jìn)行介紹。

1.基本的算術(shù)運算符

在Verilog HDL語(yǔ)言中,算術(shù)運算符又稱(chēng)為二進(jìn)制運算符,共有下面幾種。

  • +:(加法運算符或正值運算符,如ega+regb、+3)。
  • −:(減法運算符或負值運算符,如rega−3、−3)。
  • ´:(乘法運算符,如rega´3)。
  • /:(除法運算符,如5/3)。
  • % :(模運算符或求余運算符,要求%兩側均為整型數據,如7%3的值為1)。

在進(jìn)行整數除法運算時(shí),結果值要略去小數部分,只取整數部分。而進(jìn)行取模運算時(shí),結果值的符號位采用模運算式里第一個(gè)操作數的符號位,例如:

10%3 1 //余數為1

11%3 2 //余數為2

12%3 0 //余數為0,即無(wú)余數

-10%3 -1 //結果取第一個(gè)操作數的符號位,所以余數為-1

11%3 2 //結果取第一個(gè)操作數的符號位,所以余數為2.

注意

在進(jìn)行算術(shù)運算操作時(shí),如果某一個(gè)操作數有不確定的值x,則整個(gè)結果也為不定值x。

2.位運算符

Verilog HDL作為一種硬件描述語(yǔ)言是針對硬件電路而言的。在硬件電路中信號有4種狀態(tài)值1、0、x和z。在電路中信號進(jìn)行與或非時(shí),反映在Verilog HDL中則是相應的操作數的位運算。Verilog HDL提供了以下5種位運算符。

  • ~ :(取反)
  • :(按位與)
  • | :(按位或)
  • ^ :(按位異或)
  • ^~:(按位同或(異或非))

說(shuō)明:

  • 位運算符中除了~是單目運算符以外,均為二目運算符,即要求運算符兩側各有一個(gè)操作數。
  • 位運算符中的二目運算符要求對兩個(gè)操作數的相應位進(jìn)行運算操作。

下面對各運算符分別進(jìn)行介紹。

“取反”運算符~

~是一個(gè)單目運算符,用來(lái)對一個(gè)操作數進(jìn)行按位取反運算。如表2所示為單目運算符~的運算規則表。

表2 ~ 運算規則表

~運算

操 作 數

結 果

1

0

0

1

x

x

舉例說(shuō)明:

rega=b1010; //rega的初值為b1010

rega=~rega; //rega的值進(jìn)行取反運算后變?yōu)閎0101

“按位與”運算符

按位與運算就是將兩個(gè)操作數的相應位進(jìn)行與運算,其運算規則如表3所示。

表3 運算規則表

運算

操作數1

操作數2

0

1

x

0

0

0

0

1

0

1

x

x

0

x

x

“按位或”運算符 |

按位或運算就是將兩個(gè)操作數的相應位進(jìn)行或運算,其運算規則如表4所示。

表4 | 運算規則表

| 運算

操作數1

操作數2

0

1

x

0

0

1

x

1

1

1

1

x

x

1

x

“按位異或”運算符^(也稱(chēng)之為XOR運算符)

按位異或運算就是將兩個(gè)操作數的相應位進(jìn)行異或運算,其運算規則如表5所示。

表5 ^ 運算規則表

^ 運算

操作數1

操作數2

0

1

x

0

0

1

x

1

1

0

x

x

x

x

x

“按位同或”運算符^~

按位同或運算就是將兩個(gè)操作數的相應位先進(jìn)行異或運算再進(jìn)行非運算,其運算規則如表6所示。

表6 ^~ 運算規則表

^~ 運算

操作數1

操作數2

0

1

x

0

1

0

x

1

0

1

x

x

x

x

x

不同長(cháng)度的數據進(jìn)行位運算

兩個(gè)長(cháng)度不同的數據進(jìn)行位運算時(shí),系統會(huì )自動(dòng)將兩者按右端對齊。位數少的操作數會(huì )在相應的高位用0填滿(mǎn),以使兩個(gè)操作數按位進(jìn)行操作。

3.邏輯運算符

在Verilog HDL語(yǔ)言中存在3種邏輯運算符。

  • :(邏輯與)
  • ||:(邏輯或)
  • ! :(邏輯非)

“”和“||”是二目運算符,它要求有兩個(gè)操作數,如(a>b)(b>c),(ab)||(bc)。“!”是單目運算符,只要求一個(gè)操作數,如!(a>b)。如表7所示為邏輯運算的真值表。它表示當a和b的值為不同的組合時(shí),各種邏輯運算所得到的值。

表7 邏輯運算真值表

操 作 數

邏輯運算及結果

a

b

!a

!b

ab

a||b

邏輯運算符中“”和“||”的優(yōu)先級別低于關(guān)系運算符,“!”的優(yōu)先級別高于算術(shù)運算符,例如。

(a>b)(x>y) 可寫(xiě)成: a>b x>y

(a==b)||(x==y) 可寫(xiě)成: a==b || x==y

(!a)||(a>b) 可寫(xiě)成: !a || a>b

為了提高程序的可讀性,明確表達各運算符間的優(yōu)先關(guān)系,建議使用括號。

4.關(guān)系運算符

關(guān)系運算符共有以下4種。

  • a b:(a小于b)
  • a > b:(a大于b)
  • a = b:(a小于或等于b)
  • a >= b:(a大于或等于b)

在進(jìn)行關(guān)系運算時(shí),如果聲明的關(guān)系是假的(flase),則返回值是0;如果聲明的關(guān)系是真的(true),則返回值是1;如果某個(gè)操作數的值不定,則關(guān)系是模糊的,返回值是不定值。

所有的關(guān)系運算符有著(zhù)相同的優(yōu)先級別。關(guān)系運算符的優(yōu)先級別低于算術(shù)運算符的優(yōu)先級別,例如。

a size-1 //這種表達方式等同于下面一行的表達方式

a (size-1)

size - (1 a) //這種表達方式不等同于下面一行的表達方式

size - 1 a

從上面的例子可以看出這兩種不同運算符的優(yōu)先級別。當表達式size -(1a)進(jìn)行運算時(shí),關(guān)系表達式先被運算,然后返回結果值0或1被size減去。而當表達式 size -1a 進(jìn)行運算時(shí),size先被減去1,然后再同a相比。

5.等式運算符

在Verilog HDL語(yǔ)言中存在4種等式運算符。

  • = =:(等于)
  • != :(不等于)
  • = = =:(等于)
  • != =:(不等于)

這4個(gè)運算符都是二目運算符,它要求有兩個(gè)操作數。“= =”和“!=”又稱(chēng)為邏輯等式運算符,其結果由兩個(gè)操作數的值決定。由于操作數中某些位可能是不定值x和高阻值z,結果可能為不定值x。

“= = =”和“!= =”運算符則不同,它在對操作數進(jìn)行比較時(shí),對某些位的不定值x和高阻值z也進(jìn)行比較。兩個(gè)操作數必需完全一致,其結果才是1,否則為0。“= = =”和“!= =”運算符常用于case表達式的判別,所以又稱(chēng)為“case等式運算符”。

這4個(gè)等式運算符的優(yōu)先級別是相同的。下面畫(huà)出“= =”與“= = =”的真值表,幫助理解兩者間的區別。

表8 等式運算符真值表

= = = 運算

操作數1

操作數2

0

1

x

z

0

1

0

0

0

1

0

1

0

0

x

0

0

1

0

z

0

0

0

1

= = 運算

操作數1

操作數2

0

1

x

z

0

1

0

x

x

1

0

1

x

x

x

x

x

x

x

z

x

x

x

x

下面舉一個(gè)例子說(shuō)明“= =”與“= = =”的區別。

if(A==1’bx) $display( AisX ); //當A等于X時(shí),這個(gè)語(yǔ)句不執行

if(A===1’bx) $display( AisX ); //當A等于X時(shí),這個(gè)語(yǔ)句執行

6.移位運算符

在Verilog HDL中有兩種移位運算符。

:(左移位運算符)

>>:(右移位運算符)

其使用方法如下:

a >> n;

a n;

a代表要進(jìn)行移位的操作數,n代表要移幾位。這兩種移位運算都用0來(lái)填補移出的空位。下面舉例說(shuō)明:

module shift;

reg [3:0] start, result;

initial begin

start = 1; //start在初始時(shí)刻設為值0001

result = (start2); //移位后,start的值0100,然后賦給result

end

endmodule

從上面的例子可以看出,start在移過(guò)兩位以后,用0來(lái)填補空出的位。進(jìn)行移位運算時(shí)應注意移位前后變量的位數,下面舉例說(shuō)明。

4’b10011 = 5’b10010; //左移1位后用0填補低位

4’b10012 = 6’b100100; //左移2位后用00填補低位

16 = 32’b1000000; //左移6位后用000000填補低位

4’b1001>>1 = 4’b0100; //右移1位后,低1位丟失,高1位用0填補

4’b1001>>4 = 4’b0000; //右移4位后,低4位丟失,高4位用0填補

7.位拼接運算符(Concatation)

在Verilog HDL語(yǔ)言有一個(gè)特殊的運算符:位拼接運算符{}。用這個(gè)運算符可以把兩個(gè)或多個(gè)信號的某些位拼接起來(lái)進(jìn)行運算操作。其使用方法如下:

{信號1的某幾位,信號2的某幾位,..,..,信號n的某幾位}

即把某些信號的某些位詳細地列出來(lái),中間用逗號分開(kāi),最后用大括號括起來(lái)表示一個(gè)整體信號,例如:

{a,b[3:0],w,3’b101}

也可以寫(xiě)成為:

{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}

在位拼接表達式中不允許存在沒(méi)有指明位數的信號。這是因為在計算拼接信號的位寬的大小時(shí)必需知道其中每個(gè)信號的位寬。

位拼接也可以用重復法來(lái)簡(jiǎn)化表達式,如下所示:

{4{w}} //等同于{w,w,w,w}

位拼接還可以用嵌套的方式來(lái)表達,如下所示:

{b,{3{a,b}}} //等同于{b,a,b,a,b,a,b}

用于表示重復的表達式必須是常數表達式,如上例中的4和3。

8.縮減運算符(reduction operator)

縮減運算符是單目運算符,也有與、或、非運算。其與、或、非運算規則類(lèi)似于位運算符的與、或、非運算規則,但其運算過(guò)程不同。位運算是對操作數的相應位進(jìn)行與、或、非運算,操作數是幾位數,則運算結果也是幾位數。而縮減運算則不同,縮減運算是對單個(gè)操作數進(jìn)行與、或、非遞推運算,最后的運算結果是一位的二進(jìn)制數。

縮減運算的具體運算過(guò)程如下。

(1)先將操作數的第一位與第二位進(jìn)行與、或、非運算。

(2)將運算結果與第三位進(jìn)行與、或、非運算,依次類(lèi)推,直至最后一位。

例如:

reg [3:0] B;

reg C;

C = B;

相當于:

C =( ( B[0]B[1] ) B[2] ) B[3];

由于縮減運算的與、或、非運算規則類(lèi)似于位運算符與、或、非運算規則,這里不再詳細講述,可參照位運算符的運算規則介紹。

9.優(yōu)先級別

各種運算符的優(yōu)先級別關(guān)系如表9所示。

表9 運算符優(yōu)先級別表

運 算 符

優(yōu) 先 級 別

! ~

* / %

+ -

>>

= > >=

== != === !==

^ ^~

|

||

? :



評論


相關(guān)推薦

技術(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>