我正在参与这个学校项目。
我有两个 std_logic_vector (31 downto 0) A 和 B,并且我有一个变量类型 std_logic_vector (32 downto 0),我想添加 A+B 并将结果放入 32 位的 std_logic_vector 中。
这是我的设计:
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”定义,无法确定“+”的精确重载匹配定义
有人可以帮忙吗?
首先你已经包含了标准库numeric_std
和非标准库std_logic_arith
一起。他们互相冲突,所以摆脱std_logic_arith
.
这两个包都使用以下方法实现算术unsigned
and signed
类型。如果您想对向量进行算术运算,强烈建议您使用这些类型。它明确表明您希望它们在数字上下文中进行解释。没有为以下定义“+”运算符std_logic_vector
类型实现于std_logic_1164
这就是你收到错误的原因。您可以在 VHDL-2008 中使用算术运算符来扩充该类型,还包括numeric_std_unsigned
。再次强调,最好只使用传统的unsigned
type:
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 信号的大小,将其扩展为 33 位,然后再添加 32 位信号 B。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)