Forum: FPGA, VHDL & Co. clock Generierung aus PWM Signal


von Alex (Gast)


Lesenswert?

Hallo,

ich versuche gerade aus einem Signal das pulseweitenmoduliert ist, aber 
zu konstanten Zeitpunkten (alle 10 ms) eine steigende Flanke hat, eine 
dazu synchrone clock zu generieren.
Die clock soll 100Hz betragen, absolut synchron zum Eingangssignal sein 
(das Signal jittert etwas, ca. 1,8µs) und auch einen duty cycle von 50% 
(5ms) haben.

Intuitiv und ohne großen Aufwand lässt sich zumindest eine 50Hz-clock 
generieren:
1
process
2
begin
3
    
4
 wait until rising_edge(pwm_signal);
5
  clk_50Hz <= not clk_50Hz;
6
  
7
  -- some other stuff
8
  
9
end process;

Hier eine Simulation die zeigt was ich erreichen möchte:

http://i.imgur.com/x6wgfPP.png

in der Simulation so erstellt:
1
process
2
begin
3
    
4
 wait until rising_edge(pwm_signal);
5
  clk_50Hz <= not clk_50Hz;
6
  not_clk_50Hz <= (not clk_50Hz) after 5 ms;
7
  
8
  -- some other stuff
9
  
10
end process;
11
12
clk_100Hz <= clk_50Hz XOR not_clk_50Hz;

Ein Konstrukt der Form:
1
process
2
begin
3
4
 wait until rising_edge(clk_1kHz);
5
  temp <= pwm_signal;
6
  if (pwm_signal = '1' and temp = '0') then
7
   -- high
8
  else
9
   -- delay dann low
10
  end if;
11
12
end process;

führt zu Fehlern: Ich erkenne die steigenden Flanken des pwm Signals 
nicht immer. Wohl weil es sich um zwei unabhängig freischwingende 
Systeme handelt (inkl. jittern) und ich nicht sicherstellen kann, das 
meine interne clock immer Zeitpunkte bereitstellt an denen das pwm high 
oder low ist, sondern ggf. dazwischen.
Außerdem werde ich so wohl kaum hundertprozentige Synchronität 
erreichen, oder?

Der "Ansatz" (Frequenz verdoppeln) der Simulation erscheint mir relativ 
unelegant, und außerdem ist mir nicht klar wie ich hier den delay 
vernünftig integrieren soll, sodass er sich synthetisieren lässt.

Hat jemand einen alternativen Vorschlag, oder eine Idee wie sich die 
anderen Ansätze anpassen/korrigieren lassen?

Vielen Dank im Vorraus!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> Intuitiv und ohne großen Aufwand lässt sich zumindest eine 50Hz-clock
> generieren: ...
Alex schrieb:
> wait until rising_edge(clk_1kHz);
Du bist sehr wahrscheinlich ganz arg auf dem Holzweg.

> ich versuche gerade aus einem Signal das pulseweitenmoduliert ist, aber
> zu konstanten Zeitpunkten (alle 10 ms) eine steigende Flanke hat, eine
> dazu synchrone clock zu generieren.
Worauf soll das implementiert werden?

von Alex (Gast)


Lesenswert?

Lothar Miller schrieb:
> Alex schrieb:
>> Intuitiv und ohne großen Aufwand lässt sich zumindest eine 50Hz-clock
>> generieren: ...
> Alex schrieb:
>> wait until rising_edge(clk_1kHz);
> Du bist sehr wahrscheinlich ganz arg auf dem Holzweg.

Diese beiden Blöcke sind unabhängig voneinander zu betrachten. Der Bezug 
auf die steigende Flanke einer (z.b.) 1kHz clock soll einen Versuch der 
Signalabtastung darstellen. Die 50Hz clock ist eigentlich gar nicht 
benötigt.


Lothar Miller schrieb:
> Worauf soll das implementiert werden?

Verzeihung, das habe ich ganz vergessen. Auf einem Spartan 3AN 
(xc3s700an).
Also hilft mir der DCM von Xilinx auch nicht weiter um die 50Hz ggf zu 
verdoppeln (zu langsame Frequenzen, laut docs).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> Also hilft mir der DCM von Xilinx auch nicht weiter um die 50Hz ggf zu
> verdoppeln (zu langsame Frequenzen, laut docs).
Hast du einen richtigen Takt auf dem System (so im Bereich 
50...100MHz)? Falls ja: das ist (d)ein richtiger Takt! Alles andere sind 
nur profane Signale, die mit diesem Takt verarbeitet werden. Wenn du 
willst kannst du sie irgendwie "clock" nennen, aber das ist 
irreführend...

WAS soll denn mit diesem gewonnenen "100Hz-Takt" gemacht werden?

Alex schrieb:
> ich versuche gerade aus einem Signal das pulseweitenmoduliert ist, aber
> zu konstanten Zeitpunkten (alle 10 ms) eine steigende Flanke hat, eine
> dazu synchrone clock zu generieren.
> Die clock soll 100Hz betragen
"Die clock" (ich würde, weil es ein hübsches deutsches Wort dafür gibt 
eher "der Takt" sagen) kann nur das betragen, was aus dem PWM-Signal 
erzeugt wird. Und eigentlich musst/willst du (so wie ich das sehe) nur 
die steigende Flanke des PWM-Signals erkennen und irgendwie darauf 
reagieren...

> absolut synchron zum Eingangssignal sein (das Signal jittert etwas,
> ca. 1,8µs) und auch einen duty cycle von 50% (5ms) haben.
Definiere "absolut" in Zahlen. Wenn das Eingangssignal schon jittert, 
was ist ann "absolut" genau?

Ein Tipp: such hier im VHDL-Forum mal nach "Postulate".

: Bearbeitet durch Moderator
von Alex (Gast)


Lesenswert?

Lothar Miller schrieb:
> Alex schrieb:
>> Also hilft mir der DCM von Xilinx auch nicht weiter um die 50Hz ggf zu
>> verdoppeln (zu langsame Frequenzen, laut docs).
> Hast du einen richtigen Takt auf dem System (so im Bereich
> 50...100MHz)? Falls ja: das dist dein Takt! Alles andere sind nur
> profane Signale, die mit diesem Takt verarbeitet werden. Wenn du willst
> kannst du sie irgendwie "clock" nennen, aber das ist irreführend...

Nativ sind 50MHz vorhanden.


> WAS soll denn mit diesem gewonnenen "100Hz-Takt" gemacht werden?

Ich benötige einen, zu dem PWM Signal synchronen 100 Hz "Takt" ;), um 
ein anderes, Bi-Phase codiertes, Signal zu verarbeiten.

> Alex schrieb:
>> ich versuche gerade aus einem Signal das pulseweitenmoduliert ist, aber
>> zu konstanten Zeitpunkten (alle 10 ms) eine steigende Flanke hat, eine
>> dazu synchrone clock zu generieren.
>> Die clock soll 100Hz betragen
> "Die clock" (ich würde, weil es ein hübsches deutsches Wort dafür gibt
> eher "der Takt" sagen) kann nur das betragen, was aus dem PWM-Signal
> erzeugt wird. Und eigentlich musst/willst du (so wie ich das sehe) nur
> die steigende Flanke des PWM-Signals erkennen und irgendwie darauf
> reagieren...

s.O. Ich werde diesen "Takt" an anderer Stelle benötigen.

>> absolut synchron zum Eingangssignal sein (das Signal jittert etwas,
>> ca. 1,8µs) und auch einen duty cycle von 50% (5ms) haben.
> Definiere "absolut" in Zahlen. Wenn das Eingangssignal schon jittert,
> was ist ann "absolut" genau?

Wenn das Signal jittert, und mein "Takt" dann genauso jittert, bin ich 
weiterhin damit synchron, oder sehe ich das falsch? Aber eine Abweichung 
im µs wäre (entgegen meiner Aussage) noch akzeptabel.



Aber bitte nochmal zurück meiner eigentlich Frage:
Ich habe ein PWM-Signal, das zu absolut konstanten Zeipunkten von 10 ms 
eine steigende Flanke liefert und möchte daraus einen "100Hz-Takt" 
generieren (also innerhalb der 10 ms einen Taktzyklus durchlaufen), wie 
stelle Ich das geschickt an?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> Wenn das Signal jittert, und mein "Takt" dann genauso jittert, bin ich
> weiterhin damit synchron, oder sehe ich das falsch? Aber eine Abweichung
> im µs wäre (entgegen meiner Aussage) noch akzeptabel.
Mit 50MHz Überabtastung hast du einen Jitter von 20ns. Also weit im 
grünen Bereich.

> Ich habe ein PWM-Signal, das zu absolut konstanten Zeipunkten von 10 ms
> eine steigende Flanke liefert und möchte daraus einen "100Hz-Takt"
> generieren (also innerhalb der 10 ms einen Taktzyklus durchlaufen), wie
> stelle Ich das geschickt an?
So:
1
  signal  inpSR : std_logic_vector(2 downto 0) := "000";
2
3
  ...
4
5
  -- steigende Flanke erkennen und merken
6
  process begin
7
     wait until rising_edge(clk50M);  -- Der einzige Takt im Design!!!
8
     inpSR <= inpSR(1 downto 0) & PWM_Signal; -- PWM-Signal in Schieberegister eintakten
9
     
10
     if inpSR(2 downto 1) = "01" then -- steigende Flanke des PWM-Signals
11
         Flag100Hz <= '1';
12
     else
13
         Flag100Hz <= '0';
14
     end if;
15
  end process;
16
17
  ...
18
19
  -- steigende Flanke auswerten
20
  process begin
21
     wait until rising_edge(clk50M); -- Der einzige Takt im Design!!!
22
     if Flag100Hz = '1' then         -- Merker: steigende Flanke des PWM-Signals
23
         -- mach was damit
24
     end if;
25
  end process;
26
  
27
  ...
Zum Eintakten das da:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

> Ich benötige einen, zu dem PWM Signal synchronen 100 Hz "Takt" ;), um
> ein anderes, Bi-Phase codiertes, Signal zu verarbeiten.
Auch diese Verarbeitung wird mit den 50MHz gemacht. Siehe z.B. den RC-5 
Empfänger da:
http://www.lothar-miller.de/s9y/categories/50-RC-5

: Bearbeitet durch Moderator
von Alex (Gast)


Lesenswert?

Danke für die ausführliche Antwort! Aufgrund dieses Tipps:

Lothar Miller schrieb:
> Ein Tipp: such hier im VHDL-Forum mal nach "Postulate".

lese ich bereits:

Lothar Miller schrieb:
> Zum Eintakten das da:
> http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

Danke für diese ausführliche Ausarbeitung!

von Alex (Gast)


Lesenswert?

Okay, nochmal vielen Dank an dieser Stelle. Ich habe das jetzt alles mal 
durchgearbeitet und auch erreicht was ich wollte.
Ich muss zugeben, dass Ich mir (wie anscheinend viele andere) keinerlei 
Gedanken über das Einsynchronisieren des externen Signals gemacht habe.

Ich würde mich dennoch kurz über die Postulate unterhalten:

Lothar Miller schrieb:
> Ich habe ein paar Postulate, die das Leben einfacher machen:Ein Design
> (insbesondere ein Anfängerdesign) hat genau 1 Takt,
> der immer auf dieselbe Flanke aktiv ist.
> Es gibt keinen (und schon gar keinen asynchronen) Reset.
> Externe Signale werden über 2 Flipflops einsynchronisiert.
> Jede Abweichung von diesen Regeln muß fundiert begründet werden können.

Was wäre eine "fundierte Begründung" bei der Abweichung von genau 1 Takt 
(ggf. auch in Nicht-Anfängerdesigns ;))?

Und warum sollte man keinen "Takt" nutzen (den ich beispielsweise aus 
DEM Takt mit einem Divider gewonnen habe)?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> Was wäre eine "fundierte Begründung" bei der Abweichung von genau 1 Takt
> (ggf. auch in Nicht-Anfängerdesigns ;))?
Wenn du wirklich 2 Taktdomänen hast: z.B. eine PCI Taktdomäne und eine 
die einen schnellen ADC bedient und dazu eine Kamera, die ihren Takt 
mitbringt. Das sind dann aber auch richtige Takte mit hohen Frequenzen, 
wo man keine Überabtastung mehr machen kann. Alles, was sich im 
unteren MHz-Bereich abspielt, gehört nicht dazu...

Und dann muss man sich innerhalb des FPGAs Mechanismen zur 
Einsynchronisierung über die Taktdomänen hinweg ausdenken (z.B. mit 
einem FIFO oder per Handshake).

Alex schrieb:
> Und warum sollte man keinen "Takt" nutzen (den ich beispielsweise aus
> DEM Takt mit einem Divider gewonnen habe)?
Mit was für einem "Divider"? So einem Ding, das du in VHDL kurz mal 
hinkritzelst? Das ist kein Taktteiler für ein FPGA. Für sowas haben 
FPGAs Taktmanager (DCM, DLL, PLL...). Mit Takten, die von solchen 
Komponenten abgeleitet werden, kann die Toolchain umgehen und Laufzeiten 
korrigieren.

: Bearbeitet durch Moderator
von Alex (Gast)


Lesenswert?

Danke!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bitte. Viel Erfolg mit VHDL weiterhin...

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.