32 / 37 · Travaux pratiques
Travaux pratiques intégrés : impulsions périodiques et accumulateur autorisé
Spécifiez les transferts utilisant les valeurs précédentes et vérifiez pauses, impulsions consécutives et reset simultané.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Définir la connexion avant composition
Acceptez un sample non signé de quatre bits à chaque montée avec enable=1. Toutes les N acceptations, générez pulse enregistré. L'accumulateur consomme pulse et l'échantillon correspondant sauvegardé à la montée suivante, même si enable=0 à cet instant. total de huit bits reboucle modulo 256. Reset synchrone efface les étages et rejette l'échantillon en attente. Cette latence d'un front est contractuelle: l'accumulateur lit les anciens pulse et saved_sample, non les nouvelles affectations non bloquantes du même front. Enregistrez modulo_tick.sv et ce periodic_accumulator.sv; N est positif.
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
endmoduleSuivre ensemble donnée et événement
N=3, entrées avant et sorties après le front.
| Front | rst | enable | sample | pulse après | total après |
|---|---|---|---|---|---|
| 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 ajoute 7, pas sample externe=9. enable contrôle seulement les nouvelles acceptations et n'annule pas l'attente. E8 rejette 5 et efface total. enable && pulse au moment de consommer perdrait E4.
Référence à la frontière du système
Gardez compteur d'acceptations, valeur en attente facultative et total entier. Sur un front sans reset, consommez d'abord l'ancienne attente modulo 256; puis utilisez enable/sample actuels pour créer l'attente à la N-ième acceptation. Reset efface tout. Ne lisez ni tick_u.count ni saved_sample. Stimulez au descendant et comparez ensuite pulse, total, maintien sans événement et retrait des données consommées.
Couvrir les défauts d'intégration
- N=1 produit des impulsions consécutives: chaque sample doit être consommé exactement une fois au front suivant.
- N=3 avec pauses avant/après l'échantillon terminal: comptez acceptations, pas tous les clocks.
- Changez sample externe pendant une consommation avec enable=0: la donnée sauvegardée doit être utilisée.
- Reset avec attente rejette événement et total.
- Additionnez au-delà de 255 et vérifiez modulo 256.
Remplacez saved_sample par sample: E4 doit échouer. Conditionnez la consommation à enable pour constater un autre échec. Restaurez avant PASS. Le contrat testé est fonctionnel, à une horloge et largeur finie; il ne prouve ni CDC, ni clôture physique du timing, ni pratique gratuite dans le produit DDS.