VHDL 计数器错误 (vcom-1576)
VHDL Counter Error (vcom-1576)
伙计们,我正在尝试用 VHDL 编写一个简单的计数器,但我总是遇到这个错误:
Error: C:/Users/usrname/dir1/dir2/dir3/counter.vhd(22): near "rising_edge": (vcom-1576) expecting == or '+' or '-' or '&'.
这是我的代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity counter is
port (
EXT_RST : in std_logic;
EXT_CLK : in std_logic;
EXT_LED : out std_logic_vector(7 downto 0)
);
end counter;
architecture fast of counter is
signal count : std_logic_vector(7 downto 0);
begin
process(EXT_CLK, count)
begin
if (EXT_RST = '1') then
count <= "00000000";
elseif rising_edge(EXT_CLK) then
count <= count + '1';
end if;
end process;
EXT_LED <= count;
end fast;
有人知道为什么我会收到此错误吗?
除了 elsif
Lars Asplund 建议在他的评论中使用 `count:
使用类型转换
count <= std_logic_vector(unsigned(count) + 1);
或使用包 numeric_std_unsigned(仅限 VHDL -2008)而不是 numeric_std。
注意 1
而不是 '1'
和类型转换。 numeric_std_unsigned 不需要这些,它有一个带有此签名的“+”添加运算符函数:
[STD_ULOGIC_VECTOR,STD_ULOGIC return STD_ULOGIC_VECTOR]
使用包 numeric_std,您还可以将 count
设为无符号而不是 std_logic_vector 并转换为 LED 分配 -
EXT_LED <= std_logic_vector(count);
此外,count
不需要在进程敏感列表中:
process(EXT_CLK)
在使用 count
的值的过程中没有分配,除了时钟边沿。
使用第一个建议修改您的代码并缩进(这有助于显示敏感度列表不需要 count
:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity counter is
port (
EXT_RST : in std_logic;
EXT_CLK : in std_logic;
EXT_LED : out std_logic_vector(7 downto 0)
);
end counter;
architecture fast of counter is
signal count : std_logic_vector(7 downto 0);
begin
process(EXT_CLK)
begin
if (EXT_RST = '1') then
count <= "00000000";
elsif rising_edge(EXT_CLK) then
count <= std_logic_vector(unsigned(count) + 1);
end if;
end process;
EXT_LED <= count;
end fast;
本文将分析、阐述和模拟。
如果您实际综合您的设计,这会提示如何导出 EXT_RST
和 EXT_CLK
的问题。如果它们来自按钮(尤其是时钟),即使薄膜开关会老化并在以后反弹,也可能需要去抖动。
伙计们,我正在尝试用 VHDL 编写一个简单的计数器,但我总是遇到这个错误:
Error: C:/Users/usrname/dir1/dir2/dir3/counter.vhd(22): near "rising_edge": (vcom-1576) expecting == or '+' or '-' or '&'.
这是我的代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity counter is
port (
EXT_RST : in std_logic;
EXT_CLK : in std_logic;
EXT_LED : out std_logic_vector(7 downto 0)
);
end counter;
architecture fast of counter is
signal count : std_logic_vector(7 downto 0);
begin
process(EXT_CLK, count)
begin
if (EXT_RST = '1') then
count <= "00000000";
elseif rising_edge(EXT_CLK) then
count <= count + '1';
end if;
end process;
EXT_LED <= count;
end fast;
有人知道为什么我会收到此错误吗?
除了 elsif
Lars Asplund 建议在他的评论中使用 `count:
count <= std_logic_vector(unsigned(count) + 1);
或使用包 numeric_std_unsigned(仅限 VHDL -2008)而不是 numeric_std。
注意 1
而不是 '1'
和类型转换。 numeric_std_unsigned 不需要这些,它有一个带有此签名的“+”添加运算符函数:
[STD_ULOGIC_VECTOR,STD_ULOGIC return STD_ULOGIC_VECTOR]
使用包 numeric_std,您还可以将 count
设为无符号而不是 std_logic_vector 并转换为 LED 分配 -
EXT_LED <= std_logic_vector(count);
此外,count
不需要在进程敏感列表中:
process(EXT_CLK)
在使用 count
的值的过程中没有分配,除了时钟边沿。
使用第一个建议修改您的代码并缩进(这有助于显示敏感度列表不需要 count
:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity counter is
port (
EXT_RST : in std_logic;
EXT_CLK : in std_logic;
EXT_LED : out std_logic_vector(7 downto 0)
);
end counter;
architecture fast of counter is
signal count : std_logic_vector(7 downto 0);
begin
process(EXT_CLK)
begin
if (EXT_RST = '1') then
count <= "00000000";
elsif rising_edge(EXT_CLK) then
count <= std_logic_vector(unsigned(count) + 1);
end if;
end process;
EXT_LED <= count;
end fast;
本文将分析、阐述和模拟。
如果您实际综合您的设计,这会提示如何导出 EXT_RST
和 EXT_CLK
的问题。如果它们来自按钮(尤其是时钟),即使薄膜开关会老化并在以后反弹,也可能需要去抖动。