14 / 24 · Conceito
Ready/valid e estado em pausa
O estágio de saída mantém A com out_ready=0 enquanto a entrada B é válida. O que o estágio e o produtor devem fazer na próxima borda?
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Avance apenas em uma transferência
Um produtor ativa valid quando seu item atual está disponível. Um consumidor ativa ready quando pode aceitar esse item. Em uma borda de subida com ambos ativos, ocorre uma transferência. Avance as coordenadas do pixel, o estado do buffer de linha e a entrada de acumulação associada apenas nesse momento. Avançar apenas com valid perde dados durante uma pausa do consumidor; avançar apenas com ready conta entradas inexistentes.
Enquanto valid estiver alto e ready baixo, mantenha os mesmos dados e valid. Para continuar aceitando entradas enquanto a saída está bloqueada, forneça armazenamento e derive a prontidão de sua capacidade restante. O RTL de exemplo é um estágio de um item: ele aceita um novo item quando está vazio ou quando o item atual pode sair.
Sequência de transferências resolvida
Para os ciclos zero a quatro, valid=[0,1,1,1,1] e ready=[0,1,0,1,1] dão fire=[0,1,0,1,1]. Cinco clocks aceitam três pixels. O item em pausa no ciclo dois permanece até o ciclo três. Um contador de linha de largura quatro ainda não completou sua primeira linha. Contar clocks em vez de transferências desloca todas as coordenadas posteriores de janelas.
Se o estágio mantiver A com out_valid alto e out_ready baixo, in_ready estará baixo e A continuará armazenado. Quando out_ready ficar alto, ele poderá enviar A e aceitar B na mesma borda. Sem entrada de substituição, ele desativa o valid da saída. Documente se a substituição simultânea é permitida e qual latência está implícita.
Reset limpa a validade além dos dados. Um novo quadro precisa de reset definido das coordenadas e da validade das janelas. Receber a última entrada difere de consumir a última saída; ativar done cedo demais pode permitir que um novo quadro sobrescreva trabalho pendente.
O código é um estágio de transferência, não um mecanismo completo de convolução. Se o fluxo instalado suportar edição e simulação de SystemVerilog, crie manualmente um arquivo e teste a estabilidade sob pausa e a substituição simultânea. Nenhuma execução de simulador RTL é afirmada aqui. O diagrama ilustra fire; não é um rastreamento capturado do 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 os dados da forma de onda
| Sinal | Forma de onda | Valores do barramento |
|---|---|---|
| clock | p.... | |
| valid | 01111 | |
| ready | 01011 | |
| fire | 01011 |
Experimente
O estágio de saída mantém A com out_ready=0 enquanto a entrada B é válida. O que o estágio e o produtor devem fazer na próxima borda?
Ler a explicação
O estágio coloca in_ready baixo e mantém A com out_valid. O produtor mantém B com in_valid. Itens estáveis podem depois ser transferidos exatamente uma vez.