14 / 24 · Concepto
Ready/valid y estado detenido
La etapa de salida conserva A con out_ready=0 mientras la entrada B es válida. ¿Qué deben hacer la etapa y el productor en el siguiente flanco?
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Avanza solo con una transferencia
Un productor activa valid cuando su elemento actual está disponible. Un consumidor activa ready cuando puede aceptarlo. En un flanco ascendente con ambas activadas ocurre una transferencia. Avanza las coordenadas de píxel, el estado de los búferes de línea y la entrada de acumulación asociada solo entonces. Avanzar solo con valid pierde datos durante una pausa del consumidor; avanzar solo con ready cuenta una entrada inexistente.
Mientras valid está a nivel alto y ready a nivel bajo, conserva los mismos datos y valid. Para seguir aceptando entradas mientras la salida está bloqueada, proporciona almacenamiento y deduce la disponibilidad de su capacidad restante. El ejemplo RTL es una etapa de un elemento: acepta uno nuevo cuando está vacía o cuando el actual puede salir.
Secuencia de transferencias resuelta
En los ciclos cero a cuatro, valid=[0,1,1,1,1] y ready=[0,1,0,1,1] dan fire=[0,1,0,1,1]. Cinco relojes aceptan tres píxeles. El elemento detenido en el ciclo dos permanece hasta el tres. Un contador de fila de anchura cuatro no ha completado su primera fila. Contar relojes en lugar de transferencias desplaza todas las coordenadas posteriores de ventanas.
Si la etapa conserva A con out_valid a nivel alto y out_ready a nivel bajo, in_ready está a nivel bajo y A sigue almacenado. Cuando out_ready pasa a nivel alto, puede enviar A y aceptar B en el mismo flanco. Sin entrada de reemplazo, borra output valid. Documenta si se permite el reemplazo simultáneo y qué latencia implica.
El reinicio borra la validez además de los datos. Un fotograma nuevo necesita un reinicio definido de coordenadas y de validez de ventana. Recibir la última entrada difiere de consumir la última salida; activar done demasiado pronto puede dejar que un nuevo fotograma sobrescriba trabajo pendiente.
El código es una etapa de transferencia, no un motor de convolución completo. Si tu flujo instalado admite edición y simulación de SystemVerilog, crea manualmente un archivo y prueba la estabilidad bajo pausa y el reemplazo simultáneo. Aquí no se afirma ejecución de un simulador RTL. El diagrama ilustra fire; no es una traza capturada de hardware.
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
endmoduleVer los datos de la forma de onda
| Señal | Forma de onda | Valores del bus |
|---|---|---|
| clock | p.... | |
| valid | 01111 | |
| ready | 01011 | |
| fire | 01011 |
Inténtalo tú
La etapa de salida conserva A con out_ready=0 mientras la entrada B es válida. ¿Qué deben hacer la etapa y el productor en el siguiente flanco?
Leer la explicación
La etapa pone in_ready a nivel bajo y conserva A con out_valid. El productor conserva B con in_valid. Los elementos estables podrán transferirse después exactamente una vez.