www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Fehler bei Synthese


Autor: vhdler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: vhdler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
SYNC:process (clk)
begin
if rising_edge(clk) then
zustand<=folge;
end if;
end process SYNC;

ZAEHLER:PROCESS(zustand,a)
BEGIN
IF a='1' THEN
 counter<=(OTHERS=>'0');
ELSIF zustand = S1 THEN
  counter<=   counter+1;
ELSIF zustand = S2 THEN
   counter<=(OTHERS=>'0');
--ELSE
--counter<=counter Wert im S1 behalten!!!! 
END IF;
END PROCESS ZAEHLER;

COMB:process(zustand,counter)
begin
case zustand is 
when S0 => folge<=S1;
          a<='0';       
when S1 => 

          if counter< 7 then
        folge<=S0;
        a<='0';
        else
        folge<=S2;
        a<='0';
        end if;
       
when S2 => folge<=S0;
           a<='1';
       
end case;
end process COMB;
MFG

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
process (clk)
begin
   if (clk='1') then
      Reg <= Reg(4 downto 0)&Input;
   end if;
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:
process (clk, Reg, Input)
begin
   if (clk='1') then                        
      Reg <= Reg(4 downto 0)&Input; 
   end if;
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
   if rising_edge(clk) then
verwendet.


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

Autor: Hanna (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.