在变量类型VHDL中添加2 std_logic_vector

时间:2014-09-12 00:28:34

标签: variables logic vhdl add

我在这个学校项目中工作。 我有两个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" +"的定义无法确定" +"

的确切重载匹配定义

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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;

分配的左侧和右侧的长度必须匹配,因此首先调整A信号的大小,在添加32位信号B之前将其扩展为33位。