Verilogの論理式の書き方

[] [] []


ここでVerilogの論理式の書き方をまとめておく。C言語と似ているのでマニュアルを見なくても大体想像がつくが、ハードウェアを記述するためにビット単位の書き方になっている点が特徴である。

■変数

    reg変数でもwire変数でも必ずビット幅を指定して宣言する。

    reg[7:0] a; 8ビットの変数aの宣言。(要素8個の配列という意味ではない)

MSBがビット7LSBがビット0であることを示す。

    reg b; 1ビットの変数の宣言。reg[0:0] b;と書いてもよいが普通は書かない。

    a[4:1]は変数aのビット4からビット1までを抜き出した4ビット変数を示す。

    a[3]は変数aのビット3を抜き出した1ビット変数を示す。

■定数

    reg変数、wire変数が取りうる値は

0: Low

1: High

x: 不定

z: ハイインピーダンス(HiZ)

ただし現実のFFHiZにはならないので、zwire変数だけ

    形式は <ビット幅>’<基数><数値>

    ビット幅を省略すると32ビット、基数を省略すると10進数と見なされる。

    桁を見やすくするため数値の途中にアンダースコア( _ )を入れてもよい。

    数値で省略した上位ビットは0と見なされるが、10進数以外は省略しない方がよい。

    ただし多ビットのzxの書き方は紛らわしく、8ビットのzは本来は8’bzzzz_zzzzだが8’bzと書いても同じなのでこちらの方が便利。

) 8’b0000_00018ビット2進数の1

  8’b1と書いても同じだが0を省略しない方がよい。

) 8’d38ビット10進数の38’b0000_0011と同じ

) 8’h0a8ビット16進数のa8’b0000_1010と同じ

) 1032ビット10進数。32’h0000_000a同じ

■演算子

    算術演算子: + (加算), - (減算), * (乗算)

    ビット演算子: ~ (NOT), & (AND), | (OR), ^ (XOR)

) a=’b1010, b=’b1100のとき、~a=’b0101, a&b=’b1000

    関係演算子: == (等しい), != (等しくない), <,>,<=,>= (不等号)

(注意) “<=”は a_reg <= b_reg; のように代入の記号と重複している

    条件演算子

) y = ( s )? a : b;  // s=1のときas=0のときbを代入する

■リダクション演算子

    変数内の全ビット同士の演算を示す ~ (NOT), & (AND), | (OR), ^ (XOR)

) ^a[2:0] a[2]^a[1]^a[0] と同じ意味

■ビットの連結

    中かっこ { a,b,c } は変数a,b,cを並べた1つの変数を示す。

    { N { a } } aN個並べた1つの変数を示す。

) dat[15:0] = {dat_upper[7:0],dat_lower[7:0]}; // 上位バイトと下位バイトを連結した2バイトを表す

) d_sign_ext[15:0] = {{8{d[7]},d[7:0]}; // 符号拡張の書き方


[] [] []