¿Cómo conviertes un número entero en tiempo en VHDL?

Con el fin de simplificar un banco de pruebas, me gustaría establecer varios retrasos cambiando los valores numéricos en la parte superior del archivo. Me gustaría hacer algo como:

input_frequency : integer := 1000000;
...
constant t_per : time := (1. / input_frequency * 1000000000.) ns;

... que no compila.

En este momento estoy codificando:

constant t_per : time := 1000 ns;

Tampoco he podido hacer que el ejemplo superior funcione usando la palabra clave variable .

¿Hay alguna forma de evitar los tiempos de codificación en VHDL?

Respuestas (3)

multiplicar (u operar de otra manera) por la unidad de tiempo

constant t_per : time := (1 / input_frequency * 1000000000) * 1ns;(o variaciones de los mismos)

Aquí hay una referencia que podría ayudar: aldec.com/en/support/resources/documentation/articles/1165
En realidad, el 1antes nsno es necesario, pero se recomienda un buen estilo. Para ejecutar su código, solo se necesitaría el operador de multiplicación. Debe haber un delimitador (espacio en blanco) entre el valor entero y la unidad secundaria ( ns).
@CapnJJ Funcionó de maravilla. Gracias. No entendí muy bien cómo fs/ns/ms/etc. palabras clave trabajadas.
@Paebbels sí. Voy de un lado a otro entre VHDL y Systemverilog, por lo que a veces la sintaxis se hace puré para mí :( (Dejaré mi respuesta de esa manera para que su comentario aún se aplique, por el bien de la posteridad)
@CapnJJ No hay quejas sobre su respuesta. Solo quería agregar ese hecho :). ¿Por qué usar SV cuando tienes VHDL? (pero esta pregunta es de tema aquí ...)
@Paebbels Me he centrado en la verificación ~ 8 años y uso SV para la verificación funcional. pero, si, fuera de tema

Puede convertir valores enteros para escribir valores de tiempo. Cada valor de tiempo se representa como un número de posición en la escala numérica. Por lo tanto, VHDL ofrece los atributos 'val(...)y 'pos(...). Cada unidad entera representa una unidad de tiempo primaria. Esta unidad primaria se define como femtosegundo (fs). Pero muchos simuladores como ModelSim eligieron una unidad primaria mayor como el picosegundo (ps). Puede establecer este límite de resolución de tiempo mínimo en femtosegundos con la opción de línea de comandos -t 1fs.

Convirtiendo números enteros a tiempo:

constant myInt  : integer := 10000;
constant myTime : time    := time'val(myInt);

Esto es igual a 10 ps, porque son 10.000 fs. Puede volver a convertir con atributo 'posde un valor de tipo físico a un valor entero universal .

Lo mismo se puede lograr multiplicando los valores de tiempo con un número entero, porque el paquete std.standardcontiene sobrecargas de operadores para *permitir time * integery integer * timeoperaciones.

constant myInt  : integer := 5;
constant myTime : time    := 10 ns * myInt;

Esto da como resultado 50 ns. Por supuesto hay más operadores sobrecargados como división o módulo.


Si le gusta jugar más con el tipo de tiempo o experimentar otro tipo físico como la frecuencia , eche un vistazo a la Biblioteca PoC y al paquete PoC.physical .

Para las personas que vienen aquí desde Google, esta respuesta es útil para convertir la frecuencia en tiempo en los bancos de prueba:

CONSTANT freq : positive := 50E6;
CONSTANT CLKPERIOD : time := (real(1E9)/real(freq)) * 1 ns;

El typecast real() permite valores más precisos.