VHDL 3-8 декодер, использующий синтаксическую ошибку if else вблизи 'else' и 'process' - PullRequest
0 голосов
/ 09 марта 2019

Я пытался скомпилировать эту программу и пытался внести изменения в соответствии с моим пониманием сообщения об ошибке, которое увеличило количество ошибок. Это второй VHDL-код, который я когда-либо писал, и я не уверен, что еще я могу сделать

это код:

    entity maashro3o is
port (Q: out bit_vector (0 to 7);
        A: in bit_vector(2 down to 0);
        en: in bit);
end maashro3o;

architecture maashro3o of maashro3o is
begin


process(A, en)
begin

if (en = "1") 
then 
    if (A = "000") 
    then
        Q <= "10000000";
    else if (A = "001") then
        Q <= "01000000";
    else if (A = "010") then
        Q <= "00100000";
    else if (A = "011") then
        Q <= "00010000";
    else if (A = "100") then
        Q <= "00001000";
    else if (A = "101") then
        Q <= "00000100";
    else if (A = "110") then
        Q <= "00000010";         
    else if (A = "111") then
        Q <= "00000001";    

END If;
    else
        Q <= "00000000";
End If;

end process;

end maashro3o

this is the error message

Обновление

Я изменил else if на elsif и else соответственно.

Now I'm getting all these errors

Я пытался удалить then из else, но я получаю похожие ошибки

    entity maashro3o is
port (Q: out bit_vector (0 to 7);
        A: in bit_vector(2 downto 0);
        en: in bit);
end maashro3o;

architecture maashro3o of maashro3o is
begin


process(A, en)
begin

if (en = '1') 
then 
    if (A = "000") 
    then
        Q <= "10000000";
    elsif (A = "001") then
        Q <= "01000000";
    else (A = "010") then
        Q <= "00100000";
    elsif (A = "011") then
        Q <= "00010000";
    else (A = "100") then
        Q <= "00001000";
    elsif (A = "101") then
        Q <= "00000100";
    else (A = "110") then
        Q <= "00000010";         
    elsif(A = "111") then
        Q <= "00000001";    

END If;
    else
        Q <= "00000000";
End If;

end process;

end maashro3o;

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Вам нужно поменять все остальные элементы внутри блока, начинающиеся с

if (A="000") then
 .
 .
 .
end if;

В VHDL нет ключевого слова "else if". Используйте "elsif". При кодировании оператора if-else с несколькими условиями вы не должны писать else после elsif или наоборот. Вы не можете использовать их обоих.

Ключевое слово "else" не объявляет конкретное утверждение. Он используется для проверки только одного условия и выполнения каких-либо действий, когда условие не выполняется.

Также при написании кода VHDL не забудьте включить библиотеки, которые вам понадобятся и могут понадобиться.

Исправленный код приведен ниже.

library ieee;
use ieee.std_logic_1164.all;

entity maashro3o is
port (Q: out bit_vector (0 to 7);
        A: in bit_vector(2 downto 0);
        en: in bit);
end maashro3o;

architecture maashro3o of maashro3o is
begin


process(A, en)
begin

if (en = '1')  then 

    if (A = "000")  then
        Q <= "10000000";
    elsif (A = "001") then
        Q <= "01000000";
    elsif (A = "010") then
        Q <= "00100000";
    elsif (A = "011") then
        Q <= "00010000";
    elsif (A = "100") then
        Q <= "00001000";
    elsif (A = "101") then
        Q <= "00000100";
    elsif (A = "110") then
        Q <= "00000010";         
    elsif(A = "111") then
        Q <= "00000001";    
end if;

    else
        Q <= "00000000";
end if;

end process;

end maashro3o;
0 голосов
/ 18 июля 2019

Почему вы хотите использовать только операторы else, так как декодер является комбинационной логикой, вы можете использовать оператор case для разработки логики, это будет более уместно.

...