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
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;
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.
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...
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.
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
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...
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.
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)?
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...
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").
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...
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?
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?
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?
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...
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.
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?
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.
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?
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"..
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.
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 ;-)
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 ;-)
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 :)
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 :)
Sven schrieb:> weil im Datei Pfad ein Leerzeichen warrofl 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 ;-)
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...
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
endif;
4
if(aus='0')then-- höchste Priorität
5
x<='0';
6
endif;
Ergibt exakt das selbe wie das hier
1
if-- höchste Priorität
2
(aus='0')thenx<='0';
3
elsif-- niedrigere Priorität
4
(an='0')thenx<='1';
5
endif;
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
signalerror: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
endif;
8
if(Blockiert='1')then-- noch höhere Priorität
9
error<=3;
10
endif;
11
if(Ueberlast='1')then-- höchste Priorität
12
error<=2;
13
endif;
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...
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...
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
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...