Lau*_*ikh 1 variables logic add vhdl
我在这个学校项目工作.我有两个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;
Run Code Online (Sandbox Code Playgroud)
我有这个错误:找到运算符"+"的'0'定义,无法确定"+"的精确重载匹配定义
有人可以帮忙吗?
首先,您将标准库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;
Run Code Online (Sandbox Code Playgroud)
分配的左侧和右侧的长度必须匹配,因此首先调整A信号的大小,在添加32位信号B之前将其扩展为33位.