3.3 Verarbeitungseinheiten
167
diese Speicher in Indexregistern I0-I7 bereitstellen. Es gibt separate Einheiten für
Additionen und Multiplikationen mit eigenen Parameterregistern AX0, AY0, AF, MX0,
MY0 und MF. Der Multiplizierer ist mit einem zweiten Addierer verbunden, um die
Folge von Multiplikationen und Additionen (sog. MAC-Operationen) schnell berechnen zu können. Dieser Prozessor führt eine Iteration in einem Zyklus aus. Dafür
wird für die Arrays w und a Speicherplatz in den beiden Speichern reserviert.
Zeiger auf die Arrayelemente werden in Indexregistern gehalten, auf die in der
AGU bei jeder Iteration der Inhalt eines der Modify-Register M0-M7 addiert wird.
Dies wird meist als Nebeneffekt der Zugriffe auf die Arrays kodiert. – Teilsummen
werden in MR gespeichert.
Würden wir jeweils das nächste eintreffende Folgenelement in einem freien Speicherelement ablegen, so würde der Speicherbedarf im Laufe der Zeit wachsen, und
zwar unbegrenzt. Die Größe des Arrays w kann aber beschränkt werden, da wir nur
Zugriff auf die n aktuellsten Werte benötigen. Die Wiederverwendung von Speicher
ist durch Verwendung eines Ringpuffers und den Einsatz von Modulo-Adressierung
realisierbar. Zu diesem Zweck werden die in Abb. 3.22 zu sehenden Längenregister
L0-L7 benutzt. Wenn in einem geeigneten Register der Grad n des Filters abgelegt
wird, erfolgt die Adressierung des Speichers modulo n.
Die erwähnten Register haben offenbar verschiedene Aufgaben, sie sind heterogen. Heterogene Registersätze sind für DSP-Prozessoren charakteristisch.
Um Zyklen für das Testen auf das Schleifenende einzusparen, stellen DSPProzessoren häufig zero-overhead loop instructions bereit. Diese erlauben es, einen
einzelnen Befehl oder eine kleine Zahl von Befehlen mehrmals zu wiederholen.
Damit kommen wir zur Vorstellung der Realisierung des Filters aus Gleichung
(3.21) mit Prozessoren der ADSP 2100-Familie (adaptiert aus [14]):
/* äußere Schheife über Abtastzeitpunkte t s */ {
L0 = n; L4 = n;
/* Ringpufferränge */
M1 = 1; M5 = 1;
/* Inkrement für Indexregister */
I0 = Adresse äätester Wert in w; I4 = Beginn der Fiitertabeeee a;
MX0 = DM[I0]; MY0 = PM[I4];
/* Lade äätestes w[] & a 0 */
MR = 0; I0 = I0 + M1; I4 = I4 + M5;
/* Ringpuffer-gewahre Addition */
for (k=0; k < (n − 1); k++) {
/* n-1 Iterationen */
MR = MR + MX0 * MY0; MX0 = DM[I0]; MY0 = PM[I4]; /* MAC Operation */
I0 = I0 + M1; I4 = I4 + M5;
/* Ringpuffer-gewahre Addition */
}
MR = MR + MX0 * MY0; x[s] = MR;
/* MAC für jüngstes EEem. */
}
Die äußere Schleife entspricht den fortschreitenden Abtastzeitpunkten. Zu Beginn
jeder Filterberechnung erfolgt die Initialisierung der Register. Ein einzelner Befehl
realisiert den inneren Schleifenkörper, bestehend aus vier Operationen:
• Lesen von zwei Argumenten aus den Registern MX0 bzw. MY0, Multiplizieren der
Argumente und Addieren des Ergebnisses zur Teilsumme in Register MR,
• Laden der nächsten Elemente der Arrays a und w aus den Speichern PM und DM
und Speichern der Werte in den Argumentregistern MX0 und MY0,
Précédent

- 189/485

Suivant