在VHDL中找到运算符"+"的'0'定义

Bil*_*nde 5 vhdl

首先,我想指出这是我第一次用VHDL尝试,所以要善良.我想读取X1 ... X4输入并在输出端产生1的总和.这是我的代码

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;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

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.
Run Code Online (Sandbox Code Playgroud)

哪个"我"指的是什么,其他人呢?提前致谢.

Bor*_*nov 17

用你的VHDL启动

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
Run Code Online (Sandbox Code Playgroud)


小智 2

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

\n\n
\n

错误:HDLCompiler:69 - 第 11 行:未声明 <\xc3\xad>。

\n
\n\n

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

\n\n

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

\n\n
\n

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

\n
\n\n

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

\n\n
   library STD, WORK; use STD.STANDARD.all;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是为什么我们添加以下内容:

\n\n
    library ieee;\n    use ieee.std_logic_1164.all;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n
        counter <= counter + "1"; --O counter \xce\xbb\xce\xb5\xce\xb9\xcf\x84\xce\xbf\xcf\x85\xcf\x81\xce\xb3\xce\xb5\xce\xaf \xcf\x89\xcf\x82 \xcf\x83\xcf\x84\xce\xbf\xce\xb9\xcf\x87\xce\xb5\xce\xaf\xce\xbf \xce\xbc\xce\xbd\xce\xae\xce\xbc\xce\xb7\xcf\x82 \n
Run Code Online (Sandbox Code Playgroud)\n\n

字符串文字“1”将根据上下文确定其类型(这里是整个赋值。

\n\n

有两个候选包用于提供运算符重载函数:来自 Synopsys 的 std_logic_unsigned 和 numeric_std_unsigned -2​​008 IEEE 包。目前,这两者都不通过 use 子句变得可见。

\n\n

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

\n\n

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

\n\n
    counter <= std_logic_vector(unsigned(counter) + "1");\n
Run Code Online (Sandbox Code Playgroud)\n\n

还有其他问题

\n\n
    \n
  1. 锁存器的启用不应该是组合派生的。可能存在不同的路由延迟或时序导致故障。

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

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

  6. \n
\n