www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Samer Afach (Firma: Personal) (thedestroyer)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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
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;

Autor: Ingenieur (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Samer Afach (Firma: Personal) (thedestroyer)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Samer Afach (Firma: Personal) (thedestroyer)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
 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...

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Samer Afach (Firma: Personal) (thedestroyer)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das Ausgangssignal eines D-FF ist kein Takt, sondern ein normales 
Signal. Das kannst du problemlos auf einen Ausgang legen.

Autor: Samer Afach (Firma: Personal) (thedestroyer)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Danke sehr :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net