首先,我想指出这是我第一次用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.
它指的是哪个“我”,其他人呢?提前致谢。
答案 0 :(得分:14)
使用
启动VHDLlibrary 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");
还有其他问题
锁存器的使能不应该是组合导出的。可能存在不同的路由延迟或导致毛刺的定时。
counter(N - 1 downto 0)
取决于实现行为的合成(映射)以匹配模拟。如果实现为具有增量的锁存器,则存在将在计数器输出上产生门控振荡的反馈路径(counter <= counter + "1";
)。保证增量至少反转一个输入。输出频率取决于路由延迟,锁存和递增延迟。
有一些历史综合属性用于指示计数器的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;