SOC

Ps/2통신 - 키보드 receiver,ps/2 keyboard receiver VHDL,SOC,MODELSIM

전자자연인 2021. 6. 9. 21:56
반응형

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

 

2-2 ps2 receiver vhdl

entity ps2_receiver is

port(

nRst:in std_logic;

clk : in std_logic;

ps2_clk : in std_logic;

ps2_data : in std_logic;

valid : out std_logic;

received_data : out std_logic_vector( 7 downto 0 )

);

end ps2_receiver;

 

architecture beh of ps2_receiver is

 

type state_type is (IDLE, START, RECEIVE, PARITY, STOP);

signal state : state_type;

signal ps2_clk_d : std_logic;

signal ps2_clk_det : std_logic;

signal ps2_data_d : std_logic;

signal ps2_data_det : std_logic;

signal bit_cnt: std_logic_vector(3 downto 0);

signal temp_data : std_logic_vector(7 downto 0);

 

 

begin

   process(nRst,clk)

    begin

 

     if(nRst='0')then

ps2_clk_d <= '0';

ps2_clk_det <= '0';

ps2_data_d <= '0';

         ps2_data_det <= '0';

elsif rising_edge(clk) then

ps2_clk_d <= ps2_clk;

ps2_data_d <= ps2_data;

if(ps2_clk_d ='0') and (ps2_clk = '1') then

ps2_clk_det <= '1';

 else

                    ps2_clk_det<='0';

 end if;

 

if(ps2_data_d = '1')and (ps2_data = '0') then

   ps2_data_det <= '1';

else

   ps2_data_det <= '0';

  end if;

end if;

end process;

process(nRst,clk)

nRst

     begin

if(nRst='0') then

   state <= IDLE ;

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

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

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

   valid <= '0';

elsif rising_edge(clk) then

   

case state is

when IDLE =>

if(ps2_data_det = '1') then

state <= START ;

else

state <= IDLE;

end if;

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

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

valid <= '0';

when START =>

if(ps2_clk_det = '1') then

state <= RECEIVE;

else

state <= START;

end if;

when RECEIVE =>

if(ps2_clk_det = '1') then

if(bit_cnt = 7) then

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

state<=PARITY;

else

bit_cnt <= bit_cnt + 1;

state <= RECEIVE;

end if;

temp_data <= ps2_data & temp_data(7 downto 1);

else

state <= RECEIVE ;

end if;

 

when PARITY =>

if(ps2_clk_det = '1') then

state <= STOP;

else

state <= PARITY;

end if;

received_data <= temp_data;

when STOP=>

if(ps2_clk_det = '1') then

state <= IDLE;

else

state <= STOP;

end if;

valid <= '1';

 when others =>

state <= IDLE;

end case;

end if;

end process;

end beh;

 

 

 

 

(0) 시스템CLK의 상승엣지 일 경우 ps2_data_det의 값이 1이되어 START상태로 시작된다.

(1) ps2_clk_det 값이 1이되어 RECEIVE 상태로, ps2_data 1의 값이 입력되고, 입력된 1의 값이 ps2_data_d로 전달된다,

그리고 temp_data값에 8비트자리에 ps2_data값을,7~1비트 자리에 temp_data(7 downto 1)이 연결연산자를 통해 8비트의 값이 전달된다. temp_data는 초기상태인 0000 0000 이므로

1(ps2_data)000 0000(temp_data)의 값이 temp_data에 최종적으로 전달 되고. temp_data 16진수로 80이므로 80이 출력된다. 이때 bit_cnt 비트수는 0이다

 

(2) ps_2data로부터 1이 입력되어 입력된 1의 값이 ps2_data_d에 전달된다.

그리고 temp_data 값은 8비트자리엔 새로입력된 1, 7~1비트 자리엔 (1)번에서 temp_data에저장된 1000 0000 7비트부터 1비트자리가 연결연산자를 통해 8비트로 입력되어 최종적으론 temp_data 1100 0000이 전달된다. temp_data 16진수인 C0로 출력된다. 이때 bit_cnt 비트수는 1이다.

 

(3)~(8) (1)~(2)번의 과정이 반복되어 처음부터 입력받은 값이 우측으로 8번의 과정을 거쳐 8 shift 되어 최종적으로 0010 0011이 되고 bit_cnt 비트수가 7이된다. 다음상태인 PARITY 오류검출상태로 넘어간다.

 

(9) PARITY 상태에선 temp_data의 최종값 0010 0011 received_data에 전달되어 16진수인 23으로 출력되고, ps2_clk_det의 값이 1이되면 STOP상태로 넘어가고 bit_cnt값이 0으로 초기화 된다.

 

(10) STOP상태에서 ps2_clk_det의 값이 1이되면 초기상태인 IDLE로 넘어가고 valid값에 1을 전달해준다.

 

반응형