14 / 24 · Concetto
Ready/valid e stato in stallo
Lo stadio di uscita mantiene A con out_ready=0 mentre l'ingresso B è valido. Che cosa devono fare stadio e produttore al fronte successivo?
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Avanza soltanto su un trasferimento
Un produttore attiva valid quando l'elemento corrente è disponibile. Un consumatore attiva ready quando può accettarlo. A un fronte di salita con entrambi attivi, avviene un trasferimento. Soltanto allora avanza coordinate dei pixel, stato dei buffer di riga e ingresso di accumulo associato. Avanzare soltanto su valid perde dati durante una pausa del consumatore; avanzare soltanto su ready conta ingressi inesistenti.
Quando valid è alto e ready basso, mantieni gli stessi dati e valid. Per continuare ad accettare ingressi mentre l'uscita è bloccata, fornisci memoria e ricava ready dalla capacità rimanente. L'esempio RTL è uno stadio a un elemento: accetta un nuovo elemento quando è vuoto oppure quando quello corrente può uscire.
Sequenza di trasferimenti svolta
Per i cicli da zero a quattro, valid=[0,1,1,1,1] e ready=[0,1,0,1,1] danno fire=[0,1,0,1,1]. Cinque clock accettano tre pixel. L'elemento in stallo nel ciclo due rimane fino al ciclo tre. Un contatore di riga di larghezza quattro non ha completato la prima riga. Contare i clock anziché i trasferimenti sposta ogni successiva coordinata delle finestre.
Se lo stadio mantiene A con out_valid alto e out_ready basso, in_ready è basso e A rimane memorizzato. Quando out_ready diventa alto, può inviare A e accettare B allo stesso fronte. In assenza di un ingresso sostitutivo, azzera valid di uscita. Documenta se la sostituzione simultanea è consentita e quale latenza implica.
Reset azzera la validità oltre ai dati. Un nuovo frame richiede un reset definito delle coordinate e della validità delle finestre. Ricevere l'ultimo ingresso è diverso da consumare l'ultima uscita; attivare done troppo presto può consentire a un nuovo frame di sovrascrivere lavoro in sospeso.
Il codice è uno stadio di trasferimento, non un motore completo di convoluzione. Se il tuo flusso installato supporta modifica e simulazione SystemVerilog, crea manualmente un file e prova la stabilità durante la pausa e la sostituzione simultanea. Qui non viene attestata un'esecuzione di simulatore RTL. Il diagramma illustra fire; non è una traccia hardware acquisita.
module sample_stage (
input logic clk, reset,
input logic in_valid,
output logic in_ready,
input logic signed [7:0] in_data,
output logic out_valid,
input logic out_ready,
output logic signed [7:0] out_data
);
assign in_ready = !out_valid || out_ready;
always_ff @(posedge clk) begin
if (reset) begin
out_valid <= 1'b0;
out_data <= '0;
end else if (in_ready) begin
out_valid <= in_valid;
if (in_valid) out_data <= in_data;
end
end
endmoduleMostra i dati della forma d’onda
| Segnale | Forma d’onda | Valori del bus |
|---|---|---|
| clock | p.... | |
| valid | 01111 | |
| ready | 01011 | |
| fire | 01011 |
Prova tu
Lo stadio di uscita mantiene A con out_ready=0 mentre l'ingresso B è valido. Che cosa devono fare stadio e produttore al fronte successivo?
Leggi la spiegazione
Lo stadio porta in_ready basso e conserva A con out_valid. Il produttore conserva B con in_valid. Gli elementi stabili possono essere trasferiti successivamente esattamente una volta.