結合演算子
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 27/90。
連結演算子 { } は、複数の信号、定数、または式を1つのより大きなベクトルに結合します。これは、ビットを結合してより広い値を形成する必要がある場合に使用されます。
連結に使用できる値
以下を連結できます:
- WireとReg — 任意の信号
- 定数 —
4'b1010や8'hFFのような数値
- 式 —
a + bのような演算の結果 - 複製 — 値を複数回繰り返すこと
連結されるすべての値は、固定された既知の幅を持つ必要があります。
基本構文: {value1, value2, value3, ...} 結果の幅は、すべての個別の幅の合計になります。
例
2つの4ビット値を8ビットに結合する:
reg [3:0] high, low;
reg [7:0] word;
word = {high, low}; // highが上位4ビットになり、lowが下位4ビットになります定数との結合:
data = {4'b1010, 4'b0000}; // 8'b101000003つ以上を組み合わせる:
full = {a, b, c, d}; // すべての幅が加算されますレプリケーション
{n{value}} を使用して、値を複数回繰り返すことができます:
repeat = {4{4'b1010}}; // 16'b1010101010101010 (4回繰り返す)これは符号拡張に便利です:
signed_8bit = {4{sign_bit}, value_4bit};コード例
module concatenation_demo;
reg [3:0] upper, lower;
reg [7:0] combined;
reg [11:0] repeated;
initial begin
upper = 4'b1010;
lower = 4'b1100;
combined = {upper, lower}; // 10101100
repeated = {3{4'b1010}}; // 101010101010
$display("{upper, lower} = %b", combined);
$display("{3{4'b1010}} = %b", repeated);
$finish;
end
endmodule出力:
{upper, lower} = 10101100
{3{4'b1010}} = 101010101010重要な注意事項
- 順序が重要です:
{a, b}は{b, a}とは異なります - すべてのパーツは固定幅である必要があります(サイズ指定のない数値は不可)
- 連結は代入の左辺と右辺の両方で使用できます
チャレンジ
各タスクに対して正しい連結式を記述してください。
作業内容:
aとbを組み合わせて8ビットの結果を作成し、combine1に格納してください。c、d、eを組み合わせて12ビットの結果を作成し、combine2に格納してください。fと2つのgを組み合わせて12ビットの結果を作成し、combine3に格納してください。
チートシート
結合演算子 { } は、ビットを結合してより広いベクトルを作成します。結果の幅は、個々のすべての幅の合計になります。
// 基本: {value1, value2, ...}
reg [3:0] high, low;
reg [7:0] word;
word = {high, low}; // high = 上位ビット, low = 下位ビット
// 定数を使用する場合
data = {4'b1010, 4'b0000}; // 8'b10100000
繰り返し {n{value}} は、値をn回繰り返します:
repeated = {3{4'b1010}}; // 12'b101010101010
signed_8bit = {4{sign_bit}, val_4b}; // 符号拡張
主なルール:
- 順序が重要です:
{a, b}≠{b, a} - すべてのパーツは、固定された既知の幅を持っている必要があります
- 代入文の両辺で使用できます
自分で試してみよう
module concatenation_challenge;
reg [3:0] a, b;
reg [3:0] c, d, e;
reg [3:0] f, g;
reg [7:0] combine1;
reg [11:0] combine2, combine3;
initial begin
a = 4'b1010;
b = 4'b0101;
c = 4'b1111;
d = 4'b0000;
e = 4'b1100;
f = 4'b1001;
g = 4'b0110;
combine1 = ______; // Combine a and b into an 8-bit result
combine2 = ______; // Combine c, d, and e into a 12-bit result
combine3 = ______; // Combine f and two copies of g into a 12-bit result
$display("{a, b} = %b", combine1);
$display("{c, d, e} = %b", combine2);
$display("{f, g, g} = %b", combine3);
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。