Menu
CoddyTech

Câu lệnh case

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

Câu lệnh case cho phép bạn chọn giữa nhiều hành động khác nhau dựa trên giá trị của một biểu thức. Đây là cách viết gọn hơn so với nhiều câu lệnh if-else khi so sánh cùng một biến với nhiều giá trị khác nhau.

Câu lệnh case so sánh một biểu thức với danh sách các giá trị rồi thực thi khối lệnh khớp. Nó giống như một nhánh nhiều hướng.

Cú pháp:

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

Bạn nên luôn thêm default vào câu lệnh case tổ hợp. Nếu không có default, khi sel nhận một giá trị không được liệt kê trong mục case nào, out sẽ không được gán và giữ nguyên giá trị trước đó. Khi một giá trị của sel chỉ gồm các bit 0 và 1 không có nhánh tương ứng, quá trình tổng hợp sẽ tạo ra bộ nhớ ngoài ý muốn (một chốt) thay vì chỉ tạo logic tổ hợp. Trong mô phỏng, giá trị X hoặc Z trên sel cũng khiến out giữ nguyên, nhưng không tạo ra chốt.

Ví dụ đơn giản

case (sel)
  2'b00: out = a;
  2'b01: out = b;
  2'b10: out = c;
  default: out = 0;
endcase

Nếu sel là 00, out nhận a. Nếu sel là 01, out nhận b. Nếu sel là 10, out nhận c.

Nếu không, out nhận giá trị 0.

Nhiều câu lệnh trong mỗi trường hợp

Dùng begin và end cho nhiều câu lệnh:

case (state)
  2'b00: begin
    out = a;
    flag = 1;
  end
  2'b01: begin
    out = b;
    flag = 0;
  end
  default: out = 0;
endcase

Quy tắc quan trọng

Quy tắcGiải thích
Giá trị trong các nhánh case phải là duy nhấtNếu có giá trị trùng lặp, chỉ nhánh khớp đầu tiên được thực thi
Giá trị phải khớp với độ rộng bitViết 2'b01, không viết 1'b1 (giá trị ngắn hơn sẽ được đệm bằng các số không)
default là tùy chọn nhưng được khuyến nghịBắt các giá trị chưa được ánh xạ
Không có default, các giá trị chưa được ánh xạ sẽ gây ra latchTrong logic tổ hợp

Case và if-else

 CaseIf-Else
Phù hợp nhất vớiMột biến, nhiều giá trịĐiều kiện phức tạp
Dễ đọcRất rõ ràngCó thể trở nên rối rắm
Ví dụBộ ghép kênh, bộ giải mãBộ so sánh, kiểm tra phạm vi
challenge icon

Thử thách

Hoàn thành câu lệnh case

Việc cần làm:

Thêm câu lệnh case còn thiếu để bộ chọn kênh này hoạt động.

Cách hoạt động:

  • Khi select = 2'b00, result = in0
  • Khi select = 2'b01, result = in1
  • Khi select = 2'b10, result = in2
  • Khi select = 2'b11, result = in3

Tự làm thử

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: Thêm câu lệnh case
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // default -> result = 0
  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