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.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
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.
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
endmoduleCW 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
| N | CW padrão | count após bordas habilitadas desde reset | pulse após |
|---|---|---|---|
| 1 | 1 | 0,0,0 | 1,1,1 |
| 2 | 1 | 1,0,1 | 0,1,0 |
| 5 | 3 | 1,2,3,4,0 | 0,0,0,0,1 |
| 8 | 3 | 1,2,3,4,5,6,7,0 | 0,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.