Verilog HDL基礎教程之:數據類型和運算符
2.寄存器型變量
寄存器是數據儲存單元的抽象。寄存器型變量的關鍵字是reg。通過賦值語句可以改變寄存器儲存的值,其作用與改變觸發(fā)器儲存的值相當。
Verilog HDL語言提供了功能強大的結構語句使設計者能有效地控制是否執(zhí)行這些賦值語句。這些控制結構用來描述硬件觸發(fā)條件,例如時鐘的上升沿和多路器的選通信號。reg類型變量的缺省初始值為不定值,即x。
reg型變量常用來表示用于“always”模塊內的指定信號,常代表觸發(fā)器。通常,在設計中要由“always”塊通過使用行為描述語句來表達邏輯關系。在“always”塊內被賦值的每一個信號都必須定義成reg型。和wire型變量類似,reg型變量的聲明格式如下:
reg [n-1:0] 變量名1,變量名2,…,變量名i; //共有i條總線,每條總線內有n條線路
也可以如下表示:
reg [n:1] 變量名1,變量名2,…,變量名i; //共有i條總線,每條總線內有n條線路
其中,reg是reg型變量的確認標識符,[n-1:0]和[n:1]代表該變量的位寬,即該變量有幾位(bit),最后跟著的是變量的名字。如果一次定義多個變量,變量名之間用逗號隔開。聲明語句的最后要用分號表示語句結束。如下所示:
reg rega; //定義了一個一位的名為rega的reg型變量
reg [3:0] regb; //定義了一個四位的名為regb的reg型變量
reg [4:1] regc, regd; //定義了兩個四位的名為regc和regd的reg型變量
reg型變量可以賦正值,也可以賦負值。但當一個reg型變量是一個表達式中的操作數時,它的值將被當作是無符號值,即正值。例如:當一個四位的寄存器用作表達式中的操作數時,如果開始寄存器被賦以值-1,則在表達式中進行運算時,其值被認為是+15。
3.存儲器型變量
Verilog HDL通過對reg型變量建立數組來對存儲器建模,用于描述RAM型存儲器、ROM存儲器和reg文件。數組中的每一個單元通過一個數組索引進行尋址。由于在Verilog語言中沒有多維數組存在,因此memory型數據是通過擴展reg型數據的地址范圍來生成的。其格式如下:
reg [n-1:0] 存儲器名[m-1:0];
或:
reg [n-1:0] 存儲器名[m:1];
在這里,reg[n-1:0]定義了存儲器中每一個存儲單元的大小,即該存儲單元是一個n位的寄存器。存儲器名后的[m-1:0]或[m:1]則定義了該存儲器中有多少個這樣的寄存器。最后用分號結束定義語句。下面舉例說明:
reg [7:0] mema[255:0]; //定義一個名為mema的256×8的存儲器
這個例子定義了一個名為mema的存儲器,該存儲器有256個8位的存儲器。該存儲器的地址范圍是0~255。需要注意的是,對存儲器進行地址索引的表達式必須是常數表達式。
另外,在同一個數據類型聲明語句里,可以同時定義存儲器型數據和reg型數據。 例如:
parameter wordsize=16, memsize=256; //定義兩個參數
reg [wordsize-1:0] mem[memsize-1:0],writereg, readreg; //使用可變參數來定義存儲器
盡管memory型數據和reg型數據的定義格式很相似,但要注意其不同之處。如一個由n個1位寄存器構成的存儲器組是不同于一個n位的寄存器的,如下所示:
reg [n-1:0] rega; //一個n位的寄存器
reg mema [n-1:0]; //一個由n個1位寄存器構成的存儲器組
一個n位的寄存器可以在一條賦值語句里進行賦值,而一個完整的存儲器則不行,例如:
rega =0; //合法賦值語句
mema =0; //非法賦值語句
如果想對memory中的存儲單元進行讀寫操作,必須指定該單元在存儲器中的地址。下面的寫法是正確的。
mema[3]=0; //給memory中的第3個存儲單元賦值為0。
進行尋址的地址索引可以是表達式,這樣就可以對存儲器中的不同單元進行操作。表達式的值可以取決于電路中其他的寄存器的值。例如可以用一個加法計數器來做RAM的地址索引。
常用運算符
Verilog HDL語言的運算符范圍很廣,其運算符按其功能可分為以下幾類。
算術運算符:(+,-,×,/,%)。
賦值運算符:(=,=)。
關系運算符:(>,,>=,=)。
邏輯運算符:(,||,!)。
條件運算符:(?:)。
位運算符:(~,|,^,,^~)。
移位運算符:(,>>)。
拼接運算符:({ })。
其他
在Verilog HDL語言中運算符所帶的操作數是不同的,按其所帶操作數的個數運算符可分為以下3種。
單目運算符(unary operator):可以帶一個操作數,操作數放在運算符的右邊。
二目運算符(binary operator):可以帶兩個操作數,操作數放在運算符的兩邊。
三目運算符(ternary operator):可以帶三個操作數,這三個操作數用三目運算符分隔開。
例如:
clock = ~clock; // ~ 是一個單目取反運算符,clock是操作數。
c = a | b; // | 是一個二目按位或運算符,a 和 b是操作數。
r = s ? t : u; // ?: 是一個三目條件運算符,s,t,u是操作數。
下面對常用的幾種運算符進行介紹。
1.基本的算術運算符
在Verilog HDL語言中,算術運算符又稱為二進制運算符,共有下面幾種。
+:(加法運算符或正值運算符,如ega+regb、+3)。
−:(減法運算符或負值運算符,如rega−3、−3)。
´:(乘法運算符,如rega´3)。
/:(除法運算符,如5/3)。
% :(模運算符或求余運算符,要求%兩側均為整型數據,如7%3的值為1)。
在進行整數除法運算時,結果值要略去小數部分,只取整數部分。而進行取模運算時,結果值的符號位采用模運算式里第一個操作數的符號位,例如:
10%3 1 //余數為1
11%3 2 //余數為2
12%3 0 //余數為0,即無余數
-10%3 -1 //結果取第一個操作數的符號位,所以余數為-1
11%3 2 //結果取第一個操作數的符號位,所以余數為2.
注意 | 在進行算術運算操作時,如果某一個操作數有不確定的值x,則整個結果也為不定值x。 |
評論