Forum: FPGA, VHDL & Co. Ein Signal auf eine Clockleitung legen


von Michael (Gast)


Lesenswert?

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

von Samuel Lehner (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

Wie kann ich denn ein CLK-Enable Signal erzeugen kannst Du villeicht ein
wenig Quellcode schreiben dann kann ich mir mehr darunter vorstellen

Txh

von Samuel Lehner (Gast)


Lesenswert?

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;

von Michael (Gast)


Lesenswert?

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)

von Samuel Lehner (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von Samuel Lehner (Gast)


Lesenswert?

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

von BernhardT (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von BernhardT (Gast)


Lesenswert?

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

von BernhardT (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.