Forum: FPGA, VHDL & Co. Takt abschalten bzw. unterbrechen mit dem Spartan II E


von Michael (Gast)


Lesenswert?

Hallo liebe FPGA-Gemeinde,

ich hätte da gern mal ein Problem...

Im Rahmen meiner Diplomarbeit muss ich mein Design an eine bereits 
existierende Prozessor-Architektur (DLX) anbauen. Nun ergibt sich daraus 
die Schwierigkeit, dass ich die DLX solange anhalten muss, bis meine 
Verarbeitung beendet ist. Sprich, ich muss sie zeitweise vom System-Takt 
trennen, da es sonst keine andere Möglichkeit gibt, sie anzuhalten.

Wenn ich das nun einfach über eine Und-Verknüfung mit einem 
Enable-Signal mache, gibt es Glitches... logisch....

Der Einsatz eines BUFGMUX bzw. BUFGCE, wie er bei den Xilinx-Primitives 
existiert, würde zwar den gewünschten Erfolg bringen, aber diese 
existieren leider nicht für den Spartan II E. Meine Versuche diesen 
Anhand der in ISE enthaltenen unisims-Bibliothek nachzuprogrammieren 
sind leider bisher an den ieee.vital-Bibliotheken gescheitert.

In den Xilinx White-Papers habe ich einen vlt. interessanten Ansatz für 
einen "gupufferten Muxer" gefunden:

buf_clk : process (CLK_IN)

  begin

    if (CLK_IN'event and CLK_IN = '1') then
      case W_CLK_DLX_EN is
        when '1' => W_CLK_DLX <= CLK_IN;
        when others => W_CLK_DLX <= '0';
      end case;
    end if;

  end process; -- buf_clk

Ich weiß, so Zeug sollte man schon wg. des Clock-Skews nicht machen, 
aber ich sehe derzeit keine andere Möglichkeit.

Das würde auch soweit funktionieren, wenn nicht sich dadurch die 
DLX-Clock auf einen Systemtakt verbreitern würde. Führt man meherer 
Taktzyklen hintereinander aus, so fehlen die Fallenden Flanken - die 
DLX-Clock entspricht genau dem Verlauf des Enable-Signales.

Hat jedmand eine Idee, wie ich das besser/anders machen kann? Wäre über 
konstruktive Antworten äußerst dankbar :)

Viele Grüße
Michael

von Morin (Gast)


Lesenswert?

An der Clock selbst rumfummeln ist seehr gewagt. Z.B. müsstest du solche 
Sachen sicherstellen wie dass die Clock genau dann abschaltet, wenn du 
das willst, und nicht z.B. einen Takt später; dass es keine Glitches 
gibt; dass die Pegel beim umschalten nicht zu kurz werden; dass durch 
das Wiedereinschalten nicht eine Flanke zu viel kommt... von der 
Verteilung des Signals auf dem Clocknetz mal ganz abgesehen.

Die richtige Antwort ist: Clock-Enable. Genau deshalb wurde es erfunden.

Wenn du das partout nicht willst, fallen mir noch zwei andere 
Möglichkeiten ein.
1. Statt den Prozessor auf Hardware-Ebene anzuhalten, könne das darauf 
laufende Programm lange genug "nichts" tun
2. Du erzeugst die Clock für den Prozessor nur direkt aus dem 
Systemtakt, sondern als Ausgabe eines Toggle-FF, welches mit dem 
Systemtakt betrieben wird. Dan nbekommt der Prozessor nur den halben 
Takt, wonach du auch entscheiden musst, ob dieser Ansatz überhaupt in 
Frage kommt. Dafür ist dieser halbe Takt auch meines Wissens "sauber" 
(ohne Glitches) und hat ein einigermaßen definiertes Phasenverhältnis 
zum Systemtakt, was das Rüberschaufeln von Daten vereinfachen sollte.

von Michael (Gast)


Lesenswert?

Hi Morin,

eben, deswegen verwende ich ja auch ein Clock-Enable-Signal. Nur ist die 
Frage, wie ich damit ohne Glitches den Takt abschalten kann - oder was 
meinst du mit "Wenn du das partout nicht willst..."

Zu 1: Wäre prinzipiell machbar, aber dennoch unschön, da (i) dadurch 
unheimlich viele Leerbefehle entstehen würden und (ii) die Verarbeitung 
unterschiedlich lang dauern kann.

Zu 2: Genau das hatte ich ja oben beschrieben. Im Prinzip kann ich den 
halben Takt verwenden. Aber was so halt nicht geht, ist mehrere 
Prozessor-Takte hintereinander auszuführen.

von Falk B. (falk)


Lesenswert?

@  Michael (Gast)

>eben, deswegen verwende ich ja auch ein Clock-Enable-Signal. Nur ist die
>Frage, wie ich damit ohne Glitches den Takt abschalten kann - oder was

Ja, wenn man weiss wie.

http://web.archive.org/web/20051118160637/www.xilinx.com/xlnx/xweb/xil_tx_display.jsp?sGlobalNavPick=&sSecondaryNavPick=&category=&iLanguageID=1&multPartNum=1&sTechX_ID=pa_six_easy

Nr. 6 ist dein gesuchter Umschalter.

MfG
Falk

von Morin (Gast)


Lesenswert?

> eben, deswegen verwende ich ja auch ein Clock-Enable-Signal. Nur ist die
> Frage, wie ich damit ohne Glitches den Takt abschalten kann - oder was
> meinst du mit "Wenn du das partout nicht willst..."

Ein sauberes Clock-Enable-Signal blockiert den Takt nicht, sondern sagt 
den Registern, sie sollen den Takt ignorieren. Die Register sind schon 
so gebaut, dass sie das können. Keine Glitches etc., der Takt läuft 
normal weiter, nur die Register nehmen keine neuen Werte auf. Das CE ist 
ein weiterer Steuereingang der Register neben CLK und Daten.

von Falk B. (falk)


Lesenswert?


von Michael (Gast)


Lesenswert?

@ Morin: Ok, sorry, ich stand vorhin auf dem Schlauch... Natürlich, dass 
wäre die sauberste Lösung den Prozessor umzuschreiben und die einzelnen 
Register dort mit einem CE-Signal zu belegen... Allerdings in Anbetracht 
der noch zur Verfügung stehenden Zeit und dass der Quellcode ja nicht 
von mir kommt... aber vlt. ist das wirklich die Notlösung und ich muss 
in den sauren Apfel beißen, kurz vor Schluss noch einen fremden Code 
über den Haufen zu werfen... Aber vielen Dank auf alle Fälle. Ich behalt 
das mal im Hinterkopf.

@ Falk: Vielen Dank für den Link. Sieht sehr vielversprechend aus. Das 
werd ich morgen gleich mal probieren :))

von Michael (Gast)


Lesenswert?

Funktioniert super :) Vielen, vielen Dank! Und das Gesamtsystem lässt 
sich synthetisiern und läuft. Falk, hast was gut bei mir!

Gruß Michael

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.