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
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.
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.
> 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.
@ 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 :))