diff --git a/dvi_test.xise b/dvi_test.xise index b51d2e2..508ce9d 100644 --- a/dvi_test.xise +++ b/dvi_test.xise @@ -17,7 +17,7 @@ - + @@ -27,26 +27,34 @@ - + - + - + - + - + + + + + + + + + diff --git a/keyboard.vhd b/keyboard.vhd new file mode 100644 index 0000000..37a99d1 --- /dev/null +++ b/keyboard.vhd @@ -0,0 +1,85 @@ +library ieee; +library unisim; + +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity keyboard is + generic ( + input_clk: integer + ); + port ( + clk: in std_logic; + reset: in std_logic; + + bytes_received: out std_logic_vector(5 downto 0); + + ps2_scl: inout std_logic; + ps2_sda: inout std_logic + ); +end keyboard; + +architecture Behavioral of keyboard is + signal ps2_reset_n: std_logic; + signal ps2_clear_data_available: std_logic; + signal ps2_data_available: std_logic; + signal ps2_data_available_old: std_logic; + + signal byte_count: std_logic_vector(5 downto 0); +begin + + ps2_host: entity work.ps2 port map ( + clk_i => clk, + rst_i => ps2_reset_n, + + data_o => open, + data_i => "00000000", + ibf_clr_i => ps2_clear_data_available, + obf_set_i => '0', -- we don't want to write anything + ibf_o => ps2_data_available, + obf_o => open, + + frame_err_o => open, -- ignore errors for now + parity_err_o => open, + busy_o => open, + err_clr_i => '0', + + wdt_o => open, + + ps2_clk_io => ps2_scl, + ps2_data_io => ps2_sda + ); + + -- count bytes received + main: process(clk, reset) + constant max_delay: integer := input_clk / 200_000; -- 5µs + variable delay: integer range 0 to max_delay := 0; + begin + if reset = '1' then + delay := 0; + byte_count <= "000000"; + -- reset component + ps2_reset_n <= '0'; + elsif rising_edge(clk) then + if delay = 5 then + -- init component + ps2_reset_n <= '1'; + delay := delay + 1; + elsif delay = max_delay then + ps2_clear_data_available <= '0'; + ps2_data_available_old <= ps2_data_available; + if ps2_data_available_old = '0' and ps2_data_available = '1' then + -- count rising edges on ps2_data_available: + byte_count <= byte_count + 1; + ps2_clear_data_available <= '1'; + end if; + else + delay := delay + 1; + end if; + end if; + end process main; + + bytes_received <= byte_count; + +end Behavioral; diff --git a/main.ucf b/main.ucf index 110de02..ed10311 100644 --- a/main.ucf +++ b/main.ucf @@ -20,6 +20,10 @@ NET "dvi_reset" LOC = AK6; NET "i2c_scl" LOC = U27; NET "i2c_sda" LOC = T29; +# PS/2 Interface +NET "ps2_scl" LOC = T26; +NET "ps2_sda" LOC = T25; + NET "clk" LOC = AH15; NET "clk" PERIOD = 100 MHz HIGH 50%; @@ -28,7 +32,11 @@ NET "rotary_up" LOC = AH30; NET "rotary_down" LOC = AG30; NET "rotary_push" LOC = AH29; -NET "led0" LOC = H18; -NET "led1" LOC = L18; -NET "led2" LOC = G15; -NET "led4" LOC = G16; +NET "led(0)" LOC = H18; # no DCI +NET "led(1)" LOC = L18; # no DCI +NET "led(2)" LOC = G15; # no DCI +NET "led(3)" LOC = AD26; +NET "led(4)" LOC = G16; # no DCI +NET "led(5)" LOC = AD25; +NET "led(6)" LOC = AD24; +NET "led(7)" LOC = AE24; diff --git a/main.vhd b/main.vhd index 56c5a6a..1c37a67 100644 --- a/main.vhd +++ b/main.vhd @@ -21,11 +21,16 @@ entity main is i2c_scl: inout std_logic; i2c_sda: inout std_logic; + ps2_scl: inout std_logic; + ps2_sda: inout std_logic; + switch_center: in std_logic; rotary_up: in std_logic; rotary_down: in std_logic; rotary_push: in std_logic; + led: out std_logic_vector(7 downto 0); + led0: out std_logic; led1: out std_logic; led2: out std_logic; @@ -91,12 +96,23 @@ begin rgb => pixel_rgb ); + keyboard_i: entity work.keyboard generic map ( + input_clk => 48_000_000 + ) port map ( + clk => clk_vga, + reset => switch_center, + bytes_received => led(5 downto 0), + ps2_scl => ps2_scl, + ps2_sda => ps2_sda + ); + dvi_hsync <= hsync; dvi_vsync <= vsync; dvi_de <= de; - led0 <= switch_center; - led1 <= dvi_clk; - led2 <= hsync; - led4 <= vsync; + led(7) <= switch_center; + led(6) <= '0'; + --led1 <= dvi_clk; + --led2 <= hsync; + --led4 <= vsync; end Behavioral;