Menu
CoddyTech

Gán liên tục

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 37 trên 90.

Trong phần cứng, kết nối là một sợi dây vật lý nối hai điểm trong mạch điện. Khi đã nối dây, kết nối đó sẽ cố định và luôn hoạt động. Nếu một đầu thay đổi, đầu kia cũng thay đổi ngay lập tức.

Trong Verilog, ta cần một cách để mô hình hóa hành vi này. Ta muốn truyền một giá trị lên dây dẫn và giữ kết nối đó mãi mãi. Quá trình này gọi là phép gán liên tục.

Phép gán liên tục dùng từ khóa assign để tạo kết nối cố định giữa một dây dẫn và một biểu thức. Dây dẫn liên tục nhận giá trị của biểu thức, giống như dây dẫn vật lý.

Hãy hình dung việc này giống như hàn một sợi dây hơn là chỉ viết một giá trị một lần.

Cú pháp

assign wire_name = expression;
PhầnÝ nghĩa
assignTừ khóa bắt đầu phép gán liên tục
wire_nameDây dẫn được điều khiển (không thể là reg)
expressionGiá trị điều khiển dây dẫn

Ví dụ đơn giản

wire out;
assign out = a & b;

Điều này có nghĩa là: out luôn bằng a AND b. Bất cứ khi nào a hoặc b thay đổi, out cũng thay đổi ngay lập tức.

Cách hoạt động

Khác với reg dùng để lưu giá trị, wire với phép gán liên tục luôn được cập nhật:

module continuous_demo;
  reg a, b;
  wire c;
  
  assign c = a & b;   // c luôn bằng kết quả của a AND b
  
  initial begin
    a = 0; b = 0;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=0
    
    a = 1;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=0 (1&0=0)
    
    b = 1;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=1 (1&1=1)
    
    $finish;
  end
endmodule

Đầu ra:

a=0, b=0, c=0
a=1, b=0, c=0
a=1, b=1, c=1

Mỗi khi a hoặc b thay đổi, c tự động cập nhật.

Nhiều phép gán

Bạn có thể có nhiều phép gán liên tiếp trong một module:

module multiple_assign (
  input a, b, c,
  output x, y
);
  assign x = a & b;
  assign y = x | c;   // y phụ thuộc vào x
endmodule

Tất cả phép gán chạy song song liên tục.

Các ứng dụng phổ biến

Các phép gán liên tục được dùng để:

  • Tạo logic tổ hợp đơn giản (AND, OR, XOR)
  • Kết nối các dây với nhau
  • Tạo bộ đệm ba trạng thái
  • Điều khiển đầu ra từ các biểu thức tổ hợp
challenge icon

Thử thách

Cần làm gì:

  1. Thêm phép gán liên tục còn thiếu để z bằng x AND y.

Tự làm thử

module continuous_challenge (
  input x,
  input y,
  output z
);
  
  // TODO: Thêm phép gán liên tục còn thiếu để z bằng x AND y
  

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