VHDL计数器错误(vcom-1576)

时间:2015-10-13 12:58:44

标签: vhdl counter modelsim

我试图在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;

有谁知道为什么我会收到此错误?

1 个答案:

答案 0 :(得分:3)

除了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_RSTEXT_CLK的问题。如果它们来自按钮(特别是时钟),即使薄膜开关可能会老化,然后反弹,也可能需要去抖动。