サイズ指定ありの数値
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 14/90。
Verilogには、特定のサイズで数値を宣言する方法があります。それはサイズ指定された数値 (sized number)と呼ばれます。これは、数値が何ビットであるかについての混乱を防ぎ、ハードウェアが期待通りに動作することを保証するため、非常に有用です。
サイズ指定された数値は、次の形式に従います:[bits]'[format][value]
<strong>bits</strong>— ビット数(例:8)<strong>'</strong>— サイズと形式を区切るアポストロフィ(必須)
<strong>format</strong>— 数値の基数: 2進数のb、10進数のd、16進数のh、または8進数のo<strong>value</strong>— 実際の数値(例:1010)
例えば:
4'b1010— 4ビット、2進数 1010(10進数 10)8'd255— 8ビット、10進数 255(2進数 11111111)16'hFF— 16ビット、16進数 FF(2進数 0000000011111111)3'b1— 3ビット、2進数 001(左側のビットはゼロで埋められます)
コード例:
reg [7:0] data;
data = 8'b10101010; // 8ビット、2進数 10101010
data = 8'd170; // 8ビット、10進数 170
data = 8'hAA; // 8ビット、16進数 AAこれら3つの例はすべて、dataに同じ値を代入します。
サイズが重要な理由
サイズ指定がない場合:
reg [7:0] data;
data = 1; // これはどういう意味でしょうか? 1ビット? 8ビット?Verilogはデフォルトで小さな数値を32ビットと見なすため、問題が発生することがあります。
サイズ指定あり:
reg [7:0] data;
data = 8'b00000001; // クリア: 8ビットの値 1ゼロパディング
小さい値を大きいベクトルに代入すると、Verilogは左側のビットをゼロで埋めます:
reg [7:0] data;
data = 4'b1010; // 8'b00001010 になりますチャレンジ
正しいサイズの数値を記述して、コードを完成させてください。
手順:
aを10進数の 170(2進数 10101010)を表す8ビットの2進数に設定してください。bを10進数の 12(2進数 1100)を表す4ビットの2進数に設定してください。cを10進数の 255(16進数 FF)を表す16ビットの16進数に設定してください。
チートシート
Verilogにおけるサイズ指定された数値は、次の形式に従います:[bits]'[format][value]
bits— ビット数'— 必須のアポストロフィ区切り文字format—b(2進数),d(10進数),h(16進数),o(8進数)value— 実際の数値
reg [7:0] data;
data = 8'b10101010; // 8ビット、2進数
data = 8'd170; // 8ビット、10進数
data = 8'hAA; // 8ビット、16進数(これら3つはすべて等価です)サイズを指定しない場合、Verilogはデフォルトで32ビットになります。これは予期しない動作を引き起こす可能性があります。値が宣言されたサイズよりも小さい場合、左側のビットはゼロで埋められます:
reg [7:0] data;
data = 4'b1010; // 8'b00001010 になります自分で試してみよう
module sized_challenge;
reg [7:0] a;
reg [3:0] b;
reg [15:0] c;
initial begin
a = ______; // 170の8ビットバイナリ (10101010)
b = ______; // 12の4ビットバイナリ (1100)
c = ______; // 255の16ビット16進数 (FF)
$display("a = %b", a);
$display("b = %b", b);
$display("c = %h", c);
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。