在变量类型VHDL中添加2 std_logic_vector

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'定义,无法确定"+"的精确重载匹配定义

有人可以帮忙吗?

Kev*_*eau 8

首先,您将标准库numeric_std和非标准库std_logic_arith一起包含在内.他们互相冲突,所以摆脱std_logic_arith.

这两个包都使用unsignedsigned类型实现算术.如果要对向量进行算术运算,强烈建议您使用这些类型.它明确表示您希望在数字上下文中解释它们.没有为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位.

  • 考虑仍然将端口声明为`A:在STD_LOGIC_VECTOR(31 downto 0);`等等,以便与其他模块轻松连接,然后在表达式中将`A`和`B`转换为`unsigned`,如`resize(unsigned( A),temp'length)+ unsigned(B)`.如果`temp`也是`std_logic_vector`,那么在添加后使用`std_logic_vector(resize ...)`转换回来. (4认同)