Haciendo un contador mod-13

0

¿Cuál es la forma más óptima de hacer un contador de mods que no sea una potencia de 2? El incremento del contador es una variable

Mi enfoque en un contador mod-13 por ejemplo:

wire [3:0] counter_d ;
reg  [3:0] counter_q ;
wire [4:0] counter_plus_increment ;
wire overflow ;

assign counter_plus_increment = counter_q + increment ; //small increments
assign overflow = counter_plus_increment[4] ;
assign counter_d = overflow ? 4'd3 : counter_plus_increment ;

always @ (posedge clk or negedge resetn) begin
  if (!resetn)
     counter_q <= 4'd3 ;
  else
     counter_q <= counter_d ;
end

¿Crees que esto es correcto? ¿Alguna sugerencia mejor y más eficiente?

    
pregunta frank_010

2 respuestas

1

He escrito miles de contadores que no son múltiplos de dos. El procedimiento es siempre el mismo:

if (counter==MAX-1)
   counter <= 0;
else
   counter <= counter + 1;

Más un reinicio, por supuesto.

Su contador no comienza en 0, lo que no se puede usar en el 99.9% de los casos. Además, la solución para el mod-13 no es utilizable genéricamente, por lo que en mi opción no existe la forma más 'eficiente'. (¿También en qué aspecto es 'más eficiente'? ¿Área? ¿Velocidad? ¿Potencia?)

En la industria, no puedes dedicar tu tiempo a optimizaciones de ese tipo a menos que realmente las necesites. Módulo 13 funcionando a 40GHz: Construya un registro de desplazamiento con 13 registros, conecte la salida a la entrada. Reinicie con 13'b0000000000001

Una forma diferente de contar es la cuenta regresiva.

if (counter==0)
   counter <= MAX-1;
else
   counter <= counter-1;

Esto hace que la lógica de comparación se convierta en una gran compuerta AND en lugar de AND / OR. Pero la ganancia en la lógica de hoy es despreciable.

    
respondido por el Oldfart
0

Aunque el contador de Oldfart es sencillo, esto es mejor en algunos casos

if (counter==0)
   counter <= MAX-1;
else
   counter <= counter - 1;

¿Qué instancias?

Pruebas == 0 generalmente generará menos lógica que igual a una N arbitraria, y es probable que sea más rápido.

Cuando N es variable, especialmente en función de cada ciclo, el retardo de propagación del reloj a == 0 es independiente del N. Esto puede parecer bastante sutil, pero es vital si el divisor es parte de un sintetizador N fraccional . Si el retardo de propagación es dependiente de N, el ruido se convertirá en banda baja.

Un reinicio puede o no ser necesario. Si el contador se enciende en el rango ilegal de contador > MAX-1, luego eventualmente contará su camino hacia el rango legal. Si este tiempo es inaceptable en su aplicación, entonces es necesario un reinicio. Sin embargo, si vas a probar esto, entonces es recomendable un reinicio de todas formas.

    
respondido por el Neil_UK

Lea otras preguntas en las etiquetas