steigende und fallende flanken

Gast #1789724
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #1789763
Lesenswert?

> 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
Gast #1790132
Lesenswert?

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.
#3011973
Lesenswert?

will eig nur ein enable-Signal schalten.
also:
1
DE_High: process (DE_WQVGA)
2
begin
3

4
  if rising_edge (DE_WQVGA)
5
    then
6
      DE_status <= 1;
7
    end if;
8
end process DE_High;
9

10
DE_Low: process (DE_WQVGA)
11
begin
12

13
  if rising_edge (DE_WQVGA)
14
    then
15
      DE_status <= 0;
16
    end if;
17
end process DE_Low;


Problem: ISIM wills iwie nicht simulieren,verstehs nich so ganz.
Gast #3012011
Lesenswert?

> 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
Moderator (Firma: Titel) Persönliche Seite #3012022
Lesenswert?

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?
Persönliche Seite #3013110
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren