반응형
첨부파일 : 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을 전달해준다.
반응형
'SOC' 카테고리의 다른 글
ps/2 keyboard DE2보드 동작/ps2통신 키보드 DE2 내용 및분석 (0) | 2021.06.10 |
---|---|
ps/2 keyboard testbench, ps/2키보드테스트벤치 parsing vhdl (0) | 2021.06.10 |
PS/2 동기화통신 ps/2 keyboard VHDL,MODELSIM (0) | 2021.06.09 |
TestBench연습 2진업다운카운터 (0) | 2021.06.09 |
SOC를 위한 모델심(MODELSIM)설치 (0) | 2021.06.09 |