22

我想要一个添加两个 std_logic_vectors 的简单模块。但是,将下面的代码与 + 运算符一起使用时,它不会合成。

library IEEE; 
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

entity add_module is
        port(
  pr_in1   : in std_logic_vector(31 downto 0);
  pr_in2   : in std_logic_vector(31 downto 0);
  pr_out   : out std_logic_vector(31 downto 0)  
        );
end add_module;

architecture Behavior of add_module is

begin

    pr_out <= pr_in1 + pr_in2;

end architecture Behavior;

我从 XST 收到的错误消息

第 17 行。+ 在这种情况下不能有这样的操作数。

我想念图书馆吗?如果可能的话,我不想将输入转换为自然数。

非常感谢

4

4 回答 4

27

您希望编译器如何知道您的 std_logic_vectors 是有符号还是无符号?在这两种情况下,加法器的实现是不一样的,所以你需要明确地告诉编译器你想要它做什么;-)

注意:StackOverflow 中的 VHDL 语法突出显示很糟糕。将此代码复制/粘贴到您首选的 VHDL 编辑器中以更轻松地阅读它。

library IEEE; 
use IEEE.std_logic_1164.all;
-- use IEEE.std_logic_arith.all; -- don't use this
use IEEE.numeric_std.all; -- use that, it's a better coding guideline

-- Also, never ever use IEEE.std_unsigned.all or IEEE.std_signed.all, these
-- are the worst libraries ever. They automatically cast all your vectors
-- to signed or unsigned. Talk about maintainability and strong typed language...

entity add_module is
  port(
    pr_in1   : in std_logic_vector(31 downto 0);
    pr_in2   : in std_logic_vector(31 downto 0);
    pr_out   : out std_logic_vector(31 downto 0)  
  );
end add_module;

architecture Behavior of add_module is
begin

  -- Here, you first need to cast your input vectors to signed or unsigned 
  -- (according to your needs). Then, you will be allowed to add them.
  -- The result will be a signed or unsigned vector, so you won't be able
  -- to assign it directly to your output vector. You first need to cast
  -- the result to std_logic_vector.

  -- This is the safest and best way to do a computation in VHDL.

  pr_out <= std_logic_vector(unsigned(pr_in1) + unsigned(pr_in2));

end architecture Behavior;
于 2010-10-28T12:30:20.620 回答
5

不要使用std_logic_arith- 我已经写过这个(在某种程度上:)。

使用 numeric_std - 并在您的实体端口上使用正确的类型。如果您正在做算术,请使用数字类型(整数或(无)符号向量,视情况而定)。他们会很好地合成。

std_logic_vectors 适合

  • 当您不关心数值时(一组控制位,一些随机数据位)
  • 当您不知道输入的类型时(比如一个可以根据控制标志对有符号和无符号数字进行操作的加法器)。
于 2010-11-02T14:08:33.317 回答
0

@Aurelien 提供的使用 numeric_std 的好建议。

请记住,添加两个 32 位值可能会产生一个 33 位值并决定您要如何处理溢出。

于 2010-10-28T13:02:52.623 回答
-2

解决此错误的简单方法是:
添加 unsign 库,
然后您的代码开始工作。

利用

ieee.std_logic_unsigned.all;
pr_out <= pr_in1 + pr_in2;
于 2016-09-21T07:13:25.750 回答