30 / 37 · Konzept
Ready/valid und ein elastischer Einplatzpuffer
Verlust- und duplikatfreie Übergabe sowie gleichzeitige Ein-/Ausgabe bei Stopps entwerfen.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Übertragung bedeutet valid und ready an derselben Flanke
Der Sender setzt valid bei gültigen Daten, der Empfänger ready bei Annahmebereitschaft. Beide werden an der Taktflanke gemeinsam ausgewertet.
Bei valid=1, ready=0 muss der Sender Daten und valid halten. Wartet er mit valid grundsätzlich auf ready, kann je nach Gegenseite ein Deadlock entstehen. Alle Signale gehören hier zur selben Taktdomäne; ready/validHandshake Transfervertrag: valid des Senders und ready des Empfängers sind an derselben Flanke 1. Dazu gehören Regeln zum Halten wartender Daten. löst keine CDC.
Wartende Daten genau einmal übertragen
Die Spalten sind Abtastzyklen 0–5; Werte gelten unmittelbar vor der steigenden FlankeSteigende Flanke Übergang des Takts von 0 auf 1. Nicht zu verwechseln mit dem gesamten hohen Pegelintervall CLK=1. Mehr erfahren. In 1 und 2 wartet A mit valid=1, ready=0 und bleibt stabil. Flanke 3 nimmt A, Flanke 4 B an. Die Ausrichtung erläutert den Vertrag und modelliert keine Setup-/Hold-ZeitenSetup Mindestzeit vor der Abtastflanke, in der Eingangsdaten stabil sein müssen. Bei Verletzung ist das gespeicherte Ergebnis nicht garantiert. Mehr erfahren.
Wellenformdaten anzeigen
| Signal | Wellenform | Buswerte |
|---|---|---|
| clk | p..... | |
| valid | 01...0 | |
| ready | 10.1.. | |
| transfer | 0..1.0 | |
| data | x3..4x | A → B |
Mehrere Zyklen valid=1 bedeuten nicht nur eine Übertragung. An jeder Flanke mit zusätzlich ready=1 findet eine eigene statt.
Einen Puffer für genau ein Element bauen
Ist der Puffer leer oder kann er sein aktuelles Element an dieser Flanke ausgeben, hat er Platz für neue Daten.
module elastic_buffer (
input logic clk,
input logic rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data
);
assign in_ready = !out_valid || out_ready;
always_ff @(posedge clk) begin
if (rst) begin
out_valid <= 1'b0;
end else if (in_ready) begin
out_valid <= in_valid;
if (in_valid) out_data <= in_data;
end
end
endmoduleEin Eingang bei leerem Puffer aktualisiert out_valid und out_data erst nach der Flanke. Ohne kombinatorischen Bypass wird derselbe neue Wert nicht bereits an dieser Flanke als ausgegeben gezählt. Während Reset zählen keine Übertragungen; bei out_valid=0 ist out_data bedeutungslos. Deshalb muss das DatenregisterRegister Speichert einen Zustand aus mehreren Bits. Die synchronen Register dieses Kurses übernehmen festgelegte Eingaben an Taktflanken. Mehr erfahren nicht zwingend zurückgesetztReset Steuerung zur Rückkehr in einen festgelegten Anfangszustand. Synchron/asynchron und Priorität gegenüber anderen Steuerungen müssen definiert werden. Mehr erfahren werden.
Auch ein voller Puffer kann ersetzt werden
| Zustand davor | out_ready | in_valid | Aktion an der Flanke |
|---|---|---|---|
| Leer | 0 oder 1 | 1 | Eingang speichern, valid=1 |
| Voll | 0 | 0 oder 1 | Daten und valid halten |
| Voll | 1 | 0 | Ausgeben und leeren |
| Voll | 1 | 1 | Alten Wert ausgeben, neuen gleichzeitig speichern |
Die letzte Zeile ermöglicht nach dem Füllen einen Wert je Zyklus. Latenz halbiert nicht automatisch den DurchsatzDurchsatz Anzahl angenommener oder abgeschlossener Aufgaben je Zeiteinheit. Eine Pipeline kann ihn erhöhen, ohne die Latenz einer einzelnen Aufgabe zu verkürzen. Mehr erfahren.
Ein Modell zur Reihenfolgeprüfung
Verwenden Sie eine Queue mit höchstens einem Element. Bestimmen Sie Aus- und Eingangsannahme anhand der alten Werte an jeder Flanke. Vergleichen Sie zuerst eine Ausgabe mit dem Head, hängen Sie dann neue Daten an. Dequeue und Enqueue können gleichzeitig vorkommen; ihre Modellreihenfolge muss klar sein.
Die Invariante gilt innerhalb eines durch Reset neu begonnenen Intervalls. Prüfen Sie zusätzlich Stabilität im Stall, Reihenfolge und keine Duplikate. Zählgleichheit allein beweist keine korrekten Datenwerte.
Lange kombinatorische ready-Ketten erzeugen lange Rückwärtspfade. Prüfen Sie beim Verbinden auch auf kombinatorische Schleifen.
Weiterführend: AMD UG934 — READY/VALID Handshake
Selbst ausprobieren
Der Puffer enthält A, B wartet mit in_valid=1. Erst out_ready=0, an der nächsten Flanke 1. Was geschieht jeweils und wie lange muss B gehalten werden?
Erklärung lesen
Zuerst in_ready=0: A hält, B wird nicht angenommen; der Sender hält B und valid. Danach in_ready=1: A wird ausgegeben, B gleichzeitig gespeichert. Anschließend steht B am Ausgang, ist aber noch nicht übertragen. Das geschieht erst an einer späteren Flanke mit out_valid=out_ready=1.