Menu
Coddy logo textTech

結合演算子

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 27/90。

連結演算子 { } は、複数の信号、定数、または式を1つのより大きなベクトルに結合します。これは、ビットを結合してより広い値を形成する必要がある場合に使用されます。

連結に使用できる値

以下を連結できます:

  • WireとReg — 任意の信号
  • 定数4'b10108'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'b10100000

3つ以上を組み合わせる:

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} とは異なります
  • すべてのパーツは固定幅である必要があります(サイズ指定のない数値は不可)
  • 連結は代入の左辺と右辺の両方で使用できます
challenge icon

チャレンジ

各タスクに対して正しい連結式を記述してください。

作業内容:

  1. ab を組み合わせて8ビットの結果を作成し、combine1 に格納してください。
  2. cde を組み合わせて12ビットの結果を作成し、combine2 に格納してください。
  3. 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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン