Guten Tag,
ich hab ein kleines Problemchen hinsichtlich steigender und fallender
Taktflanken.
man kann ja für prozesse den Takt clk in die sensitivity-Liste legen und
am anfang des Prozesses clk'event and clk='1' bzw gleich
rising_endge(clk) schreiben. Analog verhält sich das für fallende
Flanken -> falling_edge.
Aber wie kann man denn Synthetisierbaren VHDL-Code schreiben, bei dem im
Prozess sowohl steigende und fallende Flanken erzeugt.
ich kann natürlich nicht schreiben:
1
process(clk)
2
begin
3
rising_edge(clk) or falling_edge(clk)
4
...
Was unweigerlich ur Fehlermeldung führt:
"Cant implement register for two clock edges combined with binary
operator"
...
nun ich hab auch probiert mit was zu basteln, aber folgender code wird
auch auf die gleiche fehermeldung reduziert:
1
-- Prozess für Impulswandlung von sw0 zu start
2
flankendetektor:process(clk)
3
begin
4
if(clk'event and clk='0') then
5
fflanke <= '1';
6
sflanke <= '0';
7
end if;
8
9
if(clk'event and clk='1') then
10
sflanke <= '1';
11
fflanke <= '0';
12
end if;
13
end process flankendetektor;
14
15
sw0_impdet:process(fflanke,sflanke)
16
begin
17
if((fflanke'event and fflanke='1') or (sflanke'event and sflanke='1')) then
Bitte sagt mir nicht, das quartus und andere Synthesetools, es nicht
hinbekommen, FF´s zu erzeugen, welche mal auf beide taktflanken
reagieren.
MFG
Ich kenne nur die Dual-Flanken-FF im CoolRunner II, und die muss man
meines Wissens auch instanziieren. Ansonsten gibts weder in FPGAs noch
in CPLDs FF, die auf beide Flanken reagieren können. Von den
DDR-IO-FlipFlops mal abgesehen. Aber das sind ja auch 2 IO_FF dann.
> Bitte sagt mir nicht, das quartus und andere Synthesetools, es nicht> hinbekommen, FF´s zu erzeugen, welche mal auf beide taktflanken> reagieren.
Gegenfrage: Hast du schon mal so ein Bauteil gesehen?
> -- Prozess für Impulswandlung von sw0 zu start
Du willst also offenbar laut Kommentar die Flanke(n) eines Tasters in
ein Start-Signal ummünzen? Das geht grundlegend anders: du tastet mit
einem schnellen Systemtakt (Zitat: es kann nur Einen geben) das Signal
in eine Registerkette und frägst dann ab, ob die letzten beiden Register
ungleich sind. Das ist dann eine Flanke. Ich mache das so:
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung
Lothar hat völlig recht. Das Eingangssignal sollte mit the one and only
Systemtakt abgetastet werden, vielleicht noch eine Entprellung
vorgesehen werden, und aus der Diffezenz der letzten beiden Stufen
erzeugt man ein Enable-Signal für die eigentliche Schaltung, die dann
ebenfalls mit dem einzigen Systemtakt läuft. Das ist der richtige Weg,
so machen das die Profis. Für alle anderen Entwickler gibt es nur noch
einen Ausweg. Wie hieß es doch gleich im ersten Post? "Bitte sagt mir
nicht, das quartus und andere Synthesetools, es nicht hinbekommen, FF´s
zu erzeugen, welche mal auf beide taktflanken reagieren." Ein FF kann
das nicht, aber zwei. Eines mit der steigenden Flanke takten, das andere
mit der fallenden. Es ist nur fraglich, wie du die beiden Flipflops
wieder löscht und die Ausgänge verknüpfst. Also lass lieber die Finger
davon.
Hi zu dem Thema stigende und fallende Flanke hab ich da auch noch mal ne
Frage:
ist es nicht aber auch möglich 2 Prozesse zu erstellen, in dem einen auf
die steigende, dem anderen auf die fallende Flanke des selben Signals zu
reagieren?
MfG
Ramon F. schrieb:> ist es nicht aber auch möglich 2 Prozesse zu erstellen, in dem einen auf> die steigende, dem anderen auf die fallende Flanke des selben Signals zu> reagieren?
Doch, klar. Aber es ist keine gute Idee. Was willst du damit erreichen?
> DE_High: process (DE_WQVGA)> begin>> if rising_edge (DE_WQVGA)> then> DE_status <= 1;> end if;> end process DE_High;>> DE_Low: process (DE_WQVGA)> begin>> if rising_edge (DE_WQVGA)> then> DE_status <= 0;> end if;> end process DE_Low;
Erstens reagieren beide Prozesse auf die steigende Taktflanke und
zweitens sollen beide Prozesse das selbe Signal treiben. Das
funktioniert nicht - während der eine das Signal auf 1 setzt, setzt der
zweite das Signal auf 0. Du könntest in einem Prozess die steigende und
fallende Flanke erkennen und davon abhängig das Statusbit setzen.
Gruß, Achim
Ramon F. schrieb:> Problem: ISIM wills iwie nicht simulieren,verstehs nich so ganz.
Zweimal eine steigende Flanke. Einmal wird 0 zugewiesen und einmal 1...
:-o
Aber auch nach der "Korrektur" auf falling_edge() wird das so nicht
gehen, denn es gibt in einem FPGA kein Flipflop, das einen
Dual-Edge-Clock Eingang hat.
Da fehlt aber sicher noch was, denn diese Beschreibung könnte ich
eigentliche so abkürzen:
DE_WQVGA <= DE_status;
> rising_edge (DE_WQVGA)
Wieviele Takte hast du in deinem Design?
Bei einem DDR-Flipflop liegt der Dateneingang gleichzeitig an einem
positiv getriggerten FF und an einem negativ getriggerten FF. Die
Ausgänge der FFs gelangen auf einen Multiplexer, dessen Selekt-
Eingang der Takt ist. Es wird jenes FF, welches gerade seinen
Ausgang aktualisiert hat, am Multiplexer durchgestelt. Problem,
wenn man so etwas selber bastelt, dürfte sein: Glitche.