ためになるホームページ お問い合わせ




TOP > Verilog > Verilogのコーディング
定数の表現
<ビット幅>'<基数><数値>
  • ビット幅・・・ビット幅を指定。省略すると32ビットとなる。
  • 基数・・・b,B:2進数、o,O:8進数、d,D:10進数、h,H:16進数。省略すると10進数となる。
  • 数値・・・数値を記述。アンダースコア(_)でビットを区切ることも可能。数値以外に使えるのは、x(不定値)とz(高インピーダンス)。ただし、10進数では、xとzは使えない。

  • 定数の記述の例
    2'b01;        //2ビット幅の2進数01
    10;           //32ビット幅の10進数10
    8'hFF;        //8ビット幅の16進数FF
    8'b0000_1111; //8ビット幅の2進数00001111
    
    

    信号の宣言
    モジュール内で記述する信号は、全て型宣言をする。
  • レジスタ型・・・ラッチやフリップフロップ(値を保持する)。レジスタ型信号への代入は、always文、initial文、task、functionの中だけ。
  • ネット型・・・配線部分(値を保持できない)。ネット型信号への代入はassign文の中だけ。

  • 多ビット信号
    ビット幅を持った信号を宣言するには、ビット幅を[MSB:LSB]で宣言してあげる必要がある。範囲を指定しないと1bitとなる。また、1行に複数のビット幅の信号を宣言する事はできない。ちなみに、多ビットの信号は符号なしの整数として扱われる

    信号の宣言の例
    wire [3:0] a,b;    //4ビット幅のネット型a,bの宣言
    reg CLK;           //1ビット幅のレジスタ型cの宣言
    //以下のコードは不可
    //wire [3:0]d, [5:0] e; //複数のビット幅を指定できない
    
    

    多ビット信号のビット選択と部分選択
    ある多ビット信号のビット選択をする際は、信号名の右辺に[ビット値]をつける。また、ビット範囲を選択する(複数ビット)をする際には、信号名の右辺に[MSB:LSB]を指定する。
    宣言した範囲外を指定した場合は不定値となり、範囲外のビットへの代入は文法エラーとなる。

    多ビット信号のビット選択と部分選択の例
    wire [7:0] dbus;
    wire [3:0] d_low;
    wire MSB; LSB, aaa;
    assign MSB = dbus[7];      //MSBを代入
    assign LSB = dbus[0];      //LSBを代入
    assign d_low = dbus[3:0];  //多ビットを代入
    assign aaa = dbus[8];      //不定値
    
    

    レジスタ配列(メモリ)
    レジスタ配列を作成するには、信号名の後に配列の数を指定してあげる。レジスタ配列は、ビット選択や部分選択はできず必ず宣言したビット幅でしかアクセスできない。

    レジスタ配列の例
    reg [31:0] mem [0:31];        //32ビットレジスタ配列32ワード
    wire [31:0] tmp;
    assign tmp = mem[10];         //10ワード目の情報をtmpに代入
    assign tmp[0] = mem[0];       //0ワード目のLSBを代入(tmpの0ビット目は、mem[0]のLSBが入る)
    assign tmp[7:0] = mem[0];     //0ワード目下位4ビットを代入(tmpの下位4ビットは、mem[0]の下位4ビットが入る)
    
    

    連結演算
    連結演算子{}を用いる事により、ビット操作を楽にできる。複数のビットを連結する際、左側の値が重いビットとして扱われる。

    連結演算の例
    wire [15:0] bus;
    wire [7:0] high_data, low_data, tmp;
    wire msb_bit;
    assign bus = {high_data, low_data};            //8bit8bitで、16bitになる
    assign {msb_bit, tmp} = low_data + high_data;  //8bit+8bitで9bitになるが、桁上がりのビットをmsb_bitに入れる
    assign bus = { 8{2'b01} };                     //2bitの01を8回busに入れる(0101010101010101)
    
    

    リダクション演算
    項の先頭に演算子をつける単行演算子。ビット幅をもった信号内の全てのビットに対し作用する。結果は1ビットとなる。

    リダクション演算の例
    reg [7:0] cnt;
    wire tmp;
    assign tmp = & cnt; //cnt[7] & cnt[5] & cnt[4] & cnt[3] & cnt[2] & cnt[1] & cnt[0]と同等
    assign tmp = ^ cnt; //cnt[7] ^ cnt[5] ^ cnt[4] ^ cnt[3] ^ cnt[2] ^ cnt[1] ^ cnt[0]と同等
    
    





    Copyright 2007 ためになるホームページ All Rights Reserved.