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

1

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

Debe permanecer en cada recuento durante un número específico de relojes x, donde x puede ser cualquier entero o factor fraccional de 512.

Mi enfoque:

Use el contador de 10 bits temp [9: 0] que se incrementa en cada reloj de posicionamiento

Para x = 512, aumente temp en los pasos de 1, e incremente cuando temp[9◆==1

Para x = 256, incremente temp en pasos de 2, e incremente 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 en particular? Solo sabemos el máximo que x puede ser.

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é pasa si max hold no es una potencia de 2? ¿Cómo manejaría el caso en el que el tiempo de espera máxima (x = 1) es, por ejemplo, 460 en lugar de 512?

    
pregunta frank_010

3 respuestas

1

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

Para cada ciclo de reloj, verifique si temp es igual a x-1. Si es así, establezca temp en 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, count solo incrementará una vez cada 512 relojes. Si x = 512, count se incrementará en cada reloj. Si x = 40, count se 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), piense qué está haciendo el código anterior con respecto al valor y = 512:

  • ¿Qué hace la expresión temp & 10'h1FF en realidad numéricamente?
  • Del mismo modo, ¿qué significa que el bit 9 que se está configurando signifique numéricamente?
respondido por el Dave Tweed
2

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

    
respondido por el a_bet
0

Si hablamos de fracciones, entonces necesita 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: construir un acumulador de N + 1 bit, en cada ciclo agregue su paso de N bits al acumulador. Cuando el MSB alterna, incremente su contador de salida.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas