Statemaschine fehler!

(Firma: Keine) #932476
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ß
Gast #932484
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.
#932490
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.
(Firma: Keine) #932511
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ß
#932602
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.
Gast #932634
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
Gast #932656
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.

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