verilog REG 寄存器、向量、整数、实数、时间寄存器
寄存器(reg)
寄存器(reg)用來表示存儲單元,它會保持數據原有的值,直到被改寫。聲明舉例如下:
實例
reg?? ?clk_temp;
reg????flag1,?flag2?;
例如在 always 塊中,寄存器可能被綜合成邊沿觸發器,在組合邏輯中可能被綜合成 wire 型變量。寄存器不需要驅動源,也不一定需要時鐘信號。在仿真時,寄存器的值可在任意時刻通過賦值操作進行改寫。例如:
實例
reg?rstn?;
initial?begin
? ? rstn?=?1'b0?;
? ??#100?;
? ? rstn?=?1'b1?;
end
向量
當位寬大于 1 時,wire 或 reg 即可聲明為向量的形式。例如:
實例
reg?[3:0]?? ? ?counter?;????//聲明4bit位寬的寄存器counter
wire?[32-1:0]??gpio_data;???//聲明32bit位寬的線型變量gpio_data
wire?[8:2]?????addr?;???????//聲明7bit位寬的線型變量addr,位寬范圍為8:2
reg?[0:31]?????data?;???????//聲明32bit位寬的寄存器變量data, 最高有效位為0
對于上面的向量,我們可以指定某一位或若干相鄰位,作為其他邏輯使用。例如:
實例
wire?[9:0]?? ? data_low?=?data[0:9]?;
addr_temp[3:2]?=?addr[8:7]?+?1'b1?;
Verilog 支持可變的向量域選擇,例如:
實例
reg?[31:0]?? ? data1?;
reg?[7:0]?? ? ?byte1?[3:0];
integer?j?;
always@*?begin
? ??for?(j=0;?j<=3;j=j+1)?begin
? ? ? ? byte1[j]?=?data1[(j+1)*8-1?:?j*8];
? ? ? ??//把data1[7:0]…data1[31:24]依次賦值給byte1[0][7:0]…byte[3][7:0]
? ??end
end
Verillog 還支持指定 bit 位后固定位寬的向量域選擇訪問。
- [bit+: width]?: 從起始 bit 位開始遞增,位寬為 width。
- [bit-: width]?: 從起始 bit 位開始遞減,位寬為 width。
實例
//下面 2 種賦值是等效的
A?=?data1[31-:?8]?;
A?=?data1[31:24]?;
//下面 2 種賦值是等效的
B?=?data1[0+?:?8]?;
B?=?data1[0:7]?;
對信號重新進行組合成新的向量時,需要借助大括號。例如:
實例
wire?[31:0]?? ?temp1,?temp2?;
assign?temp1?=?{byte1[0][7:0],?data1[31:8]};??//數據拼接
assign?temp2?=?{32{1'b0}};??//賦值32位的數值0 ?
整數,實數,時間寄存器變量
整數,實數,時間等數據類型實際也屬于寄存器類型。
整數(integer)
整數類型用關鍵字 integer 來聲明。聲明時不用指明位寬,位寬和編譯器有關,一般為32 bit。reg 型變量為無符號數,而 integer 型變量為有符號數。例如:
實例
reg?[31:0]?? ? ?data1?;
reg?[3:0]?? ? ? byte1?[7:0];?//數組變量,后續介紹
integer?j?;??//整型變量,用來輔助生成數字電路
always@*?begin
? ??for?(j=0;?j<=3;j=j+1)?begin
? ? ? ? byte1[j]?=?data1[(j+1)*8-1?:?j*8];
? ? ? ??//把data1[7:0]…data1[31:24]依次賦值給byte1[0][7:0]…byte[3][7:0]
? ? ? ??end
end
此例中,integer 信號 j 作為輔助信號,將 data1 的數據依次賦值給數組 byte1。綜合后實際電路里并沒有 j 這個信號,j 只是輔助生成相應的硬件電路。
實數(real)
實數用關鍵字 real 來聲明,可用十進制或科學計數法來表示。實數聲明不能帶有范圍,默認值為 0。如果將一個實數賦值給一個整數,則只有實數的整數部分會賦值給整數。例如:
實例
real?? ? ? ?data1?;
integer?? ? temp?;
initial?begin
? ? data1?=?2e3?;
? ? data1?=?3.75?;
end
?
initial?begin
? ? temp?=?data1?;?//temp 值的大小為3
end
時間(time)
Verilog 使用特殊的時間寄存器 time 型變量,對仿真時間進行保存。其寬度一般為 64 bit,通過調用系統函數 $time 獲取當前仿真時間。例如:
實例
time?????? current_time?;
initial?begin
???????#100?;
?????? current_time?=?$time?;?//current_time 的大小為 100
end
總結
以上是生活随笔為你收集整理的verilog REG 寄存器、向量、整数、实数、时间寄存器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 战略家任正非
- 下一篇: 如歌岁月--之《老鹰之歌》