首先,我想指出这是我第一次用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\n\n错误:HDLCompiler:69 - 第 11 行:未声明 <\xc3\xad>。
\n
这是由非 ISO 8859-1 字符引起的。我N用新的替换了它N并克服了这一点。我的分析器指向第 11 行,第 36 个字符,检查显示那里有一个两字节字符 (X"CE9D")。
VHDL 分析器根据 ISO 8859-1 字符的特定子集构建词汇元素。注释可以包含 VHDL -2008 中的任何字符,而该标准的先前修订版要求注释由图形字符子集组成。
\n\n\n\n\n错误:HDLCompiler:1731 - 第 17 行:找到运算符“+”的“0”定义,无法确定“+”的精确重载匹配定义
\n
运算符重载函数的重载解析上下文取决于签名 - 参数的类型和数量以及返回值的类型。VHDL 分析器只会查找它所指向的位置,而不查找每个设计单元可用的隐式上下文子句:
\n\n library STD, WORK; use STD.STANDARD.all;\nRun Code Online (Sandbox Code Playgroud)\n\n这就是为什么我们添加以下内容:
\n\n library ieee;\n use ieee.std_logic_1164.all;\nRun Code Online (Sandbox Code Playgroud)\n\n使库 ieee 包 std_logic_1164 中的所有声明可见,以便它们可以在设计规范中使用。
\n\n如果不添加正确的 use 和库子句,分析器将无法找到"+"签名为 [std_logic_vector string return std_logic_vector] 的函数。
为第 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 \nRun Code Online (Sandbox Code Playgroud)\n\n字符串文字“1”将根据上下文确定其类型(这里是整个赋值。
\n\n有两个候选包用于提供运算符重载函数:来自 Synopsys 的 std_logic_unsigned 和 numeric_std_unsigned -2008 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");\nRun Code Online (Sandbox Code Playgroud)\n\n还有其他问题
\n\n锁存器的启用不应该是组合派生的。可能存在不同的路由延迟或时序导致故障。
counter(N - 1 downto 0)取决于实现行为的综合(映射)以匹配模拟。如果实现为具有增量的锁存器,则存在反馈路径 ( counter <= counter + "1";),该反馈路径将在计数器输出上产生门控振荡。保证增量至少反转一个输入。输出频率将取决于路由延迟、锁存和增量延迟。
有一些历史综合属性用于指导计数器对其自身的 else 分配在逻辑中实现。否则,综合工具会忽略它们(大多数情况下模拟器都会忽略它们,有效值没有变化的分配不会导致事件)。这些属性可能对 CPLD 中的 Earle 锁存器有用,而 FPGA 供应商通常管理实现锁存器的所有方面。