Ich stehe gerade auf dem Schlauch. Ich möchte beim Wechsel des Signals S
eine Aktion ausführen. Kann ich da
1
Port(S:instd_logic);
2
signaloldsstd_logic;
3
4
P:process(CLK)
5
begin
6
ifrising_edge(CLK)then
7
olds<=S;
8
if(S!=olds)then
9
-- Aktion
10
endif;
11
endif;
12
endprocess;
sinnvoll schreiben, oder haben S und olds nach der Zuweisung immer den
gleichen Wert?
Ich dachte, daß bei Signalen die Änderung erst beim nächsten CLK wirksam
wird, habe aber auch andere Beispiele (unbekannter Qualität) gesehen.
vhtl schrieb:> Ich möchte beim Wechsel des Signals S> eine Aktion ausführen
Sicher, dass du weißt, was du meinst? Das, was du da machst ist
taktsynchron. Es passiert was bei steigender Taktflanke. Das, was
passiert, ist dann lediglich abhängig von S, aber nicht durch S
getriggert.
> sinnvoll schreiben, oder haben S und olds nach der Zuweisung immer den> gleichen Wert?
S ist ein Eingangssignal und ist davon abhängig, was da von außen
anliegt. Alles (vom Prinzip her) gut, so wie es da steht, meine ich.
> Ich dachte, daß bei Signalen die Änderung erst beim nächsten CLK wirksam> wird, habe aber auch andere Beispiele (unbekannter Qualität) gesehen.
Es kommt halt drauf an, ob du etwas im taktsynchronen Umfeld, also in
einem Prozess mit CLK in der Sensivitätsliste machst.
Wieso simulierst du dir das nicht einfach?
Ja, das ist taktsynchron gemeint. Eigentlich geht es mir um das
Gegenteil, also ob das Signal S über zwei Takte hinweg konstant
(punktuell gemessen natürlich) ist. Ich fand das Beispiel oben aber
verständlicher.
Die Zuweisung olds <= S; wirkt also nicht "auf den Rest des Prozesses".
vhtl schrieb:> Ich dachte, daß bei Signalen die Änderung erst beim nächsten CLK wirksam> wird, habe aber auch andere Beispiele (unbekannter Qualität) gesehen.
Habs mal mit einer tesbench simuliert. Das Signal ist natürlich auch
außerhalb des Prozesses da.
Code und so später, meine Freundin will jetzt Eis essen gehen :)
Servus,
ohne jetzt alles gelesen zu haben: Bei der Zuweisung
[vhdl]
olds <= S;
[vhdl]
bzw.
[vhdl]
olds <= olds(0) & S;
[vhdl]
wird der Wert von "olds" erst am Ende (!!!) des Prozesses zugewiesen.
Wenn du "olds" einen Wert zuweisen und gleich darauf verwenden willst
(in der Abfrage) müsstest du mit Variablen arbeiten.
wird der Wert von "olds" erst am Ende (!!!) des Prozesses zugewiesen.
Wenn du "olds" einen Wert zuweisen und gleich darauf verwenden willst
(in der Abfrage) müsstest du mit Variablen arbeiten.
vhtl schrieb:> Herzlichen Dank, aber die Simulation zeigt doch, daß ich NICHT recht> habe. Ich nehme an, die Änderung der Reihenfolge bewirkt nichts.
Ich verstehe nicht, was du meinst. Ich bin nach dem hier...
vhtl schrieb:> Ja, das ist taktsynchron gemeint. Eigentlich geht es mir um das> Gegenteil, also ob das Signal S über zwei Takte hinweg konstant> (punktuell gemessen natürlich) ist.
...davon ausgegangen, dass du wissen wolltest, ob S nach änderung im
Prozess seinen Wert behält, wenn der Prozess beendet ist. Und ja, das
tut es und das geht aus der Simulation hervor.
vhtl schrieb:> Wenn ich es recht bedenke, sagt die Simulation noch nichts.
Siehe. oben
vhtl schrieb:> Kannst Du bitte als Aktion ein S2 <= '1'; einführen, welches mit '0'> initialisiert wird?
Mach selbst ;-) Du wirst kaum effektiv vorankommen, wenn du nicht
simulierst. Womit arbeitest du denn derzeit? Direkt auf Hardware? Kann
doch nicht sein, dass du dein VHDL nur im Kopf laufen lässt.
Ja, mein Code funktioniert! Ich habe einfach Deine Testbench genommen,
wie man selbst eine schreibt wußte ich nicht.
Mir ging es darum, daß "olds <= S" gerade NICHT sofort aufgeführt wird.
Ich hatte die erste Simulation zunächst so interpretiert, das dem so
ist, das war aber falsch.
Danke euch also nochmals. Jetzt stimmt mein Weltbild wieder.
Nur kurz nebenbei: S und olds sind std_logic. Die können viele
verschiedene Werte haben. In deinem Beispiel würde das if auch
ausgeführt, wenn sich S von zum Beispiel X, U oder H ändert.
vhtl schrieb:> oder haben S und olds nach der Zuweisung immer den gleichen Wert?
Ein Signal behält seinen initialen Wert bis zum Ende des Prozesses (oder
bis zum nächsten wait). Am Ende des Prozesses (oder beim nächsten wait)
übernimmt das Signal den zuletzt zugewiesenen Wert. Das hier:
1
P:process(CLK)
2
begin
3
ifrising_edge(CLK)then
4
olds<=S;
5
if(S/=olds)then
6
-- Aktion
7
endif;
8
endif;
9
endprocess;
kannst du also (solange bei der "Aktion" dem olds nicht auch noch was
zugewiesen wird) ohne jegliche funktionelle Änderung auch so schreiben:
1
P:process(CLK)
2
begin
3
ifrising_edge(CLK)then
4
if(S/=olds)then
5
-- Aktion
6
endif;
7
olds<=S;
8
endif;
9
endprocess;
Dussel schrieb:> Nur kurz nebenbei: S und olds sind std_logic. Die können viele> verschiedene Werte haben. In deinem Beispiel würde das if auch> ausgeführt, wenn sich S von zum Beispiel X, U oder H ändert.
Das ist aber nur ein Simulationsproblem. In der Realität sind Signale
nur low und high. Der neunwertige std_logic reduziert sich also
"automatisch" auf '0' und '1'...
Lothar M. schrieb:> Dussel schrieb:>> Nur kurz nebenbei: S und olds sind std_logic. Die können viele>> verschiedene Werte haben. In deinem Beispiel würde das if auch>> ausgeführt, wenn sich S von zum Beispiel X, U oder H ändert.> Das ist aber nur ein Simulationsproblem. In der Realität sind Signale> nur low und high. Der neunwertige std_logic reduziert sich also> "automatisch" auf '0' und '1'...
Ja, aber nicht dass es plötzlich unerklärliche Unterschiede zwischen
Simulation und Realität gibt.
vhtl schrieb:> Das hatte ich zuerst geschrieben, aber ist man dann nicht einen> Taktzyklus hintendran mit der Detektion?
Du kannst jede Flanke erst einen Takt später detektieren. Zeichne dir
einfach mal ein Bild auf.
Und wenn das Signal ein FPGA-Pin ist, dann empfiehlt es sich sehr, erst
mal einzusynchronisieren. Sonst bastelst du wieder mal eines der
Beispiele, die zeigen, warum man einsynchronisieren muss. Such dazu
einfach mal hier im Forum nach "eintakten", "einsynchronisieren",
"seltsame Effekte", "sporadische Fehler" usw...