Altifigence Academy

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.

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.

SystemVerilog
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
endmodule

CW 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

NCW defaultcount setelah tepi aktif sejak resetpulse sesudah
110,0,01,1,1
211,0,10,1,0
531,2,3,4,00,0,0,0,1
831,2,3,4,5,6,7,00,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.

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.