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

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.