📄 ps2.vhd
字号:
---------------------------------------------------------------------------------------------------
--*************************************************************************************************
-- CreateDate : 2007-07-12
-- ModifData : 2007-07-12
-- Description : PS2 ( Synchronous, Data bits: 8 )
-- Author : Explorer01
-- Version : V1.0
--*************************************************************************************************
---------------------------------------------------------------------------------------------------
-- VHDL library Declarations
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Entity Declarations
ENTITY PS2 IS
PORT
(
RESET: IN STD_LOGIC;
GCLK: IN STD_LOGIC;
KBDATA: IN STD_LOGIC;
KBCLK: IN STD_LOGIC;
EOC: OUT STD_LOGIC;
PDATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END PS2;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Architecture of Entity Declarations
ARCHITECTURE Behavioral OF PS2 IS
SIGNAL CLK : STD_LOGIC;
SIGNAL DATA : STD_LOGIC;
SIGNAL spdata: STD_LOGIC_VECTOR(10 DOWNTO 0);
SIGNAL cnt8: INTEGER RANGE 0 TO 10;
SIGNAL Flag : STD_LOGIC;
SIGNAL Count : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
DATA <= KBDATA;
-------------------------------------------------
-- Optimize : CLK Filter
PROCESS( RESET, GCLK, KBCLK, Count )
BEGIN
IF( RESET='0' ) THEN
CLK <= '1';
Count <= (OTHERS=>'0');
ELSIF( KBCLK='0' ) THEN
IF( GCLK'EVENT AND GCLK='1' ) THEN
IF( Count<"1110" ) THEN Count <= Count + 1;
ELSE Count <= "1111"; CLK <= '0';
END IF;
END IF;
ELSE
CLK <= '1';
Count <= (OTHERS=>'0');
END IF;
END PROCESS;
-------------------------------------------------
-- Check flag of end
PROCESS( RESET, GCLK, CLK, KBCLK )
VARIABLE CountEnd : STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
IF( RESET='0' ) THEN
Flag <= '0';
CountEnd := (OTHERS=>'0');
ELSIF( KBCLK='0' ) THEN
Flag <= '1';
CountEnd := (OTHERS=>'0');
ELSE
IF( GCLK'EVENT AND GCLK='1' ) THEN
IF( CountEnd<"110010" ) THEN Flag <= '1';CountEnd := CountEnd + 1; -- 50
ELSE Flag <= '0';
END IF;
END IF;
END IF;
END PROCESS;
-------------------------------------------------
-- Recevie
Recevie: PROCESS( RESET, CLK, DATA, spdata, cnt8, Flag )
BEGIN
IF( RESET = '0' ) THEN
cnt8 <= 0; spdata <= (OTHERS=>'0');
ELSIF( Flag='0' ) THEN
cnt8 <= 0;
ELSIF( CLK'event AND CLK = '0' ) THEN
IF( cnt8<10 AND Flag='1' ) THEN
spdata(cnt8) <= DATA;
cnt8 <= cnt8 + 1;
ELSE
cnt8 <= 0;
END IF;
END IF;
END PROCESS;
-------------------------------------------------
-- End of recevie
PROCESS( RESET, cnt8 )
BEGIN
IF ( RESET='0' ) THEN EOC <= '0';
ELSIF( cnt8=10 ) THEN EOC <= '1';
ELSE EOC <= '0';
END IF;
END PROCESS;
-------------------------------------------------
-------------------------------------------------
PDATA <= spdata( 8 downto 1 );
END Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -