mikrocontroller.net

Forum: FPGA, VHDL & Co. Verschiedene Takte in einem Design


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich arbeite gerade mit dem Spartan3 Eval.-Board.
Der Takt am Clock Eingang beträgt 50MHz, intern bräuchte ich aber neben
den 50MHz noch einen 2MHz Takt.
Ist es ratsam hierfür die 50MHz über einen Zähler zu teilen? Dann
benutze ich, soweit ich das verstehe, keine interne
Taktleitung mehr und somit können Laufzeitverzögerungen (Skew Rate) an
meinen 2MHz Modulen auftreten, oder?
Wie würdet Ihr dieses Problem "sauber" lösen?

Danke schon mal für Eure Hilfe!

Gruß
Stefan

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also skew wird jedes taktnetzwerk seperat angegeben, du hast also einen
skew auf den 50MHz und einen anderen auf den 2 MHz Netzwerk. der skew
ist unabhängig von der takterzeugung, skew entsteht wenn das Taktsignal
nicht über spezielle Leitungen geführt wird. Der Taktteiler
ist also OK. Du solltest allerdings nach dem Teiler einen BUFG
einfügen.

beispiel folgt später, wenn kein anderer schneller ist.

Autor: axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur erklärung: BUFG ist eine Globale Clockleitung. In deinem Falle hast
du 8 zur verfügung. Die sind spezielle nur für Taktsignale. Wenn mich
nicht alles täusche gewährleisten die einen nahezu synkronen Takt an
allen im Design verwendeten Flipflops. Man korrigiere mich wenn ich da
falsch liege :-)
Probiers mal mit dem Teiler:
process (clk40MHz, rst)  -- Erzeugung des 2 MHz Takt
variable teiler_2Mhz   : integer range 255 downto 0;

begin
  if rst = '1' then
    teiler_2Mhz := 9;
    elsif clk40MHz'event and clk40MHz = '1' then
       if teiler_2Mhz = 0 then     
         teiler_2Mhz := 9;
           clk2Mhz_int <= not clk2Mhz_int;  
       else
          teiler_2Mhz := teiler_2Mhz - 1;
      end if;
  end if;  
end process;

Ich habs grad zusammengetippt. Also ohne Gewähr :-)


Axel

Autor: axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups das war für 40 MHZ... sorry. Naja aber das kann man ja anpassen.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst anstatt dem Teiler über Zähler auch einen der integrierten DCM
(Digital Clock Manager) benutzen, um deinen Zieltakt zu erzeugen. Dieser
synchronisiert dann die beiden Takte auch korrekt.

Autor: axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt. Aber das geht nur bis 1 Mhz oder wo war noch die Grenze?

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan

sollen die beiden Takte synchron sein ?
Falls ja, dann scheidet der Taktteiler aus, es sei denn,
Du nimmst das damit generierte Signal nur als Clock-Enable
und lässt trotzdem alles generell mit 50 MHz laufen.

Die sichere Methode für mehrere synchrone Clocks ist die
Verwendung einer DCM bzw. PLL/DLL.

Falls asynchron OK ist, dann geht auch der Taktteiler.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure bisherigen und noch kommenden Antworten!

@FPGA-User
In meinem Fall sind die 2MHz als Clock-Enable ausreichend. Würde mich
aber trotzdem noch interessieren wie ich einen 2. Takt auf eine globale
Taktleitung bekommen. So wie es aussieht geht es ja auch ohne DCM. Denn
wenn ich es richtig verstanden habe kann ich auch das durch einen
Zähler generierte 2. Taktsignal auf einen BUFG bringen.

@FPGAküchle
>> Du solltest allerdings nach dem Teiler einen BUFG einfügen.

Wäre super wenn Du mir kurz auf die Sprünge hilfst, wie ich meinen mit
Hilfe eines Zählers generierten Takt auf einen BUFG gebe.

Autor: axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
global Buf Clock2_bufg : bufg port map(i => clock2, o => clock2_int);
Dann ist das Signal clock2 dein Takt und clock2_int dein Takt auf dem
bufg.


Axel

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

was ist eigentlich mit Clock Enable gemeint?!?
Variable mit bollean-Funktion in einem Prozess für Taktteiler je nach
Bedarf steuern, und dann die jeweiligen Taktteiler mit if-Funktion
steuern?!?

In etwa so:
IF Taktteiler_enable THEN
 Takt_2 <= '1';
ELSE
 Takt_2 <= '0';
END IF;

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.