我在这个学校项目中工作。 我有两个std_logic_vector(31 downto 0)A和B,我有一个变量类型std_logic_vector(32 downto 0),我想添加A + B并将结果放在我的std_logic_vector中32位。
这是我的设计:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE ieee.numeric_std.ALL;
use ieee.std_logic_arith.all;
entity Ej3 is
Port ( A : in STD_LOGIC_VECTOR (31 downto 0);
B : in STD_LOGIC_VECTOR (31 downto 0);
S : out STD_LOGIC_VECTOR (31 downto 0);
AluOp : in STD_LOGIC_VECTOR (3 downto 0);
COut : out STD_LOGIC;
Z : out STD_LOGIC;
OFL : out STD_LOGIC);
end Ej3;
architecture Behavioral of Ej3 is
begin
process(AluOp)
variable Temp: STD_LOGIC_VECTOR (32 downto 0);
begin
Temp := A+B;
我有这个错误:发现' 0' operator" +"的定义无法确定" +"
的确切重载匹配定义有人可以帮忙吗?
答案 0 :(得分:8)
首先,您已将标准库numeric_std
和非标准库std_logic_arith
放在一起。他们互相冲突,所以摆脱std_logic_arith
。
这两个包都使用unsigned
和signed
类型实现算术运算。如果要对向量进行算术运算,强烈建议您使用这些类型。它明确表示您希望在数值上下文中解释它们。没有" +"为std_logic_vector
中实现的std_logic_1164
类型定义的运算符,这就是您收到错误的原因。您可以使用VHDL-2008中的算术运算符来扩充该类型,还包括numeric_std_unsigned
。同样,最好只使用传统的unsigned
类型:
A : in unsigned(31 downto 0);
B : in unsigned(31 downto 0);
...
process(AluOp)
variable temp : unsigned(32 downto 0);
begin
temp := resize(A, temp'length) + B;
分配的左侧和右侧的长度必须匹配,因此首先调整A信号的大小,在添加32位信号B之前将其扩展为33位。