Ringoszillator
In diesem Abschnitt wollen wir uns näher mit den Subcell-Konzept von Spice beschäftigen. Dazu verwenden wir das einfache Beispiel des Ringoszillators. Der Ringoszillator wird gerne verwendet, um die Schaltgeschwindigkeit des verwendeten Prozesses zu bestimmen. Ein Ringoszillator besteht aus einer ungeraden Anzahl von Invertern (sind mit Minimumkriterien realisiert), die als Ring zusammengschlossen sind. Die ungerade Anzahl von Schaltgliedern ergibt sich wegen folgenden Grund: jeder Inverter hat eine Verzögerung, die sich über die Anzahl der Inverter fortpflanzt. Ist das Signal am Ende des der Inverterkette angekommen, so hat es eine Zeit t gebraucht. Durch die ungerade Anzahl von Invertern wird der Inputwert jedesmal am Ende negiert. Der letzte Inverter stellt jedoch den Input des ersten Inverters da, dessen Information ja negiert wurde. Die Information wird wieder über alle Inverter geschickt und am Ende kommt es wieder zu einer Inversion des Eingangsergebnisses. Der Ring oszilliert wegen der ungeraden Anzahl an Gliedern
Wie erstellt man nun solch eine Struktur mit minimalen Aufwand? Spice bietet die Möglichkeit, Schaltkreise als sogenannte Subcells zu definieren. Subcells kann man sich als Funktionen vorstellen, die mit angegebenen Variablen mit der äußeren Welt kommunizieren können. Alles was sich innerhalb der Subcell befindet sind lokale Variablen. Diese lokalität der Variablen ermöglicht es, daß man den Subcircuit beliebig oft wieder aufrufen kann. Bei einer periodischen Struktur wie die des Ringoszillators bietet sich deshalb diese Vorghensweise an.
Zunächst muß man das Bauteil definieren, daß man als später als Subcicuit habe möchte. In unseren Fall ist dies wieder der Inverter (1.2mm, Minimumkriterium):
| M1 OUT IN 1 1 pmos W=3.6u L=1.2u |
| M2 OUT IN 0 0 nmos W=1.8u L=1.2u |
Die Definition des Subcircuits lautet:
| .SUBCKT INVERTER IN OUT |
| VDD 1 0 DC 5V |
| M1 OUT IN 1 1 pmos W=3.6u L=1.2u |
| M2 OUT IN 0 0 nmos W=1.8u L=1.2u |
| .ENDS INVERTER |
Das .SUBCKT und .ENDS bilden den Kopf und Fuß einer Subcell. Das .SUBCKT-Kommando hat folgende Struktur:
.SUBCKT <Name> Node(1) .. Node(n)
Node(1) .. Node(n) sind die Nodes des Schaltkreises innerhalb des Subcircuits und geben an, welche Informationen mit der äußeren Welt ausgetauscht werden sollen. Im obrigen Fall wird nur der Input und der Output des Inverters nach außen zugänglich gemacht. Die Spannungsversorgung für den Inverter wird ebenfalls innerhalb der Subcell geregelt und erspart, daß man diese Nodezusätzlich mit sich führen muß. Würde die Struktur erwarten, daß man verschieden Spannungsquellen hat, so müßte die Spannungsversorgung ebenfalls Global werden und jeder Subcircuit könnte somit seine eigene Spannungsversorgung haben. Dies ist jedoch hier nicht der Fall.
Nachdem man einen Subcircuit definiert hat, muß man diesen im Spice-File aufrufen. Dies geschieht in Spice für unseren Fall folgendermaßen
xname1 IN NEXT2 INVERTER |
xname2 NEXT2 OUT INVERTER |
xnamex ist ein beliebiger Bezeichner, muß jedoch einmalig im Spice-File sein. Für gleiche Elemente ist eine fortlaufende Nummerierung deshalb sinnvoll. Weiterhin ist die genaue Bezeichung ebenfalls hilfreich, wenn man mehrere verschiedene Subcirucits in eine Spice-File verwendet. Eine favorisierte Schreibweise ist:
xINVERTER1 IN NEXT2 INVERTER |
xINVERTER2 NEXT2 OUT INVERTER |
Das x vor INVERTER wurde beibehalten, weil es ein nicht reservierter Buchstabe ist. Würde man das x weglassen, so würde in Spice nur der Name INVERTER stehen. Da I ein reservierter Bezeichner für eine Stromquelle ist, würde Spice INVERTER als Stromquelle NVERTER interpretieren. Ein x vor den Namen erspart das Nachdenken über reservierte Buchstaben innerhalb Spice.
Der Subcircuit-Aufruf hat folgende Struktur:
xname Node1 Node2 NodeN <Subcircuit-Name>
Weitere Beispiele für Subcircuits finden Sie hier. Weitere Fragen können im Spice-Manual beantwortet werden.
Beziehen wir uns nun auf das Beispiel des Ringoszillators. Der Spice-File hat folgenden Aufbau:
- Header |
- Model-Files |
- Options |
- Subcircuit definition |
- Circuit description |
- Operation |
.END |
Entwerfen Sie einen Spice-File für einen Ringoszillator. Der verwendete Prozeß soll ein 1.2mm-CMOS-Prozeß sein. Das entsprechende Modell finden Sie in der Library. Definieren sie einen Inverter als Subcircuit. In der Circuit description rufen sie diesen Subcircuit 21 mal auf. Achten Sie darauf, daß jeder Aufruf einmal ist und die Verbindung zwischen den Invertern einer Ringstruktur gleich kommt. Bei Operation fügen sie eine normale Transient-Analysis ein (.tran-Kommando). Der maximal time step soll 2 Nanosekunden betragen. Die Simulationsdauer soll 150 Nanosekunden betragen. Schließen Sie den File mit .END ab.
Normalerweise wäre der Spice-File nun fertig für die Simulation. Wir haben jedoch eines noch nicht beachtet. Das Anschalten einer Schaltung ist ein statistischer Prozeß. D.h. das der Zustand an jeder Node undefiniert ist. In der Simulationsumgebung ist es ein wenig anderes. Der Simulator versucht eine DC Operation Point ausfindig zu machen. Bei den Ringoszillator wird dies in den meisten fällen irgendwo um den Bias-Point 2.1V sein, d.h. das der Inverter nicht schaltet und wir keine Oszillation bekommen. In der Realität ist diese Zustand auch wahrscheinlich. Wir müssen also ein Set-Mechanismus einführen. Dies realisieren wir durch einen groß gewählten NMOS-Transistor, der durch anlegen einer Spannung einen bestimmten Punkt im Ringoszillator für die Dauer des Set-Signals diesen Punkt auf GND liegt. Nach dem Set-Signal haben wir einen Inverter, der Digital schaltet. Die Schaltung fängt an zu oszilieren.
Ergänzen Sie Ihren Schaltkreis durch diese Set-Option. Realisieren Sie das Set-Signal durch das PWL-Kommando (siehe Spice-Help). Eine Lösung für den Spice-File finden Sie hier.
Simulieren Sie den Schaltkreis in Spice und stellen Sie die maximale Schaltfrequenz bzw Periodendauer des Ringoszillators fest. Stellen Sie sich die Frage, wie groß die Schaltverzögerung eines einzelnen Inverters ist und wie der Ringoszillator dabei hilfreich sein kann. Die Lösungen finden sie hier.
karl@vlsi.bu.edu ,12.09.98