Forum: FPGA, VHDL & Co. Eingänger werden weg optimiert


von Autoflug (Gast)


Angehängte Dateien:

Lesenswert?

Moin,
Ich stuer in mit hilfe eines prozesses einen AD Wandler. Leider werden
die datenleitungen (Wert_ad) vom FPGA zum AD-wandler weg optimiert mit
der begründung das die nicht gebraucht werden.

bei when 5 =>
und when 15 =>

wird Wert_Ad benötigt.

@W: CL159
:"C:\Actelprj\400758-01\Stickstoff\hdl\Stickstoff.vhd":21:10:21:16|Input
wert_ad is unused

Was kann ich dagegen tun?
danke
Erik

von schlumpf (Gast)


Lesenswert?

Vervollständige mal deine Sensitivity-List!

von Roger S. (edge)


Lesenswert?

state_ADC wird auf 1 gesetzt unabhaengig davon ob die delays
abgelaufen sind, drum kommts nie zum lesen von Wert_AD.

Cheers, Roger

von Autoflug (Gast)


Lesenswert?

meines wissens nach sind "if" statements in VHDL sequenziell
ausgeführt. versteh also nicht ganz wieso state_ADC dann immer auf 1
gesetzt wird unabhängig von den Delays. State_ADC wird erst auf 1
gesetzt wenn ein delay abgelaufen ist, oder seh ich das verkehrt.

thx
erik

von Roger S. (edge)


Lesenswert?

weil state_ADC ausserhalb dem if im state gesetzt wird,
du muesstest es halt ins if reinnehmen, dort wo du Wert_AD
lesen willst. Dann koennte das so funktionieren wie du willst.

und sequentiell ist dein Konstrukt hoechstens bei der Simulation,
Variablen benutzt du ja keine.

Cheers, Roger

von TobiFlex (Gast)


Lesenswert?

Ich schreibe mal ausführlicher was Roger meinen könnte. Hier Dein
Codeauszug:

                    --Daten von AD Wandler lesen // Wert Feuchte, darf
nur gelesen werden, wenn Taster Temperturanzeige
                    --(show_temperature) nicht betätigt ist, da sonst
der Wert der Temperatur ausgegeben wird
                    when 5 =>   Zustand    <= "0101";
                        timeout2    <= 0;
                                convst      <= '1';
                                cs          <= '0';
                                rd          <= '0';
                                switch      <= '0';
                        delay    <= delay-1;
                                if delay =0 and show_temperature='1'
then
                                      Wert_Feuchte <=
to_bitvector(Wert_AD);
                                      Zustand <= "1100";
                                end if;
                                state_ADC   <= 11;

delay wird von 5 auf 4 verringert und dann gleich State 11 aktiviert.
D.h. Wert_Feuchte wird nie ein Wert zugewiesen wiel es zu delay=3...
garnicht mehr kommt. Hier mein Codevorschlag:

                    --Daten von AD Wandler lesen // Wert Feuchte, darf
nur gelesen werden, wenn Taster Temperturanzeige
                    --(show_temperature) nicht betätigt ist, da sonst
der Wert der Temperatur ausgegeben wird
                    when 5 =>   Zustand    <= "0101";
                        timeout2    <= 0;
                                convst      <= '1';
                                cs          <= '0';
                                rd          <= '0';
                                switch      <= '0';
                        delay    <= delay-1;
                                if delay =0 then
                                state_ADC   <= 11;
 if show_temperature='1' then
                                      Wert_Feuchte <=
to_bitvector(Wert_AD);
                                      Zustand <= "1100";
                                end if;

von Roger S. (edge)


Lesenswert?

bingo

von TobiFlex (Gast)


Lesenswert?

Sorry beim Editieren felsche Taste gedrückt. War noch nicht fertig
Autor: TobiFlex
Datum: 31.07.2006 17:41

------------------------------------------------------------------------ 
--------

Ich schreibe mal ausführlicher was Roger meinen könnte. Hier Dein
Codeauszug:

                    --Daten von AD Wandler lesen // Wert Feuchte, darf
nur gelesen werden, wenn Taster Temperturanzeige
                    --(show_temperature) nicht betätigt ist, da sonst
der Wert der Temperatur ausgegeben wird
                    when 5 =>   Zustand    <= "0101";
                        timeout2    <= 0;
                                convst      <= '1';
                                cs          <= '0';
                                rd          <= '0';
                                switch      <= '0';
                        delay    <= delay-1;
                                if delay =0 and show_temperature='1'
then
                                      Wert_Feuchte <=
to_bitvector(Wert_AD);
                                      Zustand <= "1100";
                                end if;
                                state_ADC   <= 11;

delay wird von 5 auf 4 verringert und dann gleich State 11 aktiviert.
D.h. Wert_Feuchte wird nie ein Wert zugewiesen wiel es zu delay=3...
garnicht mehr kommt. Hier mein Codevorschlag:

                    --Daten von AD Wandler lesen // Wert Feuchte, darf
nur gelesen werden, wenn Taster Temperturanzeige
                    --(show_temperature) nicht betätigt ist, da sonst
der Wert der Temperatur ausgegeben wird
                    when 5 =>   Zustand    <= "0101";
                        timeout2    <= 0;
                                convst      <= '1';
                                cs          <= '0';
                                rd          <= '0';
                                switch      <= '0';
                        delay    <= delay-1;
                                if delay =0 then
                                state_ADC   <= 11;
                               if show_temperature='1' then
                                      Wert_Feuchte <=
to_bitvector(Wert_AD);
                                      Zustand <= "1100";
                                end if;
                                end if;

Mit State 15 genauso verfahren.
Wert_Druck und Wert_Feuchte verändern keinen OUTPUT. Deshalb werden sie
wahrscheinlich weiterhin wegoptimiert. Also am Besten für den Test noch
Ausgabepins definieren.
Viele Grüße
TobiFlex

von Juergen Schuhmacher (Gast)


Lesenswert?

guck Dir auch mal den When-4-Fall an (inneres IF). Was soll mit dem
state passieren ?

von Autoflug (Gast)


Lesenswert?

Danke

von Autoflug (Gast)


Angehängte Dateien:

Lesenswert?

Es wird nur Wert_Feuchte wegoptimiert. Libero gibt mir folgende
Fehlermeldung:

@W: BN116
:"c:\actelprj\400758-01\stickstoff\hdl\stickstoff.vhd":91:12:91:13|Remov 
ing
sequential instance Wert_Feuchte[0:11] of view:PrimLib.dff(prim) because
there are no references to its outputs

Es ist nicht möglich weitere Pins am FPGA zu definieren da alle bereits
gebraucht werden. Wie kann ich die Wegoptimierung noch umgehen?

Die Signale Wert_Feuchte und Wert_Druck werden im Process
"Programmauswahl" mit Sollwerten verglichen, welche abhänging von
Schalterstellung S4 und S5 sind. Kann daher nicht ganz nachvollziehen
wieso die wegoptimiert werden.

Hab mal das ganze Programm angehängt.

gruß
erik

von TobiFlex (Gast)


Lesenswert?

Oh man das ist ja schon ganz schön ordentlich. Da wirst du wohl mal
Simulieren müssen um den Fehler zu finden.
Zwei Sachen sind mir auf die Schnelle aufgefallen(sind Vermutungen):
-Zuweisung an Signal Programm nicht sauber. Eingang P1 könnte Prellen
oder zu jeder Zeit den Zustand ändern. Außerdem zeitgleiche
Wertzuweisung an Signal Programm in den Case-Zweigen.
-Startbedingung für Signal state_automatik bei Programm=5 wird mir
nicht klar.

Vielleicht hilft es weiter.
Viele Grüße
TobiFlex

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.