Hallo,
bei meinen Übungen mit CPLD stellte sich mir eine Frage:
Gibt es bei der Frequenzteilung Grenzen oder kann bei einem 1MHz-Takt
jede beliebige Frequenz zw. 1Hz und 1MHz an einem I/O-Ausgang erreicht
werden?
Kann sein, ich hab da generell noch ein Verständnisproblem. Ich konnte
nur bestimmte Frequenzen erreichen.
LG
Karl-Heinz
Karl-Heinz M. schrieb:> lager schrieb:>> PI Hz geht zum Beispiel nicht.>> ???
Naja, ist kein endlicher Bruch, und kann also mit den DCM/PLL-Teilern
nicht erreicht werden... ;-)
Was Du erreichen kannst, ist durch die Multiplizierer und Teiler (resp.
deren Grösse) und der maximalen PLL-Frequenz Deiner Clock-Resourcen
bestimmt.
Karl-Heinz M. schrieb:> Gibt es bei der Frequenzteilung Grenzen oder kann bei einem 1MHz-Takt> jede beliebige Frequenz zw. 1Hz und 1MHz an einem I/O-Ausgang erreicht> werden?
Nein. Spätestens bei 500kHz ist Schluss. Das sagen schon Shannon&Co in
ihrem Abtasttheorem...
> Kann sein, ich hab da generell noch ein Verständnisproblem.> Ich konnte nur bestimmte Frequenzen erreichen.
Such mal nach DDFS.
Aber du wirst auf jeden Fall bei hohen Frequenzen einen merklichen
Jitter haben. Das musst du einfach mal auf einem Blatt Papier
aufmalen....
Christian R. schrieb:> Hm, er hat ein CPLD, da gibts in der Regel weder DCM noch PLL.
Oops, ist mir voll durch die Lappen...
...in dem Fall ist das Teilverhälnis begrenzt durch die Anzahl FF's,
welche Du für einen Zähler erübrigen kannst, welcher Dir das
Clock-Enable für die "runtergeteilte" Domain generiert.
Christian R. schrieb:> Wie teilst du denn den Takt?
Siehe hier:
Beitrag "Re: USBprog CPLD Starterkit Wie bauen?"
Egal, welche Werte ich da einstellte, es kamen immer nur bestimmte
Frequenzen in Abhängigkeit meiner Einstellungen heraus. Zwischenwerte
konnte ich nicht erreichen, da waren immer Sprünge von einer zur anderen
Frequenz.
Ihr Spezis denkt da viell. aufgrund Eures Fachwissens viell. viel zu
weit bei mir? Daher mal ein konkretes Bsp. für den XC95144XL:
entity frequ is
Port ( clk : in STD_LOGIC;
f_out: out STD_LOGIC);
end frequ;
architecture Behavioral of frequ is
SIGNAL counter : integer range 0 to 1023 :=0;
signal f_out_sig : STD_LOGIC :='0';
begin
los_gehts: PROCESS (clk)
BEGIN
IF (RISING_EDGE(clk)) THEN
counter <= counter + 1;
IF (counter < 610) THEN
f_out_sig <= '0';
ELSE
f_out_sig <= '1';
END IF;
END IF;
END PROCESS los_gehts;
f_out <= f_out_sig;
end Behavioral;
Und die ucf dazu:
NET "clk" LOC = "p22" | BUFG = CLK; --1MHz
NET "f_out" LOC = "p82" | SLEW = SLOW;
Mit 1023 als max. Range erreiche ich eine Frequenz von fast 1000 Hz an
Pin 82. Ab 1024 erreiche ich eine Frequenz von ca. 500Hz. Tastverhältnis
ca. 50%. Zwischen 500Hz und 1kHz ist der Sprung, den ich noch nicht
nachvollziehen kann.
Ich glaub beim Schreiben haben sich noch Antworten gekreuzt, lese ich
gleich sofort, danke.
Peter K. schrieb:> ...in dem Fall ist das Teilverhälnis begrenzt durch die Anzahl FF's,> welche Du für einen Zähler erübrigen kannst, welcher Dir das> Clock-Enable für die "runtergeteilte" Domain generiert.
Ja, wenn ichs richtig verstehe, die Frequenz ändert sich in Potenzen der
Basis 2 bei der max. Range-Angabe. Viell. hab ich ein
VHDL-Verständnisproblem.
Karl-Heinz M. schrieb:> Ja, wenn ichs richtig verstehe, die Frequenz ändert sich in Potenzen der> Basis 2 bei der max. Range-Angabe.
Du musst Deinen Counter beim gewünschten Stand auf 0 zurücksetzen, sonst
läuft er immer bis zum Wrap-Around, d.h. bis zur nächst höheren
Zweierpotenz von Deiner Rangeangabe her gerechnet (i.e. wenn Du die
Range 0 bis 1024 setzt wird der Zähler von 2047 auf 0 wrappen).
Das ist nicht etwa ein Fehler, aber der Synthesizer muss immer ganze
FF's instanzieren, in Deinem Fall 11.
Peter K. schrieb:> Du musst Deinen Counter beim gewünschten Stand auf 0 zurücksetzen, sonst> läuft er immer bis zum Wrap-Around, d.h. bis zur nächst höheren> Zweierpotenz von Deiner Rangeangabe her gerechnet (i.e. wenn Du die> Range 0 bis 1024 setzt wird der Zähler von 2047 auf 0 wrappen).
Dank Dir Peter, das versuche ich.
Karl-Heinz M. schrieb:> http://www.lothar-miller.de/s9y/categories/31-DDFS> Klasse! Gefällt mir! Wird ausprobiert.
Ähm, für dich dürfte da aber nur der Teil (eigentlich nur die Zeile) mit
dem Akku interessant sein, den Rest mit dem Sinus bekommst du sicher
nicht in ein CPLD...
Deine DDFS beläuft sich also nur auf diese paar Zeilen:
1
signalakku:unsigned(19downto0):=(others->'0');
2
constantwunschfrequenz:unsigned(19downto0):=x"00001";-- bezogen auf 2^20 = 1048576 !
Peter K. schrieb:> Du musst Deinen Counter beim gewünschten Stand auf 0 zurücksetzen, sonst> läuft er immer bis zum Wrap-Around, d.h. bis zur nächst höheren> Zweierpotenz von Deiner Rangeangabe her gerechnet (i.e. wenn Du die> Range 0 bis 1024 setzt wird der Zähler von 2047 auf 0 wrappen).> Das ist nicht etwa ein Fehler, aber der Synthesizer muss immer ganze> FF's instanzieren, in Deinem Fall 11.
Klappt wunderbar, danke! Es war ein VHDL-Verständnisproblem: Ich
glaubte, dass die max. Range-Angabe auch nur bis zum angegebenen Wert
läuft und danach von selbst auf 0 springt. Das aber zeigt mir, dass es
eigentlich in diesem Fall egal ist, wie hoch ich diesen Wert setze, da
ich ihn ja durch z. B.:
1
IF(counter=1536)THEN
2
counter<=0;
3
ENDIF;
vorzeitig rücksetze.
Mit 1536 erhalte ich, wie erwartet, 651Hz (1000000Hz / 1536 = 651Hz).
Lothar Miller schrieb:> Ähm, für dich dürfte da aber nur der Teil (eigentlich nur die Zeile) mit> dem Akku interessant sein, den Rest mit dem Sinus bekommst du sicher> nicht in ein CPLD...
:-( Zu früh gefreut... Trotzdem danke für Deine Hilfe.
Karl-Heinz M. schrieb:> Zu früh gefreut...
Trotzdem kannst du dir das anschauen, weil bei der DDFS-Lösung kleine
"Wunschfrequenzwerte" auch niedrigere Frequenzen ergeben. Das ist
irgendwie intuitiver...
Karl-Heinz M. schrieb:>> Ähm, für dich dürfte da aber nur der Teil (eigentlich nur die Zeile) mit>> dem Akku interessant sein, den Rest mit dem Sinus bekommst du sicher>> nicht in ein CPLD...>> :-( Zu früh gefreut... Trotzdem danke für Deine Hilfe.
So wie ich das in den anderen Threads gesehen hatte, hat er einen
95XL144 bzw. 95XL288 zur Verfügung. Da passt der DDFS von Lothar ohne
Änderung rein:
Duke Scarring schrieb:> So wie ich das in den anderen Threads gesehen hatte, hat er einen> 95XL144 bzw. 95XL288 zur Verfügung. Da passt der DDFS von Lothar ohne> Änderung rein:
Danke Duke, ich probiere das dann bald mal, interessiert mich sehr, da
ich gern niederfrequente Töne (hörbare) damit erzeugen möchte. Btw ich
hab den XC9572 und den XC95144XL. Bei letzterem probiere ichs zuerst.
Karl-Heinz M. schrieb:> SIGNAL counter : integer range 0 to 1023 :=0;
und
> IF (counter < 610) THEN> Tastverhältnis ca. 50%.
war nicht korrekt. Korrekte Daten s. Screenshots.
f = 1000000Hz / 1023 = 977Hz (gerundet)
Duke Scarring schrieb:> Da passt der DDFS von Lothar ohne Änderung rein:
Cool... :-o
> Abgesehen davon, könnte man auch den Sinus-ROM noch kleiner machen.
Insbesondere, wenn man im Auge behält, dass ja nur ein Rechteck
herauskommen muss... ;-)
Lothar Miller schrieb:> Insbesondere, wenn man im Auge behält, dass ja nur ein Rechteck> herauskommen muss... ;-)
Nö, muss nicht. Ist alles nur zu meiner Übung und Ideen für Anwendungen
kommen mir dabei auch, welche ich erst einmal im Hinterkopf behalte und
später umsetze. Möglicherweise auch hier vorstelle. Sinustöne hören sich
freundlicher an, mal sehn.
http://www.lothar-miller.de/s9y/categories/31-DDFS
Davon hab ich mir das 1. Script oben kopiert. Ich bekomme einen Fehler:
[sinus01.ucf(2)]: NET "Dout" not found. Please verify that:
1. The specified design element actually exists in the original
design.
2. The specified object is spelled correctly in the constraint source
file.
Mein UCF-File:
1
NET"CLK"LOC="p22";
2
NET"Dout"LOC="p82";
Dout ist aber da ?? Er ist erst zufrieden, wenn ichs im UCF
auskommentiere. Macht dann aber wenig Sinn.
Achso, Freq_Data hab ich erst mal auskommentiert und so geändert:
danke Duke, habs bemerkt, s. o., dauerte aber heut ziemlich lang ;-) Bin
zu unkonzentriert.
Ich seh jetzt erst, dass die Daten an einen DA-Wandler gehen, hatte ich
überlesen. Ich brech hier erst mal ab.
Hat aber in den XC95144XL rein gepasst.
Lothar Miller schrieb:> den Rest mit dem Sinus bekommst du sicher> nicht in ein CPLD...
Hat aber in den XC95144XL rein gepasst, den XC9572 hab ich nicht
versucht.
Karl-Heinz M. schrieb:> Ich seh jetzt erst, dass die Daten an einen DA-Wandler gehen, hatte ich> überlesen. Ich brech hier erst mal ab.
Schau Dir mal das MSB auf Deinem Oszi an...
Karl-Heinz M. schrieb:> Hat aber in den XC95144XL rein gepasst, den XC9572 hab ich nicht> versucht.
In den 72er passt es so erstmal nicht rein.
Duke
Lothar Miller schrieb:> Karl-Heinz M. schrieb:>> Hat aber in den XC95144XL rein gepasst.> Lothar Miller schrieb:>> Cool... :-o> Immer noch...
Duke hatte es wohl probiert und festgestellt, ich habs später erst
probiert.
Duke Scarring schrieb:> Schau Dir mal das MSB auf Deinem Oszi an...
D7 schaut bei mir so aus..
Man müsste sich einen 8- oder gar 16-Kanal-Multiplexer bauen. Hatte ich
mal von Elektor nachgebaut für den damals nur 1-Strahl-Oszi von Hameg.
Duke Scarring schrieb:> dann passt es auch in den 72er:
So langsam wirds extrem... ;-)
Ich finde es stark, dass der Synthesizer die Tabelle tatsächlich so
kompakt in Produktterme umgesetzt bekommt. Man lernt nie aus.
Duke Scarring schrieb:> Schau Dir mal das MSB auf Deinem Oszi an...
Tastgrad 50%.
Wie beim Sinus, positive, negative Halbwelle. Passt. Sieht gut aus. Nun
bräuchte man einen DA-Wandler.
@ Karl-Heinz M. (Firma: www.khmweb.de) (khmweb)
>Wie beim Sinus, positive, negative Halbwelle. Passt. Sieht gut aus. Nun>bräuchte man einen DA-Wandler.
Welchen man problemlos aus ein paar Widerständen testhalber
zusammenbauen kann. Stichwort R2R DAC.
Falk Brunner schrieb:> Welchen man problemlos aus ein paar Widerständen testhalber> zusammenbauen kann. Stichwort R2R DAC.
Danke, kommt auch noch. Hab grad was andres beim Wickel.