32 / 37 · Übung
Integrierte Übung: periodische Impulse und freigegebener Akkumulator
Beschreiben Sie Übertragungen mit alten Werten und prüfen Sie Pausen, aufeinanderfolgende Impulse und gleichzeitigen Reset.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Vor dem Verbinden die Schnittstelle definieren
Nehmen Sie an jeder steigenden Flanke mit enable=1 einen vorzeichenlosen Vier-Bit-Wert sample an. Jede N-te Annahme erzeugt den registrierten pulse. Der Akkumulator konsumiert pulse und den zugehörigen gespeicherten sample an der nächsten steigenden Flanke, auch wenn enable dann 0 ist. total hat acht Bits und läuft modulo 256 über. Synchroner Reset löscht beide Stufen und verwirft wartende Daten. Eine Flanke Latenz gehört zum Vertrag: der Akkumulator liest alte pulse/saved_sample, keine an derselben Flanke neu geplanten Werte. Speichern Sie modulo_tick.sv und dieses periodic_accumulator.sv; N ist positiv.
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
endmoduleDaten und Ereignis zusammen verfolgen
N=3, Eingänge vor und Ausgänge nach der Flanke.
| Flanke | rst | enable | sample | pulse danach | total danach |
|---|---|---|---|---|---|
| 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 addiert 7, nicht den externen sample=9. enable steuert neue Annahmen und löscht keinen bereits wartenden Vorgang. E8 verwirft 5 und löscht total. enable && pulse beim Konsum verlöre E4.
Referenz an der Systemgrenze
Speichern Sie Zahl angenommener Werte, einen optionalen wartenden Wert und ganzzahliges total. Ohne Reset konsumieren Sie zuerst den alten wartenden Wert modulo 256. Danach erzeugen Sie aus aktuellem enable/sample bei der N-ten Annahme einen neuen wartenden Vorgang. Reset löscht alles. Lesen Sie weder tick_u.count noch saved_sample. Setzen Sie Stimuli an der fallenden Flanke und prüfen Sie später pulse, total, Halten ohne Ereignis und Entfernen konsumierter Daten.
Integrationsfehler abdecken
- N=1 erzeugt aufeinanderfolgende Impulse: jedes sample muss an der nächsten Flanke genau einmal konsumiert werden.
- N=3 mit Pausen vor/nach dem Endwert: zählen Sie Annahmen, nicht alle Takte.
- Ändern Sie externe sample-Daten bei gesperrtem Konsum: gespeicherte Daten gelten.
- Reset bei wartenden Daten verwirft Ereignis und total.
- Addieren Sie über 255 und prüfen Sie modulo 256.
Ersetzen Sie saved_sample durch sample: E4 muss scheitern. Verknüpfen Sie Konsum fälschlich mit enable und prüfen Sie einen weiteren Fehler. Stellen Sie vor PASS die Quelle wieder her. Geprüft wird endliche, eintaktige Funktion. CDC, physikalischer Timingabschluss und kostenlose DDS-Produktausführung sind damit nicht bewiesen.