Hallo, wie frage ich auf eine fallende UND steigende Flanke ab? so funktioniert es bei mir nicht if (((rising_edge (clock)) or (falling_edge (clock)))) then und so auch nicht if (clock'event) then ... wie macht man sowas richtig? Gruß Bustle
Das geht nur mit bestimmten DDR FFs. Die musst Du von Hand instanziieren. Ist es überhaupt unbedingt nötig auf beide Flanken zu reagieren?
Eigentlich müsste if (clk'event and clk='1') then -- steigende Flanke if (clk'event and clk='0') then -- fallende Flanke funktionieren (clk in Sensitivity-Liste vorausgesetzt).
@Dominik Nein, geht nicht, weil die FlipFlops nicht auf beide Flanken reagieren.
In den FPGAs sind halt nur D-FF drin, die auf steigende Flanke reagieren. Das schliesst nicht aus, dass man auch auf fallende Flanken detektieren kann. Die Synthese schaltet dann halt Logik vor das FF, um das gewünschte Verhalten zu erreichen. Beides gleichzeitig geht aber nicht, dazu muss man entweder 2 FF nehmen oder mal in den Output Pads schauen, da sinf oft DDR-FF drin. T.M.
Ein D-FlipFlop ist ein Element, das auf EINE Flanke des Taktsignals (meist die steigende) den Zustand am Eingang speichert und an den Ausgang legt. Dieses Verhalten ist durch die Hardware bestimmt. Auch wenn in VHDL zwei Flanken als Bedingung für das Übernehmen der Daten geschrieben werden können, so kann das die HW schlicht so nicht umsetzen. Ein D-FF kann prinzipbedingt nur auf 1 Flanke reagieren. Es ist nicht alles synthetisierbar, was in VHDL definiert werden kann. So kann z.B. auch kein "wait for 23.77ns" in HW implementiert werden. Was willst du eigentlich machen?
...ich habe ein Taktsignal am Eingang auf welches ich synchronisieren will. Am Ausgang will ich Daten mit diesem Takt raus schicken. Wenn ich nun immer auf die positive Flanke triggere, dann bekomme ich die halbe Datenrate. Daher würde ich gerne auf beide Flanken reagieren um die volle Datenrate zu bekommen...
CoolRunner2 CPLDs können auf beide Flanken triggern. Sofern ich mich erinnern kann heißt diese Funktionalität CoolClock.
process (clk50_in) begin if clk50_in'event and clk50_in='1' then if (clk25 = '0') then clk25 <= '1'; else clk25 <= '0'; end if; end if; end process; Oh ja, das ist umständlich. So gehts richtig: process (clk50_in) begin if rising_edge(clk50_in) then clk25 <= not clk25; end if; end process;
Ups...Entschuldigt bitte. Das war leider das falsche Fenster. Vergesst den Beitrag. :(
...ich habe einen Eingangstakt. Mit diesem Takt möchte ich synchron Daten raus schieben und das mit derselben Taktrate. Also muss ich auch die negative Flanke irgendwie ausnutzen... wie funktioniert so was? proc_TEST : process (Takt) begin counter <= counter + 1; end process; ??? wird hier bei jeder Taktänderung der Zähler ein hochgezählt? Eigentlich schon, oder?
Ändern sich denn die Eingangsdaten bei der steigenden UND fallenden Flanke? Wenn ja, musst du im FPGA mit der doppelten Taktfrequenz arbeiten. Was du oben beschreibst, ist zwar gültiger VHDL-Code, aber nicht synthetisierbar, das heisst, es kann nicht in den FPGA abgebildet werden, weil dieser nicht die passende HW dafür hat. Dafür besitzt er zB ClockDLL, mit denen du leicht Taktverdopplungen oder Phasenverschiebungen machen kannst. Man könnte also entweder den Takt verdoppeln und dann an jeder steigenden Flanke abfragen, oder auch einen um 180 Grad verschobenen Takt erzeugen, dann müsste man aber die Verarbeitung in 2 getrennten Prozessen machen, wo der eine auf den originalen und der andere Prozess auf den verschobenen (invertierten) Takt abfragt. T.M.
danke für die Antwort... Ich hab es mir der doppelten Taktrate gelöst, wollte jedoch wissen ob es auch anders geht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.