📄 keytx.vhd
字号:
library IEEE, unisim;use IEEE.std_logic_1164.all;use IEEE.NUMERIC_STD.all;use unisim.vcomponents.all;use work.key_Inter_pckg.all;entity KeyTx is --100_000 generic(FREQ : natural := 50000 ); -- frequency of main clock (KHz) port(clk : in std_logic; -- main clock rdy : buffer std_logic; ps2_clk : in std_logic; -- keyboard clock ps2_data : in std_logic; -- keyboard data s : out std_logic_vector(7 downto 0); -- LED display sccode : out std_logic_vector(7 downto 0));end keyTx;architecture behave of keyTx is constant YES : std_logic := '1'; constant NO : std_logic := '0'; signal scancode : std_logic_vector(7 downto 0); -- scancode from keyboard-- signal rdy : std_logic; -- indicates when scancode is available signal s_x : std_logic_vector(7 downto 0); -- next state of LED segments signal kbd_error : std_logic; -- error receiving scancode from keyboard -- LED segment activation patterns for various numbers and letters constant DIG_1 : std_logic_vector(7 downto 0) := "11111001"; constant DIG_2 : std_logic_vector(7 downto 0) := "10100100"; constant DIG_3 : std_logic_vector(7 downto 0) := "10110000"; constant DIG_4 : std_logic_vector(7 downto 0) := "10011001"; constant DIG_5 : std_logic_vector(7 downto 0) := "10010010"; constant DIG_6 : std_logic_vector(7 downto 0) := "10000010"; constant DIG_7 : std_logic_vector(7 downto 0) := "11111000"; constant DIG_8 : std_logic_vector(7 downto 0) := "10000000"; constant DIG_9 : std_logic_vector(7 downto 0) := "10010000"; constant DIG_0 : std_logic_vector(7 downto 0) := "11000000"; constant LETTER_A : std_logic_vector(7 downto 0) := "10001000"; constant LETTER_b : std_logic_vector(7 downto 0) := "10000011"; constant LETTER_C : std_logic_vector(7 downto 0) := "11000110"; constant LETTER_d : std_logic_vector(7 downto 0) := "10100001"; constant LETTER_E : std_logic_vector(7 downto 0) := "10000110"; constant LETTER_F : std_logic_vector(7 downto 0) := "10001110"; constant LETTER_G : std_logic_vector(7 downto 0) := "10010000";--** constant LETTER_h : std_logic_vector(7 downto 0) := "10001011"; constant LETTER_i : std_logic_vector(7 downto 0) := "11101111"; constant LETTER_J : std_logic_vector(7 downto 0) := "11100001"; constant LETTER_K : std_logic_vector(7 downto 0) := "10001001";--*** constant LETTER_L : std_logic_vector(7 downto 0) := "11000111"; constant LETTER_n : std_logic_vector(7 downto 0) := "10101011"; constant LETTER_M : std_logic_vector(7 downto 0) := "11001000";--**** constant LETTER_o : std_logic_vector(7 downto 0) := "10100011"; constant LETTER_P : std_logic_vector(7 downto 0) := "10001100"; constant LETTER_q : std_logic_vector(7 downto 0) := "10011000"; constant LETTER_R : std_logic_vector(7 downto 0) := "10101111"; constant LETTER_s : std_logic_vector(7 downto 0) := "10010010";--*** constant LETTER_T : std_logic_vector(7 downto 0) := "10000111"; constant LETTER_u : std_logic_vector(7 downto 0) := "11100011"; constant LETTER_V : std_logic_vector(7 downto 0) := "11000001";--*** constant LETTER_W : std_logic_vector(7 downto 0) := "11000001";--*** constant LETTER_X : std_logic_vector(7 downto 0) := "10001001";--*** constant LETTER_y : std_logic_vector(7 downto 0) := "10010001"; constant LETTER_Z : std_logic_vector(7 downto 0) := "10100100";--*** constant LETTER_Enter : std_logic_vector(7 downto 0) := "01111111";--*** constant LETTER_Space : std_logic_vector(7 downto 0) := "11110111";--*** constant LETTER_BKSP : std_logic_vector(7 downto 0) := "11111111";--*** constant LETTER_ESC : std_logic_vector(7 downto 0) := "11111110";--*** constant LETTER_tab : std_logic_vector(7 downto 0) := "11110110";--*** constant ERROR : std_logic_vector(7 downto 0) := "10111111";begin u400 : key_interface generic map( FREQ => FREQ ) port map( clk => clk, -- clock for the keyboard interface rst => kbd_error, -- reset the keyboard intfc whenever there is an error receiving a scancode ps2_clk => ps2_clk, -- clock from the keyboard ps2_data => ps2_data, -- serial data from the keyboard (valid on falling edge of ps2_clk) scancode => scancode, -- the scancode received from the keyboard rdy => rdy, -- indicates when a scancode from the keyboard is available error => kbd_error -- indicates an error in receiving a scancode from the keyboard ); -- this maps the scancode received from the keyboard into a pattern on the 7-segment display s_x <= DIG_1 when scancode = "00010110" else DIG_2 when scancode = "00011110" else DIG_3 when scancode = "00100110" else DIG_4 when scancode = "00100101" else DIG_5 when scancode = "00101110" else DIG_6 when scancode = "00110110" else DIG_7 when scancode = "00111101" else DIG_8 when scancode = "00111110" else DIG_9 when scancode = "01000110" else DIG_0 when scancode = "01000101" else LETTER_A when scancode = "00011100" else LETTER_b when scancode = "00110010" else LETTER_C when scancode = "00100001" else LETTER_d when scancode = "00100011" else LETTER_E when scancode = "00100100" else LETTER_F when scancode = "00101011" else LETTER_G when scancode = "00110100" else --** LETTER_h when scancode = "00110011" else LETTER_i when scancode = "01000011" else LETTER_J when scancode = "00111011" else LETTER_K when scancode = "01000010" else --** LETTER_L when scancode = "01001011" else LETTER_M when scancode = "00111010" else --** LETTER_n when scancode = "00110001" else LETTER_o when scancode = "01000100" else LETTER_P when scancode = "01001101" else LETTER_q when scancode = "00010101" else LETTER_R when scancode = "00101101" else LETTER_s when scancode = "00011011" else --** LETTER_T when scancode = "00101100" else LETTER_u when scancode = "00111100" else LETTER_V when scancode = "00101010" else --** LETTER_W when scancode = "00011101" else --** LETTER_X when scancode = "00100010" else --** LETTER_y when scancode = "00110101" else LETTER_Z when scancode = "00011010" else --** LETTER_Enter when scancode = "01011010" else --** LETTER_Space when scancode = "00101001" else --** LETTER_BKSP when scancode = "01100110" else --** LETTER_tab when scancode = "00001101" else LETTER_ESC when scancode = "01110110" else --** ERROR; -- update the LED display process(clk) begin if rising_edge(clk) then if rdy = YES then s <= s_x; -- update the display each time a scancode is received sccode <= scancode; end if; end if; end process;end behave;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -