PS/2 Keyboard
- Wrapper for PS/2 keyboard interfaces
- PS/2 to ASCII conversion
Software Interface
Status register (Read only)
- Addr = 0
- Value = 0x00, No data present
- Value = 0x01, Data present
Data register (Read only)
PS/2 Keyboard Subroutines
- Blocking routine waits for keypress
KB2U IOR 0X00 0X0C READ KBD STATUS
ARI 0X00 0X01 MASK RX DATA PRESENT BIT
BNZ KB2U NO KBD DATA
IOR 0X01 0X0D READ KBD DATA
NOKDBD RTS DONE KEYBOARD TO UART
- Non-blocking routine skips read
KB2U IOR 0X00 0X0C READ KBD STATUS
ARI 0X00 0X01 MASK RX DATA PRESENT BIT
BEZ NOKDBD NO KBD DATA
IOR 0X01 0X0D READ KBD DATA
IOW 0X01 0X09 WRITE TO UART DATA
NOKDBD RTS DONE KEYBOARD TO UART
Hook-up
- Add to Top Level VHDL code
Pins
- Add to top level entity pins list
-- PS/2
ps2Clk : inout std_logic;
ps2Data : inout std_logic;
Signals
- Add signal into architecture section
-- Decodes/Strobes
...
signal w_kbcs : std_logic;
-- Interfaces
...
signal w_KbdData : std_logic_vector(7 downto 0);
VHDL Instance
-- PS/2 keyboard/mapper to ANSI
KEYBOARD : ENTITY WORK.Wrap_Keyboard
port MAP (
i_CLOCK_50 => i_clk,
i_n_reset => w_resetClean_n,
i_kbCS => w_kbcs,
i_RegSel => w_periphAdr(0),
i_rd_Kbd => w_kbcs,
i_ps2_clk => ps2Clk,
i_ps2_data => ps2Data,
o_kbdDat => w_KbdData
);
Hook-up Strobes/Read Mux
- Add to strobes and read mux
-- Strobes/Selects
...
w_kbcs <= '1' when (w_periphAdr(7 downto 1) = "0000110") and (w_periphRd = '1') else '0';
-- Peripheral bus read mux
w_periphIn <= ...
w_KbdData when w_periphAdr(7 downto 1) = "0000110" else
...
Resources
- Logic Cells: 708
- Registers: 95
- Memory Bits: 0
- M9Ks: 0