logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kalkulator VHDL na Altera Cyclone 2 z klawiaturą PS2 i wyświetlaczem 7-segmentowym

mojrzesz8 24 Gru 2011 15:28 2776 2
REKLAMA
  • #1 10299457
    mojrzesz8
    Poziom 1  
    Posty: 1
    Proszę o pomoc w projekcie jaki otrzymałem do zrobienia na mikrokontrolerze altera cyclone 2. Chodzi o napisanie prostego kalkulatora który wykorzystywał by klawiature PS2. Wpisana cyfa jak i wynik działania miała by się pokazywać na 7-segmentowym wyświetlaczu. Proszę o jakąkolwiek pomoc nawet o wskazówki dotyczące zwykłego wykorzystania klawiatury PS2. Będę bardzo wdzięczny za podpowiedzi w tym temacie.
  • REKLAMA
  • #2 10302636
    robik2
    Poziom 16  
    Posty: 183
    Pomógł: 3
    Jedyne co mogę pomóc to to że cyclone altery to nie jest mikrokontroler.
  • Pomocny post
    #3 10343401
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    Używanie klawiatury w vhdl'u
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    
    entity KeyboardController is
        Port ( Clock : in STD_LOGIC;
    	        KeyboardClock : in  STD_LOGIC;
               KeyboardData : in  STD_LOGIC;
               LeftPaddleDirection : buffer  integer;
               RightPaddleDirection : buffer  integer
    	);
    end KeyboardController;
    
    architecture Behavioral of KeyboardController is
    
    signal bitCount : integer range 0 to 100 := 0;
    signal scancodeReady : STD_LOGIC := '0';
    signal scancode : STD_LOGIC_VECTOR(7 downto 0);
    signal breakReceived : STD_LOGIC := '0';
    
    constant keyboardA : STD_LOGIC_VECTOR(7 downto 0) := "00011100";
    constant keyboardY : STD_LOGIC_VECTOR(7 downto 0) := "00011010";
    constant keyboardK : STD_LOGIC_VECTOR(7 downto 0) := "01000010";
    constant keyboardM : STD_LOGIC_VECTOR(7 downto 0) := "00111010";
    
    -- tutaj dajesz stałe przycisków które cię interesują
    -- według rysunku wklejonego niżej... to akurat do sterowania pongiem ale zasada -- działania jest taka sama
    
    begin
    
    	keksfabrik : process(KeyboardClock)
    	begin
    		if falling_edge(KeyboardClock) then
    			if bitCount = 0 and KeyboardData = '0' then --keyboard wants to send data
    				scancodeReady <= '0';
    				bitCount <= bitCount + 1;
    			elsif bitCount > 0 and bitCount < 9 then -- shift one bit into the scancode from the left
    				scancode <= KeyboardData & scancode(7 downto 1);
    				bitCount <= bitCount + 1;
    			elsif bitCount = 9 then -- parity bit
    				bitCount <= bitCount + 1;
    			elsif bitCount = 10 then -- end of message
    				scancodeReady <= '1';
    				bitCount <= 0;
    			end if;
    		end if;
    	end process keksfabrik;
    
    	kruemelfabrik : process(scancodeReady, scancode)
    	begin
    		if scancodeReady'event and scancodeReady = '1' then
    			-- breakcode breaks the current scancode
    			if breakReceived = '1' then 
    				breakReceived <= '0';
    				if scancode = keyboardA or scancode = keyboardY then
    					LeftPaddleDirection <= 0;
    				elsif scancode = keyboardK or scancode = keyboardM then
    					RightPaddleDirection <= 0;
    				end if;
    			elsif breakReceived = '0' then
    				-- scancode processing
    				if scancode = "11110000" then -- mark break for next scancode
    					breakReceived <= '1';
    				end if;
    
    				if scancode = keyboardA then
    					LeftPaddleDirection <= -1;
    				elsif scancode = keyboardY then
    					LeftPaddleDirection <= 1;
    				elsif scancode = keyboardK then
    					RightPaddleDirection <= -1;
    				elsif scancode = keyboardM then
    					RightPaddleDirection <= 1;
    				end if;
    			end if;
    		end if;
    	end process kruemelfabrik;
    end Behavioral;


    do top modułu dołączasz moduł kontrolera zgodnie z zasadami składni

    component KeyboardController is
        Port ( Clock : in STD_LOGIC;
    	        KeyboardClock : in  STD_LOGIC;
               KeyboardData : in  STD_LOGIC;
               LeftPaddleDirection : out  integer;
               RightPaddleDirection : out  integer
    	);
    end component;


    potem mapujesz

    kbController : KeyboardController port map ( clk, kb_clk, kb_data, leftPaddleDirection, rightPaddleDirection );
    


    i tyle jeżeli chodzi o obsługę klawiszy
REKLAMA