Chương 3: Cú Pháp Cơ Bản Verilog HDL (Phần 2)
3.3. Toán Tử Và Biểu Thức
Ngôn ngữ Verilog HDL cung cấp nhiều loại toán tử được phân loại theo chức năng:
- Toán tử số học
- Toán tử bit
- Toán tử logic
- Toán tử quan hệ
- Toán tử so sánh
- Toán tử dịch bit
- Toán tử nối bit (Concatenation)
- Toán tử rút gọn (Reduction)
3.3.1. Toán Tử Số Học
Các toán tử số học trong Verilog:
| + | Cộng hoặc giá trị dương |
| - | Trừ hoặc giá trị âm |
| * | Nhân |
| / | Chia |
| % | Lấy dư (chỉ áp dụng cho số nguyên) |
Lưu ý: Kết quả chia số nguyên chỉ lấy phần nguyên. Dấu của phép lấy dư phụ thuộc vào toán hạng đầu tiên.
3.3.2. Toán Tử Bit
Verilog hỗ trợ 5 toán tử thao tác trên từng bit:
- ~ (NOT đơn nguyên)
- & (AND)
- | (OR)
- ^ (XOR)
- ^~ (XNOR)
| Ngõ vào | Kết quả |
|---|---|
| 1 | 0 |
| 0 | 1 |
| X | X |
3.3.3. Toán Tử Logic
| && | AND logic |
| || | OR logic |
| ! | NOT logic |
Kết quả trả về 0 (sai), 1 (đúng) hoặc X (không xác định).
3.3.4. Toán Tử Quan Hệ
- < (nhỏ hơn)
- > (lớn hơn)
- <= (nhỏ hơn hoặc bằng)
- >= (lớn hơn hoặc bằng)
3.3.5. Toán Tử So Sánh
| == | So sánh giá trị (bỏ qua X/Z) |
| === | So sánh chính xác (kể cả X/Z) |
3.3.6. Toán Tử Dịch Bit
4'b1001 << 2 // Kết quả: 6'b100100
4'b1001 >> 1 // Kết quả: 4'b0100
3.3.7. Toán Tử Nối Bit
{a, b[3:0], 3'b101} // Tương đương {a, b[3], b[2], b[1], b[0], 1'b1, 1'b0, 1'b1}
{4{data}} // Tương đương {data, data, data, data}
3.3.8. Toán Tử Rút Gọn
reg [3:0] A;
reg result;
result = ^A; // Tương đương: result = A[0] ^ A[1] ^ A[2] ^ A[3];
3.3.9. Thứ Tự Ưu Tiên Toán Tử
Các toán tử có thứ tự ưu tiên khác nhau ảnh hưởng đến kết quả biểu thức. Nên dùng dấu ngoặc đơn để xác định rõ ràng thứ tự tính toán.
3.4. Câu Lệnh Gán Và Khối Lệnh
3.4.1. Hai Kiểu Gán Cơ Bản
- Gán chặn (Blocking):
=- Cập nhật giá trị ngay lập tức - Gán không chặn (Non-blocking):
<=- Cập nhật sau khi khối lệnh hoàn tất
3.4.2. Khối Lệnh
Khối begin...end thực thi tuần tự:
begin
a = 1;
b = a; // b = 1
end
Khối fork...join thực thi song song:
fork
a = 1;
b = 0;
join
3.5. Câu Lệnh Điều Kiện
3.5.1. Câu Lệnh If-Else
if (x > y)
result = HIGH;
else
result = LOW;
3.5.2. Câu Lệnh Case
case (sel)
2'b00: out = a;
2'b01: out = b;
default: out = 0;
endcase
3.6. Vòng Lặp
3.6.1. Vòng Lặp Forever
initial begin
forever #5 clk = ~clk;
end
3.6.2. Vòng Lặp Repeat
repeat (8) begin
shift_reg = {shift_reg[6:0], din};
end
3.6.3. Vòng Lặp While
while (count < 10) begin
count = count + 1;
end
3.6.4. Vòng Lặp For
for (i=0; i<8; i=i+1) begin
sum = sum + data[i];
end