32 / 37 · Esercitazione
Laboratorio integrato: impulsi periodici e accumulatore abilitato
Specifica trasferimenti con valori precedenti e verifica pause, impulsi consecutivi e reset simultaneo.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Definire connessione prima di comporre
Accetta sample senza segno di quattro bit ad ogni salita con enable=1. Ogni N campioni accettati genera pulse registrato. L'accumulatore consuma pulse e il campione corrispondente salvato alla salita successiva, anche se enable=0 in quell'istante. total di otto bit torna modulo 256. Reset sincrono pulisce gli stadi e scarta il campione pendente. Il ritardo di un fronte è contrattuale: l'accumulatore legge pulse e saved_sample precedenti, non i valori non bloccanti creati sul medesimo fronte. Salva modulo_tick.sv e questo periodic_accumulator.sv; N è positivo.
module periodic_accumulator #(parameter integer N = 3) (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic pulse,
output logic [7:0] total
);
localparam integer CW = (N <= 1) ? 1 : $clog2(N);
wire [CW-1:0] count;
logic [3:0] saved_sample;
modulo_tick #(.N(N)) tick_u (
.clk(clk), .rst(rst), .enable(enable),
.count(count), .pulse(pulse)
);
always_ff @(posedge clk) begin
if (rst) saved_sample <= 4'b0;
else if (enable) saved_sample <= sample;
end
always_ff @(posedge clk) begin
if (rst) total <= 8'b0;
else if (pulse) total <= total + {4'b0, saved_sample};
end
endmoduleSeguire insieme dato ed evento
N=3, ingressi prima e uscite dopo il fronte.
| Fronte | rst | enable | sample | pulse dopo | total dopo |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 0 | 0 |
| E1 | 0 | 1 | 2 | 0 | 0 |
| E2 | 0 | 1 | 4 | 0 | 0 |
| E3 | 0 | 1 | 7 | 1 | 0 |
| E4 | 0 | 0 | 9 | 0 | 7 |
| E5 | 0 | 1 | 1 | 0 | 7 |
| E6 | 0 | 1 | 3 | 0 | 7 |
| E7 | 0 | 1 | 5 | 1 | 7 |
| E8 | 1 | 1 | 15 | 0 | 0 |
E4 aggiunge 7, non sample esterno 9. enable controlla solo nuove accettazioni e non annulla la pendente. E8 scarta 5 e azzera total. enable && pulse sul consumo perderebbe E4.
Modello di riferimento al confine del sistema
Mantieni numero accettato, valore pendente opzionale e total intero. Senza reset consuma prima la precedente pendente modulo 256; poi usa enable/sample attuali per creare pendente alla N-esima accettazione. Reset azzera tutto. Non leggere tick_u.count o saved_sample. Stimola in discesa e controlla poi pulse, total, mantenimento senza evento e rimozione del consumato.
Coprire difetti d'integrazione
- N=1 genera impulsi consecutivi: ogni campione deve essere consumato una sola volta al fronte successivo.
- N=3 con pause prima/dopo campione terminale: conta accettazioni, non tutti i clock.
- Cambia sample esterno durante consumo disabilitato: deve usare quello salvato.
- Reset con pendente scarta evento e total.
- Somma oltre 255 e verifica modulo 256.
Sostituisci saved_sample con sample: E4 deve fallire. Condiziona il consumo a enable e rileva un altro difetto. Ripristina prima di PASS. Il contratto verificato è funzionale, a clock singolo e larghezza finita; non prova CDC, chiusura del timing fisico o pratica gratuita nel prodotto DDS.