Spezielle hardware für digitale filter
Spezielle Hardware
für
Digitale Filter
1. IDT - Referat
Ronald Hasenberger 87bN
28. Oktober 1986
Inhaltsverzeichnis
1. Allgemeines 1
2. Filter mit "diskreter" Logik 1
2.1 Multiplizierer 1
2.
2 Ausführung von digitalen Filtern ohne
Rückführung (Finite Duration Response - FIR) 5
2.2.1 Kaskadiertes FIR-Filter 8
2.2.2 Vollparallele Form eines FIR-Filters 10
2.3 Ausführung von digitalen Filtern mit Rück-
führung (Infinite Impulse Response - IIR) 11
2.
3.1 Kaskadiertes IIR-Filter 12
2.4 gemultiplexte Filterbänke 13
3. Digitale Filter mit Digitalen Signal-
prozessor IC's (DSP) 16
3.1 Allgemeine Features von DSP 16
3.2 DSP mit Harvard-Architektur 18
3.
3 DSP mit Datenfluß-Methode 20
3.3.1 Datenflußmethode 20
3.3.2 NEC uPD7281 "Image Pipelined Processor" 23
Anhang Literaturverzeichnis 27
1. Allgemeines
Digitale Filter können entweder off-line ("Filterung" eines gespeicherten Datensatzes) oder on-line (Echtzeitverarbeitung der ankommenden Datensätze) ausgeführt werden.
Bei off-line Verarbeitung sind die Ansprüche an die Hardware gering, es kann problemlos ein herkömmlicher Computer mit geeignetem Programm eingesetzt werden. Die on-line Verarbeitung wird bereits bei relativ geringen zu verarbeitenden Frequenzen zeitkritisch (bei 20kHz: Abtastung mit 40 kHz => 25 us Verarbeitungszeit für einen Abtastpunkt). Diese Geschwindigkeit ist aufgrund der umfangreichen Rechenoperationen für einen Abtastpunkt für einen herkömmlichen uP nicht mehr erreichbar. Hier werden spezielle Ausführungen benötigt.
Früher wurde bei off-line Verarbeitung prinzipiell "diskrete" Logik verwendet, heute werden vielfach spezielle Prozessoren für digitale Signalverarbeitung verwendet.
2.
Filter mit "diskreter" Logik
2.1 Multiplizierer
Zur Erreichung hoher Verabeitungsgeschwindigkeiten sind schnelle arithmetische Einheiten notwendig. Hierbei sind speziell die Multiplizierer beachtenswert, da sie meist auf mehrfaches Addieren zurückgeführt werden, und deshalb wesentlich mehr Rechenzeit benötigen, als die Addierer.
Die einfachste Möglichkeit wäre ein Multiplizierer aus einem Addierer und Schieberegistern.
Bild 2.1 Addier-Schiebe-Multiplizierer
Bei diesem Aufbau wird mit Clock 1 der eine Faktor in einem Schieberegister bitweise weitergeschoben.
Wenn an den Gattern eine 1 ansteht, wird zum Akkumulator (Ergebnis) der Wert des anderen Faktors dazuaddiert. Nach jedem Additions- oder Nichtadditionsvorgang wird der Akkumulator um eine Stelle nach rechts geschoben (Erniedrigung des Stellenwerts).
Dieser Multiplizierer ist zwar vom Aufbau her sehr einfach, aber sehr langsam.
Eine schnellere Möglichkeit ist der Array-Multiplizierer, der gänzlich aus Addierern aufgebaut ist.
Bild 2.2 Array-Multiplizierer
Auch dieser Multiplizierer ist noch nicht sehr zeiteffizient, da er mit Ripple-Carry arbeitet, d.
h. der am weitesten links befindliche Addierer liefert erst dann eine gültige Summe, wenn alle Addierer weiter rechts fertig sind.
Bild 2.3 Schnellerer Array-Multiplizierer
Dieser Multiplizierer arbeitet mit diagonalem Carry, sodaß die Summen von niedrigeren Stufen gleichzeitig zu den Addierern auf den höheren Stufen gelangen. Dieses Prinzip heißt Carry-Save und ist auch auf andere als Array-Multiplizierer anwendbar. Die höchste Berechnungszeit ergibt sich hierbei entweder aus 8 Carry-Zeiten, oder 5 Summier-Zeiten, je nach dem welches länger dauert.
Im Gegensatz dazu benötigt der Multiplizierer von Bild 2.2 mindestens 2 x 5 Carry-Zeiten + 8 Summier-Zeiten.
Eine weitere Möglichkeit zum Aufbau eines Multiplizierers wäre eine Baum-Struktur, mit der sich die Anzahl der Summier-Zeiten stark verringern ließe. Bild 2.4 zeigt den prinzipiellen Aufbau eines solchen n x 16 Bit-Multiplizierers, wobei jedes Plus-Symbol n Bit repräsentiert. Bei diesem Aufbau sind nur 4 Summier-Zeiten nötig.
Es wird hier die selbe Anzahl von Addierern verwendet, aber es arbeiten mehr parallel.
Bild 2.4 Multiplizierer mit Baum-Struktur
Bild 2.5 Realisierung eines 6 x 8 Bit-Multiplizierers
mit Baum-Struktur
Bild 2.5 zeigt die Realisierung eines 6 x 8 Bit-Multiplizierers mit Baum-Struktur, wobei die Carries reihenweise verarbeitet werden. Dadurch benötigt jede Reihe die gesamte Carry-Ripple-Zeit.
Da 4 Reihen vorhanden sind, wird für die gesamte Multiplikation 4 x die Carry-Ripple-Zeit einer Reihe benötigt. Dadurch ist diese Methode nicht so effizient, wie die in Bild 2.3 gezeigte, außer wenn die Summier-Zeit sehr hoch ist. Es ist jedoch auch beim Multiplizierer mit Baumstruktur der Übergang auf Diagonal-Carry möglich.
Bild 2.6 Array-Multiplizierer mit Diagonal-Carry und
Baumstruktur
Diese Kombination von Baumstruktur und diagonale Weitergabe des Carrys ist die wahrscheinlich schnellste Möglichkeit einen Multiplizierer auszuführen.
Die Diskussion der anderen Möglichkeiten des Aufbaus eines Multiplizierers ist aber trotz des eindeutigen Geschwindigkeitsvorteils der letztgenannten Methode notwendig, da der Aufwand an ICs bei den einzelnen Methoden stark unterschiedlich ist.
2.2 Ausführung von digitalen Filtern ohne Rückführung (Finite Duration Impuls Response - FIR)
Bild 2.7 Prinzipschaltbild eines Filters ohne Rückführung
Man könnte dieses Prinzipschaltbild praktisch direkt in eine Schaltung übernehmen, es wären dann aber 6 Multiplizierer und 7 Addierer nötig, was einen sehr hohen Hardware-Aufwand bedeuten würde. Dieses System wird später noch beschrieben.
Die hardwaremäßig einfachste Struktur besteht aus einem ROM zur Speicherung der Koeffizienten, einem Schieberegister für die Amplitudenwerte, einem Multiplizierer und einem Addierer-Akkumulator.
Bild 2.8 Struktur, Programm und Zustände eines einfachen
Filters ohne Rückführung
Hierbei sind die letzten 6 digitalisierten Amplitudenwerte in einem Schieberegistersatz, bei dem jede Stufe ein ganzes Wort faßt, gespeichert.
Zunächst wird x(n-6) mit dem Koeffizienten a_6 verknüpft. Das Ergebnis wird im Akkumulator abgelegt. Mit dem ersten Takt wird x(n-6) aus dem Schieberegister herausgeschoben, und x(n-5) steht am Multiplizierer an. Gleichzeitig wurde der aktuelle Amplitudenwert in das Schieberegister hereingenommen.
x(n-5) wird mit a_5 multipliziert und zum Akkumulator dazuaddiert. Mit dem nächsten Takt wird das Schieberegister wieder um 1 weitergeschoben, wobei aber x(n-5) nicht aus dem Register hinausgeschoben wird, sondern an den Anfang des Registers zurückgeführt wird. Dieser Vorgang findet nun solange statt, bis x(n)a_0 zum Akkumulator dazuaddiert und an die erste Stelle des Schieberegisters geschoben ist. Dann steht im Akkumulator der richtige Ausgangswert, und der nächste Auswertezyklus kann beginnen.
In der Schaltung aus Bild 2.8 wurde aber noch keine Rücksicht auf die Verfügbarkeit geeigneter Schieberegister genommen.
Die hier dargestellte Methode würde entweder mehrere parallele 1 Bit Schieberegister mit einer relativ einfachen Logik benötigen, oder ein RAM mit einer relativ komplizierten Logik. Es ist aber relativ einfach möglich, auf einem IC tausende von seriell angeordneten Speicherzellen anzuordnen. Hierbei würde dann aber eine serielle Verarbeitung der einzelnen Wörter nötig.
Bild 2.9. Schaltung aus Bild 2.
8. mit rein serieller
Speicherung
In diesem Fall wäre jeder Amplitudenwert seriell gespeichert, obwohl es nur für x(n-6) explizit dargestellt ist. Die Multiplikationsroutine sollte hierbei nach der Addier-Schiebe-Methode durchgeführt werden, da die Daten bereits in serieller Form vorliegen. Hierbei würden die Amplitudenwerte zur Ansteuerung der Register verwendet, da diese Faktoren ohnehin geschoben werden müssen. Diese Methode ist sehr einfach für positive Zahlen, benötigt aber für vorzeichenbehaftete Zahlen, die nicht in 2er-Komplementdarstellung gespeichert sind eine relativ komplizierte Logik, weshalb meist die 2er-Komplement-Darstellung gewählt wird.
Wie bereits bei der Diskussion erwähnt wurde, ist dieser Multiplizierer relativ langsam, weshalb diese Methode in dieser Ausführung bald an die Grenzen ihrer Möglichkeiten gelangt.
Wenn die Schiebezeit pro Bit 100ns beträgt (=> Addierzeit des oberen Addierers < 100ns), die Wortgröße 16 Bit beträgt, und 16 Amplitudenwerte verarbeitet werden müssen (Filter 16.Ordnung), dann ist die höchste verarbeitbare Datenrate
R=1 / (Wortgröße x Ordnung des Filters x Schiebezeit)=
=10_9 / (16 x 16 x 100) = 39062.5 Hz
Mit dieser Datenrate könnten höchstens Frequenzen bis etwa 20kHz verarbeitet werden (Abtasttheorem).
Die Datenrate kann vergrößert werden, indem man Parallelverarbeitung einführt.
Durch Verwendung mehrerer Schieberegister kann die Geschwindigkeit proportional vergrößert werden, ebenso durch Verwendung mehrerer Arithmetikeinheiten (AE)
Bild 2.10 Struktur, Programm und Zustände eines
FIR-Filters mit 2 AE's
Diese Schaltung wäre nicht ganz doppelt so schnell wie die in Bild 2.
9 dargestellte, wenn man die gleichen AE's voraussetzt. Hier würden x(n) bis x(n-3) und x(n-4) bis x(n-6) getrennt und gleichzeitig bearbeitet, und anschließend die beiden Ergebnisse addiert werden.
2.2.1 Kaskadiertes FIR-Filter
Die selbe Basisstruktur wie in Bild 2.10.
kann auch für kaskadierte FIR-Filter verwendet werden. Bild 2.11 zeigt ein Beispiel für ein dreistufiges Filter, wobei jedes Filter 4. Ordnung ist, und Bild 2.12 zeigt die Realisierung mit einer AE.
Bild 2.
11 Kaskadiertes FIR-Filter
Bild 2.12 Realisierung mit einer AE
Der einzige Trick, der hierbei benötigt wird, ist das Retten der Ausgänge jeder Sektion, um sie zu geeigneter Zeit in das Schieberegister einzuspeisen.
Für größere Geschwindigkeitsansprüche kann das Filter aus Bild 2.11 ebenfalls durch Parallelverarbeitung beschleunigt werden. Hierbei gibt es eine besonders ins Auge springende Möglichkeit: Die Realisation jeder Filterstufe mit einer eigenen AE.
Bild 2.
13 Programm und Zustände für Filter aus Bild 2.12
Bild 2.14 Struktur, Programm und Zustände des Filters von
Bild 2.11 mit 3 AE's
2.2.2 Vollparallele Form eines FIR-Filters
Wie bereits in der Einleitung zu diesem Kapitel erwähnt, gibt es die Möglichkeit, das Prinzipschaltbild unter Verwendung von 6 Multiplizierern und 7 Addierern bei einem Filter 6.
Ordnung praktisch direkt zu übernehmen.
Bild 2.15 Verwendung von N parallelen Zweigen für ein
Filter N-ter Ordnung
In diesem Fall ist keine Zirkulation der Amplitudenwerte nötig, sodaß das Schieberegister nur mehr als angezapfte Verzögerungsleitung benützt wird. Wegen der Notwendigkeit dieser Anzapfungen verschwindet aber der Vorteil der LSI-Bausteine, die zwar sämtliche Amplitudenwerte problemlos speichern können, aber nicht auch gleichzeitig ausgeben. Die Schieberegister können auch hier gleichzeitig bitweise arbeiten, sodaß eine Addier-Schiebe-Multiplikation möglich wird. Hierbei wäre es aber kaum ein zusätzlicher Aufwand, wenn man alle Amplitudenwerte parallel speichert, und einen Schieberegistersatz mit voller Wortbreite verwendet, wodurch auch die Multiplizierer parallel arbeiten könnten (Array-Multiplizierer).
Wenn man annimmt, daß die Multiplikationszeit zur Schiebezeit hinzuaddiert wird, wird noch zusätzliche Zeit zum Addieren benötigt. Diese zusätzliche Zeit kann aber vermieden werden, indem man Buffer (in diesem Fall=Speicher) an den gekennzeichneten Stellen einfügt. Wenn man annimmt, daß die Addierzeit exakt gleich der Multiplikationszeit ist, dann tritt dadurch nur eine Verzögerung des Ausgangssignals um eine Abtastperiode ein.
2.3. Ausführung von digitalen Filtern mit Rückführung
(Infinite Impulse Response IIR)
Die Ausführung von IIR-Filtern unterscheidet sich von jener von FIR-Filtern nur sehr wenig.
Bild 2.16 zeigt ein IIR-Filter, das die selbe Grundstruktur wie das FIR-Filter von Bild 2.9. benützt.
Bild 2.16 Struktur eines IIR-Filters mit einer AE
Die Gleichung, nach der dieses Filter arbeitet ist:
Hierbei wird während der ersten Multiplikation (Addier-Schiebe-Prinzip) das Wort y(n-12) aus dem Schieberegister hinausgeschoben.
Während der nächsten 11 Multiplikationen zirkuliert das Schieberegister, d.h. die am Ende herausgeschobenen Bits werden am Anfang wieder eingefügt. Das Ergebnis y(n) ist nicht verfügbar, solange nicht bx(n) berechnet ist. Deshalb darf während der Berechnung von bx(n) das Schieberegister nicht rotiert werden. Im letzten Schiebezyklus wird dann keine Berechnung mehr durchgeführt, sondern nur mehr y(n) in das Schieberegister hineingeschoben.
In typischen Anwendungen beträgt die Abtastfrequenz 8kHz und die Abtastzeit 125us. Bei einer Wortlänge von 16 Bit werden 16 x (12 + 2) Taktzyklen für einen Abtastvorgang eines Filters 12.Ordnung benötigt, was zu einer Taktfrequenz von etwa 2MHz führt, die mit LSI-Bausteinen leicht zu bewältigen ist.
2.3.1 Kaskadierte IIR-Filter
Bild 2.
17 zeigt das Prinzipschaltbild einer Kaskade von 3 Filtern 2. Ordnung, von denen jedes 2 Pole und 2 Nullstellen hat.
Bild 2.17 IIR-Filter als Kaskade 3er Filter 2.Ordnung
Bild 2.18 zeigt Struktur, Programm und Zustände einer Realisation dieses Filters mit 2 AE's.
Die Struktur ist vergleichbar mit dem früher gezeigten mit 1 Bit breiten Schieberegister und Addier-Schiebe Multiplizierer. Die Aufgabenstellung der beiden AE's ist so verteilt, daß eine die Vorwärts-Summen berechnet (AE2) und die andere die in das Schieberegister einzuspeisenden Summen (AE1).
Da die in das Schieberegister einzuspeisenden Daten vorhanden sein müssen, bevor die Vorwärtssummen endgültig berechnet werden können, folgen auf 2 Schiebezyklen 2 Zyklen, in denen nicht geschoben wird, sondern nur die AE's arbeiten. Während dieser Zeit wird zunächst das in das Schieberegister einzuspeisende Datum berechnet, und anschließend unter Verwendung dieses Datums die Vorwärtssumme berechnet, die für die ersten beiden Filter im x_i-Register abgelegt wird, und für das letzte Filter an den Ausgang gelangt.
Dieses Filter benötigt insgesamt 7 Schiebezyklen mit Berechnungen und 6 Zyklen, in denen nur gerechnet wird. Die reinen Schiebezyklen, in denen nur die x_0(n), x_1(n) und x_2(n) weitergeschoben werden, können während der zweiten reinen Berechnung stattfinden.
Bild 2.15 IIR-Filter von 2.17 mit 2 AE's
2.4. gemultiplexte Filterbänke
Nur sehr selten sind in der Praxis so einfache Konfigurationen wie die hier gezeigten in Verwendung. Wesentlich häufiger sind Filterbänke, die IIR oder FIR-Filter verwenden, wo möglicherweise jedes Filter eine Kaskade oder eine parallele Ausführung ist.
Desto mehr Filter gemultiplext werden können, desto größer ist der Vorteil, der durch die Verwendung von digitalen Filtern erzielt werden kann, da man speziell die Speicher leicht an die speziellen Erfordernisse der zusätzlichen Zustände anpassen kann. Vorsicht ist hierbei nur geboten, wenn man zu viele verschiedene Funktionen mit einer Filtereinheit realisieren will, da dann die Kontrollogik schnell anwächst.
Die Bilder 2.19 und 2.20 zeigen ein Beispiel der Realisation von 3 getrennten FIR-Filtern mit einer Filtereinheit.
Bild 2.
19 Filter, die zu multiplexen sind
Bei der gezeigten Konfiguration wird der AE jeweils das passende Eingangsdatum zugeführt, und über den Distributor werden jeweils die richtigen Daten an die Ausgänge verteilt. Im Schieberegister zirkulieren jeweils die Daten aller 3 Filter.
Bild 2.20 Hardware-Konfiguration und Programm für
gemultiplexte FIR-Filter
3. Digitale Filter mit Digitalen Signalprozessor IC's
(DSP)
3.1 Allgemeine Features von DSP
Digitale Signalprozessoren müssen für Echtzeitverarbeitung einen sehr hohen Datendurchsatz haben, der größer ist als jener von herkömmlichen Mikroprozessoren.
Da aber die Taktraten bei Mikroprozessoren in der Regel bereits knapp am technologisch sinnvoll Machbaren liegen, stellt sich die Frage welche Mittel man anwenden kann, um einen DSP schneller zu machen?
Zum einen liegt die Antwort in der Architektur der DSP's. Diese Prozessoren werden immer mit einer relativ großen Wortbreite (16 oder 32 Bit) ausgeführt, und haben Fest- oder Fließkomma-Arithmetik bereits hardwaremäßig implementiert. Dadurch ist bereits eine gewisse Parallelverarbeitung von Informationen möglich.
Außerdem werden sie oft mit einer Pipeline-Architektur gebaut, die zwar noch keine vollständige Parallelverarbeitung ausmacht, aber immerhin garantiert, daß Arbeitsschritte, die nicht zwingend hintereinander ablaufen müssen, gleichzeitig erfolgen. Diese Fähigkeit sei an folgendem Beispiel erklärt: Um einen Befehl abzuarbeiten ist es notwendig, daß dieser erst einmal aus dem Programmspeicher in den Prozessor geladen wird (Instruction-fetch), dann entschlüsselt wird, was auszuführen ist, (instruction-decode) und schließlich muß der Befehl auch abgearbeitet werden (execution). Der Prozessor gewinnt an Geschwindigkeit, wenn er die Fähigkeit besitzt.
während der Ausführung eines Befehls den nächsten bereits zu laden und zu dekodieren. Dieses Verfahren verwenden übrigens nicht nur DSP, sondern auch die Mikroprozessoren der letzten Generation (Intel 80386).
Eine weitere Methode zur Beschleunigung eines Prozessors ist die Implementierung der Harvard-Architektur. Auch diese stellt einen Schritt in Richtung Parallelverarbeitung dar. Dabei werden Programm und Daten in getrennten Bereichen gespeichert, und auch über eigene Busse geführt. Allerdings führt dieses Verfahren schnell zu hoher Komplexität der Hardware, weshalb oft folgender Weg beschritten wird: Innerhalb des Prozessors wird der Bus getrennt geführt, außerhalb wird durch Multiplextechnik die doppelte Busstruktur auf eine einfache reduziert, um den Aufwand an extern erforderlicher Hardware gering zu halten.
Welcher Architektur im konkreten Anwendungsfall der Vorzug zu geben ist, hängt davon ab, wie zeitkritisch die Applikation ist, bzw. wie weit ökonomische Gesichtspunkte berücksichtigt werden müssen. Der Zeitfaktor wird aber in der Regel dadurch gemildert, daß die meisten DSP's bereits internes RAM und ROM besitzen, das sie über die getrennten Busse ansprechen können. Ein wesentlicher Faktor zur Erhöhung der Arbeitsgeschwindigkeit ist die Implementierung eines Hardware-Multiplizierers, da die Multiplikation als typischer Befehl in signalverarbeitenden Algorythmen bei einer Realisierung über Software sehr viel Zeit in Anspruch nehmen würde. Ein moderner 16x16 Bit Hardware-Multiplizierer benötigt zur Produktbildung etwa 100 bis 200ns, während selbst moderne Mikroprozessoren dafür einige Mikrosekunden benötigen. Wenn man bedenkt, daß etwa in einem digitalen Audiosystem zur Abarbeitung einfacher Filteralgorythmen maximal 30us zu Verfügung stehen und daß dabei mehrere Multiplikationen sowie Additionen und Schiebeoperationen (neben Ein- Ausgabebefehlen) durchzuführen sind, wird der Einsatz spezieller Prozessoren unentbehrlich, wenn man nicht auf eine "diskrete" Logik wie in Abschnitt 2 beschrieben zurückgreifen will.
Bild 3.1 Blockschaltbild eines gebräuchlichen DSP IC's
mit Harvard-Architektur und Hardware Multiplizierer
(Texas Instruments TMS 32010)
Die bisher genannten Methoden zur Vergrößerung des Datendurchsatzes sind nicht unbedingt typisch für DSP's, sondern der Technologie von Großrechnern entlehnt. Die zweite Kategorie von Maßnahmen, die einen Signalprozessor für eine bestimmte Aufgabe geeignet oder ungeeignet erscheinen läßt, wird dadurch gesetzt, daß sein Anwendungsgebiet bekannt ist. Der Zugang dazu wird sowohl über Hard- als auch Software ermöglicht.
Von der Softwareseite erfolgt die Problemlösung über die Gestaltung des Befehlssatzes. Da der Prozessor ja nur für ein ganz bestimmtes Anwendungsgebiet gedacht ist, kann der Befehlssatz spezielle Instruktionen enthalten, die die Verarbeitung bestimmter Algorythmen begünstigen.
Darüber hinaus kann eine Instruktion mehrere Operationen ausführen. Damit kann der für einen speziellen Anwendungsfall gedachte DSP unter Umständen mit einem einzigen Befehl das erreichen, wofür ein herkömmlicher Mikroprozessor ein ganzes Unterprogramm benötigen würde. So kann z.B. bei einem Signalprozessor in einem einzigen Befehl ein gerade erstelltes Produkt zum Akkumulator addiert werden, das Multiplikanden-Register mit dem nächsten Wert geladen und dieser Wert im Datenram auf die nächste Seite kopiert werden. Alle drei Einzeloperationen sind bei der Realisierung eines Digitalfilters von größter Wichtigkeit, und die Ausführungszeit liegt bei einem DSP in der Größenordnung von etwa 200ns.
Außerdem beschleunigen Bit-Testbefehle, die ein bestimmtes Bit in einem Wort testen können ohne vorher maskieren zu müssen, den Ablauf.
Das Wissen um das spezielle Einsatzgebiet erlaubt die entsprechende Gestaltung des Prozessor-Hardwareaufbaus. Die Möglichkeiten reichen hier vom Einsatz verschiedener ALU's für verschiedene Aufgaben, die dann gleichzeitig gelöst werden können über spezielle Register, die bestimmte Befehle abarbeiten, ohne daß die Daten dazu in den Akkumulator transportiert werden müssen, bis zu Rückkopplungswegen, die bestimmte Befehle (z.B. multipliziere und akkumuliere) erst ermöglichen. Daneben können noch Wiederholzähler (für rekursive Algorithmen) und Barrelshifter (der Befehl enthält die Anzahl der Stellen, um die der Operand verschoben wird, und erspart damit mehrmaligen Aufruf eines Befehls, der nur imstande ist, um ein Bit zu verschieben) vorgesehen sein.
Ein entsprechend großer RAM-Bereich auf dem Prozessorchip ermöglicht die sinnvolle Nutzung der getrennten Programm- und Datenbusstruktur, wobei auch hier der Befehlssatz den Datenaustausch zwischen Programm und Datenbus wirksam unterstützt. So kann mit einem einfachen Befehl ein Abschnitt des Programmspeichers in den Datenspeicher übertragen werden. Filterkoeffizienten können damit in vergleichsweise große externe Programm-RAM's (oder EPROM's) abgelegt werden und bei Bedarf in den kleinen internen Datenspeicher des Signalprozessors geholt werden, da die ALU oft nur Daten vom internen RAM direkt verarbeiten kann. Einige Hersteller bieten auch erweiterte Versionen an, bei denen ein schneller Analog-Digital-Wandler auf dem Chip integriert ist, was bei qualitativ weniger kritischen Anwendungen Vorteile bringen kann.
3.2 DSP mit Harvard-Architektur
Diese Art von DSP soll am TMS 320xx von TI dargestellt werden.
Das Blockschaltbild dieses Prozessors ist bereits in Bild 3.1 dargestellt.
Die wichtigsten Merkmale dieses Einchip-Computers sind: 200ns Instruktionszyklus, 32 Bit Arithmetikeinheit, 16x16 Bit Parallelmultiplizierer (benötigt für eine Multiplikation nur einen Zyklus), 0..16 Bit Barrel-Shifter, 288 Byte Daten RAM (144x16), 3kByte Programm-Rom (1,5k x 16), die extern auf 8 kByte erweiterbar sind.
Dieser Prozessor arbeitet mit einer Harvard Architektur mit 2 getrennten 16 Bit-Bussen für Programm und Daten.
Durch diese Struktur ist es möglich, Befehle zeitlich überlappend aufzunehmen und auszuführen.
Architektur:
Das Herzstück des Prozessors ist eine schnelle Arithmetik-einheit, die aus einer 32 Bit-ALU, einem 16 Bit Shifter, dem 16x16 Bit Parallelmultiplizierer sowie einem 32 Bit Akkumulator besteht. Daten werden entweder aus dem RAM über den Shifter oder aus dem Produktregister P in die ALU geladen. Daten aus dem RAM mit einer Wortbreite von 16 Bit werden nach Schiebeoperationen mit Vorzeichenzusatz für Zweierkomplement-Arithmetik auf 32 Bit erweitert. Arithmetik-Operationen mit 32 Bit aus dem RAM werden auch durch eine Kombination spezieller Befehle, bei denen die Vorzeichenerweiterung im Shifter unterdrückt wird, unterstützt. Die ALU verfügt auch über logische Operationsanwendungen für Steueranwendungen.
Eine Sättigungs-Überlauf-Betriebsart dient zur Simulation von Sättigungsereignissen in Signalverarbeitungssystemen. Der 32 Bit Akkumulator wird im Multiplexbetrieb auf den 16 Bit Datenbus umgeschaltet, damit die Resultate im RAM gespeichert werden können. Die höherwertigen Akkumulatorwerte können auch mit einem vorgegebenen Offset gespeichert werden, um die Skalierung der Resultate zu ermöglichen.
Adressierungsarten:
Der Prozessor unterstützt 4 Adressierungsarten. Die erste ist die direkte Adressierung, sie erfolgt von einem 7 Bit-Feld der Instruktion und einem Page-Register.Der Speicher ist für die direkte Adressierung in 128 Wort-Seiten aufgeteilt.
Die zweite ist die indirekte Adressierung, bei der eines der 2 Hilfsregister (AR) Verwendung findet. Diese Register unterstützen die automatischen Inkrement-/Dekrement-Operationen parallel zu Speicherbezügen und Arithmetikoperationen. Daraus ergeben sich zwei verschiedene Adressierungsarten. Die Auswahl des AR-Registers als Quelle für eine Adresse wird durch das ARP-Register festgelegt. Der Datenspeicher ist so aufgebaut, daß ein Wort auf die nächsthöhere Adresse vom derzeitigen Speicherplatz in einem Maschinenzyklus dupliziert werden kann, während andere Operationen parallel ablaufen. Außerdem sind einige direkte Operationen möglich, bei denen Teile des Instruktionsworts als Daten Verwendung finden.
Aus diesem Grund können Konstanten wie z.B. Filterkoeffizienten Teil des Programms sein.
Da Programm- und Datenbus getrennt sind, verfügt der Programm-Zähler über einen eigenen Inkrementer und einen 4-Ebenen-Stack für die Unterprogrammsteuerung.
Software:
Der Prozessor verwendet 16 und 32 Bit Instruktionen. Bei Unterprogrammen und Interrupts wird der gesamte Maschinen-Kontext gesichert.
Verzweigungen können bei den meisten arithmetischen Bedingungen, bei Überlauf, bei Register = 0 und ohne Bedingung erfolgen. Es ist ebenfalls möglich, den Akkumulator-Inhalt als Programm-ROM-Adresse zu verwenden, um an Konstanten, die im ROM gespeichert sind, zu gelangen, oder zum Unterprogrammaufruf bei datenabhängigen Verarbeitungsvorgängen. Der Prozessor ist zur Unterstützung von 2 Arten der Programm-Speicher-Operationen konfiguriert. Die erste Konfiguration (TMS320M10) besitzt ein Programm-ROM auf dem Chip, und eignet sich daher für Einchip-Anwendungen mit hoher Stückzahl. Eine Kombination von internem ROM (1,5 k Worte) und externem Programmspeicher (2,5 k Worte) ist ebenfalls möglich, und kann z.B.
bei Systemen mit festen Kernroutinen und unterschiedlichen Anwendungs-System-Konfigurationen verwendet werden. Die zweite Ausführung (TMS 32010) unterstützt 4 k Worte externen Programmspeicher und unterdrückt das interne ROM. Diese Ausführung ermöglicht, daß das Benutzer-Programm in einem externen 4 k Speicher untergebracht ist, und die Entwicklungssystem-Software in dem Programm-ROM auf dem Chip. Daher kann dieses Bauelement nicht nur zur Unterstützung der Eigen-Emulation, sondern auch als das eigene Entwicklungssystem verwendet werden. Das Interface des externen Programmspeichers arbeitet mit der selben Geschwindigkeit, wie das interne ROM, wodurch Echtzeit-Entwicklung und -Ausführung möglich ist.
Ein-/Ausgangsoperationen werden über einen parallelen 16 Bit Bus ausgeführt, auf dem 8 Kanäle definiert sind.
Der Prozessor kann E/A-Operationen mit einer Rate von 40 MBaud ausführen. Ein Polling-Eingang ermöglicht softwaremäßige E/A-Steuerung, außerdem ist ein Interrupt-Anschluß für Hardware E/A und Multitasking vorgesehen.
Chip
Hergestellt wird der Prozessor in einem 3um Silizium-Gate-NMOS-Pozeß. Er umfaßt eine Chipfläche von 43,81 mm_2. Die Bausteine sind in einem 40poligem DIL-Gehäuse untergebracht und weisen eine Verlustleistung von 950mW auf. Bei einer maximalen Taktfrequenz von 20MHz beträgt die Befehls-Rate 5 Millionen Instruktionen/s.
Verschiedene Testarten sind zur Produktionsüberwachung und Ausbeuteanalyse vorgesehen. Für Prüfzwecke und Zuverläßigkeitsanalysen sind Prozessor, Datenspeicher und PROM auf dem Chip getrennt ansprechbar.
3.3 DSP mit Datenfluß-Methode
Der bisher besprochene 320xx ist trotz verbesserter Architektur ein Von-Neumann-Computer, bei dem ein Zyklus das Senden der Adresse, Empfangen des Datums, Entschlüsseln und Verarbeiten umfaßt. Der hier beschriebene uPD7281 ("Image-Pipelined-Processor") verwendet die Datenfluß-Methode.
3.
3.1 Datenflußmethode
Der Unterschied in der Arbeitsweise eines Computers, der die Datenflußmethode anwendet sei an einem einfachen Beispiel dargestellt; der Berechnung des folgenden Ausdrucks:
Y = AxB + CxD
Ein von Neumann Computer berechnet zunächst beide Produkte, die er anschließend addiert (Bild 3.2). Hierbei ist nicht einzusehen, warum er eigentlich die beiden Multiplikationen Y1 = AxB und Y2 = CxD nicht gleichzeitig ausführt.
Bild 3.2 Flußdiagramm einer Berechnung mit einem
Von-Neumann-Computer
Ein Datenfluß-Computer ermöglicht diese Art von Parallel-Operationen.
Er verfügt über eine Anzahl datengetriebener Arithmetik-Einheiten, die die Operationen beginnen, sobald Daten einlangen. Dieser Vorzug ermöglicht den asynchronen Betrieb jeder Arithmetik-Einheit. Zusätzlich zu diesen Arithmetik-Einheiten besitzt der Datenfluß-Computer einen Fluß-Controller, dessen Aufgabe es ist zu bestimmen, wohin welche Daten gesandt werden sollen. Die Daten selbst sind mit einer ID (Identifikation) versehen und bezeichnen ihren Ursprung.
Bild 3.3 Datenfluß-Methode
Aus diesem Grund ist es nicht erforderlich, die Instruktionen durch das Programm zu beschreiben, und es ist nicht nötig, die Reihenfolge der Abarbeitung anzugeben.
Es muß lediglich der Fluß der zu verarbeitenden Daten beschrieben werden.
Da die Flußdiagramme für Von-Neumann-Computer weniger geeignet sind, Datenflüsse und Parallelverarbeitung innerhalb eines Programmes auszudrücken, werden sogenannte Flowgraphs_*) angewendet, um solche Programme schematisch
_ *) Flowgraphs bestehen aus Knoten, die den Operanden eines Ausdrucks entsprechen (den auszuführenden Befehlen) und Richtungssegmenten, oder "arcs", die den Datenflß bezeichnen. Flowgraphs bringen weniger eine sequentielle Abarbeitung zum Ausdruck, als vielmehr die Parallelverarbeitung bestimmter Prozesse. Die DAten, die zwischen den Knoten fließen werden als Token bezeichnet. Jene Information, die die Hardware steuert, wird den Token hinzugefügt, sobald sie durch die verschiedenen Hardware-Stufen fließen
darzustellen. Der Flowgraph für die Berechnung von
Y = AxB + CxD
ist in Bild 3.
4 dargestellt.
Bild 3.4 Flowgraph einer Berechnung mit einem Datenfluß-
Computer
Hier wird veranschaulicht, daß die beiden Operationen für Y1 = AxB und Y2 = CxD parallel ausgeführt werden. Der Unterschied zu einem Von-Neumann-Computer wird noch augenfälliger, wenn die Instruktionen tatsächlich auf einem Datenfluß-Computer ausgeführt werden. Um in einem Von-Neumann-Computer eine Instruktion ausführen zu können, muß das Objekt-Programm zunächst von jener Stelle des Speichers ausgelesen werden, an der es abgelegt wurde. Die abgerufene Instruktion wird decodiert, und die für die Ausführung erforderlichen Daten werden zusammengestellt.
Ein Großteil der Ausführungszeit fällt damit dem Speicherzugriff zum Opfer. Daher ist die traditionelle Computer-Architektur für Hochgeschwindigkeitsverarbeitung nicht ideal. Im Datenfluß-Computer werden dagegen, sobald das Objekt-Programm gesetzt ist, die Instruktionen ausgeführt, sobald die nötigen Daten anstehen.
Als weiteres Beispiel sei die logische UND-Verknüpfung zweier Daten angeführt. Hier nimmt man an, daß die Ausführungszeit eines herkömmlichen Von-Neumann-Computers gleich sei mit der eines Datenfluß-Computers (von den bereitgestellten Daten ausgehend) Bild 3.5 zeigt, daß auch hier der Datenfluß-Computer den herkömmlichen Computer bei weitem Übertrifft.
Bild 3.5 Zeitdiagramm für einen Von-Neumann- und einen
Datenfluß-Computer
Ein weiterer Vorzug von Computern, die sich der Datenflußmethode bedienen, ist der hohe Überschneidungsgrad der abgearbeiteten Operationen. Während beispielsweise ein Prozeß ausgeführt wird, kann gleichzeitig die Zusammenstellung von Daten für den nächsten Prozeß ablaufen. Befinden sich diese Daten in einem Speicher, kann die effektive Zugriffszeit nach außen hin nahezu auf Null gesenkt werden.
Bild 3.6 Prozessausführungen in einem Datenfluß- und
einem Von-Neumann-Computer
Zusammenfassend kenn ein Datenfluß-Computer, verglichen mit einem Von-Neumann-Computer die Anzahl der Speicherzugriffe drastisch reduzieren, und die Zugriffszeit besonders effektiv nutzen.
3.3.2 NEC uPD7281 "Image Pipelined Processor"
Der Datenfluß-Computer in Bild 3.2 enthält mehrere Arithmetik-Einheiten. Wird diese Vielzahl von Einheiten in einem einzelnen Bauteil zusammengefaßt, bedeutet das eine beträchtliche Steigerung der Verarbeitungsgeschwindigkeit. Der Flußcontroller in einem solchen Baustein müßte aber über alle Maßen komplex sein; da jede Einheit nur eine spezifische Operation ausführt, ist bei komplizierteren Operationen eine entsprechend hohe Anzahl solcher Einheiten beteiligt.
Zusätzlich weist das System einen weiteren Schwachpunkt auf: auch wenn viele Einheiten zum Einsatz kommen, ist das Risiko sehr groß, daß durch Datenkonzentration an einer Arithmetik-Einheit die Verarbeitung zusammenbricht. Aus diesem Grund findet im uPD7281 eine einzige universelle ALU Verwendung.
Im vorher beschriebenen Computer ist jeder Einheit eine bestimmte Aufgaabe zugedacht. Welche Einheit angesprochen wird, hängt vom Identifizier-Feld des Token ab. Im Fall des uPD7281 müssen jedoch die Daten, die die Art der Operation bestimmen, im Token enthalten sein. Der an die ALU kommende Token enthält daher einen Operationscode.
Weiters kann der in Bild 3.3 gezeigte Flow-Controller in folgende vier Blöcke gegliedert werden:
Link Table: Checkt die IDs der ankommenden Token und leitet den nächsten ID-Wert und die OP-Code Adresse zum Token
Function Table: Fügt dem Token einen OP-Code hinzu
Data Memory: Steuert die Daten, die zwei Token für eine bestimmte Operation zusammengetragen haben
Queue: Steuert den Eingang der Token zu den Verarbeitungseinheiten
Bild 3.7 Blockschaltbild des uPD7281
Wenn die Token die erwähnten Blöcke durchlaufen, werden ihnen Daten hinzugefügt und einige Token zu Einzel-Token zusammengefaßt. Anschließend gelangen sie in die Verarbeitungseinheit oder den Ausgangscontroller. Das Format der den uPD7281 verlassenden Token (entweder über den Ausgangscontroller oder über die Verarbeitungseinheit zur Link-Table) ist gleich dem Format jener Token, die als Eingangsinformation an den Eingangscontroller gelangen. Alle diese Konzepte sind in Bild 3.
7 dargestellt. Durch den pipelineartigen Datenfluß zwischen den Funktionsblöcken wird die Weiterleitung der Daten zwischen den Blöcken vereinfacht. Jeder dieser Link-Table-, Function-Table- und Data-Memory-Blöcke ist im RAM konfiguriert, sodaß Programme einfach modifiziert werden können, indem die Inhalte dieser Speicher neu geschrieben werden. Diese Methode wird auch programmierbare Pipeline-Methode genannt.
Obwohl der uPD7281 nur eine einzige Arithmetik-Einheit besitzt, können mehrere Prozesse glechzeitig ablaufen. Da der externe Speicherzugriff, anders als bei Von-Neumann-Computern, nur aus dem Lesen und Schreiben von Daten besteht, kann die Gesamtanzahl von Speicherzugriffen auch bei dieser Realisation eines Datenfluß-Computers drastisch gesenkt werden.
Außerdem ist durch die Parallelverarbeitung die Speicherzugriffszeit als Teil der Bearbeitungszeit nahezu nicht mehr erkennbar.
Funktionsbeschreibung
Wie Bild 3.7 zeigt, besteht die ringförmige Pipeline aus 5 Funktionsblöcken:
- Link Table (LT)
- Function Table (FT)
- Data Memory (DM)
- Queue (Q)
- Processing Unit (PU)
Der durch den Input Controller (IC) einlangende Token wird an die Link-Table weitergeführt und im Pipeline-Ring so oft als nötig bearbeitet. Ist diese Bearbeitung abgeschlossen, so wird der Token im Output Queue abgestellt und über den Output Controller (OC) zum Ausgang weitergeführt.
Bevor irgendeine Bearbeitung beginnt, lädt der Host-Prozessor den Objekt-Code in die Link-Table und die Function Table des uPD7281 unter Verwendung speziell formatierter Eingangs-Token. Zu diesem Zeitpunkt können auch Konstanten zur Abspeicherung an den Datenspeicher gesandt werden.
Die Inhalte der Link-Table und der Function-Table sind eng verwandt mit der grafischen Darstellung einer Berechnung. Wenn ein Rechenprozess grafisch dargestellt wird, zeigt er gewöhnlich einen gerichteten Datenfluß. In einer derartigen Darstellung bedeuten die Bögen (Ecken, Verbindungen usw.) den Eintritt in die Link-Table. Ein Knoten im grafischen Datenfluß bezeichnet eine Operation. Die Art der Operation wird zusammen mit der Identifikations-Information über den austretenden Bogen in der Function-Table angegeben.
Da der uPD7281 in einem Multiprozessorsystem kaskadiert werden kann, muß ihm während des Reset eine Modul-Nummer zugeteilt werden. Wenn nun während des normalen Betriebs ein Token zum Input-Controller gelangt, dann entscheidet dieser anhand der Information im Modul-Nummer-Feld des ankommenden Token, ob er ihn akzeptiert, oder nicht. Wenn die Modul-Nummer des Token von der des uPD7281 abweicht, wird der Token über den Output-Controller wieder nach außen geschickt. Besitzt der Token die selbe Modul-Nummer,
Bild 3.7 Kaskadierung von uPD7281 (maximal 14)
entfernt der Input-Controller das Modul-Nummern-Feld, und schickt den verbleibenden Teil des Token in die Link-Table zur Weiterverarbeitung. Sobald ein Token in die Pipeline eintritt, indem er Zugang zur Link-Table erhlaten hat, benötigt er 7 Pipeline-Clockzyklen, um den Ring einmal zu durchlaufen.
Je einen Pipeline-Zyklus benötigen die Link-Table, die Function-Table und das Data-Memory, um einen Token zu bearbeiten; zwei Pipeline-Zyklen beanspruchen der Queue und die Processing-Unit. Die Queue und die Processing-Unit sind aus zweistufigen Pipelines aufgebaut. Wenn sich sieben Token gleichzeitig in der Ring-Pipeline befinden, ist diese voll besetzt, und höchstmögliche Parallelverarbeitung findet statt.
Wenn ein Token durch alle Funktionsblöcke des uPD7281 fließt, ändert sich dessen Struktur gewaltig. Ein innerhalb der Ring-Pipeline fließender Daten-Token besitzt mindestens ein 7 Bit breites Identifizier-Feld (ID), und ein 18 Bit breites Datenfeld. Das Identifizier-Feld dient als Zugriffsadresse auf das Link-Table-Memory.
Wenn ein Token auf das LT-Memory zugreift, wird dessen ID-Feld durch ein im LT-Memory gespeichertes ID-Feld ersetzt.
Das Datenfeld eines Token besteht aus einem Control-Bit, Vorzeichen-Bit und 16 Bit Daten. Ein Token kann bis zu zwei Datenfelder sowie je nach Bedarf auch noch ein OP-Code-Feld besitzen.
Prozessoreigenschaften
Schnelle Datenverarbeitung
Die hier verwendete Architektur ist besonders geeignet zur schnellen Handhabung von iterativen Operationen, wie sie zum Beispiel in der Bildverarbeitung vorkommen. Bei bisherigen Prozessoren, die nach dem Pipeline-Verfahren arbeiteten, waren die ausführbaren Operationen durch die Hardware bereits festgelegt. Im uPD7281 können alle Operationen im User-Programm beliebig geändert werden, außerdem können mehrere Prozesse gleichzeitig ablaufen.
Schnelle Arithmetik-Operationen
Der uPD 7281 benötigt für alle Operationen (einschließlich Multiplikation) eine Verarbeitungszeit von 200ns (bei 10MHz), was einer Arbeitsgeschwindigkeit von 5MIPS (Millionen Instruktionen pro Sekunde) entspricht.
Problemlose Multiprozessor-Konfiguration
Die Hochgeschwindigkeitsverarbeitung läßt sich durch den Einsatz mehrerer uPD7281 noch verbessern. Hierbei ist die einfache Zusammenschaltung (vergleiche Bild 3.8) besonders günstig.
Schnelle Daten I/O
In einer Multiprozessor-Konfiguration stellt oft der Datenbus den leistungsbegrenzenden Engpass dar. Um dies Auszuschalten verwendet der uPD7281 getrennte Ein- und Ausgangsleitungen und erreicht so wesentlich verbessete Übertragungsraten.
Eine asynchrone Handshaking-Methode auf 2 Leitungen verringert hierbei den externen Schaltungsaufwand wesentlich.
Anhang: Literaturverzeichnis
Theory and Application of Digital Signal Processing
Lawrence R. Rabiner
Bernard Gold
Verlag: Prentice-Hall Inc.
32 Bit Mikrocomputer für Signalverarbeitung und
Prozessteuerung
P. von Bechen
TI Sonderdruck aus Elektronik 22 / 5.11.
1982
DSP: Ein zugeschnitzter uP
J. Thoma
F. Pavuza
ES 6 / Juni 1986
Signalprozessor für die Bildverarbeitung
R. Hell
ES 6 / Juni 1986
Anmerkungen: |
| impressum | datenschutz
© Copyright Artikelpedia.com