Программа паролей VHDL с платой DE2 - PullRequest
0 голосов
/ 29 сентября 2019

Резюме:

Я пытаюсь создать систему паролей в VHDL с платой DE2 Altera. SW 0–7 - кодовый замок, LEDR 0–7 показывает текущий код, а сигнал «код» сохраняет комбинацию. Когда переключатели соответствуют коду, у вас есть возможность изменить код, удерживая клавишу KEY (1).

Проблема:

Код работает, как и должно, толькостартовый код не то, что ожидается. Должно быть: «01010101», как показано в сигнале;но это выходит как "01111111". Я подозреваю, что программа вводит оператор if при запуске, но я не понимаю, как это возможно, поскольку «код» и SW не должны быть равны. Чего мне не хватает?

Вот код:

library IEEE;
use IEEE.std_logic_1164.all;

entity pass_sys is
    port(
        SW : in std_logic_vector(7 downto 0);
        KEY : in std_logic_vector(3 downto 0);
        LEDR : out std_logic_vector(17 downto 0);
        LEDG : out std_logic_vector(17 downto 0)
    );
end pass_sys;

architecture func of pass_sys is
signal code : std_logic_vector(7 downto 0) := "01010101"; --start code
begin

process(SW)
begin
    LEDR(7 downto 0)<=code;

    if (SW = code) then
        LEDG(0)<='1';
        LEDG(1)<=not KEY(1);
        if (KEY(1) = '0') then
            code<=SW;
        end if;
    else
        LEDG(0)<='0';
    end if;
end process;

end func;

1 Ответ

0 голосов
/ 30 сентября 2019

Полагаю, ваша проблема возникает на вашей доске, а не в симуляции. Если я ошибаюсь, мой ответ не тот, который вы ожидаете.

Этот способ инициализации полезен только при моделировании:

signal code : std_logic_vector(7 downto 0) := "01010101"; --start code

Синтез не будет учитывать ваше значение инициализации (поэтому я не рекомендую вам использовать его, кроме как на испытательном стенде). Если вы хотите инициализировать сигнал, я советую использовать сброс.

Примечания:

  • Вы должны поместить KEY в список чувствительности и вывести эту строкувашего процесса:
LEDR(7 downto 0)<=code;
  • Ваш процесс выводит защелки, это не запрещено, но вы должны быть осторожны с этим

РЕДАКТИРОВАТЬ: Какдобавить сброс

library IEEE;
use IEEE.std_logic_1164.all;

entity pass_sys is
    port(
        RST : in std_logic;
        SW : in std_logic_vector(7 downto 0);
        KEY : in std_logic_vector(3 downto 0);
        LEDR : out std_logic_vector(17 downto 0);
        LEDG : out std_logic_vector(17 downto 0)
    );
end pass_sys;

architecture func of pass_sys is
signal code : std_logic_vector(7 downto 0);
begin

LEDR(7 downto 0)<=code;

process(SW, code, KEY)
begin

    if RST = '1' then
        LEDG <= (others => '0');
        code <= "01010101";
    elsif (SW = code) then
        LEDG(0)<='1';
        LEDG(1)<=not KEY(1);
        if (KEY(1) = '0') then
            code<=SW;
        end if;
    else
        LEDG(0)<='0';
    end if;
end process;

end func;

Контакт RST вашего компонента может быть подключен к аналоговому сигналу вашей карты (POWER_GOOD, ALIM_ON, DONE, ...) или ксигнал pll_locked PLL, если вы его используете.

...