Forum: FPGA, VHDL & Co. State Machine hat 2 zustände gleichzeitig


von Thomas L. (thomers)


Angehängte Dateien:

Lesenswert?

Servus!

Ich habe folgendes Problem: in einem VHDL-Programm zum Auslesen eines 
Display-Signals nimmt meine State Machine undeterministisch 2 Zusände 
gleichzeitig an .. wie kann das sein? Bin ich blöd? Anfängerfehler?

Signal-Verlauf siehe Bil im Anhang (ab Tack 193).

Hier mal der Code der SM:
1
type cstate is (Idle, Start, R, G, B, Waiting);
2
3
fifo_wr : process(clk50, rst)
4
   begin
5
    if (rst = '1') then
6
      r_wrreq <= '0';
7
      c_state <= Idle;
8
      color    <= "00000000";
9
    elsif (clk50'event and clk50 = '1') then
10
    case (c_state) is
11
      when Idle =>
12
        if (clk_disp = '0' and data_en = '1' and downld_active = '1') then
13
          r_wrreq <= '0';
14
          c_state <= Start;
15
           color    <= "00000000";
16
        else
17
          r_wrreq <= '0';
18
          c_state <= Idle;
19
          color    <= "00000000";
20
        end if;
21
      when Start =>
22
        r_wrreq <= '1';
23
        c_state <= R;
24
        color    <= red;
25
      when R =>
26
        r_wrreq <= '1';
27
        c_state <= G;
28
        color    <= green;
29
      when G =>
30
        r_wrreq <= '1';
31
        c_state <= B;
32
        color    <= blue;
33
      when B =>
34
        r_wrreq <= '0';
35
        c_state <= Waiting;
36
        color    <= "00000000";
37
      when Waiting =>
38
        r_wrreq <= '0';
39
        color    <= "00000000";
40
        if (clk_disp = '1') then
41
          c_state <= Idle;
42
        else
43
          c_state <= Waiting;
44
        end if;
45
      when others =>
46
        c_state   <= Idle;
47
        r_wrreq   <= '0';
48
        color    <= "00000000";
49
    end case;
50
  end if;

clk_disp hat ca. 6.6MHz;
clk50 50 MHz;
red, gree und blue sind die bytes für die Farben und haben ihre Werte 
spät. 1 clk50-tak nach einer fallenden clk_disp-Flanke;
r_wrreq ist das write-signal des FIFOs;
data_en ist das Signal des Dislay-Controllers, dass die Daten valide 
sind; download_active ist einfach ein Steuersignal von mir.

ich weiß, kein test auf auf FIFO-full, aber da er nie voll laufen kann 
passt das.

der FPG ist ein Cyclone 2; die signal-Aufzeichung geschah mit Terasic 
Blaster und SignalTap II Logic Analyzer.

Jemand ne Idee?

Danke.

Gruß

Thomers

von Georg A. (Gast)


Lesenswert?

> clk_disp hat ca. 6.6MHz;
> clk50 50 MHz;

Klingt so, als käme clk_disp extern rein und wäre auch asynchron zu 
clk50. Das wäre dann definitiv ein Anfängerfehler... Das ist ungefähr so 
wie Gang wechseln ohne Kupplung treten ;)

von Thomas L. (thomers)


Lesenswert?

Georg A. schrieb:
>> clk_disp hat ca. 6.6MHz;
>> clk50 50 MHz;
>
> Klingt so, als käme clk_disp extern rein und wäre auch asynchron zu
> clk50. Das wäre dann definitiv ein Anfängerfehler... Das ist ungefähr so
> wie Gang wechseln ohne Kupplung treten ;)

Ja, das stimmt, clk_disp kommt extern rein.
Aber inwiefern hat das ein Auswikung auf die State Machine? Und wie kann 
ich das beheben?

von Duke Scarring (Gast)


Lesenswert?

Thomas L. schrieb:
> Aber inwiefern hat das ein Auswikung auf die State Machine?
Du hast offenbar eine "one-hot"-kodierte State-Machine. Nur das die 
jetzt eben "two-hot" ist :-)

> Und wie kann
> ich das beheben?
Alle externen Signale ordentlich einsynchronisieren (über zwei 
FlipFlops). Dazu sollten genügen Forumsbeiträge existieren.

Duke

von Georg A. (Gast)


Lesenswert?

Der Gag bei one-hot ist ja, dass die Entscheidung für den Folgezustand 
sehr simpel getroffen werden kann. Die Flipflops odern einfach alle 
Übergangsbedingungen zusammen. Dabei müssen aber die Bedingungen alle 
exklusiv sein.

Wenn dein externes Signal "blöd" zum Takt reinkommt, kann es sein, dass 
dein "if-else" tatsächlich beide Folge-FFs anspricht. 50ps früher oder 
später wäre es eindeutig...

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


Lesenswert?

Georg A. schrieb:
> Wenn dein externes Signal "blöd" zum Takt reinkommt, kann es sein, dass
> dein "if-else" tatsächlich beide Folge-FFs anspricht.
Das ist der Hintergrund:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren
Und da speziell:
http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html

von Thomas L. (thomers)


Lesenswert?

So, vielen Dank für die Hilfe.

Signale sind synchronisiert und schon gehts :)

Grüße

Thomers

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


Lesenswert?

Thomas L. schrieb:
> Signale sind synchronisiert und schon gehts :)
q.e.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.