【问题标题】:VHDL can't determine definition of operator "+"VHDL 无法确定运算符“+”的定义
【发布时间】:2016-05-19 17:33:58
【问题描述】:

当我尝试编译我的代码时,以下部分出现错误:

overflow <= input_a(15) + input_b(15);

我已将 input_a 和 input_b 声明为 15 位向量,我使用的库是:

library ieee; 
use ieee.std_logic_1164.all;

所以错误是:

Error (10327): VHDL error at alu16.vhd(45): can't determine definition of operator ""+"" -- found 0 possible definitions

提前致谢

【问题讨论】:

  • 我们中的一些人回答了您的最后一个问题。你看到了吗?
  • 当然谢谢。但我现在有另一个问题

标签: vhdl


【解决方案1】:

如果input_ainput_bstd_logic_vector,那么input_a(15)input_b(15)std_logic,但是VHDL 没有为+ 定义+ 运算符,因此出现错误。

如果您想基于两个std_logic 值生成结果,您可以使用标准逻辑运算符andorxornot,这就足够了。

【讨论】:

  • 还有其他方法可以做我想做的事情吗?
  • @N.Pipis 产生溢出有两种方式。如果您可以访问 MSB 的进位和进位,您可以对它们进行异或。见Calculating Overflow Flag: Method 2。这个想法是基于你在你的Making a 16-bit ALU using 1-bit ALUs - Stack Overflow 中使用全加器中的进位/输出,正如 Matthew 所指出的那样,或者参见计算溢出标志:另一种方式的方法 1。仅仅添加 a 和 b 的 MSB 是不够的。
【解决方案2】:

如果你想执行算术运算,你应该声明signed/unsigned 信号而不是bit_vector/std_logic_vector

最后这些类型只能用于逻辑运算,例如 and/or ... 因为编译器不知道您希望信号是有符号还是无符号。

当使用有符号/无符号类型时,您必须使用 IEEE numeric_std 包。

【讨论】:

    【解决方案3】:

    尝试包括未签名的库...它对我有用! 我列出了图书馆,我可以做总和

    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.std_logic_unsigned.all;
    

    【讨论】:

      【解决方案4】:

      添加这个: 使用 ieee.std_logic_unsigned.all; 因此您可以将操作 + - ... 与 std_logic 一起使用

      【讨论】:

      • 不,应该避免使用那个包,as they were deprecated many many years ago。对于 VHDL-2008,如果您真的想使用 std_logic_vector 进行算术运算,则引入了 numeric_std_unsigned。但最好不要。
      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多