TOP > Verilog > Verilogのコーディング |
定数の表現
<ビット幅>'<基数><数値>
定数の記述の例
2'b01; //2ビット幅の2進数01 10; //32ビット幅の10進数10 8'hFF; //8ビット幅の16進数FF 8'b0000_1111; //8ビット幅の2進数00001111 信号の宣言
モジュール内で記述する信号は、全て型宣言をする。
多ビット信号
ビット幅を持った信号を宣言するには、ビット幅を[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. |