Forum: FPGA, VHDL & Co. Vhdl kipsufe ist nicht Stabil


von Sven (Gast)


Lesenswert?

Morgen

Ich habe mir eine Kipfstufe gebastelt. Damit möchte ich über zwei Taster 
eine Led ein und Ausschalten.
Leider geht die led wieder aus sobald ich den Taster loslasse.
Jemand einen tipp was ich falsch mache?

Lg

1
library IEEE; 
2
use IEEE.STD_LOGIC_1164.ALL; 
3
use IEEE.NUMERIC_STD.ALL; 
4
 
5
entity Flip is 
6
    Port ( clk : in  STD_LOGIC;
7
    An : in STD_Logic;
8
    Aus : in STD_Logic;
9
    Ausgang: out  STD_LOGIC); 
10
end Flip; 
11
 
12
architecture Behavioral of Flip is 
13
14
signal x : std_logic;  
15
16
begin 
17
   process begin  
18
      wait until rising_edge(clk); 
19
      if (An='1') then
20
          x <= '1';
21
      end if; 
22
23
      if (aus='1') then
24
          x <= '0';
25
      end if; 
26
27
   end process; 
28
   Ausgang <= x;
29
end Behavioral;

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


Lesenswert?

Sven schrieb:
> Kipfstufe
https://www.google.de/search?q=Kipf&hs=vkb&tbm=isch&tbo=u&source=univ&sa=X&biw=1327&bih=722

> Damit möchte ich über zwei Taster eine Led ein und Ausschalten.
Welche Zielplattform (CPLD,FPGA,...)?
Welchen Pegel hast du an den Eingangspins?
Wie sieht die Beschaltung aus?

> Jemand einen tipp was ich falsch mache?
Was sagt die Simulation?

von Josef G. (bome) Benutzerseite


Lesenswert?

Ich hätte es so geschrieben:

entweder als RS-Latch ohne Takt:
if an='1' then x<='1' elsif aus='1' then x<='0'; end if;

oder mit Takt:
if clk'event and clk='1' then an_ff <= an; aus_ff<=aus; end if;
if clk'event and clk='1' then if (an_ff='1' or aus_ff='1')
then x<=an_ff; end if; end if;

oder vielleicht auch:
if clk'event and clk='1' then an_ff <= an; aus_ff<=aus; end if;
if an_ff='1' then x<='1' elsif aus_ff='1' then x<='0'; end if;

von Trundle T. (shaheed)


Lesenswert?

keine ahnung von vhdl aber wie wäre es wenn du denn ausgang von beiden 
tastern abhänig machst und den multiplexer komplett beschreibst und 
keine unbeschrieben fälle im design lässt. so ala

if (an == 1 && aus == 0) x <= 1;
else if(an == 1 && aus == 1) x <= 1;
else if (an == 0 && aus == 1) x <= 0;
else if( an == 0 && aus == 0) x <= 0;

ich würde es mal probieren, also ich hatte ein paar mal probleme wenn 
ich nen multiplexer mit undefinierten zuständne beschrieben hab.

ps in verilog darf man nur einmal if benutzen, danach muss jedes if mit 
nem else vorkommen (gibt aber keine fehlermeldung), sonst funkt der 
multiplexer nicht richtig... vlt is das in vhdl auch so.

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


Angehängte Dateien:

Lesenswert?

Josef G. schrieb:
> Ich hätte es so geschrieben:
Es gäbe noch viele viele andere Möglichkeiten, trotzdem muss dieser arg 
simple Code funktionieren. Und die funktionale Simulation zeigt auch, 
dass er das tut...

> if clk'event and clk='1' then an_ff <= an; aus_ff<=aus; end if;
Wozu Eintakten? Ist doch sowieso nur 1 Flipflop beteiligt.
> if clk'event and clk='1' then if (an_ff='1' or aus_ff='1')
> then x<=an_ff; end if; end if;
Das ist aber auch quer durchs Beet gedacht...

G. A. schrieb:
> else if(an == 1 && aus == 1) x <= 1;
Kommt auf die Priorität an. Da könnte genausogut auch x <= '0' stehen...
> else if( an == 0 && aus == 0) x <= 0;
Das ist falsch. Denn erst wenn das nächste Mal der Aus-Taster betätigt 
wird, soll x auf low gehen...

von Sven (Gast)


Lesenswert?

Es handelt sich um einen Spartan3 FPGA Auf einem Eval board
Taster zu Gnd mit pullup.
Die Simulation sagt garnix dazu. Wie schon in einem andern Thread 
beschrieben stürzt diese bei mir leider aktuell immer ab aufgrund von 
angeblich zuwenig Ram.

Müsste aber nicht durch die ansage
      if (An='1') then
          x <= '1';
      end if;

      if (aus='1') then
          x <= '0';
      end if;
Das signal x nicht verändert werden wenn weder an noch aus eine 1 haben 
?!
Werden diese Variablen verworfen sobald der durchlauf beendet ist?

if (an == 1 && aus == 0) x <= 1;
else if(an == 1 && aus == 1) x <= 1;
else if (an == 0 && aus == 1) x <= 0;
else if( an == 0 && aus == 0) x <= 0;
Hingegen bei diesem code würde ich denken das sobald beide taster 0 sind 
der ausgang auch 0 sein müsste.

von Trundle T. (shaheed)


Lesenswert?

ja war ja auch nur nen beispiel wie er die fälle genau wählt ist ja 
seine sache. kann ja sein das er will wenn er auf beide tasten drückt 
dass das teil ausgeht. mir gings nur darum keine defaultfälle zu lassen 
sondern alles zu beschreiben.


else if( an == 0 && aus == 0) x <= 0;

aber ja der fall is wirklich unsinn, vllt wäre das besser :

else if( an == 0 && aus == 0) x <= x;

wie bereits gesagt sven es ging nicht um meine "pseudofälle", sondern 
darum das du entsprechend dem verhalten, welches du möchstest, alles 
beschreibt für den mutliplexer und nicht nur 2 fälle

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


Lesenswert?

Sven schrieb:
> Werden diese Variablen verworfen sobald der durchlauf beendet ist?
Das sind keine Variablen im Spiel.
Die Beschreibung ist ok (siehe die Waveform der Simulation oben).
Das Problem liegt in der Hardware.
Ich vermute, du hast Taster, die gegen Masse schalten...

von Trundle T. (shaheed)


Lesenswert?

lothar hast du genau seinen code benutzt und damit die simulation laufen 
lassen oder was selbst geschriebenes?

wenn ja find ich interessant das die synthese den aus-schalter 
priorisiert.

von Josef G. (bome) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
> Die Beschreibung ist ok (siehe die Waveform der Simulation oben).

Eine Nicht-Übereinstimmung von Simulation und Synthese?
Entscheidend sind die Meldungen der Synthese-Software.
Da müsste so etwas kommen wie "found FF for signal x".
Kommt eine solche Meldung (Frage an TO)?

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


Angehängte Dateien:

Lesenswert?

G. A. schrieb:
> lothar hast du genau seinen code benutzt und damit die simulation laufen
> lassen
Ja (siehe Anhang). Und genau das Ergebnis war und ist auch zu erwarten. 
Das sind effektiv nur 6 Zeilen Code. Da kann man keinen Fehler 
verstecken...

von Achim S. (Gast)


Lesenswert?

G. A. schrieb:
> wenn ja find ich interessant das die synthese den aus-schalter
> priorisiert.

das macht nicht die Synthese, das macht der Code von Sven, da er die 
Abfrage des Ausschalters weiter unten im Prozess geschrieben hat (die 
letzte Zuweisung im Prozess "gewinnt").

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


Angehängte Dateien:

Lesenswert?

Josef G. schrieb:
> Entscheidend sind die Meldungen der Synthese-Software.
Es wird wie zu erwarten 1 Flipflop synthetisiert.

G. A. schrieb:
> wenn ja find ich interessant das die synthese den aus-schalter
> priorisiert.
Das ist VHDL: in einem Prozess "gewinnt" die letzte Zuweisung an ein 
Signal.

EDIT: Zweiter...

von Trundle T. (shaheed)


Lesenswert?

interessant...cool danke für die info... wusste nicht das die letzte 
zuweisung gewinnt. muss ich mir merken. das ist aber nicht 
beschreibungssprachen abhängig oder?

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


Lesenswert?

G. A. schrieb:
> das ist aber nicht beschreibungssprachen abhängig oder?
Nein, das ist nur bei VHDL so...

von Christoph (Gast)


Lesenswert?

Sven schrieb:
> Taster zu Gnd mit pullup.

Gut, habe ich kein Problem damit.

Und jetzt: Welchen Pegel hat dein Eingangsignal wenn der Taster NICHT 
gedrückt ist?

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


Lesenswert?

Sven schrieb:
> Taster zu Gnd mit pullup.
Verda##§! Übersehen. Dann dürfte wohl alles klar sein...

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:
> Sven schrieb:
>> Taster zu Gnd mit pullup.
> Verda##§! Übersehen. Dann dürfte wohl alles klar sein...

Warum geht dann die LED beim Drücken der AN Taste überhaupt an?

von Christoph (Gast)


Lesenswert?

Reine Vermutung: Weil die Taster nicht beschriftet sind, und dadurch 
eine Fehlbedienung vorliegt :-)

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


Lesenswert?

Lattice User schrieb:
> Warum geht dann die LED beim Drücken der AN Taste überhaupt an?
Ich tippe auch, dass da aus Versehen auf die Aus-Taste gedrückt wurde...

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:

> Ich tippe auch, dass da aus Versehen auf die Aus-Taste gedrückt wurde...

Ok, das passt.
An ein Versehen glaube ich nicht, eher wenn ich diese (unbeschrifftete) 
Taste drücke geht die LED an, also muss es die EIN Taste sein.

Lothar Miller schrieb:
> G. A. schrieb:
>> das ist aber nicht beschreibungssprachen abhängig oder?
> Nein, das ist nur bei VHDL so...

Das war doch ironisch gemeint, oder?
Ist in Verilog auch der Fall.

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


Lesenswert?

Lattice User schrieb:
> Lothar Miller schrieb:
>> G. A. schrieb:
>>> das ist aber nicht beschreibungssprachen abhängig oder?
>> Nein, das ist nur bei VHDL so...
> Das war doch ironisch gemeint, oder?
Da sag ich jetzt einfach mal: Ja!
> Ist in Verilog auch der Fall.
Man lernt nie aus...  ;-)
Und wie ist das Verhalten zwischendurch wird der Wert wie bei einer 
VHDL-Variablen sofort übernommen oder bleibt der wie beim VHDL-Signal 
erst mal ganz der Alte?

von Lattice User (Gast)


Lesenswert?

Lothar Miller schrieb:

> Man lernt nie aus...  ;-)
> Und wie ist das Verhalten zwischendurch wird der Wert wie bei einer
> VHDL-Variablen sofort übernommen oder bleibt der wie beim VHDL-Signal
> erst mal ganz der Alte?

Das Variablen/Signal-Konzept von VHDL kennt Verilog so nicht.
Unterschieden wird zwischen blocking '=' und non-blocking '<=' 
Zuweisungen.
Bei blocking steht der Wert sofort zur Verfügung.

Gängige Praxis ist bei kombinatorischen always Blöcken blocking zu 
verwenden, und bei getakteten non-blocking. Mischformen sind zwar 
erlaubt aber wie die Variablen in VHDL nichts für Anfänger.

von Sven (Gast)


Lesenswert?

Ok ihr habt schonmal recht. Die Led geht an solange ich auf aus drücke.
Und wie ihr es erahnt habt klaar unbeschriftet draufgedrückt. Led 
leuchtet muss taster An sein :)

in einem Prozess "gewinnt" die letzte Zuweisung an ein
Signal.
Kann ich also keine zwei if anfragen auf ein signal x nacheinander 
machen ?


if (An='1') then
   x <= '1';
end if;
if (aus='1') then
   x <= '0';
end if;

Würde denn
if (An='1') then    x <= '1';
elsif (aus='1') then x <= '0';
end if;

klappen?

von Schlumpf (Gast)


Lesenswert?

Sven schrieb:
> Kann ich also keine zwei if anfragen auf ein signal x nacheinander
> machen ?

Doch, klar kannst du das machen.. es ist nur so, dass die letzte 
Zuweisung "gewinnt". Aber natürlich nur, wenn das "IF" auch ERFÜLLT ist 
;-)

Also in deinem Beispiel bedeutet das, wenn AN = 1 ist und AUS = 0, dann 
ist die Zuweisung unter AN=1 die Letzte und "gewinnt" somit.

Ist AUS = 1, dann ist egal, welchen Zustand AN dabei hat, denn die 
Zuweisung unter AUS = 1 ist die letzte und "gewinnt"..

von Sven (Gast)


Lesenswert?

dann habe ich scheinbar noch immer nicht verstanden warum
if (An='1') then
   x <= '1';
end if;
if (aus='1') then
   x <= '0';
end if;

nicht geht.

Im Idealfall drücke ich ja nur einen Taster also wird x endweder ein 
oder ausgeschaltet.

von Schlumpf (Gast)


Lesenswert?

ergänzend zu meinem vorigen Post:
1
if (An='1') then
2
   x <= '1';
3
end if;
4
if (aus='1') then
5
   x <= '0';
6
end if;

führt zu folgender Tabelle:

AN    AUS    X
--------------
0     0      keine Änderung
0     1      0
1     0      1
1     1      0
1
if (An='1') then    x <= '1';
2
elsif (aus='1') then x <= '0';
3
end if;

führt zu folgender Tabelle:

AN    AUS    X
--------------
0     0      keine Änderung
0     1      0
1     0      1
1     1      1

von Schlumpf (Gast)


Lesenswert?

Sven schrieb:
> dann habe ich scheinbar noch immer nicht verstanden warum

Weil deine Taster gegen MASSE schalten!!
Gedrückter Taster ist nicht '0', sondern '1'

Logisch hast du folgendes geschrieben:

if (An  NICHT GERÜCKT) then
   x <= '1';
end if;
if (aus NICHT GEDRÜCKT) then
   x <= '0';
end if;

Und jetzt hast du versehentlich immer auf AUS gedrückt, statt auf AN.
araus ergibt sich folgendes:

Keine Taste gedrückt:
x = 0
AUS gedrückt, (was du ja fälschlicherweise für AN gehalten hast):
erste Bedingung erfüllt, aber zweite nicht erfüllt. Also ist die erste 
Bedingung die letzte erfüllte Bedingung und "gewinnt"..

Du hast nen Doppelfehler gemacht:
1. Fehler: Tasten sind bei "Gedrückt" = 0 und nicht 1
2. Fehler: Du hast die Tasten AN und AUS vertauscht

Vergleiche in deinen if nicht auf 1 sondern auf 0 und drücke dann auf 
die richtigen Tasten und es wir funktionieren ;-)

von Schlumpf (Gast)


Lesenswert?

Schlumpf schrieb:
> Gedrückter Taster ist nicht '0', sondern '1'

Was schreib ich eigentlich für nen Mist?
genau andersrum... es wird Zeit für´s Bett ;-)

von Sven (Gast)


Lesenswert?

Manchmal siht man doch wiedermal den Wald vor Bäumen nicht.
Gedrückte Taster endsprechen bei meinem Board der 0 und Offene Taster 
der 1.

Würd sagen ganz klassischer "Standardfehler"

Also
if (An='0') then
   x <= '1';
end if;
if (aus='0') then
   x <= '0';
end if;

Führt jetzt zum gewünschten Ergebnis
Vielen dank :)

von Schlumpf (Gast)


Lesenswert?

Sven schrieb:
> Manchmal siht man doch wiedermal den Wald vor Bäumen nicht.

das kommt in den besten Familien vor ;-)

von Sven (Gast)


Lesenswert?

Ich würde mal sagen zuviele neue potentielle Fehlerquellen. Aber hey 
nachdem ich zwei Wochen das Blink Led Tutorial studiert habe und es 
einfach nicht klappen wollte weil im Datei Pfad ein Leerzeichen war 
wirds langsam besser :)

von Schlumpf (Gast)


Lesenswert?

Sven schrieb:
> weil im Datei Pfad ein Leerzeichen war

rofl sowas ist mir auch schon passiert.. da rauft man sich die Haare!

Aber es wird wirklich besser.. für den ersten Fehler hast ne Woche 
gebraucht, den zweiten hattest in 12h. Ist doch eine guter Gradient ;-)

von Hagen (Gast)


Lesenswert?

>VHDL Kippstufe ist nicht stabil
ist das nicht der Sinn einer solchen Stufe?

von Schlumpf (Gast)


Lesenswert?

Hagen schrieb:
> ist das nicht der Sinn einer solchen Stufe?

So ne Kippstufe wird auch gerne als bi-STABIL bezeichnet...
im Gegensatz zu der monostabilen oder astabilen...

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


Lesenswert?

Sven schrieb:
> Kann ich also keine zwei if anfragen auf ein signal x nacheinander
> machen ?
Doch, aber die letzte gewinnt. Und wichtig: während des Prozesses ändern 
die Signale ihren Wert nicht!
Das hier
1
 if (An='0') then     -- niedrigere Priorität
2
    x <= '1';
3
 end if;
4
 if (aus='0') then    -- höchste Priorität   
5
    x <= '0';
6
 end if;
Ergibt exakt das selbe wie das hier
1
 if                           -- höchste Priorität    
2
   (aus='0') then  x <= '0';
3
 elsif                        -- niedrigere Priorität
4
   (an ='0') then  x <= '1';
5
 end if;

Aus diesem Grund werden bei kombinatorischen Prozessen einfach mal 
vorneweg alle Signale mit einem Defaultwert belegt, und dann 
überschrieben. Hier z.B. "gewinnt" die Ueberlast, wenn mehrere Fehler 
anliegen:
1
signal error : integer;
2
 :
3
 :
4
 error <= 0;  -- erstmal kein Fehler, niedrigste Priorität
5
 if (Ueberstrom='1') then   -- höhere Priorität
6
    error <= 1;
7
 end if; 
8
 if (Blockiert='1') then    -- noch höhere Priorität
9
    error <= 3;
10
 end if;
11
 if (Ueberlast='1') then    -- höchste Priorität   
12
    error <= 2;
13
 end if;


BTW:
Der Verlauf des Threads ist eigentlich auch schön und zeigt, wie nicht 
beantwortete Fragen und nicht gelesene Antworten dann gut 12 Stunden 
zur Lösung brauchen:
Sven schrieb:
> 11:31
> Jemand einen tipp was ich falsch mache?
Lothar Miller schrieb:
> 12:03
> Wie sieht die Beschaltung aus?
> Welchen Pegel hast du an den Eingangspins?
Sven schrieb:
> 13:03
> Taster zu Gnd mit pullup.
Christoph schrieb:
> 13:44
> Welchen Pegel hat dein Eingang wenn der Taster NICHT gedrückt ist?
Lothar Miller schrieb:
> 13:49
> Taster zu Gnd mit pullup.
> Verda##§! Übersehen. Dann dürfte wohl alles klar sein...
>>> zehn Stunden später <<<
Sven schrieb:
> 23:48
> Gedrückte Taster endsprechen bei meinem Board der 0
> und Offene Taster der 1.
Also für die Zukunft: alle Fragen und Antworten lesen. Und wenn dir 
nicht klar ist, WARUM das derjenige gefragt oder gesagt hat, dann bohr 
nach. Dein Problem hätte mittags um eins gelöst sein können...

von Klugscheißer (Gast)


Lesenswert?

@Lothar:
dito

Sven schrieb:
> Taster zu Gnd mit pullup.

Lothar Miller schrieb:
> Ich vermute, du hast Taster, die gegen Masse schalten...

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


Lesenswert?

Klugscheißer schrieb:
> Lothar Miller schrieb:
>> Ich vermute, du hast Taster, die gegen Masse schalten...
Um es kurz zu fassen: ich kann es mir leisten, nicht alles zu lesen, 
weil ich kein Problem mit meinem Aufbau habe  ;-)
Aber schon nach diesem Post hätte ein fruchtbarer Denkprozess einsetzen 
können...

von Michael S. (decimad)


Lesenswert?

Hallo ihr, ich habe nur kurz mitgelesen und möchte den Thread nicht 
kapern usw.: Nur eine kurze Zwischenfrage - Kann man bei den 
Location-Constraints auch irgendwie angeben, dass das Signal negativ 
gewertet werden soll, also wie bei ICs, bei denen halt der Querstrich 
indiziert, dass man andersrum steuern muss? Eigentlich gehören solche 
Aufbaudetails wie Schalter zu Ground mit Pullup ja nicht zur logischen 
Beschreibung der Schaltung.
Natürlich könnte man noch einen Anpassungsblock außenrum basteln, aber 
vielleicht geht es ja direkt.

Viele Grüße,
Deci

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


Lesenswert?

Michael S. schrieb:
> Kann man bei den Location-Constraints auch irgendwie angeben,
> dass das Signal negativ gewertet werden soll
Nein.

> Natürlich könnte man noch einen Anpassungsblock außenrum basteln
Oder in negativer Logik denken. Wenn ein Signal z.B. AUS_n Oder AN_n 
heißt, ist es low-aktiv...

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.