Ошибка счетчика VHDL (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;

Кто-нибудь знает, почему я получаю эту ошибку?


person josepchappa    schedule 13.10.2015    source источник
comment
Подсказка: elseif не является ключевым словом VHDL.   -  person wjl    schedule 13.10.2015
comment
когда я использую else if, я получаю еще больше ошибок: S   -  person josepchappa    schedule 13.10.2015
comment
Вместо этого используйте elsif.   -  person lasplund    schedule 13.10.2015


Ответы (1)


Помимо elsif Ларс Асплунд предложил использовать в своем комментарии преобразования типов для `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 и преобразовать для назначения светодиода -

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, если вы действительно синтезируете свой дизайн. Если они от кнопок (особенно часов), дребезг может быть необходим даже для мембранных переключателей, которые могут стареть и позже отскакивать.

person Community    schedule 13.10.2015
comment
Большое тебе спасибо! Я многому научился только на этом примере. - person josepchappa; 03.11.2015