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;