Ch2 - Verilog 資料型態
2.1 資料狀態
0 邏輯0
1 邏輯1
x或X 未知的值( Unknow )或浮接( Floating )
z或Z 高阻抗( High Impendence )
2.2 連接線Net ( wire、wand、wor )
- 沒有記憶性
- 預設值為z
- 將兩個wire連在一起是不允許的
- 若是型態為wand/wor則例外
範例:
module 模組名稱( a, b, c, d, e );
input a, b;
output c, d, e;
wire c;
wand d;
wor e;
// wire接一起 → 錯誤
assign c = a;
assign c = b;
// wire-and → d = a&b
assign d = a;
assign d = b;
// wire-or → e = a|b
assign e = a;
assign e = b;
endmodule
2.3 暫存器Register ( reg )
- 有記憶性
- 預設值為x ( 最好要初始化 )
範例:
module 模組名稱( a, b, c );
input a;
output b, c;
reg b, rTmp;
// 範例1
always @(*) begin
b = a;
end
// 範例2
assign c = rTmp;
endmodule
2.4 多進制表示
表示:
<位元長度> ’ <進制表示> <數值資料>
位元長度:以十進制表示位元長度(二進制長度)
進制表示:二進制(b)、八進制(o)、十進制(d)、十六進制(h),預設為十進制
數值資料:可用底線’_’來增加可讀性,數值內也可以混用X和Z
範例:
Num = 5’b01101 // 二進制
Num = 22; // 十進制
Num = 12’b0000_1111_0000; // 增加可讀性
Num = 4’hf; // 十六進制(二進制的1111)
Num = 4’bxxx1; // 前三位為未知,最後為1
Num = 4’bz01; // 前兩位為z,後兩位為01
2.5 數值資料
2.5.1 整數( integer )
- 沒有小數
- 一般長度為32位元
- 以2’s補數計算
- 常用在迴圈計數上
範例:
module Module_Int( In, Out );
input In;
output [7:0]Out;
wire In;
reg [7:0] Out = 8’h00;
always @(posedge CLK) begin
integer i;
for( i=0; i<=7; i=i+1 ) Tmp[i] <= In;
end
endmodule
2.5.2 其他(不詳述)
- 實數( real ):可具有小數,但不太常用
- 時間數字( time ):模擬時的時間設定
2.6 表示法
2.6.1 向量表示法
- [最高位元MSB : 最低位元LSB] 或 [最低位元LSB : 最高位元MSB]
範例:
/* 宣告 */
output [3:0] A; // A為4bit,A[3],A[2],A[1],A[0]
reg [0:3] B, C; // B為4 bit,B[0],B[1],B[2],B[3]
// C為4 bit,C[0],C[1],C[2],C[3]
wire [63:0] D; // D為64 bit
wire E; // E為1 bit
/* 使用 */
A[2:1] = B[0] & C[1:2]; // A[2] = 0&C[1],A[1] = B[0] & C[2]
B[0:1] = 0; // 清空B的最高(最左)2bit
C = 4’b1011; // C[0]=1,C[1]=0,C[2]=1,C[3]=1
2.6.2 陣列表示法
範例:
/* 宣告 */
integer [7:0] A [3:0]; // A為4個8bit的integer
reg B [3:0] [15:0]; // C為4*16個1bit的reg
reg [7:0] C [3:0] [15:0]; // C為4*16個8bit的reg
/* 使用 */
A[3] = 0; // 清除A陣列中第3個元素(內含8bit)
A = 0; // 把陣列全部清空
B[1][0] = 1; // 設定B陣列中[1][0]的元素為1
B[1] = 0; // 將[1][0]到[1][255]的元素都設為0
C[0][0][3:0] = 4b’0010; // 設定位置[0][0]的低4bit為0010
C[2][8][5] = 1 ; // 設定位置[2][8]的第5bit為1
2.6.3 記憶體表示法
- 由reg組成的陣列
範例:
/* 宣告 */
reg [15:0] A [1023:0] // 記憶體A由1024個16bit字元組成
/* 使用 */
A[128]; // 地址為128的字元(內含16bit)
2.7 參數( parameter )
- 是常數,不可改變也不能當作變數使用
- 但可以在初始化模組(使用)的時候重新定義
- 利於維護程式( 像C語言的define )
範例:
parameter Bit = 8, cnt_up = 1’b1;
output [Bit-1:0] A;
reg [Bit-1:0] A;
A = A + cnt_up;