2011-05-27 35 views
13

Soy nuevo en VHDL y tengo problemas para averiguar qué tipos de datos son apropiados para dónde. Si entiendo correctamente, para la síntesis, todos los puertos de entidad de nivel superior deben declararse como std_logic_vector o std_logic y nunca como cualquier otro tipo.¿Cuándo debería usar std_logic_vector y cuándo debería usar otros tipos de datos?

Pero std_logic_vector no admite aritméticos, entonces, ¿cómo debo manejar esto?

Mi intuición me dice que simplemente debería usar std_logic_vector en el nivel superior y luego convertir esto ay desde los tipos de datos integrales al pasarlo a otras entidades. ¿Es esto correcto?

¿Y qué tipo de datos integrales (entero, sin signo, firmado) debe utilizarse donde? Entiendo la diferencia entre firmado y sin firmar, pero ¿cuándo debo usar un número entero?

Respuesta

16

Utilice los tipos de datos que sean más apropiados para su modelado, incluidos los puertos. Simplemente no es cierto que la síntesis requiere que solo se use std_logic o std_logic_vector para los puertos. No creas a los que te dicen lo contrario.

Si necesita vectores de bits con soporte aritmético, considere firmar/firmar desde ieee.numeric_std. (En VHDL 2008, hay un paquete estándar que añade soporte aritmética a std_logic_vector, pero considero que el mal.)

Sólo puede haber un problema en el nivel muy superior después síntesis, cuando se desea simular la lista neta 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 crear instancias del nivel de puerta, haciendo las conversiones adecuadas en ese momento. Ese es el momento adecuado para tales preocupaciones de bajo nivel: no deberían influir en su estilo de modelado RTL.

+0

Entonces, ¿no tiene nada de malo utilizar solo números enteros? –

+0

@Emil. Así es (subtipos enteros restringidos, por supuesto). Sin embargo, los números enteros tienen un límite (perturbador) de 32 bits en la práctica, lo que significa que puede preferir firmar sin firmar/firmar, por ejemplo. si le preocupa la parametrizabilidad o la coherencia. –

+4

Nitpick (sé que Jan lo sabe, pero lo señalaré por completo): los enteros están garantizados por el estándar como "no del todo 32 bits", van desde - ((2 ** 31) -1) a + ((2 ** 31) -1). Muchos proveedores ofrecen el rango int32_t completo, pero no está garantizado :( –

1

Sugiero no usar std_logic y std_logic_vector a menos que trates de modelar señales triestatas, que considero como algo malo. En cambio, usa std_ulogic y std_ulogic_vector que no están resueltos. Esto tiene la ventaja de detectar múltiples asignaciones a señales no resueltas durante la compilación. Con señales resueltas, detectarías ese error tarde en la simulación o síntesis.

Desventaja: Esta sugerencia no es muy común y el uso de la lógica de terceros con std_logic podría requerir algunos typecasts.

Para la aritmética de std_ulogic_vector use std_numeric. Luego se requiere lanzar a firmado o sin firmar antes de la operación y devolver el resultado a std_ulogic_vector. NO existe una biblioteca standard 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 en un lado y el sin signo y firmado en el otro es la representación. Firmado y sin firmar son subtipo de std_logic_vector y más como un paquete (o matriz más precisa) de cables std_logic.

Los tipos enteros son más bien una representación matemática de un número. Por lo general, se usan más con genéricos, generar bucles e índices de matriz. Pero a veces la síntesis también puede manejarlas para unidades aritméticas.

Cuestiones relacionadas