www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Takterzeugung durch zwei Taktflanken


Autor: Der Daimlerfahrer (daimlerfahrer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus zusammen,

ich versuche derzeit in VHDL folgendes umzusetzen:
Ich benutze zwei zueinander verschobene Takte mit gleicher Frequenz.
Nun möchte ich bei der steigenden Flanke des einen Takts, den Ausgang 
auf High setzen und mit der steigenden Flanke des zweisen Taks 
rücksetzen auf Low. Ziel dieser Anwendung ist eine PWM mit einstellbarem 
Ein- und Ausschaltzeitpunkt.

Leider bekomme ich das ganze in VHDL nicht realisiert. Der Versuch:
process (EinschaltFlanke)
begin
   if (EinschaltTakt'event and EinschaltTakt='0') then 
      Ausgang <= '1';
   end if;
end process;

process (AusschaltTakt)
begin
   if (AusschaltTakt'event and AusschaltTakt='0') then 
      Ausgang <= '0';
   end if;
end process;
Ist nicht synthetisierbar, was ich auch verstehe.
Ersetze ich jedoch die zweite Flankenerkennung durch eine Abfrage des 
Zustands (if AusschaltFlanke='1' then...) funktioniert das Ganze auch 
nicht.

Habt ihr Tipps, wie ich aus zwei Takten in oben beschriebener Weise ein 
Signal generieren kann?
Eine einfache AND Verknüpfung hatte ich schon angedacht, aber auf die 
beiden Flanken wäre bei meinen Eingangssignalen deutlich besser.

Danke und Grüße

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum benutzt die beiden signale nicht als Reset und Enable und machst 
alles in einem Prozess. damit sollte das doch dann deine funktionalität 
ergeben oder ?

Autor: Der Daimlerfahrer (daimlerfahrer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, das geht. Die Frage war jedoch, ob man nicht auf zwei 
unterschiedliche Taktflanken ein- und ausschalten kann.
Der grund hierfür ist einfach: meine Flanken sind sauber, die Signale 
schrecklich :P

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abgesehen davon, dass Dein Programm nicht synthetisierbar ist, ist Dein 
Problem wahrscheinlich, dass Du das Signal gleichzeitig aus 2 Prozessen 
veränderst.
Das wirkt in VHDL wie ein Bus-Signal, das von 2 Signalen getrieben wird.
Signale sind in VHDL eben keine Variablen, die man an einer Stelle 
setzen und an der anderen Stelle löschen kann.

Schreibe alles in einen Prozess, z.B.

process (EinschaltFlanke, AusschaltTakt)
begin
   if (EinschaltTakt'event and EinschaltTakt='0') then
      Ausgang <= '1';
   end if;
   if (AusschaltTakt'event and AusschaltTakt='0') then
      Ausgang <= '0';
   end if;
end process;

dann klappt's.
Das dies auch nicht synthetisierbar ist, ist wohl klar, oder?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habt ihr Tipps, wie ich aus zwei Takten in oben beschriebener Weise ein
> Signal generieren kann?
Wozu (um alles in der welt) brauchst du für 1 PWM gleich 2 Takte?

Also ich für meinen Teil mach PWMs immer so:
process begin
  wait until rising_edg(clk);
  pwmcnt <= pwmcnt+1;
  if(pwmcnt = zaehlergrenze) then
    pwmcnt <= 0;
    ausgang <= '0';
  end if;
  if(pwmcnt = pwmwert) then
    ausgang <= '1';
  end if;
end process;

zaehlergrenze bestimmt die PWM-Frequenz
pwmwert bestimmt den Übergang von 1 nach 0

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder alternativ, falls der FPGA-Takt zu hoch wäre (z.B. 50MHz)
mit Prescaler für die PWM-Frequenz:
process begin
  wait until rising_edg(clk);         -- z.B. 50MHz
  prescaler <= prescaler+1;  
  if (prescaler=vorteilerwert) then   -- vorteilerwert z.B. 499 für PWM-Zählerfrequenz von 100kHz (50MHz/500)
    prescaler <= 0;
    pwmcnt <= pwmcnt+1;
    if (pwmcnt = zaehlergrenze) then  -- zaehlergrenze z.B. 999 für PWM-Frequenz (Zyklus) vom 100Hz (100Khz/1000)
      pwmcnt <= 0;
      ausgang <= '0';
    end if;
    if (pwmcnt = pwmwert) then        -- auflösung 1000 Schritte 
      ausgang <= '1';
    end if;
    if (pwmwert = 0) then             -- Grenzfall
      ausgang <= '0';
    end if;
  end if;   
end process;

Autor: Der Daimlerfahrer (daimlerfahrer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller wrote:
> Wozu (um alles in der welt) brauchst du für 1 PWM gleich 2 Takte?

Ganz einfach - ich möchte den bestehenden Takt von 13,56 MHz beibehalten 
und benötige eine einstellbarkeit von 500 ps. Das lässt sich einfach 
nicht (günstig) über einen Zähler lösen. Also verschiebe ich zwei 
Signale gegeneinander und kombiniere diese wieder zu meinem 
Ausgangssignal mit geänderter Pulsbreite und einstellbarem Ein- und 
Ausschaltzeitpunkt.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ganz einfach...
> ...einstellbarkeit von 500 ps
Na gut, einfach ist anders. Da wird dir ein kombinatorisches 
Zusammenfassen nicht erspart bleiben. Was ist denn eigentlich deine 
Zielplattform? Solange braucht ja schon eine LUT im FPGA, bis das 
Ergebnis am Ausgang stabil ist.

> einstellbarkeit von 500 ps.
> Das lässt sich einfach nicht (günstig) über einen Zähler lösen.
Ja, der muss dann schon arg schnell sein. 2 GHz sind wohl nur mit einem 
ASIC drin ;-)

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf welche Art werden denn Deine Takte gegeneinander verschoben?
Mit der DCM ?

Autor: Der Daimlerfahrer (daimlerfahrer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Auf welche Art werden denn Deine Takte gegeneinander verschoben?
über digital einstellbare Delay-Lines
DCM ist sicher auch eine Möglichkeit, jedoch ist hier kein fester Wert 
direkt schaltbar (zumindest beim variablen Phaseshift nicht), sondern 
die Phase wird Schritt für Schritt geändert, bis zum gewünschten Wert.

Autor: Joko (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hilft angehängtes vhd-schnipsel als Ansatz ?

Ist die Nachbildung eines DDR-Flip-Flops in Slices...
(Wäre natürlich noch entsprechend Deines 2. Taktes umzubauen)

Hier wird die Funktion dadurch gewährleistet, daß "rising" und
"falling" edge immer "weit genug" entfernt sind - was Du bei
Deinen Takten noch sicherstellen mußt! Daher ist obige Frage
berechtigt (nur hier anders gestellt): "wird der 2. Takt
aus dem ersten erzeugt ?"

/Jochen

Autor: Der Daimlerfahrer (daimlerfahrer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Codeschnipsel Jochen! Damit funktioniert es schonmal. 
Prima.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.