5 / 24 · Conceito
Leia as transferências entre registradores nas bordas de clock
Separe o estado anterior do próximo estado e acompanhe como as habilitações preservam os valores armazenados.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Todos os registradores leem o estado anterior
Comece identificando as informações que devem sobreviver entre ciclos. Um acumulador, operandos capturados, um contador de laço e a validade da saída são estado. A soma do acumulador atual com o operando é um valor combinacional. Escrever uma variável, por si só, não explica o armazenamento; especifique o evento que captura seu valor.
Este acumulador soma x apenas nas bordas de subida com en ativo. Com en baixo, ele mantém seu valor. Um intermediário de nove bits explicita a soma; selecionar seus oito bits menos significativos define o comportamento módulo 256. As atribuições não bloqueantes em always_ff programam o próximo estado usando os valores lidos na borda atual. Ler o bloco como atribuições imediatas de software leva à interpretação errada quando há vários registradores envolvidos.
logic [7:0] acc;
logic [8:0] next_sum;
assign next_sum = {1'b0, acc} + {1'b0, x};
always_ff @(posedge clk) begin
if (rst) acc <= 8'd0;
else if (en) acc <= next_sum[7:0];
endO reset é síncrono e tem prioridade sobre a habilitação. Omitir uma atribuição sequencial quando en está baixo significa manter o valor do registrador. Já omitir uma atribuição em um caminho combinacional pode implicar um latch não intencional. Na lógica combinacional do próximo estado, forneça valores padrão e depois os substitua para condições específicas.
| Borda | rst | en | x | acc anterior | acc novo |
|---|---|---|---|---|---|
| 0 | 1 | 1 | 9 | Desconhecido | 0 |
| 1 | 0 | 1 | 7 | 0 | 7 |
| 2 | 0 | 0 | 100 | 7 | 7 |
| 3 | 0 | 1 | 250 | 7 | 1 |
Na borda 2, a entrada visível 100 não foi aceita. Na borda 3, 7+250=257 é reduzido para 1. Distinguir apresentação de aceitação continua essencial quando en posteriormente se torna valid AND ready.
Para a<=x; b<=a;, os valores anteriores a=5 e x=9 produzem os novos valores a=9 e b=5. Se b deve receber 9, conecte sua entrada a x. Complete primeiro a coluna do estado anterior e, em seguida, calcule todos os valores do próximo estado juntos; isso revela desencontros de um ciclo entre dados e controle.
Experimente
Inicialmente, a=4 e b=0. As entradas x são 8 e depois 12, com a<=x; b<=a em cada borda. Quais são a e b após a segunda borda?
Ler a explicação
Após a primeira borda, a=8 e b=4. Após a segunda, a=12 e b=8. Cada atualização de b usa o valor anterior de a, portanto x=12 não passa pelos dois registradores em uma única borda.