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
¿Alguien tiene una idea mejor que esta, más eficiente en recursos?
¿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.
¿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?
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 out
contador. 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
a 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 se 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), piensa en lo que está haciendo el código anterior con respecto al valor y=512:
temp & 10'h1FF
numéricamente?¿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.
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.
Andy alias
Tony Estuardo EE75