반응형
첨부파일 : 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가 전달되어 출력된다.
반응형
'SOC' 카테고리의 다른 글
simple_U_processor VHDL/TESTBENCH (0) | 2021.06.10 |
---|---|
ps/2 keyboard DE2보드 동작/ps2통신 키보드 DE2 내용 및분석 (0) | 2021.06.10 |
Ps/2통신 - 키보드 receiver,ps/2 keyboard receiver VHDL,SOC,MODELSIM (0) | 2021.06.09 |
PS/2 동기화통신 ps/2 keyboard VHDL,MODELSIM (0) | 2021.06.09 |
TestBench연습 2진업다운카운터 (0) | 2021.06.09 |