Lauflicht mit FSM

OP #2843685
Lesenswert?

Hallo Leute,
ich habe versucht ein Lauflicht mithilfe einer FSM zu implementieren. Da 
ich ein Anfänger in Sachen VHDL bin, weiß ich nicht warum meine 
Implementierung nicht zum gewünschten Ergebnis führt, obwohl keine 
Fehler vom Compiler gemeldet werden. Es sei noch gesagt, dass ich auch 
einen Frequenzteiler bereits in einem anderen File implementiert habe 
und den dann einfach später anhänge.
Kann mir jemand einen Tip geben. Vielen Dank.

Der Code ist selbsterklärend:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4

5
entity knight_rider is
6
port(
7
  clk, reset, enable : in std_logic;
8
  A : out std_logic_vector(7 downto 0)
9
);
10
end knight_rider;
11

12
 
13

14
architecture sequenz of knight_rider is
15

16
type zustaende is (z0, z1);
17
signal zustand, folge_z : zustaende;
18

19

20
begin
21

22
z_speicher: process(clk, reset) -- Zustandsaktualisierung
23
begin
24

25
  if reset = '1' then zustand <= z0;
26
  elsif clk = '1' and clk'event then
27
    if enable = '1' then zustand <= folge_z;
28
    end if;
29
  end if;
30
  
31
end process z_speicher;
32

33

34
ue_sn: process(zustand) -- Folgezustandsberechnung
35
begin
36

37
case zustand is
38
    when z0 =>   folge_z <= z1;
39
    when z1 =>   folge_z <= z0;
40
end case;
41

42
end process ue_sn;
43

44

45
aus_sn: process(zustand) -- Ausgangsberechnung
46
begin
47

48
  case zustand is
49
      when z0 => A <= "00000000" after 300 ms;
50
              A <= "01000000" after 300 ms;
51
              A <= "00100000" after 300 ms;
52
              A <= "00010000" after 300 ms;
53
              A <= "00001000" after 300 ms;
54
              A <= "00000100" after 300 ms;
55
              A <= "00000010" after 300 ms;
56
              A <= "00000001" after 300 ms;
57
              
58
      when z1 => A <= "00000000" after 300 ms;
59
              A <= "00000001" after 300 ms;
60
              A <= "00000010" after 300 ms; 
61
              A <= "00000100" after 300 ms;
62
              A <= "00001000" after 300 ms;
63
              A <= "00010000" after 300 ms;
64
              A <= "00100000" after 300 ms;
65
              A <= "01000000" after 300 ms;
66
              A <= "10000000" after 300 ms;
67
  end case;
68

69
end process aus_sn;
70

71
end sequenz;
Moderator (Firma: Titel) Persönliche Seite #2843691
Lesenswert?

Tim S. schrieb:
> weiß ich nicht warum meine
> Implementierung nicht zum gewünschten Ergebnis führt,
>              A <= "00010000" after 300 ms;
Weil sich Zeiten nicht synthetisieren lassen. Welches Bauteil im FPGA 
sollte das können? Eine "programmierbare Verzögerungsleitung" gibt es da 
nicht! Du hast nur Logik und Flipflops...

> obwohl keine Fehler vom Compiler gemeldet werden.
Richtig, weil er solche Zeiten einfach ignoriert. Du wirst also das 
bekommen:
1
      when z0 => A <= "00000000";
2
                 A <= "01000000";
3
                 A <= "00100000";
4
                 :
5
                 A <= "00000001";
6
              
7
      when z1 => A <= "00000000";
8
                 A <= "00000001";
9
                 :
10
                 A <= "01000000";
11
                 A <= "10000000";
Also wird A immer "10000000" oder "00000001" sein, denn das ist je nach 
Zustand die letzte Zuweisung im Prozess. Und die letzte Zuweisung in 
einem Prozess "gewinnt".

> ich habe versucht ein Lauflicht mithilfe einer FSM zu implementieren.
Ich habe da ein paar Ansätze:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html

Aber ich würde vorschlagen, du fängst ein wenig weiter vorn an:
bei der blinkenden LED. Dann siehst du nämlich, wie zeitliche Abläufe im 
FPGA gemacht werden: mit Zählern.
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
Gast #2843749
Lesenswert?

@Lothar

Du solltest mal ein praxisnahes Buch schreiben. Das geht bestimmt weg 
wie warme Semmeln. Ich jedenfalls danke dir recht herzlich. Habe mir 
schon den einen oder anderen Tipp von deiner Website geholt (nicht nur 
zu FPGA).

Ein dickes Danke!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren