Forum: FPGA, VHDL & Co. Fehler bei Synthese


von vhdler (Gast)


Lesenswert?

Hallo Alle!
Ich muss ein FSM in VHDL schreiben.FSM besteht aus 3 
states:State_0----->Sate_1--->State2----State_0.
In State_1 habe ich ein schieberegister so programmiert.
register<=register(n-1-1 downto 0)&Input;
Also simultion laueft wunderbar,aber die Synthese spuckt ein warnung aus
Warnung:Found 6-bit latch for signal<register>.
ich denke,damit ich dieses problem vermeiden, kann muss ich dem register 
auch in anderen zuständen auch ein wert zuweisen.
Es ist ja ziemlich kompliziert weil,dieser register wert vom inputwert 
haengt.
Hat jeman ein Ahnung wie kann man solche warnungen beheben?
mfg

von Falk B. (falk)


Lesenswert?

@ vhdler (Gast)

>In State_1 habe ich ein schieberegister so programmiert.
>register<=register(n-1-1 downto 0)&Input;

OK.

>Warnung:Found 6-bit latch for signal<register>.

Schlecht.

>ich denke,damit ich dieses problem vermeiden, kann muss ich dem register
>auch in anderen zuständen auch ein wert zuweisen.

Nö.

>Hat jeman ein Ahnung wie kann man solche warnungen beheben?

Durch eine saubere, synchrone Beschreibung.

VHDL

MFG
Falk

von vhdler (Gast)


Lesenswert?

Hallo wieder!
Ich hab mir ein kleines Program als Test geschrieben.Im process Zaehler 
fehlt die ELSE Abfrage.Deswegen kriege ich warnungen bei der Synthese
WARNING:Xst:737 - Found 3-bit latch for signal <counter>.
IM S1 wird der counter inkrementiert und im S2 wird rückgesezt aber im 
S0 ändert  sich net der counterwert .Hat jemand eine idee wie kann man 
das problem beheben.
1
SYNC:process (clk)
2
begin
3
if rising_edge(clk) then
4
zustand<=folge;
5
end if;
6
end process SYNC;
7
8
ZAEHLER:PROCESS(zustand,a)
9
BEGIN
10
IF a='1' THEN
11
 counter<=(OTHERS=>'0');
12
ELSIF zustand = S1 THEN
13
  counter<=   counter+1;
14
ELSIF zustand = S2 THEN
15
   counter<=(OTHERS=>'0');
16
--ELSE
17
--counter<=counter Wert im S1 behalten!!!! 
18
END IF;
19
END PROCESS ZAEHLER;
20
21
COMB:process(zustand,counter)
22
begin
23
case zustand is 
24
when S0 => folge<=S1;
25
          a<='0';       
26
when S1 => 
27
28
          if counter< 7 then
29
        folge<=S0;
30
        a<='0';
31
        else
32
        folge<=S2;
33
        a<='0';
34
        end if;
35
       
36
when S2 => folge<=S0;
37
           a<='1';
38
       
39
end case;
40
end process COMB;
MFG

von Falk B. (falk)


Lesenswert?

@ vhdler (Gast)

>Ich hab mir ein kleines Program als Test geschrieben.Im process Zaehler
>fehlt die ELSE Abfrage.Deswegen kriege ich warnungen bei der Synthese
>WARNING:Xst:737 - Found 3-bit latch for signal <counter>.

Logisch. Und du hast mal wieder sämtliche Hinweise gekommt ignoriert. 
Gratulation. LIES mal den Artikel VHDL, dann sollte es auch dir 
dämmern, dass in deinem Zählerprozess ein Takt fehlt.

Und ohne jetzt wieder lange Dislussionen antreten zu wollen. Die 
Zweiprozessmethode für Statemachines und ähnliches halte ich für Unsinn. 
Viel Schreibarbeit, zusätzliche Variablen. Mach es kompakt in EINEM 
Prozess. Dann klappts auch mit den FlipFlops.

MFG
Falk

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


Lesenswert?

Das
:
ZAEHLER:PROCESS(zustand,a)
BEGIN
IF a='1' THEN
  counter<=(OTHERS=>'0');
ELSIF zustand = S1 THEN   --- Autsch: kombinatorische
  counter<=   counter+1;  ---         Schleife
ELSIF zustand = S2 THEN
  counter<=(OTHERS=>'0');
--ELSE
:
ist eine kombinatorische Schleife. Und das funktioniert in der 
Simulation nur, weil counter in der Sensitivity-List fehlt.
Ein allgemein gern gemachter Fehler.

Probier das doch mal mit der kompletten Sensitivity-List:
:
PROCESS(zustand,a,counter)
:
Dann funktioniert die Simulation nicht mehr ;-)
Im Zustand S1 wird der Zähler dauernd mit maximaler Geschwindigkeit 
weitergezählt --> wir haben einen Oszillator --> die Simulation wird nie 
fertig. Logisch.

Allgemein gilt:
Wenn die Beschreibung des Schieberegisters/Zählers nicht an einen Takt 
sondern an einen Pegel gekoppelt ist, wie etwa:
1
process (clk)
2
begin
3
   if (clk='1') then
4
      Reg <= Reg(4 downto 0)&Input;
5
   end if;
6
end process;
Dann scheint das in der Simulation zu funktionieren, weil die 
Simulationsergebnisse nur durchgerechnet werden, wenn sich eines der 
Signale in der Sensitivity-List ändert. Und diese Liste ist hier nicht 
vollständig.
Da gehören Reg und Input auch mit rein, weil die bei clk=1 auch eine 
Änderung des Ergebnisses bewirken:
1
process (clk, Reg, Input)
2
begin
3
   if (clk='1') then                        
4
      Reg <= Reg(4 downto 0)&Input; 
5
   end if;
6
end process;
Und plötzlich funktioniert auch die Simulation nicht mehr, bzw. macht 
das selbe wie die reale Schaltung.

Am einfachsten umgeht man solche unnötigen Fehler, indem man
1
   if rising_edge(clk) then
verwendet.


>Mach es kompakt in EINEM Prozess. Dann klappts auch mit den FlipFlops.
Full Ack. Und zwar aus Erfahrung.

von Hanna (Gast)


Lesenswert?

>>Mach es kompakt in EINEM Prozess. Dann klappts auch mit den FlipFlops.
>Full Ack. Und zwar aus Erfahrung.

Auch auf die Gefahr hin jetzt gehasst zu werden weil ich eine alte 
Diskussion wieder anheize, aber mit einem Prozess kann man keine Mealy 
modellieren..

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


Lesenswert?

@ Hanna
>Mealy...
Nein, das hat nichts mit hassen zu tun, sondern mit "Auf die Schnauze 
fallen" oder nicht. Ich mache nur noch Ein-Prozess-Automaten (wobei 
Ausnahmen bestenfalls die Regel bestätigen), weil ich mir schon des 
öfteren eine blutige Nase geholt habe. Die Häufigkeit dieser ungewollten 
Kollisionen mit der Realität ist signifikant geringer, seit der 2. 
Prozess pensioniert ist...

Das sieht man doch andauernd, dass diese kombinatorischen Schleifen 
programmiert werden, weil laut Lehrbuch im getakteten Teil nur das 
Weiterschalten zu erfolgen hat. Ja, und dann programmieren die 
Delinquenten eben einen Zähler oder ein Schieberegister in die 
Kombinatorik mit hinein.

Und man (ich zumindest) kann mit concurrent-Zusweisungen durchaus einen 
Mealy-Automaten aus der Ein-Prozess-Darstellung machen. Ich werde aber 
(vor allem bei FPGAs mit dem Register in jedem Pintreiber) so etwas gar 
nicht wollen. Dieser unmittelbare (kombinatorische, asynchrone) 
Durchgriff von der Eingangs- auf die Ausgangsseite ist mir zutiefst 
unwohl (irgendwie glitchig)...

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.