⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2.vhd

📁 基于fpga和sopc的用VHDL语言编写的EDA的PS/2鼠标键盘控制模块
💻 VHD
字号:

-----------this procedure is nearly successfull;
-----------maybe there are some parts need to be modified;
-----------complete at 2003:5:16;3:20 at afternoon;
-----------but complete successfully at 2003:5:25 night

 LIBRARY ieee;
 USE ieee.std_logic_1164.all; 
 use	ieee.std_logic_arith.all;
 use	ieee.std_logic_unsigned.all;

 ENTITY ps2 IS 
	port
	(   reset0	 :   in std_logic;
		clk0	     :   in std_logic;		-- 750kHz
		ps2_clk0  :  INOUT  STD_LOGIC;
		ps2_data0 :  INOUT  STD_LOGIC;
    -------------------------------------------
       ps2_data20  :  out  std_logic_vector(7 downto 0);
       ps2_data30  :  out  std_logic_vector(7 downto 0)
           			 );
 END ps2;

 ARCHITECTURE bdf_type OF ps2 IS 

  signal	  senddata    :  STD_LOGIC_VECTOR(11 DOWNTO 0);
  constant    ps2_f4      : std_logic_vector(10 downto 0) := B"10_11110100_0";
  signal    ps2_data_s    : std_logic;
  signal    ps2_clk_s     : std_logic;
  signal      enk         : std_logic;
  signal     lowtimecount : std_logic_vector(6 downto 0);
  signal     ps2_clk_r    : std_logic;
-----------------------------------------------------
  signal  flag            :   std_logic;
-----------------------------------------------------
 signal   always_one  :  std_logic; 
 signal   q_data1_x   :   std_logic_vector(8 downto 0);
 signal   q_data2_x   :   std_logic_vector(8 downto 0);
 signal   q_data3_x   :   std_logic_vector(8 downto 0);
 signal   q_data4_x   :   std_logic_vector(8 downto 0);
 signal   q_data1     :   std_logic_vector(7 downto 0);
 signal   q_data2     :   std_logic_vector(7 downto 0);
 signal   q_data3     :   std_logic_vector(7 downto 0);
 signal   q_data4     :   std_logic_vector(7 downto 0);

 signal   count         :   std_logic_vector(3 downto 0);
----------------------------------------------
 type statetype is ( m2_st0,m2_new,m2_st1,m2_st2,m2_st3,m2_st4,m2_st5,m2_st6,m2_st7,m2_st8,m2_st9,
             m2_st10,m2_st11,m2_st12,m2_st13,m2_st14,m2_st15,m2_st16,m2_st17,m2_st18,m2_st19,
             m2_st20,m2_st21,m2_st22,m2_st23,m2_st24,m2_st25,m2_st26,m2_st27,m2_st28,m2_st29,
             m2_st30,m2_st31,m2_st32,m2_st33,m2_st34,m2_st35,m2_st36,m2_st37,m2_st38,m2_st39,
                     m2_st40,m2_st41,m2_st42,m2_st43,m2_st44,m2_st45,m2_st46); 
 signal  m2_state,m2_nexts  :  statetype;
 
BEGIN 

    
  ps2_data_s <= senddata(0);

  ps2_clk0 <= '0' when ps2_clk_s = '0' else  'Z';
	
  ps2_data0 <= '0' when ps2_data_s = '0' else  'Z';
  --------------------------------------------------------
  process(reset0)  begin
       if  reset0'event and reset0='0'  then  flag<='1';
                            end if;
         end process;
----------------------------------------------------------
u1: process(clk0,reset0) begin
	  if reset0 = '1' then
		 lowtimecount <= (others => '0');
		 enk <= '0';
		 ps2_clk_s <= '1';
	  elsif falling_edge(clk0) then
---------------------- 
if  flag='1'  then
---------------------
		 if lowtimecount < 100 then
			lowtimecount <= lowtimecount + 1;
			ps2_clk_s <= '0';
		 elsif lowtimecount <120 then
			lowtimecount <= lowtimecount + 1;
			enk <= '1';
		 else
			ps2_clk_s <= '1';
			enk <= '0';
		end if;
	end if;
end if;
    end process;

u2:process(clk0) begin
	if falling_edge(clk0) then
		ps2_clk_r <= ps2_clk0;
	end if;
    end process;

u3:process(ps2_clk_r,enk) begin
     if enk = '1' then 
		senddata <= '1' & ps2_f4 ;
	 elsif falling_edge(ps2_clk_r) then
  	    senddata(11 downto 0) <= '1' & senddata(11 downto 1);
	 end if;
   end process;

-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
-----------------------------------------------Receve part--------------------------
       con: process( enk,ps2_clk_r)   
         begin
          if enk='1' then
             count<=(others=>'0');   --count
          elsif(ps2_clk_r'event and ps2_clk_r='0') then         --receive at rising_edfe
             if count<15 then
                count<=count+1;
             end if;
          end if;
        end process;

  u4:  process(clk0)
       begin
          if(clk0'event and clk0='1')  then
                 m2_state<=m2_nexts;
          end if;
       end process;
 u5:   process(ps2_clk_r,count,ps2_data0)  
 
      begin
      if(count<10)  then               
           m2_nexts<=m2_st0;

      elsif(ps2_clk_r'event and ps2_clk_r='1') then
           case m2_state is
       when  m2_st0=>   --------------------
                     --   m2_nexts<=m2_new;
                        m2_nexts<=m2_st1;
       when  m2_st1=>   m2_nexts<=m2_st3;
 ------------------------------                                          
      -- when  m2_st2=>   m2_nexts<=m2_st3;
 ------------------------------  
       when  m2_st3=>   m2_nexts<=m2_st4;                        --start
                                                                  
       when  m2_st4=>   m2_nexts<=m2_st5;                         --data0
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1);    
       when  m2_st5=>   m2_nexts<=m2_st6;
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1);   
       when  m2_st6=>   m2_nexts<=m2_st7; 
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1);   
       when  m2_st7=>   m2_nexts<=m2_st8;
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1); 
       when  m2_st8=>   m2_nexts<=m2_st9;
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1);   
       when  m2_st9=>   m2_nexts<=m2_st10;   
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1);        
       when  m2_st10=>  m2_nexts<=m2_st11; 
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1);               
       when  m2_st11=>  m2_nexts<=m2_st12;              
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1);        --data7    
                                      --  q_data1<=q_data1_x(8 downto 1);  
               
       when  m2_st12=>  m2_nexts<=m2_st13;
               q_data1_x<=ps2_data0&q_data1_x(8 downto 1);   
                                      q_data1<=q_data1_x(8 downto 1);                    
       when  m2_st13=>  m2_nexts<=m2_st14;
---------------------------------------------------------------------                
       when  m2_st14=>  m2_nexts<=m2_st15;
                                                               --start
       when  m2_st15=>  m2_nexts<=m2_st16;  
              q_data2_x<=ps2_data0&q_data2_x(8 downto 1);        --data0 
       when  m2_st16=>  m2_nexts<=m2_st17;
              q_data2_x<=ps2_data0&q_data2_x(8 downto 1);  
       when  m2_st17=>  m2_nexts<=m2_st18;               
              q_data2_x<=ps2_data0&q_data2_x(8 downto 1); 
                                        --  always_one<=ps2_data;
       when  m2_st18=>  m2_nexts<=m2_st19;
              q_data2_x<=ps2_data0&q_data2_x(8 downto 1); 
                                           always_one<=ps2_data0;                 
       when  m2_st19=>  m2_nexts<=m2_st20;
              q_data2_x<=ps2_data0&q_data2_x(8 downto 1); 
       when  m2_st20=>  m2_nexts<=m2_st21;
              q_data2_x<=ps2_data0&q_data2_x(8 downto 1); 
       when  m2_st21=>  m2_nexts<=m2_st22;    
              q_data2_x<=ps2_data0&q_data2_x(8 downto 1); 
                                                          
       when  m2_st22=>  m2_nexts<=m2_st23;
              q_data2_x<=ps2_data0&q_data2_x(8 downto 1);          --data7
                                         --   q_data2<=q_data2_x(8 downto 1);

       when  m2_st23=>  m2_nexts<=m2_st24;
              q_data2_x<=ps2_data0&q_data1_x(8 downto 1); 
                                           q_data2<=q_data2_x(8 downto 1);
                           
                  
       when  m2_st24=> 
                
----------------------------
                if(always_one='1')  then   m2_nexts<=m2_st25;                --stop2
                else                       m2_nexts<=m2_st14;      ---
                end if;
----------------------------
       when  m2_st25=>  m2_nexts<=m2_st26;
                                               --start
       when  m2_st26=>  m2_nexts<=m2_st27;
             q_data3_x<=ps2_data0&q_data3_x(8 downto 1);            --data0
       when  m2_st27=>  m2_nexts<=m2_st28; 
             q_data3_x<=ps2_data0&q_data3_x(8 downto 1); 
       when  m2_st28=>  m2_nexts<=m2_st29;
             q_data3_x<=ps2_data0&q_data3_x(8 downto 1); 
       when  m2_st29=>  m2_nexts<=m2_st30;
             q_data3_x<=ps2_data0&q_data3_x(8 downto 1); 
       when  m2_st30=>  m2_nexts<=m2_st31;
             q_data3_x<=ps2_data0&q_data3_x(8 downto 1);                 
       when  m2_st31=>  m2_nexts<=m2_st32;
             q_data3_x<=ps2_data0&q_data3_x(8 downto 1);            
       when  m2_st32=>  m2_nexts<=m2_st33;
             q_data3_x<=ps2_data0&q_data3_x(8 downto 1);
       when  m2_st33=>  m2_nexts<=m2_st34;                          
             q_data3_x<=ps2_data0&q_data3_x(8 downto 1);        --data7
                                            
                                           --q_data3<=q_data3_x(8 downto 1);                            
       when  m2_st34=>  m2_nexts<=m2_st35; 
             q_data3_x<=ps2_data0&q_data1_x(8 downto 1);
                                          q_data3<=q_data3_x(8 downto 1);                              
       when  m2_st35=>  m2_nexts<=m2_st36;                        
                                                               --stop3    
       when  m2_st36=>  m2_nexts<=m2_st37;
                                                               --start
       when  m2_st37=>  m2_nexts<=m2_st38;
             q_data4_x<=ps2_data0&q_data4_x(8 downto 1);        --data0  
       when  m2_st38=>  m2_nexts<=m2_st39;
             q_data4_x<=ps2_data0&q_data4_x(8 downto 1); 
       when  m2_st39=>  m2_nexts<=m2_st40;
             q_data4_x<=ps2_data0&q_data4_x(8 downto 1); 
       when  m2_st40=>  m2_nexts<=m2_st41;
             q_data4_x<=ps2_data0&q_data4_x(8 downto 1); 
       when  m2_st41=>  m2_nexts<=m2_st42;
             q_data4_x<=ps2_data0&q_data4_x(8 downto 1); 
       when  m2_st42=>  m2_nexts<=m2_st43;
             q_data4_x<=ps2_data0&q_data4_x(8 downto 1);
       when  m2_st43=>  m2_nexts<=m2_st44;                         
             q_data4_x<=ps2_data0&q_data4_x(8 downto 1);        
       when  m2_st44=>  m2_nexts<=m2_st45;
             q_data4_x<=ps2_data0&q_data4_x(8 downto 1);     --data7
                                       --   q_data4<=q_data4_x(8 downto 1); 

       when  m2_st45=>  m2_nexts<=m2_st46; 
             q_data4_x<=ps2_data0&q_data1_x(8 downto 1);   
                                        q_data4<=q_data4_x(8 downto 1);                                          
       when  m2_st46=>  m2_nexts<=m2_st14;                     --stop4
                   
       when others => null;
       end case;
    end if;
    end process;

   u6: process(reset0,q_data1,q_data2,q_data3,q_data4)
       begin
         if( reset0='1')  then
                   ps2_data20 <=(others=>'0');
                   ps2_data30 <=(others=>'0');
                  else
   
                ps2_data20 <=q_data2;
                ps2_data30 <=q_data3;
                
        end if;
     end process;
                 
END; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -