Article Index

 

 

 


 

The ps2 bloclk is more than a just the ps2 interface it is also coverts the Keyboard Scan to ASCI and a value I use to display on the screen

 

 

 

 

                      Keyboard G is   scan code 34  than needs to be asci G and in my my Fonts 16

                       this is line 34 of the file kb_conversion.vhd

                               x"1647",  --34  G  display  16     ascii 47

                                     

                                                           This if the font that is 16 hex

                                
 

 

      


 Test Bech of the ps2 module using scan code 34 (G)

 

 

 

 


                                                               Ps2 port  
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity ps2 is


 port (kb_ack       : in  std_logic;
       clk          : in  std_logic;
     rst          : in  std_logic;
   kb_clk       : in  std_logic;
   data_kb   : in  std_logic;
   data_out     : inout std_logic_vector (7 downto 0) ;
      data_ready   : out std_logic;
   parity_error : out std_logic;
    asci   : out std_logic_vector (7 downto 0) ;
   display   : out std_logic_vector (7 downto 0)
   ); 
     end ps2;


architecture behavoral  of ps2 is

COMPONENT  kb_conversion

  port (        clk  : in std_logic;
                rd  : in std_logic;
                scan_code : in std_logic_vector (6 downto 0);
                asci    : out std_logic_vector (7 downto 0);
                display : out std_logic_vector (7 downto 0)
        );
   END COMPONENT;

    --- signal declarations ---

 signal  count              : std_logic_vector (3 downto 0) := "0000";
 signal  tmp_data           : std_logic_vector (10 downto 0);
 signal  data_ready_internal: std_logic;
 signal  parity_chk         : std_logic;
 signal  asci_Signal        : std_logic_vector (7 downto 0);
 signal  display_Signal    : std_logic_vector (7 downto 0);
 signal  data_out_signal    : std_logic_vector (7 downto 0);
 signal  scan_code_signal   : std_logic_vector (6 downto 0);

 signal   clk_Signal  : std_logic;
 signal       rd : std_logic :='0';
 signal       fd : std_logic :='0';
 signal       q1 : std_logic :='0';
 signal       q0 : std_logic :='0';
 signal      count_rd : std_logic;
 
   begin

   process ( rst,kb_clk)
     begin
     if (rst = '0')  then                    
          tmp_data  <= "00000000000";
          count <= "0000";
       parity_chk <= '0';
          
             else
                 
               if  ( kb_clk ='0' and kb_clk'Event  ) then
          
              if   (count = "1010" )   then
                   count <= "0000";
                    data_ready_internal <= '1';
          data_out <= tmp_data ( 9 downto 2);
        
                 else   tmp_data (10 downto 0)  <= data_kb & tmp_data (10 downto 1);
                  count <= count + 1;
         parity_chk <= parity_chk xor data_kb;       
                     data_ready_internal <= '0';      
            
         
       
               end if;
               end if;
          end if; 
       end process;

data_out_signal <= data_out ;

  process ( rst,kb_clk)

   begin
          if  (kb_clk'event and kb_clk ='1' and (count = "1011")) then
               parity_error <=  not parity_chk;
             end if;
    end process;


U1 : kb_conversion
  PORT MAP (clk => clk,
            rd => '1',
            scan_code =>scan_code_signal ,
            asci => asci_Signal,
            display => display_Signal);


--process (scan_code_signal,data_out_signal,asci_Signal,data_ready_internal)
-- begin
--if (not (  data_out_signal = x"F0" )) then
    scan_code_signal  <= data_out_signal (6 downto 0);
 asci <= asci_Signal;
  
--  else
 --  asci <= x"00";
--   scan_code_signal <= x"00";
-- end if ;
 
-- end process;
  display <= display_Signal;

 

process ( data_out_signal, clk,rst)

   begin 
  
 --  if (rst = '0' and(  data_out_signal = x"F0" )) then
    if (data_out_signal(7 downto 4) = x"E")  or (data_out_signal(7 downto 4) = x"F")  then
    q0 <= '0';
    q1 <= '0';
  
      elsif (clk'event and clk ='1')then
  q0 <= data_ready_internal;
  q1 <= q0; 
  end if;
  end process ;
   
    rd <= q0 and (not q1);
       fd <= q1 and (not q0);
  
  --  data_ready <= rd;
    --   count_rd <= rd;

 


 process (clk,rst )
  begin
   if (clk'event and clk ='1') then
     if ( rd = '1' ) then
     count_rd  <= not   count_rd ;
    data_ready <= count_rd;
  else
        data_ready <= '0';  
 
  end if ;
  end if;
     
     
    end process;

  

     end;

 

 

 

 

 


 

                  asci    : out std_logic_vector (7 downto 0);
                  display : out std_logic_vector (7 downto 0)
        );
end;

 architecture   arc_kb_conversion of kb_conversion is
     signal display_asci_out: std_logic_vector(15 downto 0);
    type my_data_kb is array (0 to 127) of std_logic_vector (15 downto 0);
 signal my_data_sig :   my_data_kb :=
     (
     
     
     
      x"0000",  --00
      x"0000",  --01
      x"0000",  --02
      x"0000",  --03
      x"0000",  --04
      x"0000",  --05
      x"0000",  --06
      x"0000",  --07
      x"0000",  --08
      x"0000",  --09
      x"0000",  --0A
      x"0000",  --0B
      x"0000",  --0C
      x"0000",  --0D
      x"0000",  --0E
      x"0000",  --0F     
      x"0000",  --10
      x"0000",  --11
      x"0000",  --12
      x"0000",  --13
      x"0000",  --14
      x"2051",  --15  Q  DISP  20   ascii  51
      x"0000",  --16
      x"0000",  --17
      x"0000",  --18
      x"0000",  --19
      x"295A",  --1A  Z  dsisplay  29  ascii 5A
      x"2253",  --1B  S  display  22   ascii 53
      x"1041",  --1C  A  display  10   ascii 41
      x"2657",  --1D  W  display  26   ascii 57
      x"0000",  --1E
      x"0000",  --1F
      x"0000",  --20
      x"1243",  --21  C  display 12   ascii  43
      x"2758",  --22  X  DISPLAY 27   ascii  58
      x"1344",  --23  D  display 13   ascii  44
      x"1445",  --24  E  display 14   ascii  45
      x"0000",  --25
      x"0000",  --26
      x"0000",  --27
      x"0000",  --28
      x"2F00",  --29   sp display 2F
      x"2556",  --2A  V  display 25      ascii 56
      x"1546",  --2B  F  display 15      ascii 46
      x"2354",  --2C  T  display 23      ascii 54
      x"2152",  --2D  R  display 21   ascii 52
      x"0000",  --2E
      x"0000",  --2F
      x"0000",  --30
      x"1D4E",  --31  N  display  1D     ascii 4E
      x"1142",  --32  B  display  11     ascii 42
      x"1748",  --33  H  display  17     ascii 48
      x"1647",  --34  G  display  16     ascii 47
      x"2859",  --35  Y  display  28     ascci 59
      x"0000",  --36
      x"0000",  --37
      x"0000",  --38
      x"0000",  --39
      x"1C4D",  --3A  M  display 1C     ascii 4D
      x"194A",  --3B  J  display 19     ascii 4A
      x"2455",  --3C  U  display 24     ascii 55
      x"0000",  --3D
      x"0000",  --3E
      x"0000",  --3F
      x"0000",  --40
      x"0000",  --41
      x"1A4B",  --42 K   display  1A  ascii 4B
      x"1849",  --43 I   display  18    ascci 49
      x"1E4F",  --44 O   display  1E    ascci 4F
      x"0000",  --45
      x"0000",  --46
      x"0000",  --47
      x"0000",  --48
      x"0000",  --49
      x"0000",  --4A
      x"1B4C",  --4B  L display   1B   ascii 4C
      x"0000",  --4C
      x"1F50",  --4D  P display  1F    ascii 50
      x"0000",  --4E
      x"0000",  --4F
      x"0000",  --50
      x"0000",  --51
      x"0000",  --52
      x"0000",  --53
      x"0000",  --54
      x"0000",  --55
      x"0000",  --56
      x"0000",  --57
      x"0000",  --58
      x"0000",  --59
      x"0000",  --5A
      x"0000",  --5B
      x"0000",  --5C
      x"0000",  --5D
      x"0000",  --5E
      x"0000",  --5F
      x"0000",  --60
      x"0000",  --61
      x"0000",  --62
      x"0000",  --63
      x"0000",  --64
      x"0000",  --65
      x"0000",  --66
      x"0000",  --67
      x"2f00",  --68
      x"0000",  --69
      x"0000",  --6A
      x"2f00",  --6B
      x"0000",  --6C
      x"0000",  --6D
      x"0000",  --6E
      x"0000",  --6F
      x"0000",  --70
      x"0000",  --71
      x"2f00",  --72
      x"0000",  --73
      x"2f00",  --74
      x"2f00",  --75
      x"0000",  --76
      x"0000",  --77
      x"0000",  --78
      x"0000",  --79
      x"0000",  --7A
      x"0000",  --7B
      x"0000",  --7C
      x"0000",  --7D
      x"0000",  --7E
      x"0000"   --7F
     
           );
 
 begin
   
  process (clk)  is
  
 begin

if rising_edge (clk) then
     if ( rd = '1') then
      
              display_asci_out <= my_data_sig(  conv_integer(scan_code));
         asci    <= display_asci_out(7 downto 0);
         display <= display_asci_out(15 downto 8);
        end if;
  end if;  

end process ;
             
end ;

 

 

 

 

 

 

 

 

© 2019 All Rights Reserved. Designed By Arie Lashansky

Please publish modules in offcanvas position.