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
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.
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:
1 | process (clk40MHz, rst) -- Erzeugung des 2 MHz Takt |
2 | variable teiler_2Mhz : integer range 255 downto 0; |
3 | |
4 | begin
|
5 | if rst = '1' then |
6 | teiler_2Mhz := 9; |
7 | elsif clk40MHz'event and clk40MHz = '1' then |
8 | if teiler_2Mhz = 0 then |
9 | teiler_2Mhz := 9; |
10 | clk2Mhz_int <= not clk2Mhz_int; |
11 | else
|
12 | teiler_2Mhz := teiler_2Mhz - 1; |
13 | end if; |
14 | end if; |
15 | end process; |
Ich habs grad zusammengetippt. Also ohne Gewähr :-) Axel
Ups das war für 40 MHZ... sorry. Naja aber das kann man ja anpassen.
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.
Stimmt. Aber das geht nur bis 1 Mhz oder wo war noch die Grenze?
@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.
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.
1 | 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
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;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.