hallo Alle! ich will mir ein device mit 4 MHz steuern, aber ich habe 200 MHz CPLD Masterclock.ich hab mir überlegt ,dass ich ein frequenzteiler benutzen muss. 200*X=4<=> X=50 . 50=B110010 aber soclhe frequenzteiler ist mir schwer zu programmieren.Ein frequenzteiler mir geraden zahlen kann ich schon.die frage wie kann man solche freq_teiler programmieren(VHDL selbsverständlich)? Ich bedanke mich für jede Hilfe! mfg
Neuling, aber 50 ist doch eine gerade Zahl. Wo ist da das Problem? Helmut.
ja genau!aber ein teiler von 2,4,8,32 ist einfacher zu programmieren als ein teiler von 10,12,...50.
Eben, und auch bei ner ungeraden Zahl hättest du eben nicht ganz genau 50% duty cycle, das ist normalerweise auch nicht tragisch. Also: Synchronen Zähler (6 Bit) und ein 1-Bit Ausgaberegister. Den Zähler zur 200 MHz Clock zählen lassen, sobald er bei 25 erreicht das Ausgaberegister auf 1, sobald er 50 erreicht resetten und Ausgaberegister auf 0. Das Ausgaberegister ist nötig (du kannst nicht direkt ein Bit des Zählers verwenden) weil 50 != 2^n.
Achja, nebenbei verhindert das Ausgaberegister auch Glitches durch den Logikteil, also musst du dich nicht um Glitch-freie Logik kümmern. Das Ausgaberegister ist natürlich auch von den 200 MHz getaktet.
Und letzter Nachtrag (sorry für den Dreifachen): Wenn du den Zähler weiter bei 50 resettest, aber das Ausgaberegister nicht bei 0 und 25, sondern z.B. bei 5 und 30 schaltest, kannst du den erzeugten Takt phasenverschieben. Oder auch z.B. mit 5 und 25 einen kürzeren Duty Cycle erzeugen. Und so weiter...
Danke für die Antwort,aber ganz ehrlich zu Dir es ist mir noch net deutlich was ich machen soll?kannst Du mal bitte es noch spezifisch erlaütern. Ich bedanke mich.
Bevor ich lange um den heißen Brei rede werd ich es mal als VHDL Code hinschreiben:
1 | signal counter : integer range 0 to 49; |
2 | |
3 | process (clk_in) begin |
4 | if rising_edge (clk_in) then |
5 | |
6 | -- Erzeugung der Ausgabeclock
|
7 | if counter = 0 then |
8 | clk_out <= '0'; |
9 | elsif counter = 25 then |
10 | clk_out <= '1'; |
11 | end if; |
12 | |
13 | -- Weiterzählen
|
14 | if counter = 50 then |
15 | counter <= 0; |
16 | else
|
17 | counter <= counter + 1; |
18 | end if; |
19 | |
20 | end if; |
21 | end process; |
Kleiner Nachtrag wegen Fehler (editieren erlaubt dieses Forum anscheinend nicht...): Der Vergleich counter = 50 muss counter = 49 heißen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.