Forum: FPGA, VHDL & Co. VHDL falling edge bewirkt rising edge


von J. K. (rooot)


Angehängte Dateien:

Lesenswert?

Hi

Ich hab jetzt begonnen mich ein bisschen in VHDL einzulesen, bevors auf 
der Uni so richtig damit losgeht. Schon steh ich auf vor dem ersten 
Problem:

Mein einfaches Toggle-FlipFlop sollte auf falling-edges reagiern, tut 
aber nur was bei rising-edges.

An was kann das liegen?

MfG
Jürgen


Die beiden sources hab ich mal angehängt. Der enable-Eingang ist zwar 
vorgesehn, aber noch nicht modelliert.

von Falk B. (falk)


Lesenswert?

@  J. K. (rooot)

>Mein einfaches Toggle-FlipFlop sollte auf falling-edges reagiern, tut
>aber nur was bei rising-edges.

Wo? In der Simulation oder in Hardware?

Das FlipFlop ist schon OK, nur deine Ausgangszuweisung versaut dir die 
Simulation. Waum ist das so? Dein Prozess wird nur ausgewertet, wenn 
sich clk ändert (sensitivity list). Also wird Y<=outs nur bei der 
steigenden Flanke aktualisiert. Ist der kleine gemeine Unterschied 
zwischen variablen und Signalen. ;-)  In Hardware macht das in deinem 
Beispiel keinen Unterschied.

http://www.mikrocontroller.net/articles/VHDL#Wann_und_warum_verwendet_man_Variablen.3F

Eher so, ausserhalb des Prozesses.
1
    process(clk)
2
    begin
3
      -- compare to truth table
4
      if falling_edge(clk) then
5
        outs <= not outs;
6
      end if;
7
    end process;
8
9
    Y <=outs;


MfG
Falk

von J. K. (rooot)


Lesenswert?

Ja, in der Simulation tut es so.

Das kommt davon wenn man mal drauf los bastelt ohne wirklich ne Ahnung 
zu haben....

Danke!

von Sparxx (Gast)


Lesenswert?

Ich bin ebenfalls neu un mich verwirrt den Unterschied simulation und 
hardware synthese.

Falk Brunner schrieb:
> In Hardware macht das in deinem
> Beispiel keinen Unterschied.

wie ist das gemeint?Heißt das dass,im Hardware y würde beim falling_edge 
richtig dargestellt?

von Falk B. (falk)


Lesenswert?

@  Sparxx (Gast)

>Ich bin ebenfalls neu un mich verwirrt den Unterschied simulation und
>hardware synthese.

Der Compiler für die Hardware erkennt den Fehler, erzeugt im Idealfall 
eine Warnung und macht dennoch das Richtige draus, weil aus Sicht einer 
Hardwaresynthese es keinen Unterschied gibt. Der Simulator ist da 
"pingelig" und reagiert nur auf das, was man ihm sagt, ist auch gut so.
An sich ist die Schreibweise des OP schlechter Stil, denn in einem 
GETAKTETEM Prozess gibt es sinnvollerweise KEINERLEI Anweisungen 
ausserhalb von if rising_edge()
1
    process(clk)
2
    begin
3
      if falling_edge(clk) then
4
        -- nur hier steht irgendetwas
5
        outs <= not outs;
6
      end if;
7
      -- hier steht in Normalfall NIE etwas
8
    end process;

>> In Hardware macht das in deinem
>> Beispiel keinen Unterschied.

>wie ist das gemeint?Heißt das dass,im Hardware y würde beim falling_edge
>richtig dargestellt?

Ja.

MfG
Falk

von Sparxx (Gast)


Lesenswert?

@  Falk Brunner
 besten Dank.Jetzt ist mir vieles klar geworden.
Mit einem Oszi. hätte aus  FPGA Pins sicherlich erkannt,was im hardware 
wirklich passiert.
Gibt es so "Richtlinien",dass man sich aus einem Simultionsergebnis das 
Hardwareergebnis vorstellen kann?(wenn man kein Oszi hat)

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


Lesenswert?

Sparxx schrieb:
> Gibt es so "Richtlinien",dass man sich aus einem Simultionsergebnis das
> Hardwareergebnis vorstellen kann?(wenn man kein Oszi hat)
Wenn die Sensitivliste der beteiligten Prozesse richtig beschrieben ist, 
dann sieht das normalerweise GLEICH aus.

Einen Schritt zurück:
Das Problem hier ist eigentlich eine unvollständige Sensitivliste!

Denn in der Sensitivliste eines Prozesses müssen für eine korrekte 
Simulation alle Signale stehen, die zu einer Änderung des Ergebnisses 
führen.

Ich zerpflücke mal den ursprünglichen Prozess und zäume das Pferd von 
hinten auf:
1
    process(clk)
2
    begin
3
4
       if falling_edge(clk) then    -- mit dem Takt ändert sich was
5
          outs <= not outs;
6
        end if;
7
8
        Y <=outs;                   -- und mit einer Änderung von outs ändert sich auch was!
9
 
10
    end process;
Hier müsste die korrekte Sensitivliste also so aussehen:
1
    process(clk, outs)
2
    begin ...
Jetzt klappts auch mit der Simulation.

Achtung:
Man kann zwar solche getakteten und kombinatorischen Prozesse machen, 
aber man kann sich damit auch sehr leicht ein Ei legen. Und daher ist 
die Anmerkung von Falk richtig:
>> An sich ist die Schreibweise des OP schlechter Stil, denn in einem
>> GETAKTETEM Prozess gibt es sinnvollerweise KEINERLEI Anweisungen
>> ausserhalb von if rising_edge()
Allerdings finden sich in gut 95% aller Bücher genau solche Prozesse:
1
    process(reset, clk)
2
    begin
3
      if falling_edge(clk) then
4
        -- hier steht irgendetwas
5
      end if;
6
      if reset='1' then
7
        -- hier steht auch was
8
      end if;
9
    end process;
Was? Sieht unbekannt aus?
Dann mal die gleichwertige Schreibweise:
1
    process(reset, clk)
2
    begin
3
      if reset='1' then
4
        -- hier steht auch was
5
      elsif falling_edge(clk) then
6
        -- hier steht irgendetwas
7
      end if;
8
    end process;


BTW:
Ich verwende zur konsequenten Verhinderung von unvollständigen 
Sensitivlisten gern die Prozessschreibweise ohne Sensitivliste:
http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html
Dann passiert das oben Beschriebene garantiert nicht.

von Sparxx (Gast)


Lesenswert?

@  Lothar Miller
 Sehr gut erklärt,vielen Dank.
 Ich hätte allerdings eine letzte Frage:
bei dieser Variante im Simulator

1
process(clk)
2
    begin
3
       if falling_edge(clk) then 
4
         outs <= not outs;
5
       end if;
6
        Y <=outs;              
7
    end process;

ist das Signal  am Ausgang y um einer Taktperiode verschoben.Ist dies 
auch der Fall im realen Hardware?
Bei konkurrenten Anweisungen wären die Signale taktgenau.
Nochmals Danke.

von Sparxx (Gast)


Lesenswert?

> ist das Signal  am Ausgang y um einer Taktperiode verschoben.Ist dies
> auch der Fall im realen Hardware?

Vergessen sie die  Frage.
hab probiert mit leds und es ist auch taktverschoben.
Danke.

von Falk B. (falk)


Lesenswert?

@Sparxx (Gast)

>> ist das Signal  am Ausgang y um einer Taktperiode verschoben.Ist dies
>> auch der Fall im realen Hardware?

>Vergessen sie die  Frage.
>hab probiert mit leds und es ist auch taktverschoben.
>Danke.

Nö, das kannst du gar nicht messen, weil dir der Bezug fehlt.
Das FlipFlop schaltet mit jeder fallenden Flanke um. Wann schaltet dein 
Ausgang. Ich behaupte mal, auch mit der fallenden Flanke. Denn es ist 
UNABHÄNIG von falling_edge() und damit praktisch eine concurrent 
Zuweisung, auch wenn outs in der sensitivity list fehlt.

MfG
Falk

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


Lesenswert?

Sparxx schrieb:
> Bei konkurrenten Anweisungen wären die Signale taktgenau.
Wie meinst du diese Aussage? Was ist für dich "taktgenau"?

Sparxx schrieb:
> hab probiert mit leds und es ist auch taktverschoben.
Wie Falk glaube ich dir das auch nicht. Zeig mal deinen Code, deinen 
Messaufbau und deine Messergebnisse. Es ist vermutlich einfach so, dass 
das Signal mit jeder fallenden Flanke umschaltet...
In der Simulation sieht es aus, wie wenn es mit der steigenden Flanke 
umschalten würde...


Mein Tipp: um etwas Licht im Dunkeln zu haben sieh dir einfach mal den 
RTL-Schaltplan der Synthese an. Dort siehst du, wie der Synthesizer 
deine Beschreibung in Hardware übersetzt hat.

von Sparxx (Gast)


Angehängte Dateien:

Lesenswert?

Sorry,weiß nicht wo ich meinen Kopf hatte,als ich das oben geschrieben 
habe.
Falk Brunner schrieb:
> Wann schaltet dein
> Ausgang. Ich behaupte mal, auch mit der fallenden Flanke.

Genau.

Lothar Miller schrieb:
> Wie meinst du diese Aussage? Was ist für dich "taktgenau"?

Damit meinte ich beim Auftreten der Flanke,beide Signale  dengleichen 
Wert haben.(Siehe Simulationsergebnis).PS:Hier ist der Takt 50 MHz.
Natürlich wenn der Ausgang mit in der Flankenabfrage steht,dann 
übernimmt er seinen Wert eine Taktperiode später.Liege, hoffe ich 
,richtig!!

Lothar Miller schrieb:
> Zeig mal deinen Code,

Mein Code für den Test mit LEDs
1
 TOGGLE: process (clk_2,out_s)  --clk_2 ist ein 1 Hz Clock  
2
begin 
3
  if falling_edge(clk_2)then
4
    out_s<=not out_s;
5
--  y_1<=out_s;                 --Diese Variante meinte,taktverzögert     
6
  end if;
7
    y_1<=out_s;
8
end process;
9
 clk2 <=clk_2;
10
 y_2 <= out_s; 
11
 led(9 downto 3)<=(OTHERS=>'0');
12
 led(2)<= clk_2;
13
 led(1)<= y_2;
14
 led(0)<= y_1;

von lkmiller (Gast)


Lesenswert?

> taktverzögert...
Das Stichwort "Latency" ist hier das Richtige....

von Sparxx (Gast)


Lesenswert?

lkmiller schrieb:
> Das Stichwort "Latency" ist hier das Richtige....

ok verstanden.
Ich hätte noch eine Verständnis Frage:

Lothar Miller schrieb:
1
    process(clk,out_s)
2
    begin
3
       if falling_edge(clk) then    -- mit dem Takt ändert sich was
4
          outs <= not outs;
5
        end if;
6
7
        Y <=outs;    -- und mit einer Änderung von outs ändert sich auch was!
8
     end process;
Der Process wird bei jedem Taktflankenwechsel aktiviert,richtig?
Aber "wie oder wann" wird er bei einer Änderung von out_s aktiviert ?

von Duke Scarring (Gast)


Lesenswert?

Mach doch da mal zwei Prozesse draus, nachher schreibt das noch jemand 
falsch ab...
1
process(clk)
2
begin
3
   if falling_edge(clk) then    -- mit dem Takt ändert sich was
4
      outs <= not outs;
5
   end if;
6
end process;
7
8
process(out_s)
9
begin
10
   Y <=outs;    -- und mit einer Änderung von outs ändert sich auch was!
11
end process;

Und da kannst Du es auch gleich so schreiben:
1
process(clk)
2
begin
3
   if falling_edge(clk) then    -- mit dem Takt ändert sich was
4
      outs <= not outs;
5
   end if;
6
end process;
7
8
Y <=outs;    -- und mit einer Änderung von outs ändert sich auch was!

Duke

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


Lesenswert?

Sparxx schrieb:
> Der Process wird bei jedem Taktflankenwechsel aktiviert,richtig?
Ja, oder doch eher nein...
Du hast noch immer ein Verständnisproblem. Der Prozess wird nicht 
"aktiviert", sondern er "muss neu berechnet werden". Und zwar betrifft 
das nur den Simulator.

> Aber "wie oder wann" wird er bei einer Änderung von out_s aktiviert ?
die Sensitivliste dast:
Bei jeder Änderung von clk oder out_s muss der Prozess vom Simulator 
nochmal berechnet werden.

Die Synthese schert sich (wie schon erwähnt) einen feuchten Kehrricht um 
die Sensitivliste, bei einer falschen Liste bekommst du bestenfalls eine 
freundliche Info, dass wohl deine Simulation nicht mehr zur Hardware 
passt...

Hier nochmal ein Beispiel für eine unvollständige Sensitivliste:
Bei sowas wie diesem Prozess hier wird die Simulation einen schönen 
Zähler bauen, der mit jedem Tastendruck hochzählt, weil der Prozess vom 
Simulator ja nur bei einer Änderung neu berechnet wird:
1
   process (taster) begin
2
      if taster='1' then
3
          cnt <= cnt+1;
4
      end if;
5
   end process;
In der Hardware hast du dir aber eine kombinatorische Schleife gebaut, 
und cnt wird (theoretisch) mit Vollgas hochzählen, solange der Taster 
gedrückt ist...
(BTW: in der Praxis ist das aber nicht der schnellstmögliche Zähler, 
sondern nur ein dubioser Rauschgenerator)
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife

von Sparxx (Gast)


Angehängte Dateien:

Lesenswert?

Duke Scarring schrieb:
> Mach doch da mal zwei Prozesse draus
ok,ist viel übersichtlicher.

Ich habe leider keine Antwort auf meine Frage:
Sparxx schrieb:
> Aber "wie oder wann" wird er bei einer Änderung von out_s aktiviert ?
Sorry wenn ich euch auf die Nerven gehe.
Mir geht es nicht nur zu verstehen und anwenden zu können,sondern auch 
erklären zu können.Grob gesagt habe ich nicht kapiert :)
Deshalb habe ich eine Zeitachse gezeichnet um mein Verständnisproblem zu 
verdeutlichen(Anhang).
Annahme:
1:fallende Taktflanken  t0,t2.. usw sind und die steigenden t1,t3...usw.
2: out_s mit dem Wert A initialisiert wurde und y hat auch A

bei diesem Beispiel:
1
    process(clk,out_s)
2
    begin
3
       if falling_edge(clk) then    -- mit dem Takt ändert sich was
4
          outs <= not outs;
5
        end if;
6
        Y <=outs;  -- und mit einer Änderung von outs ändert sich auch was!
7
     end process;
bei t0-> Nach der Process neu-Berechnung, wird out_s mit
          (not A)aktualisiert ,y<=A
bei t1-> outs_s hat immer A ,da keine fallende Flanke,y mit (not A)aktu.
bei t2-> out_s wird dem Wert (not A) zugewiesen,y<=(not A).

Wäre das so richtig erklärt?
Mir interessiert vor allem wo die Process-Berechnung beim Ereignis out_s 
auftritt?

von Duke Scarring (Gast)


Lesenswert?

Sparxx schrieb:
> Deshalb habe ich eine Zeitachse gezeichnet um mein Verständnisproblem zu
> verdeutlichen(Anhang).
Geht das vielleicht auch als .png-Datei?

von Sparxx (Gast)


Angehängte Dateien:

Lesenswert?

Duke Scarring schrieb:
> Geht das vielleicht auch als .png-Datei?
Ups!!
Die richtige Datei...

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


Lesenswert?

Sparxx schrieb:
> Mir interessiert vor allem wo die Process-Berechnung beim Ereignis out_s
> auftritt?
Nun, sofort nach dem "ersten" Durchlauf des Prozesses wird festfestellt, 
dass sich out_s geändert hat. Und deshalb folgt, ohne dass die 
Simulationsuhr weiterläuft, eine Neuberechnung mit dem neuen Wert von 
out_s.

Deshalb passiert diese Invertierung von out_s (im ersten 
Prozessdurchlauf) und die "anschliessende" Datenübergabe (im zweiten 
Prozessdurchlauf) eigentlich zum selben Simulationszeitpunkt, nur eben 
im Simulator nacheinander...

von Wat (Gast)


Lesenswert?

1
process(clk)
2
begin
3
  if falling_edge(clk) then    -- mit dem Takt ändert sich was
4
      outs <= not outs;
5
  end if;
6
  -- hier darf nichts mehr stehen 
7
 end process;


Merk dir doch einfach, dass in einem Prozess, in dem ein Takt auf seine 
Flanke hin abgefragt wird (sei es falling oder rising), nach dieser 
if-Anweisung NICHTS mehr stehen darf. Dann steht in der Sens-Liste 
dieses Prozesses nur der Takt (ggf. ein asynchroner Reset).

Alle weiteren Abbildungen an Out-Ports deiner Komponente oder an andere 
Signale nimmt du einfach separat vor (entweder wie vorgeschlagen in 
einem separaten Prozess, in einer block-Anweisungen oder einfach 
concurrent). Dann gibt es keine Verständnisprobleme mehr, und der 
VHDL-Stil ist auch besser!


VG, Wat

von Sparxx (Gast)


Lesenswert?

Lothar Miller schrieb:
> Und deshalb folgt, ohne dass die
> Simulationsuhr weiterläuft

Aha,jetzt kapiere ich es,glaub ich.
Also solange Events auftreten,sagen wir es hätte noch 2 Events 
stattgefunden,
würde die Simulationsuhr stoppen,bis der Process alles neu berechnet 
hatte.und nicht für jeden Event an einer anderen Zeit stoppen.ist es so 
richtig?
War meine obige Überlegung annähernd richtig? !!

Danke an allen!

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


Lesenswert?

Sparxx schrieb:
> nicht für jeden Event an einer anderen Zeit stoppen.ist es so richtig?
Ja, jetzt passt es...

> War meine obige Überlegung annähernd richtig? !!
Ich blicke da nicht so ganz durch, und vermute, du meinst das hier zum 
Zeitpunkt t0 wegen einer fallenden Flanke am Takt:
>> bei t0-> Nach der Process neu-Berechnung

Ich würde es so beschreiben:
1. es kommt eine fallende Flanke am clk
2. dadurch wird für out_s ein neuer Wert berechnet
3. der Prozess läuft aber mit dem alten wert von out_s weiter
4. Y ändert sich nicht
5. am Ende des Prozesses wird out_s dieser neue Wert zugewiesen

6. out_s hat sich geändert, deshalb muss der Prozess neu berechnet 
werden
7. keine flanke am clk --> die if-Klammer wird nicht bearbeitet
8. es wird für Y ein neuer Wert berechnet
9. am Ende des Prozesses wird der neu berechnete Wert an Y zugewiesen

Das passiert alles zum selben Simulationszeitpunkt.

von Sparxx (Gast)


Lesenswert?

Lothar Miller schrieb:
> Ich blicke da nicht so ganz durch
war echt ein richiger Wirrwarr :)Tut mir Leid.

Lothar Miller schrieb:
> du meinst das hier zum
> Zeitpunkt t0 wegen einer fallenden Flanke am Takt:

Ja,das meinte ich.

Gruß

von J. K. (rooot)


Lesenswert?

Wie hätte man das Bsp. jetzt richtig (und sauber) gemacht? Mit einer 
Variable im process? Oder wie gezeigt mit einer erweiterten Sensitivity 
List?

Funktionieren tun natürlich mehrere Wege, aber was ist besser/warum? Im 
Netz findet man natürlich auch verschiedene Lösungwege.

mfg
Jürgen

von Christian R. (supachris)


Lesenswert?

J. K. schrieb:
> Wie hätte man das Bsp. jetzt richtig (und sauber) gemacht? Mit einer
> Variable im process? Oder wie gezeigt mit einer erweiterten Sensitivity
> List?

Wurde ja schon gesagt. Die kombinatorische Zuweisung am besten außerhalb 
des Prozesses oder notfalls in einem eigenen Prozess. Du beschreibst mit 
dem getakteten Prozess ein oder mehrere FlipFlops. Da gehört diese 
Zuweisung nicht dran.

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


Lesenswert?

J. K. schrieb:
> Wie hätte man das Bsp. jetzt richtig (und sauber) gemacht?
Das hat schon die erste Antwort von Falk aufgezeigt.
> Mit einer Variable im process?
Nur zur Fokussierung: eine Variable hat mit diesem Thema rein überhaupt 
gar nichts zu tun...  Sie hilft auch nicht!
> Oder wie gezeigt mit einer erweiterten Sensitivity List?
Das war nur, um zu zeigen, wofür die Sensitivliste da ist, und wie man 
die Simulation wieder mit der Realität in Einklang bringen kann.

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.