Estoy generando un pulso de 1 khz desde un reloj de 32 MHz, naturalmente a través de un contador. No es una tarea difícil, así que puedes imaginar mi sorpresa cuando el resultado se ejecuta a 992Hz ...
Simulando el modelo de comportamiento de este contador, puedo ver el comportamiento correcto o incorrecto sin ningún cambio en el código fuente.
El quid del código es este:
constant Clock_Frequency : natural := 32_000_000;
constant Clock_Period : time := 1 sec / Clock_Frequency;
subtype DelayType is natural range 0 to Clock_Frequency;
constant Period : DelayType := 1 ms / Clock_Period;
report "Delay " & DelayType'image(Period) severity NOTE;
que informa (en simulación) como sigue:
(Xilinx ISIM: como se esperaba)
a 125 ns: Nota: Demora 32000 (/ testbench / UUT / UUT /).
(Modelsim: ¡sorpresa!)
** Nota: Retraso 32258
Tiempo: 128 ns Iteración: 0 Instancia: / testbench / uut / uut
Y 32MHz dividido por 32258 sí da la señal de 992Hz que estaba observando. Cambiar la resolución de tiempo de Modelsim de su valor predeterminado (probablemente 1ns) a 1ps, da el resultado esperado. Por lo tanto, el período correcto (31,25 ns) se redondea a 31 ns, lo que da como resultado un cálculo incorrecto del valor de carga del contador de demoras.
Pero la implicación es que Synplify (específicamente, Actel Edition de MicroSemi Libero 9.1) usa la resolución 1ns como su valor predeterminado para la resolución de la unidad de tiempo.
Entonces, ¿cómo cambio esto a 1ps o 1 fs para cálculos más precisos que involucren tiempo? No puedo encontrar ninguna información de este tipo en las fuentes obvias.