-
Die
Erfindung betrifft ein Verfahren und eine programmgesteuerte Einheit
zur Bitfeldverschiebung in einer Speichereinrichtung einer programmgesteuerten
Einheit, insbesondere bei der Bitfeldmanipulation.
-
Derartige
programmgesteuerte Einheiten sind beispielsweise als Mikroprozessoren,
Mikrocontroller, Signalprozessoren oder dergleichen ausgebildet.
Die für
die programmgesteuerte Einheit gewählte Prozessorarchitektur in
Zusammenhang mit der jeweils gewählten
Compilertechnologie und der jeweiligen Applikation bestimmt im Wesentlichen
die Leistungsfähigkeit,
die Geschwindigkeit und die Flexibilität der programmgesteuerten Einheit.
-
Zur
hardwarenahen Programmierung steht dem Anwender der programmgesteuerten
Einheit eine Assembler-Programmiersprache zur Verfügung, die
auf der Basis eines Registermodels einen festen Befehlsatz (Instruction
Set) aufweist.
-
Beispiele
solcher programmgesteuerten Einheiten sind die von der Firma Infineon
Technologies AG vertriebenen Prozessoren der C166-Familie mit einer
16-Bit-Architektur sowie der TriCore mit einer 32-Bit-Architektur.
Diese programmgesteuerten Einheiten weisen eine Speichereinrichtung,
einen Befehlsdecodier-, Adress- und Datenregister, eine Pipeline
sowie Barrel-Shifter
und Bitmaskengenerator für
die Verarbeitung der Bitbefehle auf. Moderne programmgesteuerte
Einheiten, insbesondere Prozessoren mit Pipeline-Architektur oder
Protokollprozessoren, weisen als zusätzliche Funktionalität eine Bitfeldmanipulation
(Englisch: Bit Field Manipulation) auf. Bei der Bitfeldmanipulation
wird ein Bitsegment bestehend aus einem oder mehreren Bits, welche
in einem ersten Datentstring ent halten sind, aus dem ersten Datenstring
entnommen, bearbeitet und in ein entsprechendes Bitfeld in einem
zweiten Datenstring eingefügt.
Ein Datenstring kann beispielsweise ein Wort (32 Bit), ein Doppelwort
(64 Bit), ein Halbwort (16 Bit) etc. enthalten.
-
Zum
allgemeinen Hintergrund einer programmgesteuerten Einheit mit Bitfeldmanipulation
wird auf das US-Patent 6,061,783, die US-Patentanmeldung US 2002/0120828
A1 sowie auf die Spezifikation zu dem eingangs erwähnten TriCore-Microcontrollern
der Firma Infineon Technologies AG verwiesen. Diese Druckschriften
werden hinsichtlich der Bitfeldmanipulation vollinhaltlich in die
vorliegende Patentanmeldung miteinbezogen.
-
Ein üblicher
Befehl bei der Bitfeldmanipulation ist der „Move"-Befehl, bei dem einige Bits aus einem ersten
Datenwort entnommen werden und entsprechend modifiziert in ein zweites
Datenwort eingefügt
werden. Dieser „Move"-Befehl zur Bitfeldmanipulation
weist in der Assembler-Programmiersprache die folgende Struktur
auf:
-
Mit
dem „Move"-Befehl MVR wird
ein Bitsegment der Bitweite #bits vom Quellregister Rs an der Bitposition
#offset0 zum Zielregister Rd an der Bitposition #offset1 bewegt.
Formal gesehen wird diese Operation wie folgt beschrieben:
Rd(#bits,
#offset1) ⇐ Rs(#bits,
#offset0)
-
Um
diesen „Move"-Befehl mit einem
einfachen Befehlssatz umzusetzen, sind eine Vielzahl einzelner Programmcodes
erforderlich. Nachfolgend soll diese Umsetzung des „Move"-Befehls beispielhaft
dargestellt werden:
-
Die
erste Zeile des Programms gibt an, dass ein erste Byte (8 Bits)
an der Bitposition 0 an einer ersten Stelle R1 des Quellregisters
entnommen werden soll und an eine Bitposition an eine zweite Stelle
R2 bewegt werden soll. Die zweite Zeile bezeichnet, dass eben dieses
Bit an der zweiten Stelle R2 prozessiert (addiert) wird. Das Ergebnis
R3 des vorigen Prozessschrittes wird an die Stelle R15 im Zielregister
eingefügt
und abgespeichert (dritte Zeile). Diese Prozessschritte werden solange
wiederholt, bis sämtliche
32 Bit, also das gesamte Wort, aus dem Quellregister entnommen,
bearbeitet und ins Zielregister geschrieben wurde. Entsprechend wird
also gemäß der vierten
Zeile in obigem Programm das zweite Byte an der Bitposition 8 entnommen
und weitergeschoben.
-
Es
zeigt sich, dass für
die einfache Funktion des Befehls „Move" in diesem Fall insgesamt 12 Befehlsschritte
(Programmcodes) benötigt
werden. Ein Nachteil einer Vielzahl von Befehlsschritten besteht
darin, dass der Befehlsspeicher größer wird. Aufgrund häufiger Zugriffe
auf den Befehlsspeicher führt
dies unmittelbar zu einem größeren Energieverbrauch.
Darüber
hinaus führt
eine Vielzahl von Befehlsschritten auch zu einem entsprechend groß auszubildenden
Speicher, was letztendlich auch die Chip-Fläche vergrößert und damit die gesamte
programmgesteuerte Einheit zusätzlich
verteuert.
-
Die
obige Problematik wurde im Fall einer programmgesteuerten Einheit
mit direkter Adressierung der Register beschrieben. Bei dieser Adressierungsart
wird die Adresse (bzw. die Nummer) des Registers unmittelbar als
(Immediate-)Wert angegeben.
-
Darüber hinaus
existiert auch eine registerindirekte Adressierung, bei der die
Adresse des Registers der Inhalt eines anderen Registers ist. Diese
Adressierungsart hat gegenüber
der direkten Adressierung den Vorteil, dass beim Holen des Befehls
die Operandenadresse nicht gleichzeitig gelesen werden muss. Sie
wird eingesetzt, wenn innerhalb eines Programmteils häufig auf
dieselbe Operandenadresse zugegriffen wird.
-
Eine
Weiterbildung ist die registerindirekte Adressierung mit Displacement,
bei der die aktuelle Adresse aus dem Inhalt eines Adressregisters
von einer konstanten Adressdistanz (Displacement) berechnet wird. Dieses
Adressdistanz ist vorzeichenbehaftet (Zweierkomplement) und erlaubt
so eine positive bzw. auch negative Adressdistanz zur Basisadresse
im Adressregister. Diese Methode wird bei solchen Datenzugriffen
verwendet, die in einer festen Struktur im Speicher vorliegen. Durch
das Ändern
der Basisadresse im Adressregister wird so auf das gleiche Element
im nächsten
Datensatz zugegriffen, bzw. es kann eine variable Basisadresse berücksichtigt
werden.
-
Prozessoren
ohne die Möglichkeit
einer indirekten Speicheradressierung müssten im Falle eines 32-Bit-Speichers
beispielsweise drei einzelne Bit in ein 32-Bit-breites Datenwort
ablegen. Die übrigen
29 Bits dieses Datenwortes bleiben damit ungenutzt. Damit reduziert
diese Form der indirekten Datenadressierung, die nachfolgend auch
als Bitfeldzugriff auf den Datenspeicher bezeichnet wird, die Speichergröße des Datenspeichers
und somit auch die Chipfläche
signifikant. Ein solcher Bitfeldzugriff auf den Datenspeicher weist
allerdings keine Schleife mit einem sequentiellen Zugriff auf einzelne Bitstrukturen
auf, da bei den jeweiligen Zugriffen die Bitpositionen und deren
Offset-Wert als konstante Werte (sogenannte Immediate-Werte) vorgegeben
sind. Ein damit einhergehendes Problem besteht auch darin, dass
die Anzahl der Speicherzugriffe immer die gleiche bleibt, wodurch
im Vergleich zur herkömmlichen
Speicherzugriffen keine Energieeinsparung vorgesehen ist.
-
Diese
Problematik sei anhand des nachfolgenden Programmes, welches den
eingangs beschriebenen „Move"-Befehl MVR im Falle
einer registerindirekten Adressierung beschreibt, veranschaulicht:
-
-
Die
ersten beiden Zeilen geben an, dass ein Lesezeiger bzw. ein Schreibzeiger
an die entsprechenden Stellen R1, R3 geladen werden. Anschließend (dritte
Zeile) wird das erste Byte geladen. Nach zwei Programmschritten
(vierte und fünfte
Zeile), in denen keine Operation vorgesehen ist, wird gemäß der sechsten
Zeile das ausgelesene Byte prozessiert und gemäß der siebenten Zeile als Ergebnis
abgespeichert. Dieser Vorgang wird solange wiederholt, bis alle
vier Bytes ausgelesen wurden. Es ergeben sich damit insgesamt 22
Befehlsschritte für
den "Move"-Befehl, also zum
Verschieben eines einzelnen Wortes bestehend aus 32 Bit aus dem Speicher.
Eine große
Anzahl von Befehlsschritten und häufige Zugriffe auf den Speicher
führen
allerdings zu einem hohen Leistungsverbrauch der programmgesteuerten
Einheit und ferner zu einer großen
Chipfläche.
-
Bei
Anwendung einer programmgesteuerten Einheit, insbesondere einer
programmgesteuerten Einheit mit einem festen Befehlssatz (Instruction
Set), besteht somit der Bedarf, häufig wiederkehrende Funktionen
innerhalb eines auszuführenden
Programms effektiver zu gestalten.
-
Der
vorliegenden Erfindung liegt die Aufgabe zugrunde, eine verbesserte,
insbesondere eine vereinfachte, Bearbeitung von Befehlen bei einer
programmgesteuerten Einheit zu ermöglichen.
-
Die
der Erfindung zugrunde liegende Aufgabe wird erfindungsgemäß durch
ein Verfahren bzw. eine programmgesteuerte Einheit zur Bitfeldverschiebung
mit den Merkmalen der Patentansprüche 1 und 26 gelöst.
-
Demgemäß ist vorgesehen:
Ein
Verfahren zur Bitfeldverschiebung in einer Speichereinrichtung einer
programmgesteuerten Einheit infolge einer Ausführung eines Befehls bei dem
ein Bitsegment innerhalb einer ersten Speichereinheit in eine zweite Speichereinheit
verschoben wird, mit den folgenden Verfahrensschritten:
- (a) Auslesen des Bitsegments mit einer ersten Bitweite aus einem
ersten Bitfeld der ersten Speichereinheit beginnend an einem ersten
Startpunkt;
- (b) Speichern des ausgelesenen Bitsegments in erstes Bitfeld
der zweiten Speichereinheit beginnend an einem zweiten Startpunkt;
- (c) Aktualisieren des ersten und/oder des zweiten Startpunktes
um einen vorgegebenen Wert;
- (d) Speichern des aktualisierten ersten und/oder des zweiten
Startpunktes für
nachfolgende Verfahrensschritte. (Patentanspruch 1)
-
Eine
programmgesteuerte Einheit zur Bearbeitung von Befehlen in einem
Prozessor, insbesondere mit Pipeline-Architektur, mit
- – einem
Speicher, in dem Befehle abgelegt sind,
- – mit
mindestens einer Speichereinheit, aus der ein Bitsegment und/oder
ein Bitfeld auslesbar und/oder wieder einfügbar sind,
- – mit
mindestens einem zusätzlichen
Register zur Speicherung des aktualisierten ersten und/oder zweiten Startpunktes
mittels eines Verfahrens nach einem der vorstehenden Ansprüche,
- – mit
mindestens einer Einrichtung zur Berechnung des aktualisierten ersten
und/oder zweiten Startpunkts,
- – mit
einer Einrichtung zu Bitfeldmanipulation, die das Bitsegment innerhalb
des ersten Bitfeldes in einen Bereich des zweiten Bitfeldes verschiebt.
(Patentanspruch 26)
-
Vorteilhafte
Ausgestaltungen und Weiterbildungen sind den Unteransprüchen sowie
der Beschreibung unter Bezugnahme auf die Zeichnungen entnehmbar.
-
Der
vorliegenden Erfindung liegt die Erkenntnis zugrunde, dass immer
wiederkehrende Programmschritte nicht ständig neu aus einem Speicher
bzw. einem Register herausgeladen werden müssen. Die der vorliegenden
Erfindung zu Grunde liegende Idee besteht daher darin, diese wiederkehrenden
Programmschritte in eine Programmschleife (Loop) einzubetten. Damit
lässt sich
insbesondere bei einer Vielzahl von sich wiederholenden Programmschritten
die Anzahl der dafür
erforderlichen Befehle signifikant reduzieren. Eine Reduzierung
der einzelnen Programmschritte bzw. Programmfunktionen hat eine
Reduzierung des Leistungsverbrauchs und darüber hinaus durch einen geringeren
Speicher auch eine Reduzierung der Speichergröße zur Folge.
-
Sowohl
im Falle einer registerindirekten Adressierung eines Speichers wie
auch im Falle einer direkten Registeradressierung können mittels
des erfindungsgemäßen Verfahrens
bzw. der erfindungsgemäßen programmgesteuerten
Einheit die Speicherzugriffe bzw. die Registerzugriffe vorteilhafterweise
sehr gering gehalten werden.
-
Für die Implementierung
dieser Funktionalität
ist erfindungsgemäß eine Aktualisierung
des Bitpositionszeigers vorgesehen.
-
Das
erfindungsgemäße Verfahren
sieht für
diese zusätzliche
Funktionalität
vorteilhafterweise vor, dass die letzte bzw. alternativ auch die
nächste
Bitposition als Bitpositionszeiger (Startpunkt) abgespeichert wird. Dieser
Bitpositionszeiger gibt im Falle von sich wiederholenden Programmabschnitten
an, an welcher Stelle die Daten abgespeichert werden sollen bzw.
ausgelesen werden sollen. Dies wird erreicht durch Inkrementieren
eines festen Offsets mit dem letzten Bitpositionszeiger, der in
dem zusätzlichen
Register abgespeichert wird. Der neue Bitpositionszeiger ergibt
sich dann aus dem alten, abgespeicherten Bitpositionszeiger plus
dem vorgegebenen Offset bzw. der vorgegebenen Bitweite.
-
Für die Bitfeldmanipulation
im Falle einer direkten Adressierung wird erfindungsgemäß ein zusätzliches
Register einge führt.
Dieses zusätzliche
Register beinhaltet die Funktionalität einer Programmschleife, indem
sie die Bitposition beibehält,
bei der nach einem Auslesen eines Bitsegmentes aus einem Datenstring
das nächste
Bitsegment ausgelesen werden soll. Durch das Vorsehen dieses zusätzlichen
Registers zur Speicherung der letzten Bitposition wird die Anzahl
der Anschlüsse
des Registers vorteilhafterweise nicht verändert.
-
Durch
die vorliegende Erfindung wird die bestehende Funktionalität insbesondere
bei dem sequentiellen Auslesen von Daten aus einem Speicher unter
Verwendung variabler Bitpositionen erweitert. Zu diesem Zweck ist
eine Architektur der programmgesteuerten Einheit vorgesehen, welche
die zuletzt ausgelesenen Daten (sequentiell) in einem Cashe-Speicher
ablegt, wodurch aufgrund der dadurch wegfallenden Speicherzugriffe
der Leistungsverbrauch weiter reduziert wird. Es handelt sich hier
also um einen Datencashe-Speicher.
-
Die
vorliegende Erfindung wird nachfolgend anhand der in den Figuren
der Zeichnungen angegebenen Ausführungsbeispiele
näher erläutert. Es
zeigt dabei:
-
1 eine schematische Darstellung
zur Veranschaulichung des erfindungsgemäßen Verfahrens zur Bitfeldmanipulation
(Bit Field Manipulation) bei direkter Adressierung;
-
2 in einem Blockschaltbild
die Pipeline-Architektur der erfindungsgemäßen programmgesteuerten Einheit;
-
3 ein detailliertes Blockschaltbild
zur Veranschaulichung der Implementierung des zusätzlichen Registers
der erfindungsgemäßen programmgesteuerten
Einheit aus 2;
-
4 eine schematische Darstellung
des erfindungsgemäßen Verfahrens
zur Bitfeldverschiebung (Bit Field Movement) bei indirekter Adressierung;
-
5 das Blockschaltbild einer
programmgesteuerten Einheit zur Ausführung eines erfindungsgemäßen Verfahrens
zur Bitfeldverschiebung mittels indirekter Adressierung.
-
In
allen Figuren der Zeichnungen sind gleiche bzw. funktionsgleiche
Elemente und Signale – sofern nichts
anderes angegeben ist – mit
gleichen Bezugszeichen versehen worden.
-
Die
vorliegende Erfindung sieht vor, bei einer programmgesteuerten Einheit
mit Pipeline-Architektur für sich
wiederholende Programmschritte bzw. Programmblöcke eine Programmschleife einzuführen. Diese Schleife
sollte vorteilhafterweise ohne das Vorsehen zusätzlicher Registeranschlüsse möglich sein.
Das sich daraus ergebende Programm weist die folgende Funktionalität auf:
-
Dabei
bezeichnet Rs das Quellregister (Register Source) und Rd das Zielregister
(Register Destination). Offset0_reg und offset1_reg bezeichnen jeweils
die Bitpositionszeiger für
die entsprechenden Register. #bits bezeichnet die Bitweite und #offset0
bzw. #offset1 bezeichnen den jeweiligen Offset im Quellregister
und Zielregister, bei denen die jeweiligen Bitpositionszeiger bei
einem nachfolgenden Auslese- bzw. Einfügeschritt die entsprechenden
Bitsegmente auslesen bzw. einfügen.
Die erste Zeile beinhaltet also, dass ein Bitsegment der Bitbreite
#bits an der Stelle offset0_reg vom Quellregister an die Stelle
offset1_reg bewegt werden soll. Die nächsten beiden Zeilen bezeichnen
das erfindungsgemäße Verfahren,
bei dem sich die beiden aktuellen Bitpositionszeiger für Quellregister
und Zielregister aus der Addition des jeweils vorher verwendeten
Bitpositionszeiger mit dem entsprechenden Offset ergibt.
-
In
der Assembler-Programmiersprache hat das entsprechende Programm
die folgende Syntax:
-
In
einer vereinfachten Umsetzung ergibt sich daraus ein Programm mit
den folgenden Schritten:
-
Gemäß Zeile
1 des Programmes werden die Registerplätze vorbesetzt, indem sie initialisiert
werden. In Zeile zwei wird der Zählerstand
eines Zählers
auf drei gesetzt. Die Zeilen drei bis sechs beinhalten die Programmschleife,
wobei gemäß Zeile
drei jeweils ein Byte aus der entsprechenden Bitposition des Quellregisters ausgelesen
und geschrieben wird. Danach werden die Offsetregister aktualisiert.
In Programmzeile 5 wird der Inhalt von R3 auf die Adresse, die in
R15 enthalten ist, gespeichert (indirekte Adressierung). Die letzte
Zeile 6 setzt den Zählerstand
jeweils um eins nach unten (Dekrementieren). Ferner soll die Schleife
wieder bei Zeile drei fortgesetzt werden, solange bis der Zählerstand
null ist. Das bloße
Einführen
einer Schleife reduziert die Anzahl der für den „Move"-Befehl MVR erforderlichen Instruktionen
auf insgesamt 6 im Vergleich zu den eingangs dafür erforderlichen 12 Instruktionen.
-
Die
Schleife im obigen Programmablauf ist möglich durch Aktualisierung
der dem Quellregister und Zielregister Rs, Rd zugeordneten Bitpositionszeigers
offset0_reg, offset1_reg. 1 zeigt
eine schematische Darstellung zur Veranschaulichung dieses erfindungsgemäßen Verfahrens.
-
In 1 sind mit Rs und Rd jeweils
ein Datenwort aus dem Quellregister bzw. dem Zielregister bezeichnet.
Zunächst
werden die Bitpositionszeiger offset0_reg, offset1 reg initialisiert,
d.h. im vorliegenden Fall auf 0 gesetzt. In einem ersten Schritt
(1) wird das erste Byte (#bits = 8 Bits) beginnend von
der Startposition, die durch den Bitpositionszeiger offset0_reg
= 0 Bits festgelegt ist, in einen entsprechenden Bereich des Zielregisters
Rd beginnend mit der Startposition, die durch den Bitpositionszeiger
offset1_reg = 0 Bits festgelegt ist, geschrieben. Im zweiten Schritt
(2) wird das zweite Byte vom Quellregister Rs in das Zielregister
Rd geschrieben. Die Startpositionen, die festlegen, an welcher Position
das zweite Byte ausgelesen bzw. eingeschrieben wird, werden wiederum
durch die Bitpositionszeiger offset0_reg, offset1_reg bestimmt.
Vor dem zweiten Schritt (2) wurden allerdings diese Werte
der Bitpositionszeiger aktualisiert, indem die Werte der jeweils
alten Bitpositionszeiger, also offset0_reg und offset1_reg, durch
Addition mit einem jeweiligen Offset-Wert #offset0, #offset1 aktualisiert
werden. Im vorliegenden Beispiel sind beide Offset-Werte identisch
und betragen #offset0 = #offset1 = 8 Bits. Diese aktualisierten
Bitpositionszeiger offset0_reg, offset1_reg werden also bei dem
zweiten Schritt (2) für
die Bestimmung der Startposition berücksichtigt. Für die weiteren
Bytes (Schritte (3), (4)) werden die Bitpositionszeiger
offset0_reg, offset1_reg entsprechend aktualisiert.
-
Zur
Aktualisierung der jeweiligen Bitpositionszeigerwerte ist das Vorsehen
eines zusätzlichen
Registers erforderlich. Der Aufbau einer programmgesteuerten Einheit
mit einem solchen zusätzlichen
Register zum Speichern der jeweils, aktualisier ten Bitpositionszeigerwerte
wird nachfolgend anhand der 2 und 3 näher erläutert.
-
2 zeigt dabei anhand eines
Blockschaltbildes die Pipeline-Architektur einer erfindungsgemäßen programmgesteuerten
Einheit mit zusätzlichem
Register.
-
In 2 ist mit Bezugszeichen 1 die
entsprechende programmgesteuerte Einheit, die hier als Pipeline-Prozessor
ausgebildet ist, bezeichnet. Im vorliegenden Ausführungsbeispiel
ist eine dreistufige Pipeline vorgesehen. Die Bezugszeichen 2 bis 4 bezeichnen
dabei die verschieden Pipeline-Register für die einzelnen Pipelinestufen.
Die programmgesteuerte Einheit 1 enthält einen Befehlsspeicher 5,
in dem ein fester Befehlssatz (Instruction Set) abgelegt ist. Der
Befehlsspeicher 5 ist über
die Pipelinestufe 2 mit einem Befehlsdecoder 6 verbunden.
Dem Befehlsdecoder 6 nachgeschaltet ist das Quellregister 7,
aus dem abhängig
von den durch den Befehlsdecoder 6 decodierten Befehlen
Daten ausgelesen werden und über
die Pipelinestufen 3 einer Recheneinheit 8 zugeführt werden.
Die Recheneinheit 8 ist hier als arithmetisch logische
Einheit (ALU) ausgebildet. In der zweiten Pipelinestufe 3 kann
ferner ein Datenspeicher 9 vorgesehen sein, der eingangsseitig
ebenfalls mit dem Quellregister 7 gekoppelt ist. Die ALU-Einheit 8 und
der Datenspeicher 9 sind über die Pipelinestufe 4 einerseits
mit Ausgangsanschlüssen 10 und
andererseits mit einem Barrel-Shifter 11 verbunden. Der Barrel-Shifter 11 enthält eine
Einrichtung zur Bitfeldmanipulation. Der Barrel-Shifter 11 ist ausgangsseitig
mit dem Zielregister 12 gekoppelt.
-
Für die Implementierung
der oben anhand von 1 dargestellten
Funktionalität
zur Aktualisierung der Bitpositionszeiger für Quellregister 7 und
Zielregister 11 ist erfindungsgemäß ein zusätzliches Register 13 vorgesehen.
Dieses zusätzliche
Register 13 ist in 2 in
der zweiten Pipelinestufe 3 angeordnet und mit der ALU-Einheit 8 gekoppelt.
-
3 zeigt ein detailliertes
Blockschaltbild zur Veranschaulichung der Implementierung des zusätzlichen
Registers der erfindungsgemäßen programmgesteuerten
Einheit aus 2.
-
Aus
dem Programmspeicher 5 werden die einzelnen Befehle bzw.
Instruktionen inst ausgelesen und dem Befehlsdecoder 6 zugeführt. Der
Befehlsdecoder 6 erzeugt mittels der Signale #reg0, #reg1
die jeweiligen Registeradressen für das Quellregister Rs und
Zielregister Rd. Diese Signale #reg0, #reg1 werden dem Register 20 zugeführt, wobei
das Register 20 die Funktionalität des Quellregisters 7 und
des Zielregisters 12 beinhaltet. In Abhängigkeit der Registeradressen
#reg0, #reg1 werden aus dem Datenregister 20 Datensignale data1,
data0 ausgegeben und einem Multiplexer 21 zugeführt.
-
Die
programmgesteuerte Einheit enthält
ferner einen Barrel-Shifter 11,
einen Maskengenerator 22 sowie einen Addierer 23.
Die Elemente 11, 22, 23 dienen der Bitfeldmanipulation.
Der Befehlsdecoder 6 erzeugt ein Signal #bits, welches
eine Bitweite angibt und welches dem Maskengenerator 22 zugeführt wird.
Der Maskengenerator 22 erzeugt ausgehend davon eine Maske
zur Bitfeldmanipulation. Die Funktionsweise dieser Bitfeldmanipulation
ist dem Fachmann allgemein bekannt und beispielsweise in den bereits
in der Beschreibungseinleitung genannten Druckschriften ausführlich beschrieben,
so dass hier nicht näher
darauf eingegangen werden soll.
-
Der
Befehlsdecoder 6 stellt ausgangsseitig ferner zwei Offsetsignale
#offset0, #offset1 bereit, die in einer ersten Betriebsweise direkt
dem Addierer 23 zugeführt
werden. In dieser ersten Betriebsweise wird das Signal #offset1
im Addierer 23 vom Signal #offset0 abgezogen und das daraus
resultierende Signal sh0 dem Barrel-Shifter 11 zugeführt. Der
Barrel-Shifter 11,
dem darüber
hinaus das Datensignal data0 zuge führt wird, erzeugt ausgehend
davon ein Ausgangssignal, welches dem Multiplexer 21 zugeführt wird.
-
Die
programmgesteuerte Einheit weist erfindungsgemäß ein zusätzliches Register 13 auf,
welches neben dem ersten Betriebsmodus einen zweiten Betriebsmodus
ermöglicht.
Das zusätzliche
Register 13 weist zwei Eingänge und zwei Ausgänge auf.
Den Eingängen
des zusätzlichen
Registers 13 ist jeweils ein Addierer 24, 25 vorgeschaltet,
den beiden Ausgängen
ist jeweils ein Multiplexer 26, 27 nachgeschaltet.
Die Ausgangssignale offset0_reg, offset1_reg des zusätzlichen
Registers 13 werden einerseits den jeweils nachgeschalteten
Multiplexern 26, 27 zugeführt. Andererseits werden diese
Signale offset0_reg, offset1_reg über eine Rückkopplungsschleife den jeweiligen
Addierern 24, 25 zugeführt und dort mit den Offsetsignalen
#offset0, #offset1 addiert. Das Ergebnis dieser jeweiligen Additionen
wird jeweils in den entsprechenden Eingang des zusätzlichen
Registers 13 eingekoppelt.
-
Über das
Enable-Signal #so_enb, welches ebenfalls vom Befehlsdecoder 6 bereit
gestellt wird, werden die Multiplexer 26, 27 sowie
das zusätzliche
Register 13 gesteuert.
-
Mittels
der in den 2 und 3 dargestellten Anordnungen
lässt sich
vorteilhafterweise eine Implementierung des Befehls „Move" und damit auf sehr
einfache, leistungssparende Weise eine Bitfeldmanipulation, durchführen.
-
Das
obige anhand der 1 bis 3 beschriebene Ausführungsbeispiel
bezog sich auf eine direkte Adressierung, bei der eine Bitfeldmanipulation
vorgenommen wurde. In dem nachfolgenden, anhand der 4 und 5 beschriebenen
Ausführungsbeispiel
wird das erfindungsgemäße Verfahren
für eine
registerindirekte Adressierung eines Speicherzugriffes, bei dem
eine Bitfeldverschiebung (Bit Field Movement) vorgenommen werden
soll, eingesetzt. Im Falle des eingangs beschriebenen „Move"-Befehls führt das
erfindungsgemäße Verfahren
in diesem Fall die folgenden Instruktionen aus:
Bei einem Lesevorgang:
Rd ⇐ mem((base_adr
+ #disp), bit_pos, #bits)
Bei einem Schreibvorgang:
mem((base_adr
+ disp), bit_pos, #bits) ⇐ Rs
-
Dabei
bezeichnen Rs und Rd wiederum den Inhalt von Quellregister bzw.
Zielregister. Base_adr bezeichnet eine Startadresse in dem als Stackspeicher
ausgebildeten Speicher. #disp bezeichnet die Adressdistanz (Displacement)
der Adresse zu der Basisadresse in dem Stackspeicher und bit pos
bezeichnet den Bitpositionszeiger. #bits bezeichnet wiederum die
Bitweite, also die Anzahl der zu bewegenden Bits. Für die Assembler-Betriebssprache
ergibt sich somit die folgende Syntax im Falle eine Lesevorgangs:
-
Dabei
ist das Register @Rs als Basisadresse base_adr = Rs [31:5] gesetzt
und der Bitzeiger bit_pos = Rs [4:0] gesetzt. #auto_increment =
1 bezeichnet, dass der Bitpositionszeiger jeweils um die Anzahl
der Bits #bits weitergesetzt wird. Es gilt ferner Rs ⇐ Rs + #bits.
-
Der
Befehl Speichern STX weist eine ähnliche
Assemblersyntax auf:
-
Hier
ist das Register @Rd mit der Basisadresse base_adr = Rd [31:5] und
die Bitposition bit_pos = Rd [4:0] gesetzt.
-
Es
ergibt sich in einer vereinfachten Umsetzung damit der folgende
Programmablauf bei einem Lesebefehl:
-
Gemäß den ersten
beiden Zeilen dieses Programms werden zunächst die Positionszeiger für den Stackspeicher
geladen. Ferner werden die Positionszeiger bit_pos auf 0 gesetzt.
Gemäß Zeile
drei wird festgelegt, dass 8 mal jeweils 1 Byte prozessiert werden
muss. Die Zeilen vier bis neun geben die erfindungsgemäße Programmschleife
an. Dabei wird zunächst
gemäß Zeile
vier ein Bitsegment geladen, gemäß Zeile
sieben entsprechend prozessiert und gemäß Zeile acht wieder an eine
entsprechende Zeile des Zielregisters geschrieben. Gemäß Zeile
neun wird der Schleifenzähler
um eins zurückgesetzt
und die Schleife beginnt wieder von vorn, solange, bis der Schleifenzähler bei
Null angelangt ist.
-
Es
ergeben sich hier im Vergleich zu den in der Beschreibungseinleitung
für denselben
Befehl benötigten
22 Instruktionen zum Auslesen und Verschieben eines Datenwortes
aus dem Speicher lediglich neun Instruktionen. Damit geht eine deutliche
Reduzierung der Leistungsaufnahme einher.
-
Anhand
der schematischen Darstellung in 4 soll
dieses erfindungsgemäße Verfahren
zur Bitfeldverschiebung (Bit Field Movement) bei indirekter Adressierung
erläutert
werden.
-
Im
Falle einer indirekten Adressierung mit Displacement legt der Registerinhalt
Rs des Quellregisters fest, an welcher Stelle des Stackspeichers 9 die
Daten ausgelesen werden sollen. Zu diesem Zwecke weist das Quellregister
Rs ein erstes Bitsegment 30 auf, in dem die entsprechende
Adresse im Speicher 9 angegeben ist. Das Signal #disp gibt
einen Adressabstand bezogen auf die im Quellregister angegebene
Adresse an, die somit die aktuelle Adresse bestimmt. Ein zweites
Bitsegment 31 enthält
den Positionszeiger bit_pos, der angibt, an welcher Stelle der aktuellen
Adresse die Daten mit der Bitweite #bits ausgelesen werden sollen.
Dieses aus dem Stackspeicher 9 ausgelesene Bitsegment 32 wird
dann in das Bitsegment 33 des Zielregisters mit dem Inhalt
Rd eingefügt.
-
Im
Beispiel in 4 wird das
Bitsegment 32 dabei in das Bitsegment 33 beginnend
mit Null des Zielregisters Rd eingeschrieben, jedoch könnte es
auch, je nach Implementierung, an einer beliebigen Stelle des Zielregisters
Rd eingeschrieben werden.
-
Mittels
des erfindungsgemäßen Verfahrens
werden bei konstant bleibendem Inhalt Rs des Quellregisters 7 fortwährend Datensegmente 32 aus
dem Stackspeicher 9 in das Zielregister an die Stelle 33 geschrieben.
Der Adressabstand #disp bleibt dabei stets konstant. Es wird lediglich
die jeweilige Bitposition bit_pos für den nächsten Ausleseschritt aktualisiert.
-
Für den ersten
Ausleseschritt n gilt beispielsweise:
n: bit_pos = 16; #bits
= 10
-
Für den nächsten Ausleseschritt
n + 1 gilt dann im Falle eines 32 bit Datenwortes:
n + 1: bit_pos
= 10 + 16 = 26; #bits = 6
-
In
einer vorteilhaften Ausgestaltung erfolgt für den Fall, dass das Datensegment 32 am
Ende des entsprechenden Datenwortes 34 im Stackspeicher 9 angelangt
ist, ein Übertrag
auf den Adressinhalt im Bitsegment 30. Dabei wird die im
Bitsegment 30 abgelegte Adresse mit Eins addiert. Dies
bewirkt, dass die Adresse im Stackspeicher 9 um eine Zeile
nach unten versetzt wird und bei konstantem Adressabstand somit
auch die aktuelle Adresse um eine Zeile nach unten versetzt wird.
Durch den Übertrag
wird darüber
hinaus der Positionszeiger aufgrund des Rücksetzens der Bitposition im
Bitsegment 31 auf null gesetzt, so dass das Datenwort in
der nachfolgende Zeile beginnend mit Null ausgelesen werden kann.
-
5 zeigt das Blockschaltbild
einer programmgesteuerten Einheit für die Implementierung des erfindungsgemäßen Verfahrens
zur Bitfeldverschiebung mittels indirekter Adressierung entsprechend 4. Die 5 wie auch die oben beschriebene 3 zeigen lediglich eine
schematische Darstellung der programmgesteuerten Einheit, d. h.
dort sind insbesondere funktionelle Einheiten, die nicht direkt
für die
Darstellung der Erfindung notwendig sind, der besseren Übersicht
wegen nicht dargestellt worden.
-
Im
Unterschied zu der direkten Adressierung aus 3 werden die Befehlscodes #reg0, #reg1
nicht in den Befehlsdecoder 6 eingekoppelt, sondern direkt
in das Register 20. Die Signale #reg0, #reg1 entsprechen
den Registerinhalten Rs, Rd des Quellregisters bzw. des Zielregisters.
-
Der
Befehlsdecoder 6 erzeugt das Ausgangssignal #disp, welches
in dem Addierer 40 zusammen mit dem Ausgangssignal A des
Registers 20 addiert wird. Das sich daraus ergebende Signal
bezeichnet die aktuelle Adresse im Stackspeicher 9, welche
dem Adresseingang a_mem des Stackspeichers 9 zugeführt wird.
An einem Ausgang o_mem des Stackspeichers 9 wird ausgehend
von der jeweiligen aktuellen Adresse ein auszulesendes Bitsegment
dem Barrel-Shifter 11 zugeführt.
-
Der
Befehlsdecoder 6 erzeugt ferner das Signal #bits, welches
dem Maskengenerator 22 zugeführt wird, der ausgehend davon
ein Signal mask erzeugt, welches dem Barrel-Shifter 11 zugeführt wird.
Der Barrel-Shifter 11 erzeugt daraus und aus dem vom Stackspeicher 9 ausgelesenen
Datensignal ein verschobenes Datensignal, welches in das Zielregister 20 geschrieben
wird. Darüber
hinaus wird der Positionszeiger für die nächste Adressierung aktualisiert.
-
Die
programmgesteuerte Einheit in 5 weist
ferner eine Steuereinheit 41 zum Steuern des Lesevorgangs
aus dem Speicher 9 auf. Über das Signal #cs, welches
vom Befehlsdecoder 6 der Steuereinheit 41 zugeführt wird,
wird ein Speicherzugriff auf den Stackspeicher 9 erst möglich gemacht.
Zu diesem Zweck weist der Stackspeicher 9 einen Steuereingang
cs_mem auf, in den ein Steuersignal cs_o der Steuereinheit 41,
welches vom Signal #cs abgeleitet ist, einkoppelbar ist.
-
Das
ebenfalls vom Befehlsdecoder 6 zur Verfügung gestellte Signal #auto_increment
wird zur Steuerung der Inkrementierung bzw. auch Dekrementierung
des Lese- bzw. Schreibzeigers nach einer erfolgten Lese- bzw. Schreiboperation
verwendet.
-
Zwischen
dem Datenausgang o_mem des Speichers 9 und dem Barrel-Shifter 11 ist
in einer vorteilhaften Ausgestaltung ein Cashe-Speicher 42 vorgesehen.
Der Cashe-Speicher 42 ist ferner mit dem Ausgang oder Speichereinheit 41 verbunden
und damit mit dem Steuersignal cs_o beaufschlagbar. Über den
Eingang adr ist der Steuereinheit 41 die jeweils aktuelle
Adresse, mit der der Speicher 9 von dem Register 20 adressiert wird,
verbunden. Die Steuereinheit 41 vergleicht diese aktuelle
Adresse mit bereits früher
eingekoppelten Adressen und stellt damit fest, ob die aktuelle Adresse
bereits vorher vorhanden war. Ergibt dieser Vergleich, dass die
Adresse bereits vorhanden war, dann wird der Speicher 9 über das
Steuersignal cs_0 inaktiviert. Die entsprechenden Daten werden statt
dessen aus dem Cashe-Speicher 42 ausgelesen. Das aus dem
Cashe-Speicher 42 ausgelesene Bitsegment wird über den
Barrel-Shifter 11 verschoben und über den Maskengenerator 21 maskiert
und dann als neue Basisadresse in das Zielregister im Register 20 zurückgeschrieben.
Voraussetzung dafür
ist, dass die der jeweils aktuellen Adresse entsprechenden Daten
noch in dem Cashe-Speicher 42 vorhanden sind. Da für diese
sehr vorteilhafte Implementierung nicht eigens auf den Stackspeicher 9 zugegriffen
wird, sondern die entsprechenden Daten direkt aus dem Cashe-Speicher 42 ausgelesen
werden können,
ergibt sich vorteilhafterweise eine signifikante Reduzierung des
Energieverbrauchs.
-
Obwohl
die vorliegende Erfindung vorstehend anhand eines bevorzugten Ausführungsbeispiels
beschrieben wurde, ist sie darauf nicht beschränkt, sondern auf vielfältige Weise
modifizierbar.
-
So
kann beispielsweise die programmgesteuerte Einheit als Mikrocontroller,
Mikroprozessor, Signalprozessor oder dergleichen ausgebildet sein.
Es kann sich dabei um einen Prozessor mit Pipeline-Architektur oder
einen Protokollprozessor handeln.
-
Darüber hinaus
wurde die Erfindung vorstehend anhand einer 32-Bit-Prozessorarchitektur
beschrieben, jedoch ist sie nicht darauf beschränkt. Vielmehr kann hier eine
beliebige Prozessorarchitektur mit 64 Bits, 16 Bits, 8 Bits oder
einer beliebig anderen Bitweite vorgesehen sein.
-
Auch
ist die vorliegende Erfindung nicht auf die vorstehenden Adressierungsarten,
nämlich
einer direkten Registeradressierung oder einer indirekten Registeradressierung
mit Displacement, beschränkt,
sondern kann auf beliebige Adressierungsarten erweitert werden.
-
Darüber hinaus
kann die angegebene Pipelinestruktur auch mehr oder weniger als
drei Stufen aufweisen.
-
Die
Erfindung sei ferner nicht auf das Auslesen bzw. Beschreiben von
als Register ausgebildete Speicher festgelegt, sondern kann im Rahmen
der Erfindung zum Auslesen und Beschreiben von beliebigen Speichern,
z. B. Adress- oder Datenregister, aber auch auf Datenspeicher wie
RAM, SRAM, etc. erweitert werden.
-
Das
erste und/oder das zweite Bitfeld ist in den vorstehenden Ausführungsbeispielen
als 32-Bit breites Datenwort ausgebildet und das auszulesende Bitsegment
weist eine Bitweite von 8 Bits auf. Die Erfindung sei aber nicht
darauf beschränkt,
sondern kann selbstverständlich
auf beliebig breite Bitfelder erweitert werden. Wesentlich ist nur,
dass die Bitsegmente zumindest eine gleiche oder geringere Bitweite
als die Bitfelder aufweisen.
-
- 1
- programmgesteuerte
Einheit
- 2 – 4
- Pipelinestufen
- 5
- Befehlsspeicher,
Programmspeicher
- 6
- Befehlsdecoder
- 7
- Quellregister
- 8
- Recheneinheit,
ALU
- 9
- Datenspeicher
- 10
- Ausgangsanschlüsse
- 11
- Barrel-Shifter
- 12
- Zielregister
- 13
- zusätzliches
Register
- 20
- Register
- 21
- Multiplexer
- 22
- Maskengenerator
- 23 – 25
- Addierer
- 26 – 27
- Multiplexer
- 30
- Bitsegment
für die
Adresse
- 31
- Bitsegment
für den
Positionszeiger
- 32
- Bitsegment
für auszulesende
Daten
- 33
- Bitsegment
für einzulesende
Daten
- 34
- Datenwort,
Dateninhalt
- 40
- Addierer
- 41
- Steuereinheit
- 42
- Cashe-Einheit