tutorial - vhdl programacion
Error al agregar std_logic_vectors (4)
Quiero tener un módulo simple que agregue dos std_logic_vectors. Sin embargo, cuando se usa el código siguiente con el operador +, no se sintetiza.
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
La línea 17. + no puede tener tales operandos en este contexto.
¿Echo de menos una biblioteca? Si es posible, no quiero convertir las entradas en números naturales.
Muchas gracias
¿Cómo desea que el compilador sepa si sus std_logic_vectors están firmados o sin firmar? La implementación de Adder no es la misma en estos dos casos, por lo que debe decirle explícitamente al compilador lo que quiere que haga ;-)
Nota: el resaltado de sintaxis VHDL en es horrible. Copie / pegue este código en su editor 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;
La manera fácil de resolver este error es:
Añadir biblioteca de unsign,
Después de que su código comienza a trabajar.
Utilizar
ieee.std_logic_unsigned.all;
pr_out <= pr_in1 + pr_in2;
Un buen consejo de @Aurelien para usar numeric_std.
Tenga en cuenta que agregar dos valores de 32 bits puede resultar en un valor de 33 bits y decidir cómo desea manejar el desbordamiento.
No use std_logic_arith
- He escrito sobre esto (con cierta amplitud :).
Use numeric_std y use el tipo correcto en los puertos de su entidad. Si está haciendo aritmética, use tipos numéricos (ya sean enteros o (no) vectores con signo, según corresponda). Se sintetizan perfectamente bien.
std_logic_vector
s son buenos para
- cuando no le importan los valores numéricos (un conjunto de bits de control, algunos bits de datos aleatorios)
- cuando no conoce el tipo de entrada (por ejemplo, un sumador que puede operar tanto con números firmados como sin firmar en función de un indicador de control).