Diseño de un contador que permanece en cada estado durante x relojes

Supongamos que tenemos un contador de 8 bits [7:0]

Necesita permanecer en cada conteo por un número específico de relojes x, donde x puede ser cualquier número entero o factor fraccionario de 512.

Mi acercamiento:

Use la temperatura del contador de 10 bits [9: 0] que se incrementa en cada reloj posedge

Para x=512, incremente la temperatura en pasos de 1 y aumente cuando temp[9]==1

Para x=256, incremente la temperatura en pasos de 2, y aumente cuando temp[9]==1 ....y así sucesivamente.

Mi pregunta

  1. ¿Alguien tiene una idea mejor que esta, más eficiente en recursos?

  2. ¿Cómo manejar el caso cuando x puede tomar valores arbitrarios no necesariamente relacionados por factores de un número particular? Solo sabemos el máximo que puede ser x.


Para aclarar: x es solo un registro normal de 9 bits. El valor en x y el número de relojes de espera están relacionados por 512/x = HoldClocks.

  • 512/1 = 512
  • 512/2 = 256
  • 512/3 = 170.667
  • 512/4 = 128
  • ........
  • 512/512 = 1.

¿Qué tal el caso general? ¿Qué sucede si los relojes de retención máximos no son una potencia de 2? ¿Cómo manejaría el caso en el que el máximo de relojes de espera (x=1) es, por ejemplo, 460 en lugar de 512?

Para la pregunta 2, ¿cuál podría ser el valor de x que considera más problemático?
Por lo tanto, necesita un contador para retener y un contador para dividir. Este contador dual permite fracciones en lugar de enteros. Obviamente, salidas decodificadas con puertas para permitir el conteo. O use un PLL IC "fraccional-N" que también tiene contadores en la ruta de salida y retorno, de modo que fo/fin=x1x2/y1y2 para recuentos duales en ambas direcciones (hacia adelante y retroalimentación). Cuando la aleta está demasiado alta, sincronice. Los contadores binarios del preescalador de enteros se utilizan para llegar a contadores más baratos.

Respuestas (3)

Su pregunta dice "un estado en particular" , pero parece que desea out[7:0]permanecer en cada uno de sus estados durante x ciclos de reloj. Si es así, entonces desea utilizarlo temp[9:0]como un "prescaler": por cada x relojes, desea enviar un pulso al outcontador. Esto funciona para cualquier valor de x.

Para cada ciclo de reloj, verifique si tempes igual a x-1. Si es así, establezca tempa cero e incremente out; de lo contrario, simplemente incremente temp.

En Verilog:

always @(posedge clock) begin
  if (temp >= (x-1)) begin
    temp <= O;
    count <= count + 1;
  end else begin
    temp <= temp + 1;
  end
end

Bien, ahora que ha aclarado el significado de x, el siguiente código DDS implementará lo que desea directamente.

always @(posedge clock) begin
  temp <= (temp & 10'h1FF) + x;
  if (temp[9]) count <= count + 1;
end

Si x=1, countsolo se incrementará una vez cada 512 relojes. Si x=512, countse incrementará en cada reloj. Si x=40, countse incrementará cada 12,8 relojes en promedio.


En el caso general de tener dos números, donde la tasa de conteo es x/y (x no debe ser mayor que y), piensa en lo que está haciendo el código anterior con respecto al valor y=512:

  • ¿ Qué logra realmente la expresión temp & 10'h1FFnuméricamente?
  • Del mismo modo, ¿qué significa numéricamente mirar el bit 9 configurado?
Cierto, quiero que el contador permanezca en cada uno de sus estados durante x ciclos de reloj. Su implementación funcionará para un número entero de ciclos. Pero, ¿cómo manejarías la x fraccionaria? por ejemplo, para hacer que el contador se incremente cada 12,8 relojes en promedio?
Oh, ¿es eso lo que quisiste decir con "factor fraccionario"? Realmente no estaba claro a partir de sus ejemplos. En ese caso, se pueden aplicar técnicas DDS, pero tendrá que ser mucho más específico sobre qué tipo de valores puede tomar x y cómo está representando x como una señal digital.
Sí, esto resolverá tanto números enteros como fraccionarios. Sin embargo, el diseño actual está muy ligado a que los relojes de retención máxima sean potencias de 2. ¿Cómo manejaría el caso en el que los relojes de retención máxima (x = 1) son, por ejemplo, 460 en lugar de 512?
¿En serio? Te he entregado estas respuestas en bandeja de plata. ¿Eres realmente incapaz de generalizar a partir de esto? Sí, el atajo de mirar temp[9] para el desbordamiento funciona solo para potencias de dos, pero es fácil extenderlo a cualquier número. ¡No voy a hacer TODA tu tarea por ti!
@toolic: Gracias. Simplemente me basaba en el hecho de que el color de sintaxis SE parecía resaltarlo como una palabra clave.

¿Tal vez condicionaría el contador principal usando un comparador que toma x y la salida del contador auxiliar de 10 bits (con reloj a la frecuencia del reloj) como entradas? No puedo decirte más ya que en tu descripción faltan algunos detalles sobre el funcionamiento.

Dime qué información adicional necesitas y la agregaré a la descripción.

Si estamos hablando de fracciones, entonces debe definir qué resolución necesita en frecuencia, lo que determinará la cantidad de bits que necesita. Más bits significa más consumo de recursos, pero puede especificar una parte fraccionaria más precisa. La forma en que implementa esto es la siguiente: construya un acumulador de N + 1 bits, en cada ciclo agregue su paso de N bits al acumulador. Cuando el MSB cambia, incremente su contador de salida.