Skocz do zawartości

VHDL- maszyna stanów i świecenie ledami


pdp

Pomocna odpowiedź

Cześć!

Przychodze do was z takim problemem- chce zrobić maszyne stanów, posługiwałem się przykładem z forbota, jednak jest problem- średnio działa. Zadaniem programu jest po przyciśnięciu GPIO_SW_W ma się zmieniać stan na następny. Kolejny przycisk- następny. JEDNAK, tak się nie dzieje, być może to jest kwestia zbocza, nie wiem co robić ;/

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
 
entity main is
  Port (CLK     : in std_logic;
    RST   : in std_logic;
    led     : out std_logic_vector (3 downto 0);
    GPIO_SW_W     : in std_logic;
    GPIO_LED_0, GPIO_LED_1, GPIO_LED_2, GPIO_LED_3     : out std_logic
    );
end main;

architecture Behavioral of main is

    type STANY is (S0, S1, S2, S3, S4, S5, S6);
   
signal stan_spr : STANY := S0;
signal stan_obecny, stan_nastepny : STANY;

begin

process (CLK)

begin
    if rising_edge(CLK) then
    case stan_spr is
   
    when S0 =>
    led <=
   
   
    when S0 =>
        if GPIO_SW_W = '1' then
        stan_spr <= S1;
        else
        stan_spr <= S0;
    end if;
   
    when S1 =>
        if GPIO_SW_W = '1' then
        stan_spr <= S2;
        else
        stan_spr <= S1;
    end if;
   
    when S2 =>
        if GPIO_SW_W = '1' then
        stan_spr <= S3;
        else
        stan_spr <= S2;
    end if;
   
    when S3 =>
        if GPIO_SW_W = '1' then
        stan_spr <= S4;
        else
        stan_spr <= S3;
    end if;
   
    when S4 =>
        if GPIO_SW_W = '1' then
        stan_spr <= S5;
        else
        stan_spr <= S4;
    end if;
   
    when S5 =>
        if GPIO_SW_W = '1' then
        stan_spr <= S6;
        else
        stan_spr <= S5;
    end if;
   
    when S6 =>
        if GPIO_SW_W = '1' then
        stan_spr <= S0;
        else
        stan_spr <= S6;
    end if;
   
    when others =>
        stan_spr <= S0;
        end case;
    end if;
end process;

led(0) <= '1' when stan_spr = S3 else '0';
led(1)  <= '1' when stan_spr = S2 else '0';
led(2)  <= '1' when stan_spr = S1 else '0';
led(3)  <= '1' when stan_spr = S0 else '0';


end Behavioral;

 

Link do komentarza
Share on other sites

Hej!

Problem może leżeć w kwestii zbocza, warto byłoby zbadać, czy przyciski są poprawnie podłączone i czy reagują na odpowiednie zmiany napięcia. Jeśli wszystko wydaje się być poprawnie podłączone, to może warto przeanalizować kod programu, czy wszystkie warunki są właściwie zaimplementowane.

Link do komentarza
Share on other sites

Hej.

Nie do końca tak działa maszyna stanów. Przy wciśniętym przycisku i jeżeli wyjście przycisku ma logiczne 1 przy wciśniętym to maszyna stanów będzie taktowana zegarem i gdy zwolnisz przycisk się zatrzyma na jednym ze stanów. Przy CLK 20 MHz zmiany stanów będą następować po sobie w tempie 20 milionów razy na sekundę. Na końcu nie piszemy when Others ponieważ zadeklarowane są wszystkie możliwe stany. Wykasuj na początku kodu po poleceniu Case (Led ze znakiem przyłącz). Na dole masz już podłączone sygnały do LED.  Napisz czy działa po zmianach. Pozdrawiam 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.