Verilogの論理式の書き方

[] [] []


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

■変数

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

reg[7:0] a; 8ビットの変数aの宣言。MSBがビット7LSBがビット0であることを示す。(要素8個の配列という意味ではない)

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

■定数

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

 0: Low

 1: High

 x: 不定

 z: ハイインピーダンス(HiZ) ただし現実のFFHiZにはならないので、zwire変数だけ

形式は

 <ビット幅>’<基数><数値>

ビット幅を省略すると32ビット、基数を省略すると10進数と見なされる。見やすくするため数値の途中にアンダースコア( _ )を入れてもよい。数値で省略した上位ビットは0と見なされるが、2進数や16進数については全部の桁を明示的に書いた方がよい。ただし多ビットのzxの書き方は紛らわしく、16ットのzは本当16’bzzzz_zzzz_zzzz_zzzzだが16’bzと書いてもよいのでこちらの方が便利。

)

 8’b0000_00018ビット2進数の18’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]};            // 符号拡張の書き方


[] [] []