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

问题描述 投票:5回答:3

首先,我想指出这是我第一次用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.

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

vhdl
3个回答
14
投票

用你的VHDL启动

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

1
投票

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

错误:HDLCompiler:69 - 第11行:<í>未声明。

这是由非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
投票

试试这个,

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;
© www.soinside.com 2019 - 2024. All rights reserved.