Skocz do zawartości

PS2_INTELLIMOUSE


Pomocna odpowiedź

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity MOUSE is
    Port ( Clk : in  STD_LOGIC;
		   Reset : in  STD_LOGIC;
           PS2_D : inout  STD_LOGIC;
           PS2_C : inout  STD_LOGIC;
           MoWE : out  STD_LOGIC;
           B0 : out  STD_LOGIC_VECTOR (7 downto 0);
           B1 : inout  STD_LOGIC_VECTOR (7 downto 0);
           B2 : inout  STD_LOGIC_VECTOR (7 downto 0);
           B3 : inout  STD_LOGIC_VECTOR (7 downto 0)
			  );
end MOUSE;

architecture Behavioral of MOUSE is

	signal SelB : std_logic_vector (3 downto 0) ;

	signal D : std_logic_vector (9 downto 0) ;
	signal Din : std_logic_vector (7 downto 0) ;
	signal Cnt : std_logic_vector (7 downto 0) ;
	signal Cnt1 : std_logic_vector (13 downto 0) ;
	signal Clk1 : std_logic;
	
	signal PS2_Cin : std_logic;
	signal PS2_Cout : std_logic;
	signal PS2_Dout : std_logic;
	
	signal ParityGen : std_logic_vector (6 downto 0);
	signal Parity : std_logic;
	signal Init : std_logic_vector (10 downto 0) ;
	
   type PS2State_type is (idle, datain, sel, rts, we, we1, rts1, rts2, dataout); 
   signal PS2State : PS2State_type;


begin
		
		process(Clk, PS2_C)								--oczekiwanie na stabilny sygnał zegarowy od myszy
		begin
			if PS2_C = '1' then
				Cnt <= (others => '0');
				PS2_Cin <= '1';
			else
				if Clk'event and Clk = '0' then
					if PS2_C = '0' then
						if Cnt = "11111111" then
							PS2_Cin <= '0';
						else
							Cnt <= Cnt + 1;
						end if;
					end if;
				end if;
			end if;
		end process;
		
		with PS2State select
			Clk1 <= Clk when rts,
					  Clk when rts1,
					  Clk when sel,
					  Clk when we,
					  Clk when we1,
					  PS2_Cin when others;
		
		with PS2State select
	  PS2_Dout <= '0' when rts1,
					  '0' when rts2,
					  D(0) when dataout,
					  '1' when others;
		
		with PS2State select
	  PS2_Cout <= '0' when rts,
					  '0' when rts1,
					  '1' when others;
		
		process(Clk1, Reset, PS2State, PS2_D)		--wysłanie, odbieranie danych myszy w maszynie stanów
		begin
			if Reset = '0' then
				D <= "1000000000";
				Din <= "00000000";
				B0 <= "00000000";
				MoWE <= '0';
				Init <= "10000000000";
				SelB <= "1000";
				Cnt1 <= (others => '0');
				PS2State <= idle;
			else
				if Clk1'event and Clk1 = '0' then
					case PS2State is
					
					when idle =>
								D <= "1000000000";
								PS2State <= datain;
					
					when datain =>
							if D(0) = '1' then
								D <= "1000000000";
								Din <= D(8 downto 1);
								PS2State <= sel;
							else
								D <= PS2_D & D(9 downto 1);
							end if;
					
					when sel =>
							if ((Init = "10000000000") and (Din = X"00")) then --F3 C8 F3 64 F3 50 E8 00 F4
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"F3";
								PS2State <= rts;
						elsif ((Init = "01000000000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"C8";
								PS2State <= rts;
						elsif ((Init = "00100000000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"F3";
								PS2State <= rts;
						elsif ((Init = "00010000000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"64";
								PS2State <= rts;
						elsif ((Init = "00001000000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"F3";
								PS2State <= rts;
						elsif ((Init = "00000100000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"50";
								PS2State <= rts;
						elsif ((Init = "00000010000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"E8";
								PS2State <= rts;
						elsif ((Init = "00000001000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"00";
								PS2State <= rts;
						elsif ((Init = "00000000100") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"F4";
								PS2State <= rts;
						elsif ((Init = "00000000010") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								SelB <= "1000";
								PS2State <= idle;
							else
								B3 <= Din;
								B2 <= B3;
								B1 <= B2;
								B0 <= B1;
								SelB <= SelB(0) & SelB(3 downto 1);
								PS2State <= we;
							end if;
					
					when we =>
							if SelB = "1000" then
								MoWE <= '1';
							end if;
								PS2State <= we1;
					
					when we1 =>
								MoWE <= '0';
								PS2State <= idle;
					
					when rts =>	 --reqest to send
							if Cnt1 = "11111100000000" then
								Cnt1 <= (others => '0');
								PS2State <= rts1;
							else
								Cnt1 <= Cnt1 + 1;
							end if;
					
					when rts1 =>	 --reqest to send
							if Cnt1 = "00000100000000" then
								Cnt1 <= (others => '0');
								PS2State <= rts2;
							else
								Cnt1 <= Cnt1 + 1;
							end if;
							
					when rts2 =>	 --reqest to send
								D <= '1' & Parity & Din;
								PS2State <= dataout;
							
					when dataout => --przesył danych do myszy
							if D = "0000000001" then
								PS2State <= idle;
							else
								D <= '0' & D(9 downto 1);
							end if;
							
					end case;
				end if;
			end if;
		end process;
		
		ParityGen(0) <= Din(0) xor Din(1);			--generator parztstości
		ParityGen(1) <= Din(2) xor Din(3);
		ParityGen(2) <= Din(4) xor Din(5);
		ParityGen(3) <= Din(6) xor Din(7);
		ParityGen(4) <= ParityGen(0) xor ParityGen(1);
		ParityGen(5) <= ParityGen(2) xor ParityGen(3);
		ParityGen(6) <= ParityGen(4) xor ParityGen(5);
		Parity <= not ParityGen(6);
		
		PS2_C <= 'Z' when PS2_Cout = '1' else '0';	--zmiana portów komunikacyjnych myszy z wejściowych na wyjściowe
		PS2_D <= 'Z' when PS2_Dout = '1' else '0';

end Behavioral;

Witam.

Załączam kod programu obsługującego mysz intellimouse ps2. Kod pisany dla układu z generatorem 100MHz.

Mysz jest inicjowana natychmiast po włączeniu zasilania.

Kontroler czeka na pierwsze dane od myszy po podaniu napięcia na złącze ps2 i w następnej kolejności ją inicjuje.

Po zakończonym procesie odbiera dane wystawione przez mysz w postaci 4 bajtowej paczki danych zapisanych do rejestrów B0, B1, B2, B3.

B0 rejestrem stanu przycisków, kierunku przesunięcia, i przepełnienia rejestrów B1, B2.

B1 i B2 są rejestrami odległości przesunięcia w osi X i Y . Liczniki podane są w dopełnieniu do 2.

B3 jest rejestrem kółka informuje o obrocie w dwóch kierunkach X"FF" lub w przeciwnym X"01" lub braku obrotu X"00"

Dane pełnej paczki (4 bajty) sygnalizowane są wysokim stanem trwającym 10ns wystawionym na linii MoWE.

Kod jest napisany dla myszy intellimouse i z innymi nie będzie współpracować ze względu na algorytm inicjowania i wielkość danych przychodzących.

W algorytmie użyłem kod E8 i 00 co zmienia liczenie odległości z (4x na 1 milimetr przesunięcia) na (1x na 1 milimetr przesunięcia). Dzięki temu wskaźnik myszy na wyświetlaczu monitora nie przemieszcza się zbyt szybko .

Może się komuś przyda...

Pozdrawiam

Edytowano przez kroszkanorber
Poprawiony kod żródłowy
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Witam.

Obliczenia pozycji wskaźnika myszy na monitorze.

Dane o pozycji są obliczane w kodzie dla rozdzielczości VGA 640 X 480. 

Rejestry wyników działań są odpowiednio oznaczone " Mouse_pos_X" i "Mouse_pos_Y" + rejestry wejściowe trzy 8 bitowe B0, B1, B2. Rejestry Mouse_pos_  o minimalnej długości 9 bit, mogą być większe. Dla rozdzielczości 800 x 600 powinny mieć 10 bit każdy.

W kodzie uwzględniłem przypadek przesunięcia wskaźnika poza obszar wyświetlany opisany prostym dekoderem. W przypadku gdy zakres w osi X lub Y zostanie przekroczony, wskaźnik myszy zostanie ustawiony w skrajnej pozycji na monitorze w zależności od kierunku przesunięcia. (warunek spełniany w tym przypadku to rejestr X > 640 i rejestr Y > 480). Kod jest uniwersalny i można zmienić wartość warunku np: ( rejestr X > 800 i rejestr Y > 600) dla rozdzielczości VESA800X600.

Wektor rejestru osi Y otrzymywany od myszy jest przeciwny do licznika Linii . Dzieje się tak ponieważ wielkość licznika Linii wyświetlanych na monitorze się zmniejsza gdy wskaźnik przesuwamy w górę, podczas gdy rejestr myszy tą wielkość zwiększa.

W przypadku gdy przesuwamy mysz w górę lub w prawo obliczenia są proste i wystarczy do odpowiednich rejestrów dodać lub odjąć wartości wysłane przez mysz. Gdy przesuwamy mysz w lewo lub dół musimy uwzględnić kod uzupełnienia U2. 


	process(Clk, Reset, B0, B1, B2, WE)
	begin
		if Reset = '0' then
			Mouse_pos_X <= (others => '0');
			Mouse_pos_Y <= (others => '0');
		else
			if Clk'event and Clk = '0' then
				if WE = '1' then
					if (B0(4) = '0') then
						Mouse_pos_X <= (Mouse_pos_X + (B0(6) & B1));
					else
						Mouse_pos_X <= (Mouse_pos_X - ((B0(6) & (not B1)) + 1));
					end if;
					if (B0(5) = '0') then
						Mouse_pos_Y <= (Mouse_pos_Y - (B0(7) & B2));
					else
						Mouse_pos_Y <= (Mouse_pos_Y + ((B0(7) & (not B2)) + 1));
					end if;
				else
					if (B0(4) = '0') then
						if Mouse_pos_X > 639 then
							Mouse_pos_X <= "1001111111";  --639
						end if;
					else
						if Mouse_pos_X > 639 then
							Mouse_pos_X <= (others => '0');
						end if;
					end if;
					if (B0(5) = '0') then
						if Mouse_pos_Y > 479 then
							Mouse_pos_Y <= (others => '0');
						end if;
					else
						if Mouse_pos_Y > 479 then
							Mouse_pos_Y <= "0111011111"; --479
						end if;
					end if;
				end if;
			end if;
		end if;
	end process;

Pozdrawiam.

Edytowano przez kroszkanorber
  • Lubię! 1
Link do komentarza
Share on other sites

Witam.

Poskładałem program służący do wyświetlenia wskaźnika myszy Intellimouse na monitorze VGA 640x480. Wskaźnik jest wyświetlany pod postacią strzałki w dwóch kolorach (czarny obrys i biały środek) i wielkości 8x8 pikseli. Cały kod składa się z licznika dla wyświetlanych linii i pikseli i dekoderów synchronizacji, oraz układu odczytującego dane myszy i dekodera pozycji wskaźnika.

Kod odczytujący dane myszy komputerowej potrafi ją inicjować. Pisząc ten kod starałem się uprościć algorytm. Konsekwencją tego jest wymaganie poprawnej kolejności podłączenia zasilania. Problem w tym, że mysz powinno się podłączyć po resecie układu. W algorytmie przycisk Reset powoduje ustawienie rejestru przesuwnego Init w pozycji początkowej i po tej procedurze można podłączyć mysz do portu. W następnej kolejności mysz wysyła dane logowania do systemu, a gdy algorytm rozpozna bajt X"00" rozpoczyna inicjalizację po której mysz intellimouse powinna wysyłać dane.

Stan przycisków i kółka wyświetlany jest na 8 diodach LED od LED1 do LED8. 

Pełny kod:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity WskaznikMyszy is
    Port ( Clk : in  STD_LOGIC;
           Reset : in  STD_LOGIC;
           PS2_D : inout  STD_LOGIC;
           PS2_C : inout  STD_LOGIC;
           LED1 : out  STD_LOGIC;
           LED2 : out  STD_LOGIC;
           LED3 : out  STD_LOGIC;
           LED4 : out  STD_LOGIC;
           LED5 : out  STD_LOGIC;
           LED6 : out  STD_LOGIC;
           LED7 : out  STD_LOGIC;
           LED8 : out  STD_LOGIC;
           HS : out  STD_LOGIC;
           VS : out  STD_LOGIC;
           RGB : out  STD_LOGIC_VECTOR(7 downto 0)
			  );
end WskaznikMyszy;

architecture Behavioral of WskaznikMyszy is

------------------------------------------------------------------------------
	signal SelB : std_logic_vector (3 downto 0) ;
	
	signal B0 : std_logic_vector (7 downto 0) ;
	signal B1 : std_logic_vector (7 downto 0) ;
	signal B2 : std_logic_vector (7 downto 0) ;
	signal B3 : std_logic_vector (7 downto 0) ;
	
	signal MoWE : std_logic;

	signal D : std_logic_vector (9 downto 0) ;
	signal Din : std_logic_vector (7 downto 0) ;
	signal Cnt : std_logic_vector (7 downto 0) ;
	signal Cnt1 : std_logic_vector (13 downto 0) ;
	signal Clk1 : std_logic;
	
	signal PS2_Cin : std_logic;
	signal PS2_Cout : std_logic;
	signal PS2_Dout : std_logic;
	
	signal ParityGen : std_logic_vector (6 downto 0);
	signal Parity : std_logic;
	signal Init : std_logic_vector (10 downto 0) ;
	
   type PS2State_type is (idle, datain, sel, rts, we, we1, rts1, rts2, dataout); 
   signal PS2State : PS2State_type;
------------------------------------------------------------------------------
	signal EnH : std_logic ;
	signal EnV : std_logic ;
	signal CntH1 : std_logic_vector (3 downto 0) ;
	signal CntV1 : std_logic_vector (3 downto 0) ;
	signal Mouse_pos_X : std_logic_vector (9 downto 0) ;
	signal Mouse_pos_Y : std_logic_vector (9 downto 0) ;
	signal Wskaznik : std_logic_vector (1 downto 0) ;
------------------------------------------------------------------------------
	signal CntH : std_logic_vector (9 downto 0) ;
	signal CntV : std_logic_vector (9 downto 0) ;
	signal Cnt25 : std_logic_vector (1 downto 0) ;
	signal BL : std_logic ;
------------------------------------------------------------------------------
	
begin

------------------------------------------------------------------------------
	process(MoWE, Clk, B0, B3, Reset)
	begin
		if Reset = '0' then
			LED1 <= '0';
			LED2 <= '0';
			LED3 <= '0';
			LED4 <= '0';
			LED5 <= '0';
			LED6 <= '0';
			LED7 <= '0';
			LED8 <= '0';
		else
			if Clk'event and Clk = '0' then
				if MoWE = '1' then
					LED1 <= B0(0);
					LED2 <= B0(1);
					LED3 <= B0(2);
					LED4 <= B0(3);
					LED5 <= B3(0);
					LED6 <= B3(1);
					LED7 <= B3(2);
					LED8 <= B3(3);
				end if;
			end if;
		end if;
	end process;
------------------------------------------------------------------------------
	process(Clk)
	begin
		if Clk'event and Clk = '0' then
			Cnt25 <= Cnt25 + 1;					--dzielnik częstotliwości
			if Cnt25 = "11" then
				if CntH = 799 then				--licznik pixeli
					CntH <= (others => '0');
				else
					CntH <= CntH + 1;
				end if;
				if CntH = 799 then
					if CntV = 524 then			--licznik linji
						CntV <= (others => '0');
					else
						CntV <= CntV + 1;
					end if;
				end if;
			end if;
		end if;
	end process;
	
	BL <= '1' when ((CntH < 640) and (CntV < 525)) else '0'; --dekoder obszaru obrazy wyświetlanego (aktywny = 1)
	HS <= '0' when ((CntH > 655) and (CntH < 753)) else '1'; --dekoder synchronizacji poziomej (aktywny = 0)
	VS <= '0' when ((CntV > 488) and (CntV < 491)) else '1'; --dekoder synchronizacji pionowej (aktywny = 0)
					
	process(Clk, Cnt25, BL, Wskaznik)
	begin
		if BL = '0' then
			RGB <= (others => '0');
		else
			if Clk'event and Clk = '0' then
				if Cnt25 = "01" then
					if Wskaznik = "10" then
						RGB <= (others => '0');
					elsif Wskaznik = "01" then
						RGB <= (others => '1');
					else
						RGB <= "01001000";
					end if;
				end if;
			end if;
		end if;
	end process;
------------------------------------------------------------------------------
		process(Clk, PS2_C)								--oczekiwanie na stabilny sygnał zegarowy od myszy
		begin
			if PS2_C = '1' then
				Cnt <= (others => '0');
				PS2_Cin <= '1';
			else
				if Clk'event and Clk = '0' then
					if PS2_C = '0' then
						if Cnt = "11111111" then
							PS2_Cin <= '0';
						else
							Cnt <= Cnt + 1;
						end if;
					end if;
				end if;
			end if;
		end process;
		
		with PS2State select
			Clk1 <= Clk when rts,
					  Clk when rts1,
					  Clk when sel,
					  Clk when we,
					  Clk when we1,
					  PS2_Cin when others;
		
		with PS2State select
	  PS2_Dout <= '0' when rts1,
					  '0' when rts2,
					  D(0) when dataout,
					  '1' when others;
		
		with PS2State select
	  PS2_Cout <= '0' when rts,
					  '0' when rts1,
					  '1' when others;
		
		process(Clk1, Reset, PS2State, PS2_D)		--wysłanie, odbieranie danych myszy w maszynie stanów
		begin
			if Reset = '0' then
				D <= "1000000000";
				Din <= "00000000";
				B0 <= "00000000";
				MoWE <= '0';
				Init <= "10000000000";
				SelB <= "1000";
				Cnt1 <= (others => '0');
				PS2State <= idle;
			else
				if Clk1'event and Clk1 = '0' then
					case PS2State is
					
					when idle =>
								D <= "1000000000";
								PS2State <= datain;
					
					when datain =>
							if D(0) = '1' then
								D <= "1000000000";
								Din <= D(8 downto 1);
								PS2State <= sel;
							else
								D <= PS2_D & D(9 downto 1);
							end if;
					
					when sel =>
							if ((Init = "10000000000") and (Din = X"00")) then --F3 C8 F3 64 F3 50 E8 00 F4
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"F3";
								PS2State <= rts;
						elsif ((Init = "01000000000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"C8";
								PS2State <= rts;
						elsif ((Init = "00100000000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"F3";
								PS2State <= rts;
						elsif ((Init = "00010000000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"64";
								PS2State <= rts;
						elsif ((Init = "00001000000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"F3";
								PS2State <= rts;
						elsif ((Init = "00000100000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"50";
								PS2State <= rts;
						elsif ((Init = "00000010000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"E8";
								PS2State <= rts;
						elsif ((Init = "00000001000") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"00";
								PS2State <= rts;
						elsif ((Init = "00000000100") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								Din <= X"F4";
								PS2State <= rts;
						elsif ((Init = "00000000010") and (Din = X"FA")) then
								Init <= Init(0) & Init(10 downto 1);
								SelB <= "1000";
								PS2State <= idle;
							else
								B3 <= Din;
								B2 <= B3;
								B1 <= B2;
								B0 <= B1;
								SelB <= SelB(0) & SelB(3 downto 1);
								PS2State <= we;
							end if;
					
					when we =>
							if SelB = "1000" then
								MoWE <= '1';
							end if;
								PS2State <= we1;
					
					when we1 =>
								MoWE <= '0';
								PS2State <= idle;
					
					when rts =>	 --reqest to send
							if Cnt1 = "11111100000000" then
								Cnt1 <= (others => '0');
								PS2State <= rts1;
							else
								Cnt1 <= Cnt1 + 1;
							end if;
					
					when rts1 =>	 --reqest to send
							if Cnt1 = "00000100000000" then
								Cnt1 <= (others => '0');
								PS2State <= rts2;
							else
								Cnt1 <= Cnt1 + 1;
							end if;
							
					when rts2 =>	 --reqest to send
								D <= '1' & Parity & Din;
								PS2State <= dataout;
							
					when dataout => --przesył danych do myszy
							if D = "0000000001" then
								PS2State <= idle;
							else
								D <= '0' & D(9 downto 1);
							end if;
							
					end case;
				end if;
			end if;
		end process;
		
		ParityGen(0) <= Din(0) xor Din(1);			--generator parztstości
		ParityGen(1) <= Din(2) xor Din(3);
		ParityGen(2) <= Din(4) xor Din(5);
		ParityGen(3) <= Din(6) xor Din(7);
		ParityGen(4) <= ParityGen(0) xor ParityGen(1);
		ParityGen(5) <= ParityGen(2) xor ParityGen(3);
		ParityGen(6) <= ParityGen(4) xor ParityGen(5);
		Parity <= not ParityGen(6);
		
		PS2_C <= 'Z' when PS2_Cout = '1' else '0';	--zmiana portów komunikacyjnych myszy z wejściowych na wyjściowe
		PS2_D <= 'Z' when PS2_Dout = '1' else '0';
------------------------------------------------------------------------------
	process(Clk, Reset, B0, B1, B2, MoWE)				--zmiana pozycji wskaźnika myszy
	begin
		if Reset = '0' then
			Mouse_pos_X <= "0101000000";
			Mouse_pos_Y <= "0011110000";
		else
			if Clk'event and Clk = '0' then
				if MoWE = '1' then
					if (B0(4) = '0') then
						Mouse_pos_X <= (Mouse_pos_X + (B0(6) & B1));
					else
						Mouse_pos_X <= (Mouse_pos_X - ((B0(6) & (not B1)) + 1));
					end if;
					if (B0(5) = '0') then
						Mouse_pos_Y <= (Mouse_pos_Y - (B0(7) & B2));
					else
						Mouse_pos_Y <= (Mouse_pos_Y + ((B0(7) & (not B2)) + 1));
					end if;
				else
					if (B0(4) = '0') then
						if Mouse_pos_X > 639 then
							Mouse_pos_X <= "1001111111";  --639
						end if;
					else
						if Mouse_pos_X > 639 then
							Mouse_pos_X <= (others => '0');
						end if;
					end if;
					if (B0(5) = '0') then
						if Mouse_pos_Y > 479 then
							Mouse_pos_Y <= (others => '0');
						end if;
					else
						if Mouse_pos_Y > 479 then
							Mouse_pos_Y <= "0111011111"; --479
						end if;
					end if;
				end if;
			end if;
		end if;
	end process;
------------------------------------------------------------------------------------------
	EnH <= '1' when ((CntH = Mouse_pos_X) and (Cnt25 = "01")) else '0';  --dekoder wskaźnika myszy
	EnV <= '1' when CntV = Mouse_pos_Y else '0';
	
	process(Clk, Cnt25, Reset, EnH)
	begin
		if Reset = '0' then
			CntH1 <= "1000";
		elsif EnH = '1' then
			CntH1 <= "0000";
		else
			if Clk'event and CLk = '0' then
				if Cnt25 = "11" then
					if CntH1 = "1001" then
						null;
					else
						CntH1 <= CntH1 + 1;
					end if;
				end if;
			end if;
		end if;
	end process;
	
	process(Clk, Reset, Cnt25, CntH1, EnV, EnH)
	begin
		if Reset = '0' then
			CntV1 <= "1000";
		elsif ((EnV = '1') and (EnH = '1')) then
			CntV1 <= "0000";
		else
			if Clk'event and CLk = '0' then
				if Cnt25 = "11" then
					if CntH1 = "1000" then
						if CntV1 = "1000" then
							null;
						else
							CntV1 <= CntV1 + 1;
						end if;
					end if;
				end if;
			end if;
		end if;
	end process;
-- C = Czarny kolor    B = Biały kolor
--   0 1 2 3 4 5 6 7
-- 0 C C C C C C C 0
-- 1 C B B B B C 0 0
-- 2 C B B B C 0 0 0
-- 3 C B B B B C 0 0
-- 4 C B C B B B C 0
-- 5 C C 0 C B B B C
-- 6 C 0 0 0 C B C 0
-- 7 0 0 0 0 0 C 0 0
	
	with (CntV1 & CntH1) select
	Wskaznik <= "10" when "00000000", --0
					"10" when "00000001",
					"10" when "00000010",
					"10" when "00000011",
					"10" when "00000100",
					"10" when "00000101",
					"10" when "00000110",
					
					"10" when "00010000", --1
					"01" when "00010001",
					"01" when "00010010",
					"01" when "00010011",
					"01" when "00010100",
					"10" when "00010101",
					
					"10" when "00100000", --2
					"01" when "00100001",
					"01" when "00100010",
					"01" when "00100011",
					"10" when "00100100",
					
					"10" when "00110000", --3
					"01" when "00110001",
					"01" when "00110010",
					"01" when "00110011",
					"01" when "00110100",
					"10" when "00110101",
					
					"10" when "01000000", --4
					"01" when "01000001",
					"10" when "01000010",
					"01" when "01000011",
					"01" when "01000100",
					"01" when "01000101",
					"10" when "01000110",
					
					"10" when "01010000", --5
					"10" when "01010001",
					"00" when "01010010",
					"10" when "01010011",
					"01" when "01010100",
					"01" when "01010101",
					"01" when "01010110",
					"10" when "01010111",
					
					"10" when "01100000", --6
					"10" when "01100100",
					"01" when "01100101",
					"10" when "01100110",
					
					"10" when "01110101", --7
					
					"00" when others;


end Behavioral;

Film z działającego programu:

https://youtube.com/shorts/-cqwtUyaPlM?feature=share

  • Lubię! 2
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.