19 / 37 · Concetto
parameter, localparam, $clog2 e configurazioni limite
Distingui ingressi di esecuzione e configurazioni e progetta larghezza e termine per N=1 e non potenze di due.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Parametri fissati nell'elaborazione
Una porta cambia in esecuzione; parameter configura prima della costruzione; localparam nomina una costante derivata non sostituita dall'istanza. Non sono variabili per ciclo. Un contatore modulo N usa 0..N−1. Per N≥2 la larghezza è $clog2(N); N=1 restituisce zero, quindi riserva almeno un bit. N=0 è fuori contratto.
Completamento al fronte abilitato
Quando count precedente passa da N−1 a zero, viene registrato pulse. Un fronte disabilitato mantiene count e azzera pulse. Reset sincrono azzera entrambi e vince su enable. N è un intero positivo nell'intervallo supportato.
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 compare nelle porte ed è esposto. Mantieni il default o ≥max(1,$clog2(N)). Un valore minore tronca LAST; uno maggiore crea codici inutilizzati, riportati a zero da >= su fronte abilitato. CW'(N-1) esplicita la dimensione, non ripara configurazioni errate. Valida prima di elaborare: un'asserzione dinamica non corregge una dichiarazione invalida.
Matrice delle configurazioni
| N | CW predefinito | count dopo fronti abilitati dal reset | pulse dopo |
|---|---|---|---|
| 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 |
Un bit memorizzato non rende validi due stati per N=1. N=5 normalmente non visita 5,6,7. Solo potenze di due nascondono un confronto esplicito di ritorno mancante.
Esercizio: comportamento e rifiuto
Crea N=1,2,5,8, esegui almeno due periodi, fermati al terminale e applica reset con enable. Confronta ogni count/pulse. Il modello di riferimento intera azzera su reset, prima pulisce pulse e poi incrementa modulo N con enable rilevando il ritorno, senza CW o stato interno. Verifica il rifiuto di N=0 e CW insufficiente. La riusabilità vale nell'intervallo dichiarato e verificato, non per un solo default passato.