Hi Ich bins mal wieder :-))) Ich habe folgendes Problem: Ich habe ein Modul erstellt, welches den CLK von 36MHz auf 9MHz herunterteilt. Diese 9MHz sind mein Systemtackt, der in vielen anderen Modulen verwendet wird. Die 36Mhz benutze ich zur Berechnung. Da nach der Runterteilung des Clocks das 9MHz-Signal nicht mehr auf einer globalen CLK-Leitung liegt, entstehen interne Laufzeiten. Wie kann ich dieses umgehen? (Ich benutze eine Xilinx VirtexE 300 mit 300.000 Systemgates und 4 externen Clocks und meheren Bänken) 1. Habe es schon mit Globalen CLK Buffern probiert. Diese liegen jedoch direkt an den CLK-Eingängen. --> 9MHz-Signal muss erst dort hingeroutet werden benötigt auch wieder viel Laufzeit (bringt also nicht wirklich was oder mache ich was falsch) 2. Habe gelesen das es noch DLL's gibt (Delay Look Loop) weiß aber nicht wie ich diese anwenden soll und wie Sie funktionieren und was es bringt 3. Es gibt auch noch Long-Lines. Kann ich mein Signal denn auf die Long-Lines legen und vor allem wie? Sind die Long-Lines die Globalen Clockleitungen? Das Problem mit den Laufzeiten entsteht ja nicht nur beim CLK, auch beim Asyncronen RESET oder bei meinem TRIGGER-Signal --> sind alles Signal die von vielen Modulen verwendet werden und somit entsteht große Laufzeiten. Vielleicht hat ja jemand einen Rat für mich. (würde mich sehr darüber freuen) Viele Grüsse an alle die das lesen Michael
Hallo Wenn es die Module zulassen 36Mhz getacktet zu werden, lasse den Clk unverändert. Du kannst dann für deine Register ein Clk-Enable Signal erzeugen, das mit 9 Mhz läuft. Gruss sam
Wie kann ich denn ein CLK-Enable Signal erzeugen kannst Du villeicht ein wenig Quellcode schreiben dann kann ich mir mehr darunter vorstellen Txh
So könnte sowas aussehen. Der Clk ist immer der derselble, nur wird der Zähler nur jeden vierten Tackt freigegeben. signal Enable : std_logic; signal EnDiv : std_logic_vector(1 downto 0); signal Cntr : std_logic_vector(8 downto 0); -- Erzeugt das Enable Signal Clk/4; p1 : process(Clk) begin Enable <= '0'; if rising_edge(Clk) then EnDiv <= EnDiv - 1; end if; if EndDiv = "00" then Enable <= '1'; end if; end process p1; -- Der Counter wird mit voller Geschwindigkeit getacktet, zählt aber -- nur jedes vierte mal. p2 : process(Clk) begin if rising_edge(Clk) then if Enable = '1' then Cntr <= Cntr + 1; end if; end if; end process p2;
Das ist ja umständlich. Du teilst ja auch nur den CLK herunter. Das
Problem ist nur das das Signal dann nicht mehr auf einer "globalen
Clockleitung liegt. Da andere Module mit diesem CLK syncronisiert
werden sollen ist das nicht gut.
library IEEE;
use IEEE.std_logic_1164.all;
entity Generate_Clocks is port
(
36MHZ_CLK : in std_logic;
CLR : in std_logic;
9MHZ_CLK : out std_logic
);
end Generate_Clocks;
architecture structure of Generate_Clocks is
signal S_9MHZ_CLK: std_logic;
begin
CREATE_9MHZ_CLK: process (CLR,36_MHZ_CLK,S_9MHZ_CLK)
variable counter : integer range 0 to 2;
begin
if (CLR = '1') then
counter := 0;
S_9MHZ_CLK <= '0';
elsif (36MHZ_CLK ' event and 36MHZ_CLK = '1') then
counter := counter + 1;
if(counter = 2) then
S_9MHZ_CLK <= NOT S_9MHZ_CLK;
counter := 0;
end if;
end if;
9MHZ_CLK <= S_9MHZ_CLK;
end process CREATE_9MHZ_CLK;
>>>> So habe ich es gemacht <<<<< (Ich finde das ist ne schöne Lösung)
Das stimmt so nicht ganz. Bei deinem Beispiel teilst du den Clk, das has zur Folge, dass er nicht mehr auf der globalen Clkleitung liegt. Das wirkt sich schon bei einigen ns negativ auf die Internen Tco und Tsu Zeiten aus. Mit dem Clk-Enable gibt es erst Probleme, wenn er um eine Priode - (Tco + Tsu) = ca. 100ns verzögert beim Register eintrifft. Wenn die Verzögerung zu gross werden sollte, kannst du CLk-Enable immer noch synchronisieren.
Ah jetzt habe ich mir noch mal alles genau angesehn. Du hast recht. Jedoch habe ich ca. 15 Module. Dann müste ich in jedem Modul einen Prozess erstellen, der erst mal ein CE-Signal erzeugt. Das ist sehr umständlich, aber eine Lösung die funktionieren würde. Jedoch besteht noch das Problem das der Process der das CE-Signal für jedes Modul erzeugt beim Routen zu weit entfernt plaziert wird, deshalb muss man die Prozesse in einem Modul zu einer Gruppe zusammenfassen, jedoch weiss ich nicht wie das geht. Eine einfachere Lösung wäre, wenn ich mit einem Modul den CLK herunterteile und dann gleich auf eine Clockleitung gehen kann. Das muss doch auch funktionieren, schließlich bekommen die einzelnen CLB's auch das CLK-Signal. Deshalb muss es Knotenpunkte geben, wo man den Clock abgreifen kann, dann wird es auch sicher Punkte geben, an denen ich einen Clock auf die Leitung geben kann. Wo hast Du denn so viel über FPGA's gelernt (an der FH?) Viele Grüße Michael
Es ist auch möglich das CE-Signal einem Modul zu erzeugen und falls nötig in Zeitkritischen Pfaden neu zu synchronisieren. Hat aber den Nachteil, dass alle anderen Signale, die von diesen Signal abhängig sind, zeitlich angepasst werden müssten. Zudem geht eventuell dein Fitter immer noch davon aus, dass du mit 32Mhz arbeitest und berechnet das Timing für diesen Takt. Dieses Problem lässt sich über Multicycles (falls es dein Fitter unterstützt) umgehen, ist aber sehr umständlich. Was ich damit sagen will, das mit dem CE-Signal ist für deine Arbeit vermutlich nicht die beste Lösung, da du mit 15 Modulen sicher schon einen Haufen Code hast und sich die Änderungen kaum lohnen. Wenn du den Takt über einen Counter teilst und es bei diesen Xilinx Dingern schaffst ihn auf die Globale Clkleitung zu bringen, währe das eine Lösung für dein Problem, wenn auch nicht die beste. Jedes FlipFlop (z.B das von deinem Counter) hat eine Tco Zeit und erzeug zudem Jitter. Wenn du nun solch ein Signal als Takt nimmst, hast du eine zeitliche Verschiebung zum 32Mhz Tankt und eben Jitter. Das kann zu Problemen führen, wenn die Signale vom 32Mhz Tack auf den 9Mhz Tankt und umgekehrt wechseln, und vieles mehr. Die Beste Lösung ist sicher ein PLL oder eine DLL, da kann ich dir aber nicht weiterhelfen weil ich nicht mit Xilinx arbeite. Nein an der FH war ich nie. Habe aber das Glück in einer Firma zu arbeiten bei der ich zeit zum lernen habe. Gruss sam
Ich lese mich gerade erst ein (VHDL Spartan3 Xilinx Ding;) aber schau doch mal in der Xilinx IDE unter Lenguage Tamplates (Ikon Glühbirne) - VHDL - Global Clock buffer - BUFG und BUFMUX werden wohl als Global Clock imputs verwendet. Zum runterteilen würde ich eher unter DCM (Digital Clock Manager) schaun. CLKDV (Beispiel für die Virtex II Familie) ist ein Teiler BUFG Instantiation for CLKDV ist auch dabei. Ich habe aber wie gesagt keine eigene Erfahrung und weis auch nicht ob das auf dein FPGA Übertragbar ist. Gruß Bernhard
Wo hast Du denn genau gelesen? Kannst Du mir den Lonk senden? Ich habe gelesen das es nicht nur globale Netze sondern auch lokale Netze gibt. Auf die globalen Netze kommt man nur mit einem "BUFG" aber die sind genau an den Eingangpins für die Clockquarze. Was hat es denn mit denn DLL auf sich. Wann kann ich sie verwenden und wozu diehnen sie? Was sind denn PLL's
Link habe ich nicht- hab es auf CD. Such mal bei Xilinx nach xapp462.pdf die ist zwar für Spartan-3 aber wenn ich mich nicht täusche haben die Spartan-3 Ihren DCM/DLL Block von den ViretexII geerbt. So oder so einige Info steht in der Xilinx IDE (ich hab 6.2 installiert 5.irgendwas soll das aber auch haben) wie oben beschrieben als Templates. Pll = Phase locked loop ist eine Geschichte für sich (z.B. für Frequenzsynthesiser in Kombination eines VCO also einem analoges spannungsgesteuertem Oszilator) please Google. DLL Delay locked loop wird bei der FPGA nur für Frequenzvervielfachung verwendet. Da beide für dein Problem keine Rolle spielen kann, spare ich mir die Zeit, mein Halbwissen an dich weiterzugeben. Du solltest die Xilinx Seiten unbeding nach DCM durchsuchen dieser Funktionsblock kann wohl eben nicht nur ne DLL, sondern auch einfache Teilerfunktionen wie du sie brauchst. Das mit dem BUFG habe ich aus dem Datenblatt für die Spartan-3 Wörtlich: a Global clock input is placed in a design using either a BUFGMUX element or the BUFG (Global Clock Buffer) element. Gilt wie gesagt für Spartan - 3 BUFG gibt es wohl auch bei (zumindest einigen) Virtex. Durchsuch doch mal dein Datenblatt nach BUF Gruß Bernhard P.S. Doch noch ein Link http://toolbox.xilinx.com/docsan/xilinx6/books/data/docs/sim/sim0034_7.html
Sorry ich muss mich korrigieren. Das mit der DLL war Mist. die DLL wird wohl besonders benutzt um Phasenverschobene clk Signale zu erzeugen. Damit ist es natürlich möglich die Internen Laufzeiten auszugleichen. Wenn du z.B. ein 1 MHz clk um 180 grad verschiebst leuft z.B. eine steigende Flanke halt 1/2 µSek. dem Original nach (wenn ich mich nicht verrechnet habe - ist spät). Bsp. siehe templates und xapp462.pdf Gruß
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.