SOC

ps/2 keyboard testbench, ps/2키보드테스트벤치 parsing vhdl

전자자연인 2021. 6. 10. 21:51
반응형

첨부파일 : https://blog.naver.com/aanrt/221515682160

 

2-3 ps2 data pack 검사 및 parsing vhdl

entity ps2_parsing is

port(

nRst : in std_logic;

clk : in std_logic;

ps2_valid : in std_logic;

ps2_data : in std_logic_vector ( 7 downto 0) ;

valid : out std_logic;

data : out std_logic_vector(3 downto 0)

);

end ps2_parsing;

 

 

architecture beh of ps2_parsing is

 

function data_decode(in_data : std_logic_vector(7 downto 0) return

std_logic_vector is

variable return_data : std_logic_vector (3 downto 0);

begin

case in_data is

when x"45" => return_data := "0000";

when x"16" => return_data := "0001";

when x"1E" => return_data := "0010";

when x"26" => return_data := "0011";

when x"25" => return_data := "0100";

when x"2E" => return_data := "0101";

when x"36" => return_data := "0110";

when x"3D" => return_data := "0111";

when x"3E" => return_data := "1000";

when x"46" => return_data := "1001";

when x"1C" => return_data := "1010";

when x"32" => return_data := "1011";

when x"21" => return_data := "1100";

when x"23" => return_data := "1101";

when x"24" => return_data := "1110";

when x"2B" => return_data := "1111";

when others => return_data := "0000";

end case;

 

return(return_data);

end data_decode;

 

signal temp_data : std_logic_vector(7 downto 0);

signal data_0 : std_logic_vector(7 downto 0);

signal data_1 : std_logic_vector(7 downto 0);

 

signal ps2_valid_d : std_logic;

signal ps2_valid_det : std_logic;

 

begin

 

 

     process(nRst,clk)

begin

if(nRst = '0') then

   ps2_valid_d <= '0';

   ps2_valid_det <= '0';

 

elsif rising_edge(clk) then

   ps2_valid_d <= ps2_valid;

if(ps2_valid_d='0')and(ps2_valid = '1') then

                         ps2_valid_det <='1';

 else

    ps2_valid_det <= '0';

 end if;

end if;

end process;

 

 

process(nRst,clk)

     begin

if(nRst = '0') then

  temp_data <= (others =>'0');

   data_0 <= (others =>'0');

   data_1 <= (others =>'0');

   valid <= '0';

   data <= ( others => '0');

elsif rising_edge(clk) then

   temp_data <= ps2_data;

    if(ps2_valid_det = '1') then

      data_0 <= temp_data;

      data_1 <= data_0;

    end if;

     if(data_1 = x"F0") then

data <= data_decode(data_0);

valid <= ps2_valid_det;

end if;

end if;

end process;

end beh;

3-3 ps2_parsing 시뮬레이션 결과

 

 

 

(1) 키보드 입력에서 ps2_data 23(16진수)가 입력되고 이는 temp_data로 전달된다. 그리고 ps2_valid 1이 입력되어 ps2_valid_d에 전달되고

현재시점에서 ps2_valid의 값이 1, ps2_valid_d의 값은 ps2_valid 1의 값이 오기전의 값을 전달받으므로 0이므로 ps2_valid_det 1이 전달된다. (시작신호)

ps2_vadid_det의 값이 1로 되어, temp_data 값이 data_0 으로 전달되어 data_0의 값엔 23이 전달되고, data_0이 값이 data_1에 전달된다.

 

(2) 키에서 떨어질 때, F0 scan code data_1까지 전달되면 data_0엔 전에 입력받은 23 scan code값이 d이므로 data_decode(23) return 1101 data값에 d가 전달되어 출력된다.

 

 

 

반응형