Forum: FPGA, VHDL & Co. Clock Event in VHDL?


von Bustle (Gast)


Lesenswert?

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

von Black123 (Gast)


Lesenswert?

Nur VHDL oder auch Synthese?

von Bustle (Gast)


Lesenswert?

...???... so das es das ISE von Xilinx für  einen FPGA übersetzen kann

von Bustle (Gast)


Lesenswert?

...achso, ... der Fehler tritt in der Synthese auf

von Daniel R. (daniel_r)


Lesenswert?

Das geht nur mit bestimmten DDR FFs. Die musst Du von Hand
instanziieren.
Ist es überhaupt unbedingt nötig auf beide Flanken zu reagieren?

von Dominik S. (realniki)


Lesenswert?

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).

von Daniel R. (daniel_r)


Lesenswert?

@Dominik

Nein, geht nicht, weil die FlipFlops nicht auf beide Flanken reagieren.

von Dominik S. (realniki)


Lesenswert?

Achso, wieder was gelernt...
Wozu fragt man dann über haupt clk='1' ab?

von T.M. (Gast)


Lesenswert?

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.

von Martin Kohler (Gast)


Lesenswert?

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?

von Bustle (Gast)


Lesenswert?

...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...

von Rooney B. (rooney)


Lesenswert?

CoolRunner2 CPLDs können auf beide Flanken triggern. Sofern ich mich
erinnern kann heißt diese Funktionalität CoolClock.

von Daniel R. (daniel_r)


Lesenswert?

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;

von Daniel R. (daniel_r)


Lesenswert?

Ups...Entschuldigt bitte. Das war leider das falsche Fenster. Vergesst
den Beitrag. :(

von Bustle (Gast)


Lesenswert?

...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?

von T.M. (Gast)


Lesenswert?

Ä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.

von Bustle (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.