Menu
Coddy logo textTech

Оператор конкатенации

Часть раздела Основы путешествия по Verilog на Coddy — урок 27 из 90.

Оператор конкатенации { } объединяет несколько сигналов, констант или выражений в один вектор большего размера. Он используется всякий раз, когда вам нужно соединить биты вместе для формирования более широких значений.

Какие значения работают с конкатенацией

Вы можете конкатенировать:

  • Wires и regs — любой сигнал
  • Константы — числа вроде 4'b1010 или 8'hFF
  • Выражения — результаты операций, таких как a + b
  • Репликации — повторение значения несколько раз

Все объединяемые значения должны иметь фиксированную, известную ширину.

Базовый синтаксис:  {value1, value2, value3, ...} Результирующая ширина равна сумме всех отдельных ширин.

Примеры

Объединение двух 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

Объедините более двух:

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. Объедините a и b в 8-битный результат и сохраните в combine1
  2. Объедините c, d и e в 12-битный результат и сохраните в combine2
  3. Объедините f и две копии 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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы