Latchs bei FSM

Gast #2408968
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ß
Gast #2408978
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.
------------------------------------------------------------------------ 
----
Gast #2409078
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
Gast #2409080
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.

...
Moderator (Firma: Titel) Persönliche Seite #2409129
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... ;-)
Gast #2409297
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...
Moderator (Firma: Titel) Persönliche Seite #2409521
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.
Gast #2409983
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...
Gast #2410648
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!!
Moderator (Firma: Titel) Persönliche Seite #2410727
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"

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