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?
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)
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 'pos
de 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.standard
contiene sobrecargas de operadores para *
permitir time * integer
y integer * time
operaciones.
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.
CapnJJ
Paebbels
1
antesns
no 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
).Diamante negro
CapnJJ
Paebbels
CapnJJ