From e3561ff8151be0de903755a919fec6488723724a Mon Sep 17 00:00:00 2001 From: lonkaars Date: Sat, 11 Feb 2023 16:46:37 +0100 Subject: scaffold keyboard --- keyboard/keyboard.srcs/bcd2disp.vhd | 1 + keyboard/keyboard.srcs/bcddec.vhd | 1 + keyboard/keyboard.srcs/dispdrv.vhd | 1 + keyboard/keyboard.srcs/dispshift.vhd | 1 + keyboard/keyboard.srcs/main-keyboard.vhd | 1 + keyboard/keyboard.srcs/main.xdc | 31 ++++ keyboard/keyboard.srcs/ps2sync.vhd | 1 + keyboard/keyboard.srcs/scancodefilter.vhd | 1 + keyboard/keyboard.xpr | 262 ++++++++++++++++++++++++++++++ src/dispshift.vhd | 17 ++ src/main-keyboard.vhd | 102 ++++++++++++ src/ps2sync.vhd | 18 ++ src/scancodefilter.vhd | 18 ++ 13 files changed, 455 insertions(+) create mode 120000 keyboard/keyboard.srcs/bcd2disp.vhd create mode 120000 keyboard/keyboard.srcs/bcddec.vhd create mode 120000 keyboard/keyboard.srcs/dispdrv.vhd create mode 120000 keyboard/keyboard.srcs/dispshift.vhd create mode 120000 keyboard/keyboard.srcs/main-keyboard.vhd create mode 100644 keyboard/keyboard.srcs/main.xdc create mode 120000 keyboard/keyboard.srcs/ps2sync.vhd create mode 120000 keyboard/keyboard.srcs/scancodefilter.vhd create mode 100644 keyboard/keyboard.xpr create mode 100644 src/dispshift.vhd create mode 100644 src/main-keyboard.vhd create mode 100644 src/ps2sync.vhd create mode 100644 src/scancodefilter.vhd diff --git a/keyboard/keyboard.srcs/bcd2disp.vhd b/keyboard/keyboard.srcs/bcd2disp.vhd new file mode 120000 index 0000000..0e7f206 --- /dev/null +++ b/keyboard/keyboard.srcs/bcd2disp.vhd @@ -0,0 +1 @@ +../../src/bcd2disp.vhd \ No newline at end of file diff --git a/keyboard/keyboard.srcs/bcddec.vhd b/keyboard/keyboard.srcs/bcddec.vhd new file mode 120000 index 0000000..41a41bc --- /dev/null +++ b/keyboard/keyboard.srcs/bcddec.vhd @@ -0,0 +1 @@ +../../src/bcddec.vhd \ No newline at end of file diff --git a/keyboard/keyboard.srcs/dispdrv.vhd b/keyboard/keyboard.srcs/dispdrv.vhd new file mode 120000 index 0000000..1646d14 --- /dev/null +++ b/keyboard/keyboard.srcs/dispdrv.vhd @@ -0,0 +1 @@ +../../src/dispdrv.vhd \ No newline at end of file diff --git a/keyboard/keyboard.srcs/dispshift.vhd b/keyboard/keyboard.srcs/dispshift.vhd new file mode 120000 index 0000000..7e87a56 --- /dev/null +++ b/keyboard/keyboard.srcs/dispshift.vhd @@ -0,0 +1 @@ +../../src/dispshift.vhd \ No newline at end of file diff --git a/keyboard/keyboard.srcs/main-keyboard.vhd b/keyboard/keyboard.srcs/main-keyboard.vhd new file mode 120000 index 0000000..5933dfc --- /dev/null +++ b/keyboard/keyboard.srcs/main-keyboard.vhd @@ -0,0 +1 @@ +../../src/main-keyboard.vhd \ No newline at end of file diff --git a/keyboard/keyboard.srcs/main.xdc b/keyboard/keyboard.srcs/main.xdc new file mode 100644 index 0000000..3b00359 --- /dev/null +++ b/keyboard/keyboard.srcs/main.xdc @@ -0,0 +1,31 @@ +set_property IOSTANDARD LVCMOS33 [get_ports CLK100] +set_property IOSTANDARD LVCMOS33 [get_ports {DD[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DD[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DD[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DD[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DD[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DD[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DD[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DD[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DS[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DS[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DS[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {DS[0]}] +set_property PACKAGE_PIN W5 [get_ports CLK100] +set_property PACKAGE_PIN V7 [get_ports {DD[7]}] +set_property PACKAGE_PIN U7 [get_ports {DD[6]}] +set_property PACKAGE_PIN V5 [get_ports {DD[5]}] +set_property PACKAGE_PIN U5 [get_ports {DD[4]}] +set_property PACKAGE_PIN V8 [get_ports {DD[3]}] +set_property PACKAGE_PIN U8 [get_ports {DD[2]}] +set_property PACKAGE_PIN W6 [get_ports {DD[1]}] +set_property PACKAGE_PIN W7 [get_ports {DD[0]}] +set_property PACKAGE_PIN U2 [get_ports {DS[3]}] +set_property PACKAGE_PIN U4 [get_ports {DS[2]}] +set_property PACKAGE_PIN V4 [get_ports {DS[1]}] +set_property PACKAGE_PIN W4 [get_ports {DS[0]}] + +set_property IOSTANDARD LVCMOS33 [get_ports PS2_CLK] +set_property IOSTANDARD LVCMOS33 [get_ports PS2_DAT] +set_property PACKAGE_PIN C17 [get_ports PS2_CLK] +set_property PACKAGE_PIN B17 [get_ports PS2_DAT] diff --git a/keyboard/keyboard.srcs/ps2sync.vhd b/keyboard/keyboard.srcs/ps2sync.vhd new file mode 120000 index 0000000..1bbb31a --- /dev/null +++ b/keyboard/keyboard.srcs/ps2sync.vhd @@ -0,0 +1 @@ +../../src/ps2sync.vhd \ No newline at end of file diff --git a/keyboard/keyboard.srcs/scancodefilter.vhd b/keyboard/keyboard.srcs/scancodefilter.vhd new file mode 120000 index 0000000..dba9d80 --- /dev/null +++ b/keyboard/keyboard.srcs/scancodefilter.vhd @@ -0,0 +1 @@ +../../src/scancodefilter.vhd \ No newline at end of file diff --git a/keyboard/keyboard.xpr b/keyboard/keyboard.xpr new file mode 100644 index 0000000..84edcf9 --- /dev/null +++ b/keyboard/keyboard.xpr @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default_dashboard + + + diff --git a/src/dispshift.vhd b/src/dispshift.vhd new file mode 100644 index 0000000..5669641 --- /dev/null +++ b/src/dispshift.vhd @@ -0,0 +1,17 @@ +library ieee; +use ieee.std_logic_1164.all; +--use ieee.numeric_std.all; + +entity dispshift is port( + CLK: in std_logic; -- system clock + S: in std_logic; -- shift + D: in std_logic_vector(3 downto 0); -- shift input (data) + N0, N1, N2, N3: out std_logic_vector(3 downto 0)); -- shift outputs +end dispshift; + +architecture Behavioral of dispshift is + +begin + + +end Behavioral; diff --git a/src/main-keyboard.vhd b/src/main-keyboard.vhd new file mode 100644 index 0000000..8397266 --- /dev/null +++ b/src/main-keyboard.vhd @@ -0,0 +1,102 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity main is + port( + CLK100: in std_logic; -- system clock + PS2_CLK: in std_logic; -- async ps/2 clock input + PS2_DAT: in std_logic; -- async ps/2 data input + DD: out std_logic_vector(7 downto 0); -- display segment data + DS: out std_logic_vector(3 downto 0)); -- display select +end main; + +architecture Behavioral of main is + component ps2sync + port( + CLK: in std_logic; -- system clock + PS2_CLK: in std_logic; -- async ps/2 clock input + PS2_DAT: in std_logic; -- async ps/2 data input + DAT: out std_logic_vector(7 downto 0); -- scancode data + NEW_DAT: out std_logic); -- if scancode was just completed (1 for once clock cycle) + end component; + component scancodefilter + port( + CLK: in std_logic; -- system clock + DAT: in std_logic_vector(7 downto 0); -- scancode input + NEW_DAT: in std_logic; -- new scancode input + BCD: out std_logic_vector(3 downto 0); -- bcd digit 0-9 or dash (0xB) for keypress + SHIFT: out std_logic); -- shift display (1 for one clock cycle per key down press) + end component; + component dispshift + port( + CLK: in std_logic; -- system clock + S: in std_logic; -- shift + D: in std_logic_vector(3 downto 0); -- shift input (data) + N0, N1, N2, N3: out std_logic_vector(3 downto 0)); -- shift outputs + end component; + component bcd2disp + port ( + CLK: in std_logic; -- system clock + N0, N1, N2, N3: in std_logic_vector(3 downto 0); -- shift inputs + DD: out std_logic_vector(7 downto 0); -- display data + DS: out std_logic_vector(3 downto 0)); -- display select + end component; + signal SYNC_DAT: std_logic_vector(7 downto 0); -- ps2sync <-> scancodefilter + signal SYNC_DAT_NEW: std_logic; -- ps2sync <-> scancodefilter + signal BCD_NEW: std_logic_vector(3 downto 0); -- scancodefilter <-> dispshift + signal BCD_SHIFT: std_logic; -- scancodefilter <-> dispshift + signal N0, N1, N2, N3: std_logic_vector(3 downto 0); -- inputs for display + signal DISP_CLK: std_logic_vector(16 downto 0); -- clock counter for display clock + -- clock period = (2 << 16) / 100_000_000 = 1.31 ms per display / 5.24 ms full refresh +begin + -- convert async ps2 signals into synchronous lines + ps2: component ps2sync + port map ( + CLK => CLK100, + PS2_CLK => PS2_CLK, + PS2_DAT => PS2_DAT, + DAT => SYNC_DAT, + NEW_DAT => SYNC_DAT_NEW); + + -- filter key up scancodes, and convert non-numeric keys into "-" (0xB) + filter: component scancodefilter + port map( + CLK => CLK100, + DAT => SYNC_DAT, + NEW_DAT => SYNC_DAT_NEW, + BCD => BCD_NEW, + SHIFT => BCD_SHIFT); + + -- display 'shift register' + shift_register: component dispshift + port map( + CLK => CLK100, + S => BCD_SHIFT, + D => BCD_NEW, + N0 => N0, + N1 => N1, + N2 => N2, + N3 => N3); + + -- display driver clock divider + process(CLK100) + begin + if rising_edge(CLK100) then + DISP_CLK <= (DISP_CLK + 1); + end if; + end process; + + -- numbers N0-N3 to displays 0-3 + disp: component bcd2disp + port map ( + CLK => DISP_CLK(16), + N0 => N0, + N1 => N1, + N2 => N2, + N3 => N3, + DD => DD, + DS => DS); +end Behavioral; + diff --git a/src/ps2sync.vhd b/src/ps2sync.vhd new file mode 100644 index 0000000..5f911cc --- /dev/null +++ b/src/ps2sync.vhd @@ -0,0 +1,18 @@ +library ieee; +use ieee.std_logic_1164.all; +--use ieee.numeric_std.all; + +entity ps2sync is port( + CLK: in std_logic; -- system clock + PS2_CLK: in std_logic; -- async ps/2 clock input + PS2_DAT: in std_logic; -- async ps/2 data input + DAT: out std_logic_vector(7 downto 0); -- scancode data + NEW_DAT: out std_logic); -- if scancode was just completed (1 for once clock cycle) +end ps2sync; + +architecture Behavioral of ps2sync is + +begin + + +end Behavioral; diff --git a/src/scancodefilter.vhd b/src/scancodefilter.vhd new file mode 100644 index 0000000..518c3aa --- /dev/null +++ b/src/scancodefilter.vhd @@ -0,0 +1,18 @@ +library ieee; +use ieee.std_logic_1164.all; +--use ieee.numeric_std.all; + +entity scancodefilter is port( + CLK: in std_logic; -- system clock + DAT: in std_logic_vector(7 downto 0); -- scancode input + NEW_DAT: in std_logic; -- new scancode input + BCD: out std_logic_vector(3 downto 0); -- bcd digit 0-9 or dash (0xB) for keypress + SHIFT: out std_logic); -- shift display (1 for one clock cycle per key down press) +end scancodefilter; + +architecture Behavioral of scancodefilter is + +begin + + +end Behavioral; -- cgit v1.2.3