【问题标题】:found '0' definitions of operator "+" in VHDL在 VHDL 中找到运算符“+”的“0”定义
【发布时间】:2014-10-27 23:18:18
【问题描述】:

首先我想指出这是我第一次尝试使用 VHDL,所以请善待。我想读取 X1 ... X4 输入并在输出处产生总和。这是我的代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity counter_of_aces is 
  Generic(N: integer := 3);
     port( X1, X2, X3, X4 : IN BIT; 
        count: out std_logic_vector(N-1 downto 0)); 
end counter_of_aces;

architecture behavioral of counter_of_aces is 
signal counter : std_logic_vector(Ν-1 downto 0);
begin 
  process (X1, X2, X3, X4) 
  begin
    counter <= "0";
    if(X1='1' OR X2='1' OR X3='1' OR X4='1')then 
        counter <= counter + "1"; --O counter λειτουργεί ως στοιχείο μνήμης 
    else
        counter <= counter;
    end if; 
  end process; 
end behavioral;

我收到以下错误

ERROR:HDLCompiler:69 - Line 11: <í> is not declared.
ERROR:HDLCompiler:1731 - Line 17: found '0' definitions of operator "+", cannot determine exact overloaded matching definition for "+"
ERROR:HDLCompiler:854 - Line 10: Unit <behavioral> ignored due to previous errors.

它指的是哪个“i”,其他的呢?提前致谢。

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    开始你的 VHDL
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use ieee.std_logic_unsigned.all;
    

    【讨论】:

    • 你的意思是use ieee.numeric_std_unsigned.all;(VHDL-2008的一部分)......你提到的那个不是标准的一部分。
    • 我错过了什么还是这个答案与这个答案相矛盾:stackoverflow.com/a/45707415
    【解决方案2】:

    这些是基于模拟器分析示例代码的观察结果。

    ERROR:HDLCompiler:69 - 第 11 行: 未声明。

    这是由非 ISO 8859-1 字符引起的。我用新的N 替换了N 并超越了这一点。我的分析器指向第 11 行字符 36,检查显示那里有一个两字节字符(X“CE9D”)。

    VHDL 分析器根据 ISO 8859-1 字符的特定子集构造词法元素。注释可以包含 VHDL -2008 中的任何字符,而以前的标准版本要求 cmets 由图形字符子集组成。

    错误:HDLCompiler:1731 - 第 17 行:找到运算符“+”的“0”定义,无法确定“+”的确切重载匹配定义

    运算符重载函数的重载决策上下文取决于签名 - 参数的类型和数量以及返回值的类型。 VHDL 分析器只会查看它指向的位置,而不是每个设计单元都可用的隐式上下文子句:

       library STD, WORK; use STD.STANDARD.all;
    

    这就是我们添加以下内容的原因:

        library ieee;
        use ieee.std_logic_1164.all;
    

    使库 ieee 包 std_logic_1164 中的所有声明可见,以便可以在设计规范中使用。

    如果不添加正确的 use 和 library 子句,分析器将找不到签名为 [std_logic_vector string return std_logic_vector] 的 "+" 函数。

    为第 17 行的“+”运算符提供重载功能:

            counter <= counter + "1"; --O counter λειτουργεί ως στοιχείο μνήμης 
    

    字符串文字“1”将根据上下文确定其类型(此处为整个赋值。

    有两个候选包可提供运算符重载函数:来自 Synopsys 的 std_logic_unsigned 和 -2008 IEEE 包的 numeric_std_unsigned。两者都不是当前通过 use 子句可见的。

    由于在评论中发现了非 ISO 8859-1 字符,因此您似乎拥有符合 IEEE Std 1076-2008 的分析仪。

    对于较旧的 VHDL 实现,您可以坚持使用 Synopsys 包,编写自己的“+”函数,或使用包 numeric_std 的类型转换:

        counter <= std_logic_vector(unsigned(counter) + "1");
    

    还有其他问题

    1. 锁存器的启用不应该是组合派生的。可能有不同的布线延迟或时序导致毛刺。

    2. counter(N - 1 downto 0) 依赖于综合(映射)实现行为以匹配仿真。如果实现为具有增量的锁存器,则有一个反馈路径 (counter &lt;= counter + "1";) 将在计数器输出上产生门控振荡。一个增量保证至少反转一个输入。输出频率将取决于路由延迟、锁存器和增量延迟。

    3. 有历史综合属性用于指导计数器的 else 分配给它自己在逻辑中实现。否则,综合工具会忽略它们(大多数情况下,模拟器也是如此,没有改变有效值的分配不会导致事件)。这些属性可能对 CPLD 中的 Earle 锁存器很有用,而 FPGA 供应商通常会管理实现锁存器的所有方面。

    【讨论】:

      【解决方案3】:

      在 Vivado 本身中,它被写入添加下面提到的最后一行:


      -- 如果使用,请取消注释以下库声明

      -- 有符号或无符号值的算术函数

      use IEEE.NUMERIC_STD.ALL
      

      【讨论】:

      • 欢迎来到 stackoverflow 社区,请添加更多解释并更清楚地说明您的答案,如果可能,请添加一个 sn-p 或对您的解决方案的引用。
      【解决方案4】:

      试试这个,

      library IEEE;
      
      use IEEE.STD_LOGIC_1164.ALL;
      
      use ieee.std_logic_unsigned.all;
      
      use ieee.std_logic_arith.all;
      

      【讨论】:

      • 欢迎来到 Stack Overflow!感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
      • 这是一个糟糕的建议!不要使用这些库,因为它们不是标准的一部分。在进行signedunsigned 算术运算时,您应该使用numeric_std 库。如果您非常想使用 std_logic_vector 算术,请使用 VHDL-2008 numeric_std_unsigned 或(!)numeric_std_signed 库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2020-12-30
      相关资源
      最近更新 更多