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;
endcaseBạ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;
endcaseNế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;
endcaseQuy tắc quan trọng
| Quy tắc | Giải thích |
|---|---|
| Giá trị trong các nhánh case phải là duy nhất | Nế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 bit | Viế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 latch | Trong logic tổ hợp |
Case và if-else
| Case | If-Else | |
|---|---|---|
| Phù hợp nhất với | Một biến, nhiều giá trị | Điều kiện phức tạp |
| Dễ đọc | Rất rõ ràng | Có 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 |
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
endmoduleBà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
1Giới thiệu
Verilog là gìPhần cứng và phần mềmModule đầu tiênChú thíchCác mức trừu tượng hóa thiết kế4Toán tử phần 1
Toán tử số họcToán tử moduloToán tử so sánhÔn tập: phép tính đơn giảnToán tử thao tác bit7Gán và cổng logic
Gán liên tụcGán bằng toán tửCác cổng nguyên thủy tích hợp sẵnCổng AND, OR, NOTCổng XOR, XNORÔn tập: mạch cổng logic10Ra quyết định
Câu lệnh ifIf và elseÔn tập: Bộ so sánh đơn giảnCâu lệnh caseCasex và casezÔn tập: Thiết kế ALU5Các toán tử, phần 2
Toán tử logicToán tử rút gọnToán tử dịch bitToán tử nốiToán tử điều kiệnÔn tập: thử thách về toán tử11Vòng lặp
Vòng lặp forVòng lặp whileVòng lặp repeatVòng lặp vô hạnCâu lệnh vô hiệu hóaÔn tập: các mẫu vòng lặp3Hệ thống số
Biểu diễn nhị phânSố có kích thướcSố không có kích thướcSố âmCác giá trị đặc biệt X và ZÔn tập: định dạng số6Module
Cấu trúc moduleCổng đầu vào và đầu raCổng vào ra hai chiềuKhởi tạo moduleÁnh xạ cổng theo tênÁnh xạ cổng theo thứ tựÔn tập: xây dựng module9Khối thủ tục
Khối alwaysKhối initialDanh sách độ nhạyPhép gán chặnPhép gán không chặnÔn tập: always và initial12Dự án bộ ghép kênh
Thiết kế bộ ghép kênh 2 thành 1Thiết kế bộ ghép kênh 4 thành 115Bộ điều khiển đèn giao thông
Xác định các trạng tháiLogic máy trạng tháiTự luyện tập: Trình biên dịch Verilog online