|
Du bist hier: Referate Datenbank | Informatik
| Digitale Filter
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
|