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
@ 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
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
@ 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
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.
>>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..
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.