Timer đếm xuống có ngắt và tự nạp lại
Module cần viết: timer · 7 case (2 mẫu) · giới hạn 4 s/case · ~25 phút
Mọi vi điều khiển đều có timer: đếm xuống từ một giá trị nạp sẵn, phát ngắt khi về 0, và có thể tự nạp lại để tạo ngắt định kỳ (tick của hệ điều hành, lấy mẫu ADC). Đây là một ngoại vi nhỏ, nhưng có nhiều quy tắc ưu tiên cần làm đúng.
module timer (
input logic clk,
input logic rst_n, // reset bất đồng bộ: cnt = 0, reload = 0, irq = 0
input logic load, // nạp: cnt = reload = load_val
input logic [7:0] load_val,
input logic en, // cho phép đếm
input logic auto_reload,
output logic [7:0] cnt,
output logic irq // xung 1 nhịp
);
Ở mỗi sườn lên, theo thứ tự ưu tiên:
load = 1:cnt = reload = load_val,irq = 0.- Ngược lại nếu
en = 1:cnt != 0:cnt = cnt − 1; nếucntvừa về 0 (tức trước đó bằng 1) thìirq = 1.cnt == 0: nếuauto_reloadthìcnt = reload; không thì giữ 0. Không phát ngắt.
irqbằng 0 ở mọi nhịp khác.
Với auto_reload = 1 và load_val = N, dãy giá trị là N, N−1, …, 1, 0 (ngắt), N, … nên chu kỳ ngắt là N + 1 nhịp.
Testbench đặt tín hiệu và đọc ngõ ra ở sườn xuống của clock.
Các case
- load 3, đếm xuống, một ngắtmẫu
- auto_reload: ngắt định kỳmẫu
Cùng 5 case ẩn kiểm các yêu cầu còn lại của đề. Case ẩn chỉ báo đúng/sai, không nói chi tiết: tự tìm chỗ sai từ đề, hoặc mở gợi ý.
Testbench có mô hình tham chiếu riêng, độc lập với lời giải mẫu. Lời giải mẫu đã chạy qua mọi case trên simulator thật, và 4 bản lỗi mẫu đều bị ít nhất một case bắt. Case mẫu sai sẽ cho biết chỗ sai đầu tiên (giá trị mong đợi so với giá trị nhận được); case ẩn chỉ báo đúng/sai.