📄 fpga64_keyboard_matrix_mark_mcdougall.vhd
字号:
-- -----------------------------------------------------------------------
--
-- FPGA 64
--
-- A fully functional commodore 64 implementation in a single FPGA
--
-- -----------------------------------------------------------------------
-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com)
-- http://www.syntiac.com/fpga64.html
-- -----------------------------------------------------------------------
-- 'Joystick emulation on keypad' additions by
-- Mark McDougall (msmcdoug@iinet.net.au)
-- -----------------------------------------------------------------------
--
-- VIC20/C64 Keyboard matrix
--
-- Hardware huh?
-- In original machine if a key is pressed a contact is made.
-- Bidirectional reading is possible on real hardware, which is difficult
-- to emulate. (set backwardsReadingEnabled to '1' if you want this enabled).
-- Then we have the joysticks, one of which is normally connected
-- to a OUTPUT pin.
--
-- Emulation:
-- All pins are high except when one is driven low and there is a
-- connection. This is consistent with joysticks that force a line
-- low too. CIA will put '1's when set to input to help this emulation.
--
-- -----------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.ALL;
use IEEE.numeric_std.ALL;
entity fpga64_keyboard_matrix is
port (
clk: in std_logic;
theScanCode: in unsigned(7 downto 0);
newScanCode: in std_logic;
joyA: in unsigned(4 downto 0);
joyB: in unsigned(4 downto 0);
pai: in unsigned(7 downto 0);
pbi: in unsigned(7 downto 0);
pao: out unsigned(7 downto 0);
pbo: out unsigned(7 downto 0);
videoKey : out std_logic;
traceKey : out std_logic;
trace2Key : out std_logic;
-- Config
-- backwardsReadingEnabled = 1 allows reversal of PIA registers to still work.
-- not needed for kernel/normal operation only for some specific programs.
-- set to 0 to save some hardware.
backwardsReadingEnabled : in std_logic
);
end fpga64_keyboard_matrix;
architecture rtl of fpga64_keyboard_matrix is
signal extendedFlag: std_logic := '0';
signal releaseFlag: std_logic := '0';
signal key_del: std_logic := '0';
signal key_return: std_logic := '0';
signal key_left: std_logic := '0';
signal key_right: std_logic := '0';
signal key_f7: std_logic := '0';
signal key_f1: std_logic := '0';
signal key_f3: std_logic := '0';
signal key_f5: std_logic := '0';
signal key_up: std_logic := '0';
signal key_down: std_logic := '0';
signal key_3: std_logic := '0';
signal key_W: std_logic := '0';
signal key_A: std_logic := '0';
signal key_4: std_logic := '0';
signal key_Z: std_logic := '0';
signal key_S: std_logic := '0';
signal key_E: std_logic := '0';
signal key_shiftl: std_logic := '0';
signal key_5: std_logic := '0';
signal key_R: std_logic := '0';
signal key_D: std_logic := '0';
signal key_6: std_logic := '0';
signal key_C: std_logic := '0';
signal key_F: std_logic := '0';
signal key_T: std_logic := '0';
signal key_X: std_logic := '0';
signal key_7: std_logic := '0';
signal key_Y: std_logic := '0';
signal key_G: std_logic := '0';
signal key_8: std_logic := '0';
signal key_B: std_logic := '0';
signal key_H: std_logic := '0';
signal key_U: std_logic := '0';
signal key_V: std_logic := '0';
signal key_9: std_logic := '0';
signal key_I: std_logic := '0';
signal key_J: std_logic := '0';
signal key_0: std_logic := '0';
signal key_M: std_logic := '0';
signal key_K: std_logic := '0';
signal key_O: std_logic := '0';
signal key_N: std_logic := '0';
signal key_plus: std_logic := '0';
signal key_P: std_logic := '0';
signal key_L: std_logic := '0';
signal key_minus: std_logic := '0';
signal key_dot: std_logic := '0';
signal key_colon: std_logic := '0';
signal key_at: std_logic := '0';
signal key_comma: std_logic := '0';
signal key_pound: std_logic := '0';
signal key_star: std_logic := '0';
signal key_semicolon: std_logic := '0';
signal key_home: std_logic := '0';
signal key_shiftr: std_logic := '0';
signal key_equal: std_logic := '0';
signal key_arrowup: std_logic := '0';
signal key_slash: std_logic := '0';
signal key_1: std_logic := '0';
signal key_arrowleft: std_logic := '0';
signal key_ctrl: std_logic := '0';
signal key_2: std_logic := '0';
signal key_space: std_logic := '0';
signal key_commodore: std_logic := '0';
signal key_Q: std_logic := '0';
signal key_runstop: std_logic := '0';
-- for joystick emulation on PS2
signal joySelKey : std_logic;
signal joyKeys : std_logic_vector(joyA'range); -- active high
signal joyA_s : unsigned(joyA'range); -- active low
signal joyB_s : unsigned(joyB'range); -- active low
signal joySel : std_logic_vector(1 downto 0) := "00";
begin
--
-- cycle though joystick emulation options on <F11>
--
-- "00" - PORTA = JOYA or JOYKEYS, PORTB = JOYB
-- "01" - PORTA = JOYA, PORTB = JOYB or JOYKEYS
-- "10" - PORTA = JOYA, PORTB = JOYKEYS
-- "11" - PORTA = JOYKEYS, PORTB = JOYA
process (clk) --, reset)
begin
if rising_edge(clk) then
if joySelKey = '1' then
joySel <= joySel + 1;
end if;
end if;
end process;
joyA_s <= joyA and not unsigned(joyKeys) when joySel = "00" else
not unsigned(joyKeys) when joySel = "11" else
joyA;
joyB_s <= joyB when joySel = "00" else
joyB and not unsigned(joyKeys) when joySel = "01" else
not unsigned(joyKeys) when joySel = "10" else
joyA;
matrix: process(clk)
begin
--if reset = '1' then
-- joySelKey <= '0';
-- joyKeys <= (others => '0');
if rising_edge(clk) then
-- reading A, scan pattern on B
pao(0) <= pai(0) and joyA_s(0) and
((not backwardsReadingEnabled) or
((pbi(0) or not key_del) and
(pbi(1) or not key_return) and
(pbi(2) or not (key_left or key_right)) and
(pbi(3) or not key_f7) and
(pbi(4) or not key_f1) and
(pbi(5) or not key_f3) and
(pbi(6) or not key_f5) and
(pbi(7) or not (key_up or key_down))));
pao(1) <= pai(1) and joyA_s(1) and
((not backwardsReadingEnabled) or
((pbi(0) or not key_3) and
(pbi(1) or not key_W) and
(pbi(2) or not key_A) and
(pbi(3) or not key_4) and
(pbi(4) or not key_Z) and
(pbi(5) or not key_S) and
(pbi(6) or not key_E) and
(pbi(7) or not (key_left or key_up or key_shiftL))));
pao(2) <= pai(2) and joyA_s(2) and
((not backwardsReadingEnabled) or
((pbi(0) or not key_5) and
(pbi(1) or not key_R) and
(pbi(2) or not key_D) and
(pbi(3) or not key_6) and
(pbi(4) or not key_C) and
(pbi(5) or not key_F) and
(pbi(6) or not key_T) and
(pbi(7) or not key_X)));
pao(3) <= pai(3) and joyA_s(3) and
((not backwardsReadingEnabled) or
((pbi(0) or not key_7) and
(pbi(1) or not key_Y) and
(pbi(2) or not key_G) and
(pbi(3) or not key_8) and
(pbi(4) or not key_B) and
(pbi(5) or not key_H) and
(pbi(6) or not key_U) and
(pbi(7) or not key_V)));
pao(4) <= pai(4) and joyA_s(4) and
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -