Forum: FPGA, VHDL & Co. Statemaschine fehler!


von Frank S. (Firma: Keine) (franks)


Lesenswert?

Hallo, villeicht kann mir einer von euch helfen, ich habe ein ganz 
blöden Fehler in meiner Statemaschine.

Ich sende Daten von USB an einen FPGA, wenn Daten anliegen geht RXF_in 
auf GND, dann muss ich 4 Takte den Ausgang RD_out auf gnd legen und bei 
rd4 lese ich die USB Daten ein.

Soweit geht das auch alles, aber wenn ich bei VIEW RTL Schematic schaue, 
sind in einem Block nicht alle Gatters angeschlossen, das kann doch 
nicht sein das ISE hier mist baut.


versteht das einer ?
1
oberhalb
2
  type usb_stat_type is (
3
    idle, 
4
    ras1, ras2, ras3, ras4, ras5, 
5
    rd1, rd2, rd3, rd4); 
6
7
signal usb_stat, usb_next_stat : usb_stat_type; 
8
9
10
----
11
  process (clock, usb_stat)
12
  begin
13
    if (Reset = '0') then
14
        usb_stat <= idle; 
15
    elsif (clock'event and clock = '1') then
16
        usb_stat  <= usb_next_stat;
17
     end if;        
18
  end process;
19
20
  process (clock, usb_stat, RXF_in)
21
  begin
22
    case (usb_stat) is
23
      when idle => if (RXF_in = '0') then                  
24
                          usb_next_stat <= ras1;
25
                      else  
26
                          usb_next_stat <= idle;
27
                      end if;
28
      when ras1 => usb_next_stat <= rd2;
29
      when rd1  => usb_next_stat <= rd2;
30
      when rd2  => usb_next_stat <= rd3;
31
      when rd3  => usb_next_stat <= rd4;  
32
      when rd4  => usb_next_stat <= ras2;
33
      when ras2 => usb_next_stat <= ras3;
34
      when ras3 => usb_next_stat <= ras4;
35
      when ras4 => usb_next_stat <= ras5;    
36
      when ras5 => usb_next_stat <= idle;    
37
      when others =>  usb_next_stat <= idle;
38
    end case;
39
  end process;
40
  
41
42
43
44
  --  \_/  Daten einlesen
45
   RD_out <=  '0' when  (usb_stat=rd1) or (usb_stat=rd2) or (usb_stat=rd3) or (usb_stat=rd4)  else '1';



Gruß

von Nephilim (Gast)


Lesenswert?

also, was mich auf den ersten blick ein wenig verwundert ist, dass du 
zwar das clock-signal bei der statemaschine mit in der 
sensitivitätsliste hast, aber keine flanke abfragst.
ich würde die statemaschine mit in den anderen process mit ins elsif 
eintragen. dann hast du ne schön synchron getaktete statemaschine.

kein plan ob das deinen fehler behebt, aber ist mir halt mal so 
aufgefallen.

von Jan M. (mueschel)


Lesenswert?

Ohne deinen Code jetzt durchgelesen zu haben: Darstellungsfehler im 
RTL-Viewer kommen ab und zu mal vor. Beliebt sind auch Leitungen, die 
schraeg ueber alles in die linke obere Ecke laufen oder eben nicht 
angeschlossene Gatter, weil der Algorithmus fuer die Darstellung 
irgendwo ins Leere laeuft.

@ Nephilim:
Die Clock in der sensitivity-list ist zwar zu viel, stoert aber auch 
nicht. Diese Zwei-Prozess-Schreibweise ist aber genauso erlaubt wie eine 
mit nur einem oder drei Prozessen.

von Frank S. (Firma: Keine) (franks)


Lesenswert?

Ich habe das jetzt mal mit mit
(if (clock'event and clock = '1') then)
eingebunden, bis jetzt sehe ich keine Fehler in RTL Schematic.

Normal darf das doch so nicht sein, das müsste doch auch ohne clock 
gehen.
1
  process (clock, usb_stat, RXF_in)
2
  begin
3
  if (clock'event and clock = '1') then
4
    case (usb_stat) is
5
      when idle => if (RXF_in = '0') then                  
6
                          usb_next_stat <= ras1;
7
                      else  
8
                          usb_next_stat <= idle;
9
                      end if;
10
      when ras1 => usb_next_stat <= rd1;                   
11
      when rd1  => usb_next_stat <= rd2;
12
      when rd2  => usb_next_stat <= rd3;
13
      when rd3  => usb_next_stat <= rd4;  
14
      when rd4  => usb_next_stat <= ras2;
15
      when ras2 => usb_next_stat <= ras3;
16
      when ras3 => usb_next_stat <= ras4;
17
      when ras4 => usb_next_stat <= ras5;    
18
      when ras5 => usb_next_stat <= idle;    
19
      when others =>  usb_next_stat <= idle;
20
    end case;
21
  end if;   
22
  end process;



Gruß

von Sym (Gast)


Lesenswert?

Mache mal eine synchrones Design draus (Nur Clk und Reset in sensitivity 
list). Willst du einen Mealy oder Moore-Automaten haben?

von Frank S. (Firma: Keine) (franks)


Lesenswert?

Sym wrote:
> Willst du einen Mealy oder Moore-Automaten haben?



Hallo Sym,

ähhmmmm was ist denn das ? Mealy sagt mir nichts



gruß

von Jan M. (mueschel)


Lesenswert?

Es ist kein Fehler im urspruenglichen Code. (Ausser, dass du zweimal 
rd2 schreibst, aber rd1 vergessen hast). In ISE 9.1/Linux ist der 
RTL-View vollkommen in Ordnung. Es handelt sich bei Frank anscheinend 
lediglich um einen Darstellungsfehler.

Mealy und Moore sind zwei theoretische Modelle fuer Zustandsautomaten. 
Sollte man kennen - einfach mal googlen. Mit deinem Problem hat es aber 
nichts zu tun.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Zitat VHDL Grundregeln:
Es darf nur zwei Arten von Prozessen geben:

1. Rein kombinatorische Prozesse (keine Zustandsspeicher):
 Alle Signale die im Prozess gelesen werden in die sensitivity list 
eintragen
 ...
2. Rein getaktete Prozesse (Flip-Flops als Zustandsspeicher):
 Nur Clk und asynchroner Reset in die sensitivity list

von Jörg (Gast)


Lesenswert?

@Andreas Schwarz (andreas),

bin nur Hobbyist, aber gehören zu 2. nicht auch alle im Prozess zu
lesenden Signale in die Sen.List? Bei mir (unter Xilinx WebPack)
motzt er jedenfalls und will diese Signale.

Gruss

Jörg

von Nephilim (Gast)


Lesenswert?

ja, ISE schreit immer nach diesen Signalen, aber wenn man ein schönes 
synchrones Design haben will hängt alles nur am Clock-Signal, also 
reicht das in der Liste. Bei asynchronem Reset gehört dann auch das dort 
mit rein, aber mehr muss nicht. Ist auch beim durchdenken der 
Statemaschine, was wann passiert, am besten. Wenn man so viele Signale 
in der Sensitivitätsliste hat und es dann auch noch nicht durch eine 
Clock-Flanke gesteuert wird, dann kommt man schnell durcheinander und es 
kann schonmal passieren, dass das falsche Signal einen Zustandswechsel 
hervorruft.

von ... (Gast)


Lesenswert?

In der synchronen Statemachine dürfen NUR synchrone signale verarbeitet 
werden-> sonst gibbet murx.

von Frank S. (Firma: Keine) (franks)


Lesenswert?

Guten morgen,

also ich habe mal meinen code einen Kumpel gegeben der mit ISE 9.1 
Arbeitet,
bei dem war alles ok. Es wurde ein gleiches RTL Schematic Sheet 
erstellt, aber bei ihm waren alle Leitungen an den Gatters.


Soviel zu dem neuen ISE10.1


Gruß

von Jörg (Gast)


Lesenswert?

Ebenfalls Guten Morgen,

mit Rummosern (von 10.1) sind nur Warnings gemeint (keine Errors),
für die Synthese spielt das keine Rolle.

Gruss und frohes Schaffen

Jörg

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.