Vhdl kipsufe ist nicht Stabil

Gast #3166177
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;
Moderator (Firma: Titel) Persönliche Seite #3166226
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?
Persönliche Seite #3166250
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;
#3166292
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.
Moderator (Firma: Titel) Persönliche Seite #3166306
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...
Angehängte Dateien:
Gast #3166310
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.
#3166311
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
Moderator (Firma: Titel) Persönliche Seite #3166372
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...
Angehängte Dateien:
Gast #3166376
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").
Moderator (Firma: Titel) Persönliche Seite #3166377
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...
Angehängte Dateien:
Gast #3166527
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.
Moderator (Firma: Titel) Persönliche Seite #3166540
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?
Gast #3166577
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.
Gast #3167228
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?
Gast #3167259
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"..
Gast #3167261
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.
Gast #3167264
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
Gast #3167271
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 ;-)
Gast #3167274
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 :)
Gast #3167289
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 :)
Gast #3167293
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 ;-)
Moderator (Firma: Titel) Persönliche Seite #3167381
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...
#3167585
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

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