Altifigence Academy

19 / 37 · Conceito

parameter, localparam, $clog2 e configurações limite

Separe entradas de execução da configuração e projete largura e término para N=1 e não potências de dois.

Parâmetros são fixados na elaboração

Porta muda durante funcionamento; parameter configura antes de construir estrutura; localparam nomeia constante derivada não substituída pela instância. Não são variáveis por ciclo. Contador módulo N usa 0..N−1; para N≥2 a largura é $clog2(N). N=1 retorna zero, então reserve ao menos um bit. N=0 está fora do contrato.

Conclusão por borda habilitada

Ao passar o count antigo de N−1 para zero, registra pulse. Borda desabilitada mantém count e limpa pulse. Reset síncrono limpa ambos e vence enable. N é inteiro positivo no intervalo suportado.

SystemVerilog
module modulo_tick #(
  parameter integer N = 5,
  parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
  input  logic          clk, rst, enable,
  output logic [CW-1:0] count,
  output logic          pulse
);
  localparam logic [CW-1:0] LAST = CW'(N-1);
  always_ff @(posedge clk) begin
    if (rst) begin
      count <= '0;
      pulse <= 1'b0;
    end else begin
      pulse <= 1'b0;
      if (enable) begin
        if (count >= LAST) begin
          count <= '0;
          pulse <= 1'b1;
        end else count <= count + 1'b1;
      end
    end
  end
endmodule

CW aparece em portas e fica exposto. Mantenha padrão ou ≥max(1,$clog2(N)). Menor trunca LAST; maior cria códigos não usados, recuperados para zero numa borda habilitada pelo >=. CW'(N-1) explicita tamanho, não conserta parâmetros inválidos. Valide antes de elaborar: asserção dinâmica não repara declaração incorreta.

Matriz de configurações

NCW padrãocount após bordas habilitadas desde resetpulse após
110,0,01,1,1
211,0,10,1,0
531,2,3,4,00,0,0,0,1
831,2,3,4,5,6,7,00,0,0,0,0,0,0,1

Armazenar um bit não dá dois estados válidos para N=1. N=5 não visita 5,6,7 normalmente. Só potências de dois não revelam comparação explícita de retorno ausente.

Prática: comportamento e rejeição

Crie N=1,2,5,8, rode ao menos dois períodos, pause no terminal e aplique reset junto com enable. Compare cada count/pulse. Referência inteira zera com reset, limpa pulse e incrementa módulo N com enable, detectando retorno, sem CW nem estado interno. Verifique rejeição de N=0 e CW insuficiente. Reutilização é sustentada apenas no intervalo declarado e testado, não por um padrão que passou.

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