Forum: FPGA, VHDL & Co. Frequency divider Ausgang als Clock


von Samer A. (Firma: Personal) (thedestroyer)


Lesenswert?

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
end if;
6
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!
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
-- Uncomment the following library declaration if using
5
-- arithmetic functions with Signed or Unsigned values
6
use IEEE.NUMERIC_STD.ALL;
7
8
-- Uncomment the following library declaration if instantiating
9
-- any Xilinx primitives in this code.
10
--library UNISIM;
11
--use UNISIM.VComponents.all;
12
13
entity FreqDivider is
14
   --Generic (DivFactor : Natural := 2);
15
   Generic (FactorBits : Natural := 4);
16
    Port (clk : in  STD_LOGIC;
17
       divFactor : STD_LOGIC_VECTOR(FactorBits - 1 downto 0);   
18
       outClk : out STD_LOGIC
19
   );
20
end FreqDivider;
21
22
architecture Behavioral of FreqDivider is
23
  signal counter1, counter2 : integer:= 0;
24
  signal clkState1, clkState2 : STD_LOGIC := '0';
25
begin
26
  Process(clk)
27
  begin
28
    if(clk'EVENT AND clk = '1') then
29
      counter1 <= counter1 + 1;
30
      if(counter1 = to_integer(unsigned(divFactor))-1) then
31
        clkState1 <= NOT clkState1;
32
        counter1 <= 0;
33
      end if;
34
    end if;
35
    if(clk'EVENT AND clk = '0')then
36
      counter2 <= counter2 + 1;
37
      if(counter2 = to_integer(unsigned(divFactor))-1) then
38
        clkState2 <= NOT clkState2;
39
        counter2 <= 0;
40
      end if;
41
    end if;    
42
  end process;
43
  outClk <= clkState1 XOR clkState2;
44
end Behavioral;

von Ingenieur (Gast)


Lesenswert?

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.

von Samer A. (Firma: Personal) (thedestroyer)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

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.

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


Lesenswert?

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?

von Samer A. (Firma: Personal) (thedestroyer)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

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.

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


Lesenswert?

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
 architecture Behavioral of FreqDivider is
2
   signal counter1, counter2 : integer:= 0;
3
   signal clkState1, clkState2 : STD_LOGIC := '0';
4
 begin
5
   Process(clk)
6
   begin
7
     if(clk'EVENT AND clk = '1') then  -- **** erste Abfrage *****
8
         :
9
     end if;
10
     end if;
11
     if(clk'EVENT AND clk = '0')then  -- **** zweite Abfrage *****
12
         :
13
     end if;    
14
   end process;
15
 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...

1
   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...

von Christian R. (supachris)


Lesenswert?

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.

von Samer A. (Firma: Personal) (thedestroyer)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

Das Ausgangssignal eines D-FF ist kein Takt, sondern ein normales 
Signal. Das kannst du problemlos auf einen Ausgang legen.

von Samer A. (Firma: Personal) (thedestroyer)


Lesenswert?

Danke sehr :)

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.