发现' 0'运算符的定义" +"在VHDL中

时间:2014-10-27 23:18:19

标签: 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;

我收到以下错误

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.

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

4 个答案:

答案 0 :(得分:14)

使用

启动VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

答案 1 :(得分:1)

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

  

错误:HDLC编译器:69 - 第11行:&lt;í&gt;没有宣布。

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

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

  

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

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

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

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

    library ieee;
    use ieee.std_logic_1164.all;

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

如果没有添加正确的用法和库子句,分析器将无法找到签名为[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 <= counter + "1";)。保证增量至少反转一个输入。输出频率取决于路由延迟,锁存和递增延迟。

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

答案 2 :(得分:0)

在Vivado本身中,添加了下面提到的LAST行:


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

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

use IEEE.NUMERIC_STD.ALL

答案 3 :(得分:-2)

试试这个,

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;