19 / 37 · Konsep
parameter, localparam, $clog2 dan konfigurasi batas
Pisahkan masukan saat eksekusi dari konfigurasi serta rancang lebar dan akhir untuk N=1 dan nilai bukan pangkat dua.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Parameter tetap pada elaborasi
Port berubah saat operasi; parameter mengatur struktur sebelum dibangun; localparam menamai konstanta turunan yang tidak diganti instans. Bukan variabel tiap siklus. Pencacah modulo N memakai 0..N−1. Untuk N≥2 lebarnya $clog2(N); N=1 menghasilkan nol sehingga sediakan minimal satu bit. N=0 di luar kontrak.
Selesai pada tepi diaktifkan
Peralihan count lama dari N−1 ke nol meregistrasi pulse. Tepi dinonaktifkan mempertahankan count dan membersihkan pulse. Reset sinkron membersihkan keduanya serta menang atas enable. N adalah bilangan bulat positif dalam rentang didukung.
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 muncul pada port dan tetap terbuka. Pertahankan default atau ≥max(1,$clog2(N)). Lebih kecil memotong LAST; lebih besar menghasilkan kode tak terpakai, yang dikembalikan ke nol oleh >= pada tepi aktif. CW'(N-1) memperjelas ukuran, tanpa memperbaiki parameter invalid. Validasi sebelum elaborasi: assertion dinamis tidak memperbaiki deklarasi salah.
Matriks konfigurasi
| N | CW default | count setelah tepi aktif sejak reset | pulse sesudah |
|---|---|---|---|
| 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 |
Satu bit penyimpanan tidak menjadikan dua keadaan valid untuk N=1. N=5 normalnya tidak mengunjungi 5,6,7. Hanya pangkat dua dapat menyembunyikan pembanding putaran eksplisit yang hilang.
Praktik: perilaku dan penolakan
Instansiasikan N=1,2,5,8, jalankan minimal dua periode, jeda di terminal dan reset bersamaan dengan enable. Bandingkan setiap count/pulse. Acuan integer membersihkan saat reset, menyetel pulse nol lalu menaikkan modulo N dengan enable dan mendeteksi putaran, tanpa CW atau keadaan internal. Periksa penolakan N=0 dan CW terlalu kecil. Pemakaian ulang didukung dalam rentang dinyatakan dan diuji, bukan hanya karena default lulus.