Forum: FPGA, VHDL & Co. Lauflicht mit FSM


von Tim S. (169)


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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Chris (Gast)


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!

von Alejandro P. (alejandro_p)


Lesenswert?

@chris,

dann macht es Richtig ! ;-)

Beitrag "Hommage an Lothar Miller"

btw, sehr lustig Beitrag !

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alejandro P. schrieb:
> btw, sehr lustig Beitrag
Finde ich auch :-D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.