19 / 37 · Khái niệm
parameter, localparam,$clog2 và cấu hình biên
Tách đầu vào chạy khỏi cấu hình và thiết kế độ rộng, kết thúc cho N=1 và số không là lũy thừa hai.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Tham số cố định khi elaboration
Cổng đổi khi hoạt động; parameter cấu hình trước tạo cấu trúc; localparam đặt tên hằng suy ra mà thể hiện không ghi đè. Không phải biến từng chu kỳ. Bộ đếm modulo N dùng 0..N−1. Với N≥2, độ rộng là $clog2(N); N=1 cho zero, nên dành tối thiểu một bit. N=0 ngoài hợp đồng.
Kết thúc tại cạnh cho phép
Khi count cũ chuyển từ N−1 về zero, pulse được ghi vào thanh ghi. Cạnh bị tắt giữ count và xóa pulse. Reset đồng bộ xóa cả hai, ưu tiên hơn enable. N là số nguyên dương trong miền hỗ trợ.
module modulo_tick #(
parameter integer N = 5,
parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
input logic clk, rst, enable,
output logic [CW-1:0] count,
output logic pulse
);
localparam logic [CW-1:0] LAST = CW'(N-1);
always_ff @(posedge clk) begin
if (rst) begin
count <= '0;
pulse <= 1'b0;
end else begin
pulse <= 1'b0;
if (enable) begin
if (count >= LAST) begin
count <= '0;
pulse <= 1'b1;
end else count <= count + 1'b1;
end
end
end
endmoduleCW xuất hiện ở cổng nên được mở ra. Giữ mặc định hoặc ≥max(1,$clog2(N)). Nhỏ hơn cắt LAST; lớn hơn tạo mã không dùng, được >= đưa về zero tại cạnh cho phép. CW'(N-1) ghi kích thước rõ, không sửa tham số sai. Xác nhận trước elaboration: assertion lúc chạy không chữa khai báo sai.
Ma trận cấu hình
| N | CW mặc định | count sau các cạnh cho phép từ reset | pulse sau |
|---|---|---|---|
| 1 | 1 | 0,0,0 | 1,1,1 |
| 2 | 1 | 1,0,1 | 0,1,0 |
| 5 | 3 | 1,2,3,4,0 | 0,0,0,0,1 |
| 8 | 3 | 1,2,3,4,5,6,7,0 | 0,0,0,0,0,0,0,1 |
Một bit lưu không làm hai trạng thái hợp lệ cho N=1. N=5 thường không ghé 5,6,7. Chỉ thử lũy thừa hai sẽ giấu phép so sánh quay vòng bị thiếu.
Thực hành: hành vi và từ chối
Tạo N=1,2,5,8, chạy ít nhất hai chu kỳ đếm, dừng ở cuối và reset cùng enable. So từng count/pulse. Tham chiếu nguyên xóa khi reset, đặt pulse zero rồi tăng modulo N với enable và phát hiện quay vòng, không dùng CW hay trạng thái nội bộ. Kiểm tra từ chối N=0 và CW thiếu. Tái sử dụng được chứng minh trong miền khai báo và kiểm tra, không bởi một mặc định chạy đúng.