2010-10-28 16 views
16

Quiero tener un módulo simple que agregue dos std_logic_vectors. Sin embargo, al usar el código a continuación con el operador + no se sintetiza.Error al agregar std_logic_vectors

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_arith.all; 

entity add_module is 
     port(
    pr_in1 : in std_logic_vector(31 downto 0); 
    pr_in2 : in std_logic_vector(31 downto 0); 
    pr_out : out std_logic_vector(31 downto 0) 
     ); 
end add_module; 

architecture Behavior of add_module is 

begin 

    pr_out <= pr_in1 + pr_in2; 

end architecture Behavior; 

El mensaje de error que recibo de XST

Línea 17. + no puede tener este tipo de operandos en este contexto.

¿Echo de menos una biblioteca? Si es posible, no quiero convertir las entradas en números naturales.

Muchas gracias

Respuesta

19

¿Cómo desea que el compilador para saber si sus std_logic_vectors la firma o sin firma? La implementación de Adder no es la misma en estos dos casos, por lo que debe indicar explícitamente al compilador lo que desea que haga ;-)

Nota: El resaltado de sintaxis VHDL en StackOverflow es malo. Copie/pegue este código en su editor de VHDL preferido para leerlo más fácilmente.

library IEEE; 
use IEEE.std_logic_1164.all; 
-- use IEEE.std_logic_arith.all; -- don't use this 
use IEEE.numeric_std.all; -- use that, it's a better coding guideline 

-- Also, never ever use IEEE.std_unsigned.all or IEEE.std_signed.all, these 
-- are the worst libraries ever. They automatically cast all your vectors 
-- to signed or unsigned. Talk about maintainability and strong typed language... 

entity add_module is 
    port(
    pr_in1 : in std_logic_vector(31 downto 0); 
    pr_in2 : in std_logic_vector(31 downto 0); 
    pr_out : out std_logic_vector(31 downto 0) 
); 
end add_module; 

architecture Behavior of add_module is 
begin 

    -- Here, you first need to cast your input vectors to signed or unsigned 
    -- (according to your needs). Then, you will be allowed to add them. 
    -- The result will be a signed or unsigned vector, so you won't be able 
    -- to assign it directly to your output vector. You first need to cast 
    -- the result to std_logic_vector. 

    -- This is the safest and best way to do a computation in VHDL. 

    pr_out <= std_logic_vector(unsigned(pr_in1) + unsigned(pr_in2)); 

end architecture Behavior; 
0

buen consejo de @Aurelien utilizar numeric_std.

Tenga en cuenta que agregar dos valores de 32 bits puede dar como resultado un valor de 33 bits y decidir cómo desea manejar el desbordamiento.

4

No use std_logic_arith - I've written about this (en alguna longitud :).

Do use numeric_std - y utilice el tipo correcto en los puertos de su entidad. Si está haciendo aritmética, use tipos numéricos (enteros o vectores (no) firmados, según corresponda). Ellos sintetizarán perfectamente bien.

std_logic_vector s son buenos para

  • cuando no se preocupan por los valores numéricos (un conjunto de bits de control, algunos bits de datos aleatorios)
  • cuando usted no sabe acerca del tipo de la entrada (digamos un sumador que puede operar en números firmados y no firmados basados ​​en un indicador de control).
+0

recomiendo echarle un vistazo enlace de Martin. – George

-1

La forma más fácil de resolver este error es:
Agregar biblioteca de unsign,
Después de que el código comienza a trabajar.

Uso

ieee.std_logic_unsigned.all; 
pr_out <= pr_in1 + pr_in2; 
+0

como dijo @Martin Thompson, no se recomienda el uso de esta biblioteca. – grorel

+0

¿Puedes explicarlo? –

+0

Todo está en el enlace en la respuesta de Martin Thompson. 'std_logic_arith''std_logic_unsigned' y' std_logic_signed' son bibliotecas no estándar desarrolladas por sinopsis. 'numeric_std' es la biblioteca estándar. – grorel

Cuestiones relacionadas