Frequency divider Ausgang als Clock

(Firma: Personal) #2394600
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;
Gast #2394774
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.
Moderator (Firma: Titel) Persönliche Seite #2394994
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?
#2395027
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.
Moderator (Firma: Titel) Persönliche Seite #2395334
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...
#2395352
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.
(Firma: Personal) #2395356
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren