Datum:
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
Process(fd_output) begin if(rising_edge(fd_output))then ... end if; end process; |
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!
library IEEE; use IEEE.STD_LOGIC_1164.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values use IEEE.NUMERIC_STD.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity FreqDivider is --Generic (DivFactor : Natural := 2); Generic (FactorBits : Natural := 4); Port (clk : in STD_LOGIC; divFactor : STD_LOGIC_VECTOR(FactorBits - 1 downto 0); outClk : out STD_LOGIC ); end FreqDivider; architecture Behavioral of FreqDivider is signal counter1, counter2 : integer:= 0; signal clkState1, clkState2 : STD_LOGIC := '0'; begin Process(clk) begin if(clk'EVENT AND clk = '1') then counter1 <= counter1 + 1; if(counter1 = to_integer(unsigned(divFactor))-1) then clkState1 <= NOT clkState1; counter1 <= 0; end if; end if; if(clk'EVENT AND clk = '0')then counter2 <= counter2 + 1; if(counter2 = to_integer(unsigned(divFactor))-1) then clkState2 <= NOT clkState2; counter2 <= 0; end if; end if; end process; outClk <= clkState1 XOR clkState2; end Behavioral; |
Datum:
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.
Datum:
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?
Datum:
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?
Datum:
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?
Datum:
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.
Datum:
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:
architecture Behavioral of FreqDivider is signal counter1, counter2 : integer:= 0; signal clkState1, clkState2 : STD_LOGIC := '0'; begin Process(clk) begin if(clk'EVENT AND clk = '1') then -- **** erste Abfrage ***** : end if; end if; if(clk'EVENT AND clk = '0')then -- **** zweite Abfrage ***** : end if; end process; end Behavioral; |
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...
outClk <= clkState1 XOR clkState2;
|
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...
Datum:
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.
Datum:
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?
Datum:
Das Ausgangssignal eines D-FF ist kein Takt, sondern ein normales Signal. Das kannst du problemlos auf einen Ausgang legen.
Datum:
Danke sehr :)
