Hallo :),
ich habe einen Frequency divider Code geschrieben, und ich will den Code
als Component in einem anderen Code benutzen. Ich will den Ausgang, der
die verkleinerte Frequenz hat, im folgenden Befehl benutzen
1
Process(fd_output)
2
begin
3
if(rising_edge(fd_output))then
4
...
5
endif;
6
endprocess;
Dieses code macht immer probleme, und funktioniert nicht. Ich muss immer
den Code von meinem Frequency Divider mit dem prozess code manuell
integrieren, das macht es viel schwerer den Code zu debuggen.
Was sollte man dagegen tun? der Code meines Frequency dividers ist der
folgende. Vielen Dank!
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
4
-- Uncomment the following library declaration if using
5
-- arithmetic functions with Signed or Unsigned values
6
useIEEE.NUMERIC_STD.ALL;
7
8
-- Uncomment the following library declaration if instantiating
Ich tippe mal darauf, dass dieser famose Takt, der nichts anderes ist,
als ein Zählerausgang, nicht als CLK akzeptiert wird. Dieses Signal muss
auf einen Buffer und dann ins Taktnetz geroutet werden.
Es wurde hier aber schon desöfteren dargestellt, dass diese Bauform für
FPGAs meist eine unsinnige ist.
Danke für deine Antwort.
Also hier scheint die Frage: Wie kann man einen Frequency divider bauen
und ihn als Clock benutzen, ist das irgendwie möglich?
Sowas macht man mit Clock Enable an den Stufen, die langsamer laufen
sollen, nicht mit einem geteilten Takt. Takte teilt man ausschließlich
mit den dafür vorgesehenen Elementen im FPGA, also bei Xilinx wäre das
der DCM oder PMCD oder die CLKDIV bei den Cool Runner CPLDs.
Samer Afach schrieb:> Also hier scheint die Frage: Wie kann man einen Frequency divider bauen> und ihn als Clock benutzen, ist das irgendwie möglich?
Wenn man diese Frage stellt, dann sollte man keinen 2. Takt verwenden...
:-o
Denn dann sind einem die Seiteneffekte, die so ein 2. Takt mit sich
bringt, nicht bewusst.
Ich meine, dir im Beitrag "Re: State machine für SPI"
schon mal meine Postulate mitgeteilt zu haben. Und jetzt meine Frage:
hast du eine fundierte Begründung für den 2. Takt? Wofür ist der da?
Danke für deine Antwort :)
Ja! ich habe ein 50 MHz Clock (60/40 duty cycle). Und das DAC (LTC2624),
das ich verwenden will, braucht mindestens eine Zeit von 9 ns für jedes
High und Low state. Also ich muss die Taktfrequenz verringern durch
einen Frequency divider.
macht das sinn? Was könnte ich dafür tun?
Samer Afach schrieb:> macht das sinn?
Nein.
> Was könnte ich dafür tun?
1. Anderen Oszillator nehmen, der 50/50 oder wenigstens 55/45 hat, dann
hast du 2x 10ns.
oder
2. Mit DCM auf dem FPGA den Takt herunterteilen bzw. nur das duty-cycle
korrigieren und per ODDR Register ausgeben. Ist aber die sehr viel
schlechtere Variante, weil du dann Jitter reinbekommst. Einen ADC oder
DAC speist man immer direkt aus dem jitterarmen Quarzoszillator.
Samer Afach schrieb:> Und das DAC (LTC2624), das ich verwenden will, braucht mindestens> eine Zeit von 9 ns für jedes High und Low state. Also ich muss die> Taktfrequenz verringern durch einen Frequency divider.
Das ist kein Takt, sondern ein stinknormales Ausgangssignal und darf
durchaus auch als solches behaldelt werden.
Christian R. schrieb:> Einen ADC oder> DAC speist man immer direkt aus dem jitterarmen Quarzoszillator.
Das ist hier unnötig, weil es sich nur um den Übertragungstakt der
SPI-Schnitte handelt...
Samer Afach schrieb:
1
architectureBehavioralofFreqDivideris
2
signalcounter1,counter2:integer:=0;
3
signalclkState1,clkState2:STD_LOGIC:='0';
4
begin
5
Process(clk)
6
begin
7
if(clk'EVENTANDclk='1')then-- **** erste Abfrage *****
8
:
9
endif;
10
endif;
11
if(clk'EVENTANDclk='0')then-- **** zweite Abfrage *****
12
:
13
endif;
14
endprocess;
15
endBehavioral;
Das ist ja mal eine kuriose und unerwartete Schreibweise... :-o
Ich erwarte in 1 Prozess genau 1 Taktabfrage. Sicher nicht 2 und ganz
sicher nicht solche, die auf verschiedene Flanken reagieren...
1
outClk<=clkState1XORclkState2;
Aua, ein Takt aus einer kombinatorische Verknüpfung. Das kann gern mal
Glitches geben!
Du solltst einen Takt für (externe) Komponenten nicht aus Kombinatorik
ohne nachgeschaltetes FF erzeugen. Damit kannst du lustige Sachen
erleben (im speziellen Fall hier könntest du sogar noch Glück haben)...
Besser wäre hier allemal die Verwendung des angesprochenen DDR-Flipflops
in der IO-Zelle.
Samer Afach schrieb:> macht das sinn?
Nein. Schick deinen Tak in eine DCM und mach einen sauberen 50/50 Takt
draus. Oder gleich 100MHz, oder, oder...
Stimmt. Hatte das Datenblatt erst mal nicht angeguckt. Na dann einfach
die 50MHz in den DCM, dahinter hast du 50/50 und dann einfach einen SPI
Master machen und fertig. Taktausgabe, wie Lothar schon schwieb über
ODDR. Lässt sich ja auch prima uber S/R abschalten und über D0/D1 in der
Polarität festlegen.
Vielen Dank für eure Antworten.
Ich habe 2 Taktabfragen gemacht weil ich es ermöglichen will, die
Originale Frequenz zu bekommen, wen divFactor null ist. Mit D-Flip Flops
kann man höchstens nur die Hälfte von Maximal Frequenz bekommen.
Naja, anscheinend ist die Idee von einem Frequency divier voll sinnlos.
Ich muss lernen wie man ein DCM benutzt.
Aber ist sowieso es OK einen D-Flip Flop Ausgang als Clk zu benutzen?
oder auch sinnlos? wenn ja wie schreibt man sowas mit VHDL?