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ß
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.
------------------------------------------------------------------------
----
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!
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?
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
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.
...
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:
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...
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.
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...
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!!
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
>Indem du die kombinatorischen Schleifen vermeidest...
Na, das ist ja mal eine Profi-Antwort ;-)
Wo entstehen denn hier die kombinatorischen Schleifen?