Altifigence Academy

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.

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.

SystemVerilog
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
endmodule

Acompanhe dado e evento juntos

N=3, entradas antes e saídas após a borda.

Bordarstenablesamplepulse depoistotal depois
E011900
E101200
E201400
E301710
E400907
E501107
E601307
E701517
E8111500

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.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.