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ß
Zuerst las ich "Lachs", dann sprang main interner Korrekturmechanismus an und sagte mir, es müsse "Latches" heissen.
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?
rudi schrieb: > Kannst du die nicht in den positiven Bereich verschieben? Nein, ich verwende fixed point Zahlen in diesem Programm.
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:
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... ;-)
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...
>Ich war >der 'backbencher' der sich ueber das process (all) lustig gemacht >hatte... Ach Du warst der Klugscheißer ...
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
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"
>Indem du die kombinatorischen Schleifen vermeidest...
Na, das ist ja mal eine Profi-Antwort ;-)
Wo entstehen denn hier die kombinatorischen Schleifen?
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.