Saltar al contenido

¿Cuándo debo usar std_logic_vector y cuándo debo usar otros tipos de datos?

Intenta interpretar el código correctamente previamente a aplicarlo a tu proyecto y si ttienes algo que aportar puedes compartirlo con nosotros.

Solución:

Utilice los tipos de datos que sean más apropiados para sus fines de modelado, incluidos los puertos. simplemente no es true esa síntesis requiere que solo use std_logic o std_logic_vector para puertos. No creas a los que te dicen lo contrario.

Si necesita vectores de bits con soporte aritmético, considere firmado/sin firmar de ieee.numeric_std. (En VHDL 2008, hay un paquete estándar que agrega soporte aritmético a std_logic_vector, pero lo considero malo).

Es posible que solo haya un problema en el nivel más alto después síntesis, cuando desee simular la lista de red sintetizada. Es posible que los tipos de puerto de esa lista de red no coincidan con su interfaz RTL de nivel superior. Sin embargo, puede solucionarlo fácilmente al instanciar el nivel de la puerta, haciendo las conversiones adecuadas en ese momento. Ese es el momento adecuado para preocupaciones de tan bajo nivel: no deberían influir en su estilo de modelado RTL.

Sugiero no usar std_logic y std_logic_vector a menos que intente modelar señales tristate, lo que considero una especie de maldad. En su lugar, use std_ulogic y std_ulogic_vector que no están resueltos. Esto tiene la ventaja de detectar asignaciones múltiples a señales no resueltas durante la compilación. Con señales resueltas, detectaría ese error tarde en la simulación o síntesis.

Inconveniente: esta sugerencia no es muy común y el uso de lógica de terceros con std_logic puede requerir algunas conversiones.

Para la aritmética de std_ulogic_vector use std_numeric. Luego se requiere convertir a firmado o sin firmar antes de la operación y volver a convertir el resultado a std_ulogic_vector. NO existe una biblioteca estándar ieee.std_ulogic_unsigned para señales no resueltas.

adder_result <= std_ulogic_vector( unsigned(operant1) + unsigned(operant2) ) ;
increment <= std_ulogic_vector( unsigned(operant) + 1 ) ;

La diferencia entre entero, natural, positivo por un lado y sin signo y con signo por el otro es la representación. Firmado y sin firmar son subtipos de std_logic_vector y más como un paquete (o más preciso array) de cables std_logic.

Los tipos enteros son más bien una representación matemática de un número. Suelen usarse más con genéricos, generar bucles y array índice. Pero a veces la síntesis también puede manejarlos para unidades aritméticas.

Recuerda que puedes recomendar esta crónica si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *