как проверить 4х4 клавиатуру в VHDL - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь придумать простую клавиатуру 4x4 FSM в VHDL.Я гуглил и не могу найти примеров для начала, и что я имею, я не могу придумать, как протестировать его на тестовом стенде.Я использую ISE на Spartan-3E.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;

entity keypad is
port(
    clk, reset: in std_logic;
    kcol: in std_logic_vector(3 downto 0);
    krow: out std_logic_vector(3 downto 0);
    key_press: out std_logic_vector(7 downto 0);
    valid: out std_logic
    );
end keypad;

architecture arch of keypad is

    type kstate_type is (idle1, start, wait1, done);
    signal kstate_reg, kstate_next: kstate_type;

    signal scan: std_logic_vector(3 downto 0);
    signal res_col: std_logic_vector(3 downto 0);

begin

key_pressed_proc: process(clk,reset, kstate_reg, kcol)
begin
    if reset = '0' then
        krow <= (others=>'1');
        scan <= "1110";
        kstate_reg <= idle1;
        kstate_next <= idle1;
        res_col <= (others=>'1');
        valid <= '0';

    elsif clk'event and clk = '1' then
        case kstate_reg is
            when idle1 =>
                valid <= '0';
                if kcol /= "1111" then
                kstate_next <= start;
                end if; 
            when start =>
                case scan is
                    when "1110" => scan <= "1101";
                    kstate_next <= wait1;
                    when "1101" => scan <= "1011";
                    kstate_next <= wait1;
                    when "1011" => scan <= "0111";
                    kstate_next <= wait1;
                    when "0111" => 
                    scan <= "1110";
                    krow <= (others=>'1');
                    kstate_next <= done;
                    key_press <= scan & res_col;
                    when others =>
                end case;
            when wait1 =>
                krow <= scan;
                if kcol(0) = '0' then
                res_col <= "0111";
                end if;
                if kcol(1) = '0' then
                res_col <= "1011";
                end if;
                if kcol(2) = '0' then
                res_col <= "1101";
                end if;
                if kcol(3) = '0' then
                res_col <= "1110";
                end if;
                kstate_next <= start;
            when done =>
                if kcol = "1111" then
                    valid <= '0';
                    key_press <= (others=>'0');
                    kstate_next <= idle1;
                end if; 
        end case;
        kstate_reg <= kstate_next;
    end if;
end process;

end arch;

Имея риск походить на студента, пытающегося заставить кого-то сделать мою домашнюю работу, кто-нибудь может сказать мне, сработает ли это, прежде чем я подключу провода и попытаюсь отладить его при включенных 4 светодиодах?чип Xilinx, который я использую?

...