Menu
CoddyTech

Toán tử nối

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 27 trên 90.

Toán tử nối { } kết hợp nhiều tín hiệu, hằng số hoặc biểu thức thành một vector lớn hơn. Bạn dùng toán tử này khi cần ghép các bit lại với nhau để tạo thành giá trị rộng hơn.

Giá trị nào dùng được với phép nối

Bạn có thể nối:

  • Dây và thanh ghi: mọi tín hiệu
  • Hằng số: các số như 4'b1010 hoặc 8'hFF
  • Biểu thức: kết quả của các phép toán như a + b
  • Phép lặp: lặp lại một giá trị nhiều lần

Tất cả giá trị được nối phải có độ rộng cố định và đã biết.

Cú pháp cơ bản:  {value1, value2, value3, ...} Độ rộng của kết quả bằng tổng độ rộng của từng giá trị.

Ví dụ

Kết hợp hai giá trị 4 bit thành 8 bit:

reg [3:0] high, low;
reg [7:0] word;

word = {high, low};     // high chiếm 4 bit trên, low chiếm 4 bit dưới

Kết hợp với các hằng số:

data = {4'b1010, 4'b0000};   // 8'b10100000

Kết hợp nhiều hơn hai:

full = {a, b, c, d};   // All widths add up

Lặp lại

Bạn có thể lặp lại một giá trị nhiều lần bằng cách dùng {n{value}}:

repeated = {4{4'b1010}};   // 16'b1010101010101010 (repeat 4 times)

Điều này hữu ích khi mở rộng dấu:

signed_8bit = {{4{sign_bit}}, value_4bit};

Ví dụ về code

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

Đầu ra:

{upper, lower} = 10101100
{3{4'b1010}} = 101010101010

Lưu ý quan trọng

  • Thứ tự rất quan trọng: {a, b} khác với {b, a}
  • Tất cả các phần phải có độ rộng cố định (không dùng số không có độ rộng)
  • Có thể dùng phép nối ở cả vế trái và vế phải của phép gán
challenge icon

Thử thách

Viết các biểu thức nối đúng cho từng nhiệm vụ.

Cần làm:

  1. Nối a và b thành kết quả 8 bit rồi lưu vào combine1
  2. Nối c, d và e thành kết quả 12 bit rồi lưu vào combine2
  3. Nối f và hai bản sao của g thành kết quả 12 bit rồi lưu vào combine3

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online