Forum: FPGA, VHDL & Co. Latchs bei FSM


von Manu (Gast)


Lesenswert?

hallo Guys,
Ich hab ein Programm mittels FSM  von XILINX geschrieben.Und ich prbiere 
schon eine ganze weile herum aber ich bekomme einige Latchwarnungen 
nicht weg.
Was kann ich am quellcode verbessern und solche fehler wegzubekommen?

library IEEE, IEEE_PROPOSED;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE_PROPOSED.fixed_float_types.all;
use IEEE_PROPOSED.fixed_pkg.all;
use IEEE.NUMERIC_STD.ALL;

entity ITERATIV_TEST is
generic ( niter : integer := 8 );
port (CLK, RESET, START         : IN   STD_LOGIC;
      X_IN,Y_IN                 : IN   sfixed (3 downto -10);
      X_OUT,Y_OUT               : OUT  sfixed (3 downto -10);
      READY                     : OUT  STD_LOGIC);
end ITERATIV_TEST;

architecture Behavioral of ITERATIV_TEST is

type   ZUSTAENDE is (S_WAIT,S_INT,S_SYMBOL,S_LOOP,S_OUT,S_STOP);
signal ZUSTAND,FOLGE_Z: ZUSTAENDE;
signal X_INT,Y_INT,QX_INT,QY_INT:sfixed (3 downto -10):= (OTHERS => 
'0');
constant  Kn : sfixed (3 downto -10) := "00001001101110";

begin

PROCESS1: process(CLK,RESET)
  begin
    if RESET = '0' then
       ZUSTAND <= S_WAIT;
    elsif CLK = '1' and CLK'event then
       ZUSTAND <= FOLGE_Z;
    end if;
  end process PROCESS1;

PROCESS2: process( START,ZUSTAND,X_IN,Y_IN )
  variable VX_INT,VY_INT,VX_TEM         : sfixed (3 downto -10);
  begin
     READY <= '0';
    case ZUSTAND is
      when S_WAIT =>   if START = '1' then
                       FOLGE_Z <= S_INT;
                       else
                       FOLGE_Z <= S_WAIT;
                       end if;

      when S_INT  =>   X_INT <= X_IN;
                       Y_INT <= Y_IN;
                       FOLGE_Z <= S_SYMBOL;

      when S_SYMBOL  =>   if X_INT(3) = '0' then
                          QX_INT <= resize(X_INT,3,-10);
                          QY_INT <= resize(Y_INT,3,-10);
                          else
                          QX_INT <= resize(-X_INT,3,-10);
                          QY_INT <= resize(-Y_INT,3,-10);
                          end if;
                          FOLGE_Z <= S_LOOP;

      when S_LOOP =>  VX_INT := QX_INT;
                      VY_INT := QY_INT;

                      for i in 0 to niter-1 loop
                      VX_TEM := VX_INT;
                      if VY_INT(3) = '0' then
                       VX_INT := RESIZE(VX_INT + (VY_INT sra i),3,-10);
                       VY_INT := RESIZE(VY_INT - (VX_TEM sra i),3,-10);
                      else
                       VX_INT := RESIZE(VX_INT - (VY_INT sra i),3,-10);
                       VY_INT := RESIZE(VY_INT + (VX_TEM sra i),3,-10);
                      end if;
                      end loop;
                        QX_INT <= VX_INT;
                        QY_INT <= VY_INT;
                       FOLGE_Z <= S_OUT;

      when S_OUT      =>   READY  <= '1';
                           FOLGE_Z <= S_STOP;

      when S_STOP     =>   READY  <= '0';
                           FOLGE_Z <= S_WAIT;

      when OTHERS     =>   FOLGE_Z <= S_WAIT;
    end case;
  end process PROCESS2;

PROCESS3: process( ZUSTAND,QX_INT,QY_INT )
  BEGIN
    if ZUSTAND = S_OUT or ZUSTAND = S_STOP then
     X_OUT  <= resize(QX_INT * Kn,3,-10);
     Y_OUT  <= resize(QY_INT * Kn,3,-10);
    end if;
  END PROCESS PROCESS3;
end Behavioral;

Danke!!
Gruß

von rudi (Gast)


Lesenswert?

Zuerst las ich "Lachs", dann sprang main interner Korrekturmechanismus 
an und sagte mir, es müsse "Latches" heissen.

von Manu (Gast)


Lesenswert?

Also die WarnungsInformationen  stehen folgend:

------------------------------------------------------------------------ 
----
WARNING:Xst:737 - Found 14-bit latch for signal <X_OUT>. Latches may be 
generated from incomplete case or if statements. We do not recommend the 
use of latches in FPGA/CPLD designs, as they may lead to timing 
problems.
WARNING:Xst:737 - Found 14-bit latch for signal <X_INT>. Latches may be 
generated from incomplete case or if statements. We do not recommend the 
use of latches in FPGA/CPLD designs, as they may lead to timing 
problems.
WARNING:Xst:737 - Found 14-bit latch for signal <Y_OUT>. Latches may be 
generated from incomplete case or if statements. We do not recommend the 
use of latches in FPGA/CPLD designs, as they may lead to timing 
problems.
WARNING:Xst:737 - Found 14-bit latch for signal <Y_INT>. Latches may be 
generated from incomplete case or if statements. We do not recommend the 
use of latches in FPGA/CPLD designs, as they may lead to timing 
problems.
WARNING:Xst:737 - Found 14-bit latch for signal <QX_INT>.Latches may be 
generated from incomplete case or if statements. We do not recommend the 
use of latches in FPGA/CPLD designs, as they may lead to timing 
problems.
WARNING:Xst:737 - Found 14-bit latch for signal <QY_INT>.Latches may be 
generated from incomplete case or if statements. We do not recommend the 
use of latches in FPGA/CPLD designs, as they may lead to timing 
problems.
------------------------------------------------------------------------ 
----

von Manu (Gast)


Lesenswert?

rudi schrieb:
> Zuerst las ich "Lachs", dann sprang main interner Korrekturmechanismus
> an und sagte mir, es müsse "Latches" heissen.

:-) hops,hab nicht bemerkt! Danke!

von rudi (Gast)


Lesenswert?

Manu schrieb:
> 3 downto -10
Bin noch nicht soo bewandert in VHDL, aber negative Indizes habe ich in 
o.a. Deklarationen noch nicht gesehen. Kannst du die nicht in den 
positiven Bereich verschieben?

von Manu (Gast)


Lesenswert?

rudi schrieb:
> Kannst du die nicht in den positiven Bereich verschieben?
Nein, ich verwende fixed point Zahlen in diesem Programm.

von berndl (Gast)


Lesenswert?

moin,

in den Prozessen 2 und 3 beschreibst du kombinatorische Logik. Die in 
den Warnings aufgefuehrten Signale werden allerdings nicht in jedem Pfad 
gesetzt, das fuehrt zu einem zustandsgesteuerten Speicherelement, also 
einem Latch.
Mit dem ready Signal machst du es durch den Default ready<='0'; richtig, 
das bekommt immer einen von sich selbst unabhaengigen Wert zugewiesen. 
Uebrigens brauchst du im state 'when S_STOP' das ready nicht nochmal auf 
0 setzen.

Du koenntest auch die Prozesse 2 und 3 mit in den Prozess 1 nehmen, dann 
wirst du sofort den Unterschied sehen/bemerken

von Default (Gast)


Lesenswert?

Du musst dir die Mehrprocessschreibweise nochmal
genauer anschauen:

- In <process2> fehlt ein Defaultzuweisung an <x_int>,
  <y_int>,<qx_int>,<qy_inst> dito.

- In <process3> fehlt ein Defaultzuweisung an <x_out>,
 <y_out> dito.

Prozesse <process2>,<process3> sind nicht getacktet
=> Latches statt FFs.

...

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


Lesenswert?

Manu schrieb:
> WARNING:Xst:737 - Found 14-bit latch for signal <X_OUT>.
berndl schrieb:
> das fuehrt zu einem zustandsgesteuerten Speicherelement
Es gibt in einem FPGA nämlich genau 2 Arten von Speicher:
- getaktete Flipflops
- zustandsgesteuerte Latches

Der Hinweis, dass zur Verhinderung eines Latches eine Defaultzuweisung 
verwendet werden soll, greift aber zu kurz, denn oft soll ja gerade 
etwas gespeichert und eben keine Kombinatorik erzeugt werden. Mit der 
Defaultzuweisung wäre aber dasSpeicherverhalten weg...  :-/

Kurz: Wenn was gespeichert werden soll, dann kommt das in einen 
getakteten Prozess. Und du willst offenbar etwas speichern:
1
    if ZUSTAND = S_OUT or ZUSTAND = S_STOP then
2
     X_OUT  <= resize(QX_INT * Kn,3,-10);
3
     Y_OUT  <= resize(QY_INT * Kn,3,-10);
4
    end if;

Default schrieb:
> Du musst dir die Mehrprocessschreibweise nochmal
> genauer anschauen:
Oder die Ein-Prozess-Schreibweise:
http://www.lothar-miller.de/s9y/archives/43-Ein-oder-Zwei-Prozess-Schreibweise-fuer-FSM.html
Damit sind Latches (fast) nicht mehr möglich... ;-)

von berndl (Gast)


Lesenswert?

Lothar Miller schrieb:
> Der Hinweis, dass zur Verhinderung eines Latches eine Defaultzuweisung
> verwendet werden soll, greift aber zu kurz, denn oft soll ja gerade
> etwas gespeichert und eben keine Kombinatorik erzeugt werden. Mit der
> Defaultzuweisung wäre aber dasSpeicherverhalten weg...  :-/

Tja, deshalb ja auch meine 'rule of thumb': Wenn Speicher, dann 
getakteter Prozess. Wenn Kombinatorik, dann concurrent statement (ok, da 
oben schwierig) oder aber process (.....) mit default Zuweisung. Alles 
andere zeigt m.E. dass jemand 'nicht zuende gedacht' hat.

PS: Lothar warst du das neulich in M auf dem Lattice Campus Day? Ich war 
der 'backbencher' der sich ueber das process (all) lustig gemacht 
hatte...

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


Lesenswert?

berndl schrieb:
> PS: Lothar warst du das neulich in M auf dem Lattice Campus Day?
Ja, das war ich...
Woran hast du mich erkannt?

> Ich war der 'backbencher'
Ich war da weiter vorn...  ;-)

> der sich ueber das process (all) lustig  gemacht hatte...
Ich betrachte genau diese Neuerung bei VHDL 2008 auch recht 
nachdenklich. Vor allem deshalb, weil es einfach nichts neues ist, 
sondern nur Schreibfaulheit unterstützt. Einen Vorteil hat das (all) 
allerdings unbestritten: es gibt auch in der Simulation keine 
unvollständige Sensitivlisten mehr.

Insgesamt tendiere ich allerdings auch dazu, Kombinatorik nebenläufig zu 
beschreiben. Nur selten braucht man da wirklich einen Prozess.

von berndl (Gast)


Lesenswert?

Lothar Miller schrieb:
> Woran hast du mich erkannt?

na ich hatte da was mit Miller auf dem 'Tagesausweis' gelesen. Da es 
aber die letzte Session des Tages war, war es halt mit Diskussion nicht 
mehr so angesagt (wollten ja alle auch wieder nach Hause kommen...)

Naja, man liest sich wieder und sieht sich vlt. auch mal wieder bei 
Gelegenheit...

von Hans (Gast)


Lesenswert?

>Ich war
>der 'backbencher' der sich ueber das process (all) lustig gemacht
>hatte...

Ach Du warst der Klugscheißer ...

von Manu (Gast)


Lesenswert?

Danke euch alle.

Default schrieb:
> Du musst dir die Mehrprocessschreibweise nochmal
> genauer anschauen:
>
> - In <process2> fehlt ein Defaultzuweisung an <x_int>,
>   <y_int>,<qx_int>,<qy_inst> dito.
>
> - In <process3> fehlt ein Defaultzuweisung an <x_out>,
>  <y_out> dito.
>
> Prozesse <process2>,<process3> sind nicht getacktet
> => Latches statt FFs.

Ich hab die  Defaultzuweisungen in Process2:
         READY <= '0';
         FOLGE_Z <= S_WAIT;
         X_INT <= (OTHERS => '0');
         Y_INT <= (OTHERS => '0');
         QX_INT <= (OTHERS => '0');
         QY_INT <= (OTHERS => '0');
      und in Process3
         X_OUT <= (OTHERS => '0');
         Y_OUT <= (OTHERS => '0');
korrigiert.

Aber es treten viele "combinatorial loop" Warnungen auf.
Wie kann ich diese Warnungen vermeiden?

Danke!!

von Hans (Gast)


Lesenswert?

Was ist mit den Variablen? Die müssen eigentlich auch einen Default 
bekommen.

von Duke Scarring (Gast)


Lesenswert?

Hans schrieb:
> Was ist mit den Variablen? Die müssen eigentlich auch einen Default
> bekommen.
Wenn Du innerhalb des Prozesses erst schreibst und dann liest, nicht.

Duke

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


Lesenswert?

Manu schrieb:
> Aber es treten viele "combinatorial loop" Warnungen auf.
> Wie kann ich diese Warnungen vermeiden?
Indem du die kombinatorischen Schleifen vermeidest...

Lies das:
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife
Und mach das:
http://www.lothar-miller.de/s9y/archives/43-Ein-oder-Zwei-Prozess-Schreibweise-fuer-FSM.html
Das hatten wir aber schon im 
Beitrag "Re: Latchs bei FSM"


Hans schrieb:
> Was ist mit den Variablen? Die müssen eigentlich auch einen Default
> bekommen.
Ein Dauerbrenner, diese Variablen bei Anfängern:
Beitrag "Variable vs Signal"

von Hans (Gast)


Lesenswert?

>Indem du die kombinatorischen Schleifen vermeidest...

Na, das ist ja mal eine Profi-Antwort ;-)

Wo entstehen denn hier die kombinatorischen Schleifen?

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


Lesenswert?

Hans schrieb:
> Wo entstehen denn hier die kombinatorischen Schleifen?
Nicht im geposteten Code.

von Hans (Gast)


Lesenswert?

Aha. Gut beobachtet.

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.