-
Die
Erfindung betrifft im allgemeinen die Synchronisierung von Adreßzeigern über mehrere
Taktbereiche hinweg und insbesondere einen Zweikanal-FIFO-Speicher
(FIFO = First-In-First-Out),
der einen Lese- und einen Schreibzeiger über mehrere Taktbereiche (Domänen) synchronisiert.
-
Ein
FIFO-Speicher ist ein allgemein bekannter Speichertyp, der zahlreiche
Anwendungen in elektronischen Schaltungen und Systemen findet. Ein
FIFO-Speicher speichert Elemente in einem Stapel, wobei die ältesten
Elemente als erste entnommen werden. In vielen Anwendun gen kann
ein Prozeß dem
Stapel Elemente hinzufügen.
Dieser Prozeß wird
als Schreibprozeß bezeichnet.
Ein anderer Prozeß kann
Elemente von dem Stapel entnehmen. Dieser Prozeß wird als Leseprozeß bezeichnet.
Der Schreibprozeß muß einen
Adreßzeiger
aufrechterhalten, damit er dem Stapel Elemente hinzufügen kann. Ähnlich muß der Leseprozeß einen
Adreßzeiger
aufrechterhalten, damit er Elemente aus dem Stapel entnehmen kann.
-
In
vielen Anwendungen wird der FIFO-Speicher mit Hilfe eines Zweikanal-RAM
(DPRAM = Dual Port RAM) realisiert. Ein Kanal oder Port wird von dem
Schreibprozeß verwendet,
und der andere Kanal oder Port wird von dem Leseprozeß verwendet. Der
Schreibprozeß beginnt
mit der Speicherung eines Elements bei der niedrigsten verfügbaren Speicherstelle.
Der Schreibprozeß fügt dann
bei aufeinanderfolgenden Speicherstellen Elemente hinzu, indem ein
Schreibzeiger inkrementiert wird. Wenn der Schreibprozeß die höchste verfügbare Speicherzelle erreicht,
wird der Schreibzeiger inkrementiert, damit er zu der niedrigsten
verfügbaren
Speicherstelle zurückkehrt.
Der FIFO-Speicher arbeitet somit umlaufend.
-
Der
Leseprozeß beginnt
mit der Entnahme des Elementes bei der niedrigsten verfügbaren Speicherstelle.
Der Leseprozeß setzt
sich fort, indem er Elemente bei nachfolgenden Speicherstellen entnimmt,
wobei der Lesezeiger inkrementiert wird. Wenn der Lesezeiger bei
dem Schreibzeiger ankommt, ist der Speicher leer, und der Leseprozeß entnimmt
keine weiteren Elemente von dem FIFO-Stapel. Wenn der Schreibzeiger
bei dem Lesezeiger ankommt, ist der Speicher voll, und der Schreibprozeß beendet
das Hinzufügen
von Elementen.
-
In
vielen Anwendungen arbeiten der Schreibprozeß und der Leseprozeß in verschiedenen Taktbereichen.
Es muß daher
eine Schaltung vorgesehen werden, um den Schreibzeiger in einem
Taktbereich zu erzeugen und den Lesezeiger in dem anderen Taktbereich
zu erzeugen. Zusätzlich
muß die Schaltung
die Schreib- und Lesezeiger über
die Taktbereiche hinweg synchronisieren, damit der Schreibprozeß nur leeren
Speicherstellen ein Element hinzufügt und der Leseprozeß Elemente
aus gültigen
Speicherstellen entnimmt. Diese Synchronisierung kann erhebliche
Verzögerungen
zwischen den Lese- und Schreibprozessen einführen. Zusätzlich geht die Synchronisierung
häufig
mit komplizierten, anwendungsspezifischen Schaltungen einher, die üblicherweise
in den Standardbibliotheken der CMOS-Zellen nicht verfügbar sind.
Die Entwicklung solcher anwendungsspezifischer Schaltungen führt zu zusätzlichen Kosten
und zusätzlichem
Zeitaufwand.
-
Die
Druckschrift
US 5,555,524 offenbart
einen Zweikananl-FIFO-Speicher mit Synchronisierschaltungen und
mit Füllstandsanzeige-Schaltungen. Die
Speicheradressen liegen in Gray-Code
vor, während
die Synchronisierschaltungen mit einem einfachen D-Flip-Flop vorgesehen
sind, der das Adreßsignal
hält. In
der Füllstandsanzeige-Schaltung
verzögert
ein D-Flip-Flop
das Lese- oder Schreib-Freigabesignal, wobei die Füllstandsanzeige-Schaltung den
Füllstand
mit einer Genauigkeit von 1 angibt. Die Implementierung der Synchronisierungsschaltung bietet
nur dann korrekte synchronisierte Adreßsignale, wenn das Taktsignal
des Ziel-Taktbereichs
rechtzeitig die Synchronisierungsschaltung triggert. Weder bietet
der Zweikanal-FIFO-Speicher
Adreßsignale,
die jederzeit korrekt sind, noch exakte Angaben bezüglich des
Füllstands.
Ferner ist das Gray-Format zwingend für das Adreßsignal, wodurch gegebenenfalls
Codeumsetzer verwendet werden müssen.
-
Es
ist daher Aufgabe der Erfindung, einen FIFO-Speicher bzw. einen
Synchronisierungsmechanismus vorzusehen, der jederzeit korrekte
Adreßsignale
bzw. Füllstandssignale
vorsieht und dessen Adreßsignalformat
nicht auf ein einziges Format beschränkt ist. Diese Aufgabe wird
durch den FIFO-Speicher nach Anspruch 1, die Synchronisierschaltung
nach Anspruch 8, das Verfahren nach Anspruch 11 und durch den Signalsatz
nach Anspruch 15 erreicht.
-
Gemäß eines
Aspekts der Erfindung umfaßt ein
FIFO einen Speicher, einen Schreibkanal, einen Lesekanal und eine
erste und eine zweite Synchronisierschaltung. Der Speicher ist so
konfiguriert, daß er einen
FIFO-Stapel speichert. Der Schreibkanal ist so konfiguriert, daß er gestützt auf
einen Schreibadreßzeiger
dem FIFO-Stapel Elemente hinzufügt.
Der Schreibkanal arbeitet in einem ersten Taktbereich. Der Lesekanal
ist so konfiguriert, daß er
gestützt
auf einen Leseadreßzeiger
Elemente von dem FIFO-Stapel liest.
-
Der
Lesekanal arbeitet in einem zweiten Taktbereich, der sich vom ersten
Taktbereich unterscheidet. Die erste Synchronisierschaltung ist
mit dem Schreibkanal betrieblich gekoppelt und so konfiguriert,
daß sie
den Schreibadreßzeiger
empfängt und
den Schreibadreßzeiger
mit dem zweiten Taktbereich synchronisiert. Die zweite Synchronisierschaltung
ist mit dem Lesekanal betrieblich gekoppelt und so konfiguriert,
daß sie
den Leseadreßzeiger empfängt und
den Leseadreßzeiger
mit dem ersten Taktbereich synchronisiert.
-
Gemäß eines
weiteren Aspekts der Erfindung umfaßt eine Synchronisierschaltung,
die sich zum Koordinieren von Adreßzeigern über Taktbereiche hinweg eignet,
ein erstes und ein zweites Zeitsteuer-Flip-Flop und eine Inversionsschaltung.
Das erste Zeitsteuer-Flip-Flop ist so konfiguriert, daß es erste
Zeitsignale erzeugt. Das erste Zeitsteuer-Flip-Flop arbeitet in
einem ersten Taktbereich. Die Inversionsschaltung ist mit dem ersten
Zeitsteuer-Flip-Flop betrieblich gekoppelt und so konfiguriert, daß sie invertierte
Zeitsignale gestützt
auf die ersten Zeitsignale erzeugt. Das zweite Zeitsteuer-Flip-Flop ist
mit dem Invertierer betrieblich gekoppelt und so konfiguriert, daß es zweite
Zeitsignale gestützt
auf die invertierten Zeitsignale erzeugt. Das zweite Zeitsteuer-Flip-Flop
arbeitet in einem zweiten Taktbereich, der sich vom ersten Taktbereich
unterscheidet.
-
Die
Erfindung ist im folgenden anhand bevorzugter Ausführungsformen
mit Bezug auf die Zeichnungen näher
erläutert.
In den Figuren zeigt:
-
1 ein
Blockdiagramm einer bevorzugten Ausführungsform eines FIFO-Speichers;
-
2 ein
Flußdiagramm
eines bevorzugten Schreibprozesses, der in dem FIFO-Speicher der 1 abläuft;
-
3 ein
Flußdiagramm
eines bevorzugten Leseprozesses, der in dem FIFO-Speicher der 1 abläuft;
-
4 einen
Schaltplan einer bevorzugten Ausführungsform einer Adreßsynchronisierschaltung;
-
5 einen
Schaltplan einer anderen bevorzugten Ausführungsform einer Adreßsynchronisierschaltung;
und
-
6 ein
Zeitablaufdiagramm der Signale aus der Schaltung der 5.
-
Mit
Bezug auf 1 wird im folgenden eine bevorzugte
Ausführungsform
eine FIFO-Speichers 100 beschrieben.
Der FIFO-Speicher 100 umfaßt ein DPRAM 110.
Ein Kanal oder Port 113 wird zum Schreiben von Daten in
das DPRAM 110 verwendet, und ein Kanal oder Port 115 wird
zum Lesen von Daten aus dem DPRAM 110 verwendet. Der Kanal 113 und
der Kanal 115 umfassen jeweils einen Adreßkanal und
einen Datenkanal. Die Leitungen wr_addr 114 sind mit dem
Kanal 113 verbunden und werden zum Auswählen einer Speicherstelle in
dem DPRAM 110 verwendet. Die Leitungen wr_data 112 sind ebenfalls
mit dem Kanal 113 verbunden. Diese Leitungen werden dazu
verwendet, während
einer Schreiboperation Datensignale an die ausgewählte Adreßstelle
zu liefern. Gemeinsam werden die Leitungen wr_addr 114 und
wr_data 112 dazu verwendet, einem FIFO-Stapel in dem DPRAM 110 ein
Element hinzuzufügen.
-
Die
Leitungen rd_addr 118 sind mit dem Kanal 115 verbunden
und werden dazu verwendet, eine Speicherstelle in dem DPRAM 110 auszuwählen. Die Leitungen
rd_data 116 sind ebenfalls mit dem Kanal 115 verbunden.
Diese Leitungen werden dazu verwendet, während einer Leseoperation Datensignale von
einer ausgewählten
Adreßstelle
zu empfangen. Gemeinsam werden die Leitungen rd_addr 118 und rd_data 116 dazu
verwendet, ein Element von dem FIFO-Stapel zu entnehmen.
-
Bei
einer bevorzugten Ausführungsform sieht
das DPRAM 110 nur die Schreibfunktion für den Schreibkanal 113 und
nur die Lesefunktion für
den Lesekanal 115 vor. Eine Vielzahl im Handel erhältlicher
DPRAMs bieten jedoch sowohl die Schreib- als auch die Lesefunktion
für beide
Kanäle,
und solche DPRAMs eignen sich als Alternativen zum Realisieren der
Erfindung.
-
Der
FIFO-Speicher 100 ist so konfiguriert, daß über den
Schreibkanal 113 dem Stapel Elemente hinzugefügt werden
können
und daß über den
Lesekanal 115 dieselben Element von dem Stapel entnommen
werden können.
Elemente werden über
den Schreibkanal 113 in aufeinanderfolgenden Speicherstellen
hinzugefügt.
Das erste Element wird in die Speicherstelle „000h" geschrieben, das nächste Element wird in die Speicherstelle „001h" geschrieben usw.
Schließlich
fügt der
Schreibkanal 113 der höchsten
Speicherstelle ein Element hinzu (z.B. „FFFh" in einem 4K Speicher). Nach diesem
Schreibvorgang wird der Schreibzeiger inkrementiert, so daß er zur ersten
Speicherstelle „000h" zurückkehrt.
Der Lesezeiger arbeitet auf dieselbe Weise.
-
Um
sicherzustellen, daß ein
Schreibkanal 113 nicht versucht, ein Element in eine Speicherstelle hinzuzufügen, die
noch nicht gelesene Daten enthält (d.h.
ein Element, das noch nicht über
den Lesekanal 115 entnommen wurde), wird ein FIFO-Voll-Signal
erzeugt. Ähnlich
wird, um sicherzustellen, daß der
Lesekanal 115 nicht versucht, ein Element aus einer Speicherstelle
zu lesen, in die keine Daten geschrieben wurden (d.h. eine Speicherstelle,
in die von dem Schreibkanal 113 keine Daten geschrieben
wurden), ein FIFO-Leer-Signal erzeugt.
-
Der
Schreibkanal 113 und der Lesekanal 115 können in
verschiedenen Taktbereichen (Taktdomänen) arbeiten. Deshalb werden
der Lese- und der Schreibadreßzeiger über die
Taktbereiche hinweg synchronisiert. Die Lese- und Schreibadreßzeiger werden
dazu verwendet, FIFOvoll(fifo_full) und FIFO-leer (fifo_empty)-Signale
zu erzeugen.
-
Im
einzelnen sind die Leitungen wr_addr 114 mit einer Synchronisiereinrichtung 120 und
einer Schreiblogikschaltung 122 verbunden, und die Leitungen
rd_addr 118 sind mit einer Synchronisiereinrichtung 124 und
einer Leselogikschaltung 126 verbunden. Die Synchroni siereinrichtung 120 empfängt den
aktuellen Schreibzeiger über
die Leitungen wr_addr 114. Nach einer ausreichenden Verzögerung zum
Koordinieren der Taktbereiche liefert die Synchronisiereinrichtung 120 den
Schreibzeiger an die Leselogikschaltung 126 über die
Leitungen 128. Ähnlich
empfängt
die Synchronisiereinrichtung 124 den aktuellen Lesezeiger über die
Leitungen rd_addr 118. Nach einer ausreichenden Verzögerung zum Koordinieren
der Taktbereiche liefert die Synchronisiereinrichtung 124 den
Lesezeiger an die Schreiblogikschaltung 122 über die
Leitungen 132. Die Leselogikschaltung 126 und
die Schreiblogikschaltung 122 erzeugen das fifo_empty-Signal 130 bzw.
das fifo_full-Signal 136.
-
Eine
bevorzugte Art zum Erzeugen des fifo_empty-Signals 130 und
des fifo_full-Signals 136 besteht darin, auf der MSB-Seite
(Seite des höchstwertigen
Bits) der Signale wr_addr und rd_addr ein zusätzliches Bit hinzuzufügen und
dieses als ein Teil der Signale wr_addr bzw. rd_addr zu behandeln, wenn
diese inkrementiert werden. Wenn z.B. angenommen wird, daß wr_addr
und rd_addr 12 Bit breit sind, macht das Hinzufügen eines 13. Bits auf der MSB-Seite diese 13 Bit
breit. Während
des Zurücksetzens
werden wr_addr [12:0] und rd_addr [12:0] alle auf null zurückgesetzt.
wr_addr wird inkrementiert, bis fifo_full aktiviert (logisch wahr
gesetzt) wird; rd_addr wird inkrementiert, bis fifo-empfy aktiviert wird.
Man beachte, daß wr_addr
[12:12] (das dreizehnte Bit des Signals wr_addr) und rd_addr [12:12] (das
dreizehnte Bit des Signals rd_addr) während geradzahliger Durchgänge des
FIFO-Speichers den Wert null haben und während ungeradzahliger Durchgängen den
Wert eins haben. Aus der folgenden logischen Gleichung ergibt sich
daher das Signal fifo_full:
(wr_addr [12:12] XOR rd_addr_sync
[12:12]) UND (wr_addr [11:0] XNOR rd_addr_sync [11:0]);
fifo_empty
ergibt sich aus der logischen Gleichung:
rd_addr [12:0] XNOR
wr_addr_sync [12:0],
wobei XOR exklusiv-ODER und XNOR exklusiv-NICHT-ODER
bezeichnet.
-
Die
Schreiblogikschaltung 122 und die Leselogikschaltung 126 implementieren
diese Logikfunktionen zum Erzeugen der Signale fifo_full bzw. fifo_empty.
-
Bei
der Initialisierung werden der Lese- und der Schreibadreßzeiger
auf „000h" gesetzt. Wenn Elemente
hinzugefügt
werden, wird der Schreibzeiger inkrementiert. Demzufolge wird die
Leselogikschaltung 126 das Signal fifo_empty deaktivieren
(logisch falsch setzen). Abhängig
davon werden Elemente von dem FIFO gelesen, und der Lesezeiger wird
inkrementiert. Wenn der Lesezeiger den Schreibzeiger einholt, wird
das Signal fifo_empty aktiviert, bis dem FIFO-Stapel zusätzliche Elemente hinzugefügt worden
sind.
-
Wie
oben erwähnt,
wird der Schreibzeiger, wenn er die höchste Speicherstelle erreicht,
inkrementiert, um zur ersten Speicherstelle zurückzukehren. Wenn zusätzliche
Elemente hinzugefügt
werden, kann der Schreibadreßzeiger
schließlich
den Leseadreßzeiger
einholen. Wenn zusätzliche
Elemente hinzugefügt
würden,
würden
diese Elemente andere Elemente überschreiben,
die noch nicht von dem Stapel gelesen worden sind. Um dies zu vermeiden, wird
das Signal fifo_full aktiviert. Es darf nicht weitergeschrieben
werden, bis weitere Elemente von dem FIFO-Stapel entnommen worden
sind.
-
Wie
oben erwähnt,
ist der FIFO-Stapel in dem DPRAM 110 realisiert. Diese
Konfiguration eignet sich zur Verwendung mit einem DPRAM jeder üblichen
Größe und Breite.
-
Mit
Bezug auf 2 ist im folgenden der Prozeß zum Hinzufügen von
Elementen zu dem FIFO-Stapel mit weiteren Einzelheiten beschrieben. Im
Schritt 210 ermittelt das FIFO, ob das Signal fifo_full
aktiviert ist. Wenn ja, bleibt das FIFO beim Schritt 210.
Anderenfalls geht das FIFO zum Schritt 212 weiter. Hier
inkrementiert das FIFO den Schreibzeiger, so daß in der nächsten Speicherstelle ein Element
hinzugefügt
werden kann. Im Schritt 214 fügt das FIFO dem Stapel bei
der von dem Schreibzeiger ausgewählten
Adreßstelle
ein Element hinzu. Im Schritt 216 wird der neue Schreibzeiger über den Taktbereich
hinweg übergeben.
Dies erlaubt es dem Leseprozeß,
das nächste
Element zu entnehmen. Das FIFO geht dann zum Schritt 210 zurück.
-
Mit
Bezug auf 3 ist der Prozeß zum Entnehmen
eines Elements aus dem FIFO mit weiteren Einzelheiten beschrieben.
Im Block 310 ermittelt das FIFO, ob das Signal fifo_empty
aktiviert ist. Wenn ja, bleibt das FIFO im Block 310. Anderenfalls
geht das FIFO zum Block 312 weiter. Hier liest das FIFO
Daten aus der Speicherstelle, die durch den Lesezeiger gewählt wurde.
Im Block 314 inkrementiert das FIFO den Lesezeiger. Im
Block 316 wird ein neuer Lesezeiger über den Taktbereich hinweg übergeben.
Dies erlaubt es dem Schreibprozeß, bei der geleerten Speicherstelle
ein Element hinzuzufügen.
Das FIFO geht dann zum Block 310 zurück.
-
Mit
Bezug auf 4 ist im folgenden eine bevorzugte
Ausführungsform
einer Adreßsynchronisierschaltung 410 (oder
Adreßsynchronisiereinrichtung) beschrieben.
Die Adreßsynchronisierschaltung 410 kann
dazu verwendet werden, die Synchronisiereinrichtung 120 und
die Synchronisiereinrichtung 124 der 1 zu
realisieren. Die Adreßsynchronisierschaltung 410 ist
in zwei Taktbereiche (Taktdomänen)
aufgeteilt. Insbesondere arbeitet der Block 412 auf der
Basis eines Takts 411 (clock_src), während der Block 414 auf
der Basis eines Takts 413 (clock_dest) arbeitet. Der Takt 411 und
der Takt 413 sind zueinander asynchron und können verschiedene
Frequenzen haben. Demnach definiert der Block 412 einen
Taktbereich gestützt
auf den Takt 411, und der Block 414 definiert
einen Taktbereich gestützt
auf den Takt 413.
-
Die
Adreßsynchronisierschaltung 410 dient dazu,
den Übergang
eines Adreßzeigers 423 (addr_ptr)
von dem Taktbereich des Blocks 412 zu einem synchronisierten
Adreßzeiger 439 (addr_ptr_sync)
in dem Taktbereich des Blocks 414 zu koordinieren.
-
Die
Schaltung beginnt ihren Betrieb bei Empfang eines Signals reset_z
durch ein UND-Gatter 416. Das Signal reset_z wird dazu
verwendet, den normalen Schaltungsbetrieb zu starten. Während des
Betriebs der Synchronisierschaltung 410 muß das Signal
reset_z auf einem hohen Zustand bleiben. Das UND-Gatter 416 empfängt auch
ein Signal dest_out von dem Zeitsteuer-Flip-Flop 434. Wenn das
Signal reset_z und das Signal dest_out beide einen hohen Zustand
haben, liefert das UND-Gatter 416 ein Signal mit hohem
Pegel an das Zeitsteuer-Flip-Flop 418.
Das Zeitsteuer-Flip-Flop 418 wird von dem Takt 411 getriggert.
Bei Beginn eines neuen Taktzyklus gibt das Zeitsteuer-Flip-Flop 418 das hochpegelige
Signal von dem UND-Gatter 416 als das Signal src_sync1
weiter. Dieses Signal wird seinerseits an das Zeitsteuer-Flip-Flop 420 und
das XOR-Gatter 422 weitergegeben. Das Zeitsteuer-Flip-Flop 420 arbeitet ähnlich wie
das Zeitsteuer-Flip-Flop 418. Bei dem Beginn eines neuen
Taktzyklus gibt das Zeitsteuer-Flip-Flop 420 den Wert des Signals
src_sync1 als das Signal src_out weiter. Wenn also das Signal sr_sync1
umschaltet (Übergang),
stimmt der Wert des Signals src_out während einer Taktperiode nicht überein.
Da diese Signale beide an das XOR-Gatter 422 übergeben
werden, erzeugt dieses während
dieser Taktperiode ein Signal mit hohem Pegel.
-
Das
Ausgangssignal des XOR-Gatters 422 wird an den Steuereingang
eines Multiplexers 424 angelegt. Der Multiplexer 424 empfängt auch
den Wert des Zeigers, der von Halte-Flip-Flops 426 gehalten
wird, sowie addr_ptr 423, der den momentanen Zeigerwert
angibt. Wenn der Multiplexer 424 ein Signal mit hohem Pegel
von dem XOR-Gatter 422 empfängt, liefert er den Wert von
addr_ptr 423 an die Halte-Flip-Flops 426. Anderenfalls
liefert er den Wert des Zeigers vom Ausgang der Halte-Flip-Flops 426 an
den Eingang der Halte-Flip-Flops 426. Der Zeigerwert vom
Ausgang der Halte-Flip-Flops 426 wird über die Taktgrenze hinweg an
den Multiplexer 438 übergeben.
-
Wiederum
empfängt
das Zeitsteuer-Flip-Flop 430 das Signal src_out vom Zeitsteuer-Flip-Flop 420. Beim
Beginn eines neuen Taktzyklus innerhalb des Taktbereichs des Blocks 414 gibt
das Zeitsteuer-Flip-Flop 430 den Wert des Signals src_out
als das Signal dest_sync1 weiter. Das Signal dest_sync1 wird an
den Invertierer 432 geliefert. Das invertierte Signal dest_sync1
wird an das Zeitsteuer-Flip-Flop 434 und das XOR-Gatter 436 übergeben.
Das Zeitsteuer-Flip-Flop 434 arbeitet ähnlich wie das Zeitsteuer-Flip-Flop 430.
Beim Beginn eines neuen Taktzyklus gibt das Zeitsteuer-Flip-Flop 434 den
Wert des invertierten Signals dest_sync1 als das Signal dest_out
weiter. Wenn also das invertierte Signal dest_sync2 sich ändert (Übergang)
stimmt der Wert des Signals dest_out während einer Taktperiode nicht überein.
Da beide Signale an das XOR-Gatter 436 geliefert werden,
erzeugt dies während
dieser Taktperiode ein Signal mit hohem Pegel.
-
Das
Ausgangssignal des XOR-Gatters 436 wird an den Steuereingang
des Multiplexers 438 übergeben.
Der Multiplexer 438 empfängt auch den Wert des Zeigers,
der momentan in Abtast-Flip-Flops 440 gehalten wird, sowie
das Ausgangssignal der Halte-Flip-Flops 426. Wenn der Multiplexer 438 ein Signal
mit hohem Pegel von dem XOR-Gatter 436 empfängt, liefert
er den Zeigerwert von den Halte-Flip-Flops 426. Anderenfalls
liefert er den Zeigerwert vom Ausgang der Abtast-Flip-Flops 440 an
den Eingang der Abtast-Flip-Flops 440. Der Zeigerwert vom
Ausgang der Abtast-Flip-Flops 440 ist das Signal addr_ptr_sync.
Dieses Signal folgt somit dem Signal addr_ptr. Das Signal addr_ptr_synch
ist jedoch im Taktbereich des Blocks 414 gültig.
-
Die
Synchronisierschaltung 410 kann mit den Schaltkreiselementen
einer im Handel erhältlichen
Standard-CMOS-Zellenbibliothek realisiert werden. Alle Gatter, Flip-Flops
und Multiplexer sind allgemein erhältlich.
-
Im
normalen Betrieb übersetzt
die Adreßsynchronisierschaltung 410 das
Signal addr_ptr 423 über
die Taktbereiche hinweg in addr_ptr_sync 439. Es ist jedoch
möglich,
daß das
Zeitsteuer-Flip-Flop 418 in einen meta-stabilen Zustand
gerät.
Um eine Verfälschung
der Daten aufgrund des meta-stabilen Zustands zu vermeiden, wird
das Flip-Flop 420 Rücken
an Rücken
mit dem Flip-Flop 418 angeordnet, so daß das Flip-Flop 418 genug
Zeit hat, sich von einem meta-stabilen Zustand zu erholen, bevor
Daten in das Flip-Flop 420 eingehen. Diese Anordnung kann
auch als Doppelsynchronisierung bezeichnet werden und schafft einen
stabilen Betrieb, wenn die Signalverzögerung vom Zeitsteuer-Flip-Flop 418 zum
Halte-Flip-Flop 426 geringer als die Taktperiode des Signals
clk_src ist und wenn die Signalverzögerung vom Zeitsteuer-Flip-Flop 430 zum
Abtast-Flip-Flop 440 geringer als die Taktperiode des Signals
clk_dest ist. Die Signalverzögerung
vom Zeitsteuer-Flip-Flop 418 zum Halte-Flip-Flop 426 umfaßt:
t
(Takt des Flip-Flops 418 zu Q + t (Erholung des Flip-Flops 418 aus
meta-stabilem Zustand) + t (XOR-Gatter) + t (Multiplexer 424)
+ t (Einrichten des Flip-Flops 426) + t (Leitungsverzögerungen).
-
Die
Signalverzögerung
vom Zeitsteuer-Flip-Flop 430 zum Abtast-Flip-Flop 440 umfaßt:
t
(Takt des Flip-Flops 430 zu Q + t (Erholung des Flip-Flops 430 aus
meta-stabilem Zustand) + t (Invertierer 432) + t (XNOR-Gate 436)
+ t (Multiplexer 438) + t (Einrichten des Flip-Flops 440)
+ t (Leitungsverzögerungen).
-
Wenn
diese Bedingungen nicht erfüllt
werden können,
kann sich ein meta-stabiler Zustand ergeben, der undefinierte Übergänge verursachen kann.
Dieser potentielle meta-stabile Zustand kann vermieden werden, indem
der Adreßsynchronisierschaltung 410 zusätzliche
Zeitsteuer-Flip-Flops hinzugefügt
werden.
-
Mit
Bezug auf 5 ist eine weitere bevorzugte
Ausführungsform
einer Adreßsynchronisierschaltung 510 (oder
Adreßsynchronisiereinrichtung) beschrieben.
Die Adreßsynchronisierschaltung 510 kann
dazu verwendet werden, die Synchronisiereinrichtung 120 und
die Synchronisiereinrichtung 124 der 1 zu
realisieren. Die Adreßsynchronisierschaltung 510 arbeitet
weitgehend ähnlich
wie die Adreßsynchronisierschaltung 410 der 4.
Die Adreßsynchronisierschaltung 510 verwendet
jedoch zwei zusätzliche
Zeitsteuer-Flip-Flops. Diese Zeitsteuer-Flip-Flops reduzieren die
Wahrscheinlichkeit des oben beschriebenen metastabilen Zustands
und führen
nur eine minimale zusätzliche
Synchronisierungsverzögerung
ein.
-
Die
Adreßsynchronisierschaltung 510 wird
in zwei Taktbereiche aufgeteilt. Insbesondere arbeitet der Block 512 auf
der Basis eines Takts 511 (clock_src), während der
Block 514 auf der Basis eines Takts 513 (clock_dest)
arbeitet. Der Takt 511 und der Takt 513 sind zueinander
asynchron und können verschiedene
Frequenzen haben. Der Block 512 definiert somit einen Taktbereich
gestützt
auf den Takt 511, und der Block 514 definiert
einen Taktbereich gestützt
auf den Takt 513.
-
Die
Adreßsynchronisierschaltung 510 dient dazu,
die Überleitung
eines Adreßzeigers 523 (addr_ptr)
vom Taktbereich des Blocks 512 zu einem synchronisierten
Adreßzeiger 539 (addr_ptr_sync) im
Taktbereich des Blocks 514 zu koordinieren.
-
Die
Schaltung beginnt ihren Betrieb bei Empfang eines Signals reset_z
durch das UND-Gatter 516. Das Signal reset_z wird dazu
verwendet, den normalen Schaltkreisbetrieb zu starten. Während des Betriebs
der Synchronisierschaltung 510 muß das Signal reset_z einen
hohen Zustand behalten. Das UND-Gatter 516 empfängt auch
ein Signal dest_out von dem Zeitsteuer-Flip-Flop 534. Wenn
sowohl das Signal reset_z als auch das Signal dest_out einen hohen
Zustand haben, liefert das UND-Gatter 516 ein Signal mit
hohem Pegel an das Zeitsteuer-Flip-Flop 518.
Das Zeitsteuer-Flip-Flop 518 wird durch den Takt 511 getriggert.
Bei Beginn eines neuen Taktzyklus gibt das Zeitsteuer-Flip-Flop 518 das
Signal mit hohem Pegel von dem UND-Gatter 516 als das Signal
src_sync1 weiter. Dieses Signal wird seinerseits an das Zeitsteuer-Flip-Flop 519 übergeben.
Das Zeitsteuer-Flip-Flop 519 arbeitet ähnlich wie das Zeitsteuer-Flip-Flop 518.
Bei Beginn eines neuen Taktzyklus gibt das Zeitsteuer-Flip-Flop 519 den
Wert des Signals scr_sync1 als das Signal src_sync2 weiter. Dieses
Signal wird seinerseits an das Zeitsteuer-Flip-Flop 520 und
das XOR-Gatter 522 weitergegeben. Das Zeitsteuer-Flip-Flop 520 arbeitet ähnlich wie
das Zeitsteuer-Flip-Flop 518. Bei Beginn eines neuen Taktzyklus
gibt das Zeitsteuer-Flip-Flop 520 den Wert des Signals
src_sync2 als das Signal src_out weiter. Wenn daher das Signal src_sync2 umschaltet
(Übergang),
stimmt der Wert des Signals src_out während einer Taktperiode nicht überein.
Da beide Signale an das XOR-Gatter 522 übergeben werden, erzeugt dieses
während
dieser Taktperiode ein Signal mit hohem Pegel.
-
Das
Ausgangssignal des XOR-Gatters 522 wird an den Steuereingang
eines Multiplexers 524 übergeben.
Der Multiplexer 524 empfängt auch den Wert des Zeigers,
der von Halte-Flip-Flops 526 gehalten
wird (addr_held), sowie das Signal addr_ptr 523, das den
momentanen Zeigerwert angibt. Wenn der Multiplexer 524 ein
Signal mit hohem Pegel von dem XOR-Gatter 522 empfängt, liefert
er den Wert des Signals addr_ptr an Halte-Flip-Flops 526.
Anderenfalls liefert er den Zeigerwert vom Ausgang der Halt-Flip-Flops 526 an
den Eingang der Halte-Flip-Flops 526. Der Zeigerwert vom
Ausgang der Halte-Flip-Flops 526 wird über die Taktgrenze hinweg an
den Multiplexer 538 übergeben.
-
Wiederum
empfängt
das Zeitsteuer-Flip-Flop 530 das Signal src_out vom Zeitsteuer-Flip-Flop 520. Bei
Beginn eines neuen Taktzyklus innerhalb des Taktbereichs des Blocks 514 gibt das
Zeitsteuer-Flip-Flop 530 den Wert des Signals src_out als das
Signal dest_sync1 weiter. Dieses Signal wird seinerseits an das
Zeitsteuer-Flip-Flop 531 übergeben, das ähnlich wie
das Zeitsteuer-flip-Flop 530 arbeitet. Bei Beginn eines
neuen Taktzyklus gibt das Zeitsteuer-Flip-Flop 531 den Wert des Signals
dest_sync1 als das Signal dest_sync2 weiter. Das Signal dest_sync2 wird
an den Invertierer 532 und das XNOR-Gatter 536 übergeben.
Das invertierte Signal dest_sync2 wird an das Zeitsteuer-Flip-Flop 534 übergeben.
Das Zeitsteuer-Flip-Flop 534 arbeitet ähnlich wie das Zeitsteuer-Flip-Flop 530.
Bei Beginn eines neuen Taktzyklus gibt das Zeitsteuer-Flip-Flop 534 den
Wert des invertierten Signals dest_sync2 als das Signal dest_out
weiter. Wenn sich also das invertierte Signal dest_sync1 ändert (Übergang),
wird der Wert des Signals dest_out während einer Taktperiode auf
einem Pegel sein, der äquivalent
zu dest-sync2 ist. Da diese Signale beide an das XNOR-Gatter 536 geliefert
werden, erzeugt dies während
dieser Taktperiode ein Signal mit hohem Pegel.
-
Das
Ausgangssignal des XNOR-Gatters 536 wird an den Steuereingang
des Multiplexers 538 geliefert. Der Multiplexer 538 empfängt auch
den Zeigerwert, der momentan von den Abtast-Flip-Flops 540 gehalten wird,
sowie das Ausgangssignal der Halt-Flip-Flops 526. Wenn
der Multiplexer 538 von dem XOR-Gatter 536 ein
Signal mit hohem Pegel empfängt,
liefert er den Zeigerwert von den Halte-Flip-Flops 526.
Anderenfalls liefert er den Zeigerwert vom Ausgang der Abtast-Flip-Flops 540 an
den Eingang der Abtast-Flip-Flops 540. Der Zeigerwert vom
Ausgang der Abtast-Flip-Flops 540 ist das Signal addr_ptr_sync 539.
Dieses Signal folgt somit dem Signal addr_ptr 523. Das
Signal addr_ptr_sync 539 ist jedoch im Taktbereich des
Blocks 514 gültig.
-
Die
Synchronisierschaltung 510 kann mit Schaltkreiselementen
einer im Handel erhältlichen Standard-CMOS-Zellenbibliothek
realisiert werden. Alle Gatter, Flip-Flops und Multiplexer sind
allgemein erhältlich.
-
Mit
Bezug auf 6 wird ein Zeitablaufdiagramm
der Signale in 5 beschrieben. Das Zeitablaufdiagramm
umfaßt
das Signal clock_src (Ursprungstakt) und das Signal clock_dest (Zieltakt). Dies
sind Taktsignale, die asynchron und mit verschiedenen Frequenzen
arbeiten. Die Signale src_sync1, src_sync2, src_out, sel_src und
addr held arbeiten auf der Basis des Signals clock_src. Die Signale
dest_sync1, dest_sync2, dest_out, sel_dest und addr_prt_sync arbeiten
auf der Basis des Signals clock_dest.
-
Das
Signal reset_z beginnt bei einem niedrigen Zustand und geht dann
auf einen hohen Zustand über.
Dieser Übergang
wird zum Auslösen
des normalen Betriebs der Synchronisierschaltung verwendet. Nachdem
das Signal reset_z während
einer Taktperiode des Signals clock_src in dem hohen Zustand war,
geht das Signal src_sync1 auf einen hohen Zustand. Dann, nach einer
Taktperiode des Signals clock_src, geht das Signal src_sync2 auf
einen hohen Zustand. Da das Signal src_sync2 nicht mit dem Signal
src_out übereinstimmt,
geht das Signal sel_src auf einen hohen Zustand. Nach einer Taktperiode
des Signals clock_src bewirkt das Signal sel_src, daß addr_held
das Signal des nächsten Adreßzeigers
liest. Das erste Adreßzeigersignal
ist mit A1 bezeichnet. Nachfolgende Adreßzeigersignale sind mit A2
und A3 bezeichnet.
-
Nachdem
das Signal src_sync2 während
einer Taktperiode auf einem hohen Zustand war, geht das Signal src_out
auf einen hohen Zustand über.
Da das Signal src_out nun mit dem Signal src_sync2 übereinstimmt,
wird das Signal sel_src deaktiviert. Somit wird der Adreßzeiger
A1 von dem Signal addr_held gehalten.
-
Der Übergang
des Signals src_out wird an das Signal dest_sync1 weitergegeben.
Insbesondere macht bei der nächsten
steigenden Flanke des Signals cllock_dest das Signal dest_sync1
denselben Übergang.
Nach einer Periode des Signals clock_dest folgt das Signal dest_sync2
dem Signal dest_sync1 und geht auf einen hohen Zustand über.
-
Da
das Signal dest_sync2 mit dem Signal dest_out übereinstimmt, geht das Signal
sel_dest auf einen hohen Zustand. Nach einer Taktperiode des Signals
clock_dest bewirkt das Signal sel_dest, daß addr_prt_sync das nächste Adreßzeigersignal
liest. Das erste Adreßzeigersignal
wird als A1_sync identifiziert. Dieses Signal stimmt mit dem Signal addr_held
A1 überein,
ist jedoch im Taktbereich des Signals clock_dest gültig. Nachfolgende
Adreßzeigersignale
im Taktbereich des Signals clock_dest werden als A2_sync und A3_sync
bezeichnet. Diese Signale folgen A2 bzw. A3.
-
Eine
Taktperiode nach dem Übergang
des Signals dest_sync2 macht das Signal dest_out den entgegengesetzten Übergang.
Da das Signal dest_out nicht mehr mit dem Signal dest_sync2 übereinstimmt,
wird das Signal sel_dest deaktiviert, und das Signal addr_ptr_sync
hält den
Adreßzeiger
A1 sync.
-
Wie
durch das Zeitablaufdiagramm dargestellt, bewirken nachfolgende Übergänge der
Zeitsteuersignale, daß die
Adreßzeigersignale
A2 und A3 über
die Taktbereiche hinweg an die synchronisierten Adreßsignale
A2_sync und A3_sync übergeben
werden.
-
Die Übergänge des
Signals src_out lösen das
Lesen eines neuen Adreßzeigers
aus. Diese Übergänge werden
von dem Taktbereich clock_src an den Taktbereich clock_dest übergeben.
Gestützt auf
das Signal src_out macht das Signal dest_out einen verzögerten Übergang.
Dieser verzögerte Übergang
wird dazu verwendet, die Übertragung
eines neuen Adreßzeigers über die
Taktbereiche hinweg auszulösen.
Dieser verzögerte Übergang
wird auch über
die Taktbereiche hinweg zurückgegeben,
um einen weiteren Übergang
des Signals src_sync1 auszulösen.
Dadurch wird wiederum das Lesen eines neuen Adreßzeigers ausgelöst.
-
Anders
gesagt, die Übergänge des
Signals src_out und des Signals dest_out arbeiten wie Token. Dieser
Token wird fortlaufend von dem Ursprungstaktbereich 512 an
den Zieltaktbereich 514 und wieder zurück übergeben. Der Token wird durch
die Aktivierung des Signals reset_z (Setzen auf logisch wahr) ausgelöst und beginnt
als ein Übergang
des Signals dest_out. Der Token wird dann als Übergänge der Signale src_sync1,
src_sync2, src_out, dest_sync1 und dest_sync2 weitergegeben. Der
Token wird an dest_out durch einen Übergang in dem Signal dest_sync2
zurückgegeben.
-
Ein
Token src_out (d.h. ein Übergang
des Signals src_out) zeigt an, daß ein neuer Adreßzeiger
in die Halte-Flip-Flops geschrieben wurde. Wenn dieser Token über Taktbereiche
hinweg weitergegeben wird, löst
er die Synchronisierung des neuen Adreßzeigers aus.
-
Ähnlich zeigt
der Token dest_out an, daß der neue
Adreßzeiger über die
Taktbereiche hinweg synchronisiert wurde und in den Abtast-Flip-Flops
gehalten wird. Wenn dieser Token über die Taktbereich hinweg
zurückgegeben
wird, löst
er das Lesen eines neuen Adreßzeigers
aus. Auf diese Art werden Adreßzeiger über Taktbereich
hinweg übergeben.
-
Die
Synchronisierschaltung 510 (5) kann
weiter optimiert werden, indem weitere logische Gatter zum Steuern
des Anfangs und der Beendigung dieser Tokenübertragung eingeführt werden. Für diesen
Zweck kann z.B. ein zusätzlicher
Eingang eines UND-Gatters 516 verwendet werden.
-
Obwohl
die Ausführungsformen
der Erfindung hier in bezug auf einen FIFO-Speicher beschrieben
wurden, ist die Erfindung auf andere Schaltungen anwendbar, die
die Synchronisierung von Daten über
Taktbereiche hinweg erfordern. Obwohl die Ausführungsformen hier mit Bezug
auf bestimmte Schaltungen und Blockdiagramme beschrieben wurden,
eignen sich auch andere Konfigurationen für die Realisierung der beschriebenen
Funktionen. Der Fachmann wird aus den hier offenbarten Ausführungsformen
sicher verstehen, daß viele
Modifikationen möglich
sind, ohne die Lehre der Erfindung zu verlassen. All diese Modifikationen
sollen im Bereich der folgenden Ansprüche liegen.