32 / 37 · Prática
Prática integrada: pulsos periódicos e acumulador habilitado
Especifique transferências com valores antigos e verifique pausas, pulsos consecutivos e reset simultâneo.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Defina a conexão antes de compor
Aceite sample sem sinal de quatro bits a cada subida com enable=1. A cada N amostras aceitas gere pulse registrado. O acumulador consome pulse e a amostra correspondente guardada na próxima subida, mesmo com enable=0 naquele instante. total de oito bits retorna módulo 256. Reset síncrono limpa etapas e descarta amostra pendente. O atraso de uma borda é parte do contrato: o acumulador lê pulse e saved_sample antigos, não valores não bloqueantes produzidos na mesma borda. Salve modulo_tick.sv e este periodic_accumulator.sv; N é positivo.
module periodic_accumulator #(parameter integer N = 3) (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic pulse,
output logic [7:0] total
);
localparam integer CW = (N <= 1) ? 1 : $clog2(N);
wire [CW-1:0] count;
logic [3:0] saved_sample;
modulo_tick #(.N(N)) tick_u (
.clk(clk), .rst(rst), .enable(enable),
.count(count), .pulse(pulse)
);
always_ff @(posedge clk) begin
if (rst) saved_sample <= 4'b0;
else if (enable) saved_sample <= sample;
end
always_ff @(posedge clk) begin
if (rst) total <= 8'b0;
else if (pulse) total <= total + {4'b0, saved_sample};
end
endmoduleAcompanhe dado e evento juntos
N=3, entradas antes e saídas após a borda.
| Borda | rst | enable | sample | pulse depois | total depois |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 0 | 0 |
| E1 | 0 | 1 | 2 | 0 | 0 |
| E2 | 0 | 1 | 4 | 0 | 0 |
| E3 | 0 | 1 | 7 | 1 | 0 |
| E4 | 0 | 0 | 9 | 0 | 7 |
| E5 | 0 | 1 | 1 | 0 | 7 |
| E6 | 0 | 1 | 3 | 0 | 7 |
| E7 | 0 | 1 | 5 | 1 | 7 |
| E8 | 1 | 1 | 15 | 0 | 0 |
E4 soma 7, não sample externo 9. enable só controla novas aceitações; não cancela pendência. E8 descarta 5 e limpa total. enable && pulse no consumo perderia E4.
Referência na fronteira do sistema
Mantenha quantidade aceita, valor pendente opcional e total inteiro. Em borda sem reset consuma primeiro o pendente anterior módulo 256; depois use enable/sample atuais para criar pendência na N-ésima aceitação. Reset limpa tudo. Não leia tick_u.count nem saved_sample. Use estímulo na descida e comparação posterior, conferindo pulse, total, manutenção sem evento e remoção do consumido.
Cubra falhas de integração
- N=1 gera pulsos consecutivos: cada amostra deve ser consumida uma vez na próxima borda.
- N=3 com pausas antes/depois da amostra terminal: conte aceitação, não todo clock.
- Mude sample externo durante consumo desabilitado: deve usar dado salvo.
- Reset com pendência descarta evento e total.
- Some além de 255 e confira retorno módulo 256.
Troque saved_sample por sample: E4 deve falhar. Condicione consumo a enable e confirme outra falha. Restaure antes de registrar PASS. O contrato testado é funcional, de clock único e largura finita; não prova CDC, fechamento temporal físico nem execução gratuita do produto DDS.