📄 ps2_mouse9.vhd
字号:
--start
when m2_st15=> m2_nexts<=m2_st16;
q_data2_x<=ps2_data&q_data2_x(8 downto 1); --data0
when m2_st16=> m2_nexts<=m2_st17;
q_data2_x<=ps2_data&q_data2_x(8 downto 1);
when m2_st17=> m2_nexts<=m2_st18;
q_data2_x<=ps2_data&q_data2_x(8 downto 1);
-- always_one<=ps2_data;
when m2_st18=> m2_nexts<=m2_st19;
q_data2_x<=ps2_data&q_data2_x(8 downto 1);
always_one<=ps2_data;
when m2_st19=> m2_nexts<=m2_st20;
q_data2_x<=ps2_data&q_data2_x(8 downto 1);
when m2_st20=> m2_nexts<=m2_st21;
q_data2_x<=ps2_data&q_data2_x(8 downto 1);
when m2_st21=> m2_nexts<=m2_st22;
q_data2_x<=ps2_data&q_data2_x(8 downto 1);
when m2_st22=> m2_nexts<=m2_st23;
q_data2_x<=ps2_data&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_data&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_data&q_data3_x(8 downto 1); --data0
when m2_st27=> m2_nexts<=m2_st28;
q_data3_x<=ps2_data&q_data3_x(8 downto 1);
when m2_st28=> m2_nexts<=m2_st29;
q_data3_x<=ps2_data&q_data3_x(8 downto 1);
when m2_st29=> m2_nexts<=m2_st30;
q_data3_x<=ps2_data&q_data3_x(8 downto 1);
when m2_st30=> m2_nexts<=m2_st31;
q_data3_x<=ps2_data&q_data3_x(8 downto 1);
when m2_st31=> m2_nexts<=m2_st32;
q_data3_x<=ps2_data&q_data3_x(8 downto 1);
when m2_st32=> m2_nexts<=m2_st33;
q_data3_x<=ps2_data&q_data3_x(8 downto 1);
when m2_st33=> m2_nexts<=m2_st34;
q_data3_x<=ps2_data&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_data&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_data&q_data4_x(8 downto 1); --data0
when m2_st38=> m2_nexts<=m2_st39;
q_data4_x<=ps2_data&q_data4_x(8 downto 1);
when m2_st39=> m2_nexts<=m2_st40;
q_data4_x<=ps2_data&q_data4_x(8 downto 1);
when m2_st40=> m2_nexts<=m2_st41;
q_data4_x<=ps2_data&q_data4_x(8 downto 1);
when m2_st41=> m2_nexts<=m2_st42;
q_data4_x<=ps2_data&q_data4_x(8 downto 1);
when m2_st42=> m2_nexts<=m2_st43;
q_data4_x<=ps2_data&q_data4_x(8 downto 1);
when m2_st43=> m2_nexts<=m2_st44;
q_data4_x<=ps2_data&q_data4_x(8 downto 1);
when m2_st44=> m2_nexts<=m2_st45;
q_data4_x<=ps2_data&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_data&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(reset,q_data1,q_data2,q_data3,q_data4)
begin
if( reset='1') then
-- ps2_data2 <=(others=>'0');
ps2_data2 <="11111111";
else
ps2_data2 <=q_data2;
end if;
end process;
---------------------------------------------------rabish part---------------------------
-------------------------------------------------------------------------------------------
PROCESS( q_data2 )
BEGIN
CASE q_data2 IS
WHEN "00010110" => INDEXV <= "0001" ;
WHEN "00011110" => INDEXV <= "0010" ;
WHEN "00100110" => INDEXV <= "0011" ;
WHEN "00100101" => INDEXV <= "0100" ;
WHEN "00101110" => INDEXV <= "0101" ;
WHEN "00110110" => INDEXV <= "0110" ;
WHEN "00111101" => INDEXV <= "0111" ;
WHEN "00111110" => INDEXV <= "1000" ;
WHEN "01000101" => INDEXV <= "1001" ;
WHEN "01000110" =>
IF DATA0(3 DOWNTO 0)="1001" THEN
INDEXV <= "1010" ;
ELSIF DATA0(3 DOWNTO 0)="1010" THEN
INDEXV <= "1011" ;
ELSE INDEXV <= "1111" ;
END IF;
WHEN OTHERS => INDEXV <= "1111" ;
END CASE ;
END PROCESS ;
--------------------------------------------------------------------------------------------
Search : PROCESS(INDEXV)
BEGIN
CASE INDEXV IS -- 译码电路,查表方式,控制音调的预置数
WHEN "0001" => TONE <= 773; CODE1 <= "0001";
WHEN "0010" => TONE <= 912; CODE1 <= "0010";
WHEN "0011" => TONE <= 1036; CODE1 <= "0011";
WHEN "0100" => TONE <= 1116; CODE1 <= "0100";
WHEN "0101" => TONE <= 1197; CODE1 <= "0101";
WHEN "0110" => TONE <= 1290; CODE1 <= "0110";
WHEN "0111" => TONE <= 1372; CODE1 <= "0111";
WHEN "1000" => TONE <= 1410; CODE1 <= "1000";
WHEN "1010" => TONE <= 800; CODE1 <= "1010";
WHEN "1011" => TONE <= 1200; CODE1 <= "1001";
WHEN "1100" => TONE <= 1000; CODE1 <= "1000";
WHEN "1111" => TONE <= 2047; CODE1 <= "0000";
WHEN OTHERS => TONE <= 2047; CODE1 <= "0000";
END CASE;
END PROCESS;
-------------------------------------------------------------------------------
PROCESS(clk1)
VARIABLE Count4 : INTEGER RANGE 0 TO 15;
BEGIN
PreCLK <= '0';
IF Count4 > 11 THEN PreCLK <= '1'; Count4 := 0;
ELSIF clk1'EVENT AND clk1='1' THEN Count4 := Count4 + 1;
END IF;
END PROCESS;
GenSpkS : PROCESS(PreCLK, TONE)
VARIABLE Count11 : INTEGER RANGE 0 TO 16#7FF#;
BEGIN -- 11位可预置计数器
IF PreCLK'EVENT AND PreCLK = '1' THEN
IF Count11=16#7FF# THEN Count11 := TONE; FullSpkS <= '1';
ELSE Count11:=Count11 + 1; FullSpkS <= '0';
END IF;
END IF;
END PROCESS;
PROCESS(FullSpkS)
VARIABLE Count2 : STD_LOGIC;
BEGIN --
IF FullSpkS'EVENT AND FullSpkS = '1' THEN Count2 := NOT Count2;
IF Count2 = '1' THEN SPKS <= '1';
ELSE SPKS <= '0';
END IF;
END IF;
END PROCESS;
-----------------------------------------------------------------------------
uA : PS2 PORT MAP ( reset0 => reset,
clk0 => clk,
ps2_clk0 => ps2_clk00,
ps2_data0 => ps2_data00,
ps2_data20 => DATA0,
ps2_data30 => ps2_data3A );
ps2_data2A <= DATA0;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -