-
HINTERGRUND
-
1. Gebiet der Erfindung
-
Die
vorliegende Anmeldung bezieht sich im Allgemeinen auf die Fehlerkorrektur
von Daten mit Fehlerkorrekturcodes (z.B. Bose-Chaudhuri-Hocquenghem
(BCH), Reed-Solomon-Codes und dgl.) und insbesondere auf einen Fehlerkorrektur-Decodierer, der Zellen
mit Teilsyndromerzeugung verwendet.
-
2. Stand der Technik
-
Die
Fehlerkorrektur von Daten kann bei verschiedenen Anwendungen, wie
beispielsweise Datenspeichervorrichtungen, Telekommunikationssystemen
und dgl., verwendet werden. Beispielsweise werden bei einer Datenspeichervorrichtung
Daten durch Schreiben der Daten in ein Speichermedium in der Speichervorrichtung
gespeichert. Die gespeicherten Daten können später von der Speichervorrichtung
durch Lesen der Daten von dem Speichermedium wiederhergestellt werden.
Aus einer Anzahl von Gründen
kann jedoch ein Fehler in den von der Speichervorrichtung wiederhergestellten
Daten existieren, was bedeutet, dass die gespeicherten Daten nicht
wiederhergestellt werden können
oder sich von den Daten unterscheiden, die ursprünglich auf dem Speichermedium
gespeichert wurden. Beispielsweise kann sich ein Abschnitt der gespeicherten
Daten auf dem Speichermedium mit der Zeit verschlechtern, so dass
der Abschnitt der gespeicherten Daten nicht ordnungsgemäß zu einer
späteren
Zeit gelesen werden kann.
-
Herkömmliche
Fehlerkorrekturtechniken umfassen das Erzeugen oder Codieren von
einem oder mehreren Redundanzblöcken
für Daten,
die bei einem Decodierprozess verwendet werden können, um Fehler in den Daten
zu korrigieren. Typischerweise wird der Decodierprozess mit spezialisierter
Hardware durchgeführt,
die dazu neigt, kompliziert und schwierig zu modifizieren zu sein.
-
Die
IEEE-Veröffentlichung "Variable Shortened-and-Punctured Reed-Solomon
Codes for Packet Loss Protection",
Youshi Xu, Tingting Zhan, 03.09.2002, IEEE Transactions on Broadcasting,
offenbart ein Verfahren eines Nur-Lösch-Decodierens (erasure-only decoding)
von Reed-Solomon-Codes mit den Schritten des Berechnens eines Syndromvektors
mit einer Grundzelle, Invertieren einer "Fehlerpositionsmatrix", die eine Vandermonde-Matrix
ist, und Multiplizieren der Matrix durch den Vektor mit n-k parallelen
Zellen.
-
ZUSAMMENFASSUNG
-
Bei
einer beispielhaften Ausführungsform umfasst
ein Decodierer, um Fehler in Daten zu korrigieren, eine Mehrzahl
von Zellen. Jede Zelle erzeugt ein Teilsyndrom basierend auf Datenblöcken und
einem oder mehreren Redundanzblöcken.
Jede Zelle erzeugt einen Teilfehlerwert basierend auf einem Abschnitt
der Inversen einer Fehlerpositionsmatrix, die Positionen aller Datenblöcke kennzeichnet,
die Fehler aufweisen. Eine mit der Mehrzahl von Zellen verbundene
Summationslogik erzeugt einen Fehlerwert basierend auf den durch
die Mehrzahl von Zellen erzeugten Teilfehlerwerten. Der Fehlerwert
korrigiert Fehler in einem Datenblock mit Fehlern.
-
KURZE BESCHREIBUNG DER
FIGUREN
-
1 stellt
ein beispielhaftes Host-Terminal dar, das mit einer beispielhaften
Speichervorrichtung verbunden ist;
-
2 stellt
eine beispielhafte Einheit dar, die einen Satz von Datenblöcken, Redundanzblöcken und
zyklischen Redundanzprüfcodes
umfasst;
-
3 stellt
Abschnitte der beispielhaften Einheit von 2 dar;
-
4 stellt
einen beispielhaften Decodierer dar;
-
5 stellt
eine beispielhafte Zelle des in 4 dargestellten
beispielhaften Decodierers dar;
-
6 stellt
einen beispielhaften Leseprozess dar, der durch die in 5 dargestellte
beispielhafte Zelle durchgeführt
wird;
-
7 stellt
einen Abschnitt der in 5 dargestellten beispielhaften
Zelle dar;
-
8 stellt
einen beispielhaften Schreibprozess dar, der durch die in 5 dargestellte
beispielhafte Zelle durchgeführt
wird, und
-
9 stellt
einen weiteren Abschnitt der in 5 dargestellten
beispielhaften Zelle dar.
-
AUSFÜHRLICHE BESCHREIBUNG
-
Die
folgende Beschreibung stellt zahlreiche spezifische Konfigurationen,
Parameter und dgl. vor. Es ist jedoch ersichtlich, dass diese Beschreibung nicht
als eine Begrenzung des Schutzumfangs der Erfindung bestimmt ist,
sondern stattdessen vorgesehen ist, um eine bessere Beschreibung
beispielhafter Ausführungsformen
zu liefern.
-
Beispielsweise
wird eine Fehlerkorrektur von Daten einer Speichervorrichtung nachstehend
beschrieben. Es ist jedoch ersichtlich, dass eine Fehlerkorrektur
bei verschiedenen Anwendungen, einschl. Telekommunikation, verwendet
werden kann.
-
In 1 wird
ein Host-Terminal 102 dargestellt, das mit einer Speichervorrichtung 104 verbunden
ist. Der Host-Computer 102 kann
jede Art von Computer, wie beispielsweise ein Personalcomputer, eine
Workstation, ein Server und dgl. sein. Die Speichervorrichtung 104 kann
jede Art von Speicherlaufwerk, wie beispielsweise ein Bandlaufwerk,
ein Festplattenlaufwerk und dgl. sein. Es ist ersichtlich, dass das
Host-Terminal 102 mit einer beliebigen Anzahl von Speichervorrichtungen 104 verbunden
sein kann, und eine beliebige Anzahl von Host-Terminals 102 mit
einer oder mehreren Speichervorrichtungen 104 verbunden
sein kann.
-
Weiterhin
mit Bezug auf 1 ist bei einer beispielhaften
Ausführungsform
die Speichervorrichtung 104 konfiguriert, um Fehler bei
in der Speichervorrichtung 104 gespeicherten Daten zu erfassen und
zu korrigieren. Genauer gesagt ist, wenn die in der Speichervorrichtung 104 gespeicherte
Daten wiederhergestellt werden, die Speichervorrichtung 104 konfiguriert,
um Redundanzblöcke
zu verwenden, die ebenfalls als Fehlerkorrekturcode-Redundanzblöcke (ECC-Redundanzblöcke) bezeichnet werden,
um Fehler in den wiederhergestellten Daten zu korrigieren, wie beispielsweise,
wenn sich die wiederhergestellten Daten von den Daten unterscheiden,
die ursprünglich
in der Speichervorrichtung 104 gespeichert wurden, oder
wenn die gespeicherten Daten nicht wiederhergestellt werden können. Außerdem können innere
Codes, wie beispielsweise zyklische Redundanzprüfcodes (CRC-Codes) verwendet
werden, um Fehler in den wiederhergestellten Daten zu erfassen.
Es ist jedoch ersichtlich, dass Fehlerkorrekturcodes, wie beispielsweise
Reed-Solomon-Codes, verwendet werden können, um Fehler zu erfassen
sowie auch zu korrigieren.
-
Bei
der in 1 dargestellten Ausführungsform umfasst die Speichervorrichtung 104 ein
Speichermedium 106, einen Kanal und Lese/Schreibkopf 108,
einen Prozessor 110 und eine Fehlererfassung/Korrektureinheit 112.
In der Speichervorrichtung 104 werden Daten in dem Speichermedium 106 gespeichert.
Der Lese/Schreibkopf 108 liest und/oder schreibt Daten
in das Speichermedium 106. Der Prozessor 110 steuert
den Betrieb der Speichervorrichtung 104, einschließlich des
Betriebs des Kanals und des Lese/Schreibkopfs 108. Wie
nachstehend ausführlicher
beschrieben wird, erfasst und korrigiert die Fehlererfassung/Korrektureinheit 112 Fehler
in den in dem Speichermedium 106 gespeicherten Daten.
-
Bei
der vorliegenden beispielhaften Ausführungsform umfasst die Fehlererfassung/Korrektureinheit 112 einen
Datenpuffer 114, einen Redundanzblockcodierer/-decodierer 116 und
einen Codierer/Decodierer für
einen inneren Code 118. Wenn Daten auf dem Speichermedium 106 zu
speichern sind, werden Daten von dem Host-Terminal 102 empfangen
und in den Datenpuffer 114 geschrieben. Der Redundanzblockcodierer/-decodierer 116 erzeugt Redundanzblöcke für Daten
in dem Datenpuffer 114. Der Codierer/Decodierer für einen
inneren Code 118 erzeugt innere Codes (z.B. CRC-Codes,
Reed-Solomon-Codes
und dgl.) für
Daten in dem Datenpuffer 114. Der Lese/Schreibkopf 108 schreibt
dann die Daten und die erzeugten Redundanzblöcke und inneren Codes in das
Speichermedium 106.
-
Wenn
Daten von dem Speichermedium 106 zu lesen sind, liest der
Lese/Schreibkopf 108 Daten, Redundanzblöcke und innere Codes von dem
Speichermedium 106 in den Datenpuffer 114. Wie
nachstehend ausführlicher
beschrieben wird, werden alle Fehler in den von dem Speichermedium 106 gelesenen
Daten mit den inneren Codes und Redundanzblöcken erfasst und korrigiert.
Die Daten können dann
zu dem Host-Terminal 102 transferiert werden.
-
Bei
der vorliegenden beispielhaften Ausführungsform werden Daten zwischen
dem Host-Terminal 102 und der Speichervorrichtung 104 in
Datensätzen
transferiert, die in einem Puffer gespeichert sind. Die Datensätze werden
in Datenblöcke
einer vorbestimmten Länge,
wie beispielsweise zwei kByte, vier kByte, sechs kByte und dgl.
aufgeteilt. Es ist jedoch ersichtlich, dass Datenblöcke verschiedener
Längen verwendet
werden können.
-
Nachdem
die Datenblöcke
von dem Speichermedium 106 wiederhergestellt sind, werden
die wiederhergestellten Datenblöcke
mit Fehlern erfasst, wobei ein Fehler in einem wiederhergestellten
Datenblock angibt, dass die Daten in dem wiederhergestellten Datenblock
nicht gelesen werden können
oder sich von den Daten in dem Datenblock unterscheiden, wie sie
in dem Datenblock ursprünglich
in dem Speichermedium 106 gespeichert wurden. Beispielsweise
können
CRC-Codes verwendet werden, um zu erfassen, wenn sich die Daten
in dem wiederhergestellten Datenblock von den Daten in dem Datenblock
unterscheiden, als die Daten ursprünglich in dem Speichermedium 106 gespeichert
wurden. Genauer gesagt wird vor dem Speichern eines Datenblocks
in einem Speichermedium 106 ein CRC-Code für den Datenblock
erzeugt und mit dem Datenblock in dem Speichermedium 106 gespeichert.
Wenn der Datenblock später
wiederhergestellt wird, wird ein neuer CRC-Code für den wiederhergestellten Datenblock
erzeugt. Der neue CRC-Code wird dann mit dem von dem Speichermedium 106 wiederhergestellten
CRC-Code verglichen, der dem wiederhergestellten Datenblock entspricht
und ursprünglich
für den
wiederhergestellten Datenblock erzeugt wurde, bevor der wiederhergestellte
Datenblock in dem Speichermedium 106 gespeichert wurde.
Wenn sich der neue CRC-Code und der wiederhergestellte CRC-Code
unterscheiden, dann wird ein Fehler für diesen Datenblock erfasst.
Es ist jedoch ersichtlich, dass verschiedene Arten von Fehlererfassungscodes,
einschließlich
Reed-Solomon-Codes, verwendet werden können.
-
Bei
der vorliegenden beispielhaften Ausführungsform gekennzeichnet eine
Fehlerpositionsmatrix die Position aller Daten, die von dem Speichermedium
mit Fehlern wiederhergestellt wurden. Beispielsweise kann eine beispielhafte
Fehlerpositionsmatrix ausgedrückt
werden als:
wobei X die Position eines
Fehlers und ρ die
Gesamtzahl von fehlerhaften Datenblöcken und Redundanzblöcken ist.
-
Bei
der vorliegenden beispielhaften Ausführungsform wird die Inverse
der Fehlerpositionsmatrix erzeugt. Beispielsweise kann die Inverse
der beispielhaften Fehlerpositionsmatrix bei dem obigen Beispiel
wie folgt ausgedrückt
werden:
-
Es
sei bemerkt, dass die Fehlerpositionsmatrix eine Vandermonde-Matrix
ist, die im Allgemeinen O(ρ2) Operationen erfordert, um die Inverse
zu berechnen, verglichen mit allgemeinen Matrixinversionen, die
O(ρ3) Operationen erfordern. Eine Zeile in der
Vandermonde-Matrix besteht aus einem konstanten Wert hoch inkrementierender
Potenzen beginnend mit Null. Die Inverse der Fehlerpositionsmatrix kann
durch Firmware oder Hardware mit verschiedenen Matrix-Inversionsverfahren
erzeugt werden.
-
Bei
der vorliegenden beispielhaften Ausführungsform werden Redundanzblöcke verwendet,
um Fehler in den wiederhergestellten Datenblöcken zu korrigieren. Genauer
gesagt werden vor dem Speichern von Datenblöcken in dem Speichermedium 106 Redundanzblöcke basierend
auf Datenblöcken erzeugt
und mit den Datenblöcken
in dem Speichermedium 106 gespeichert. Wenn die Datenblöcke später wiederhergestellt
werden, werden Datenblöcke,
die als fehlerhaft gekennzeichnet sind, mit den Redundanzblöcken korrigiert.
-
Bei
der vorliegenden beispielhaften Ausführungsform sind Redundanzblöcke Bose-Chaudhuri-Hocquenghem-Codes
(BCH-Codes), und insbesondere Reed-Solomon-Codes. Für eine ausführlichere
Beschreibung von Reed-Solomon-Codes sh. Peterson & Weldon, Error
Correcting Codes, 2te Auflage, MIT-Press 1972, die in ihrer Gesamtheit
hier durch Bezug aufgenommen ist. Es ist jedoch ersichtlich, dass
verschiedene Arten von Fehlerkorrekturcodes verwendet werden können.
-
Bei
der vorliegenden beispielhaften Ausführungsform werden ein Satz
von Datenblöcken,
ein Satz von Redundanzblöcken
und ein Satz von Redundanzsymbolen eines inneren Codes zusammen als
eine Gruppe gelesen und geschrieben, die als eine "Entität" bzw. „Einheit" bezeichnet wird.
Beispielsweise wird in 2 eine Entität 202 mit 16 Datenblöcken 204,
4 Redundanzblöcken 206 und
20 Redundanzsymbolen eines inneren Codes 208 dargestellt.
Es ist jedoch ersichtlich, dass die Entität 202 verschiedene
Anzahlen von Datenblöcken 204,
Redundanzblöcken 206 und
Redundanzsymbole eines inneren Codes 208 umfassen kann.
Die Entität 202 kann
beispielsweise 32 Datenblöcke 204 und
8 Redundanzblöcke 206,
112 Datenblöcke 204 und
16 Redundanzblöcke 206 und
dgl. aufweisen. Außerdem können Redundanzsymbole
eines inneren Codes 208 Fehler in einem Datenblock 204 oder
einem Redundanzblock 206 sowohl erfassen als auch korrigieren.
-
2 stellt
die Form dar, in der die Entität 202 in
einem Datenpuffer 114 (1) gespeichert werden
kann. Es ist jedoch ersichtlich, dass die Entität 202 in der in 2 dargestellten
Form nicht physikalisch existieren muß. Es ist ebenfalls ersichtlich, dass
Daten in der Entität 202,
und genauer gesagt die Daten in einem Datenblock 204, nicht
einer einzelnen Datei entsprechen müssen. Stattdessen werden bei
der vorliegenden beispielhaften Ausführungsform von dem Host-Terminal 102 (1)
empfangene Daten verschachtelt. Als solche können die Daten in einem bestimmten
Datenblock 204 Abschnitten von getrennten Dateien entsprechen,
die von dem Host-Terminal 102 (1) empfangen
wurden.
-
2 stellt
ebenfalls logische Beziehungen zwischen den Datenblöcken 204,
Redundanzblöcken 206 und
Redundanzsymbolen eines inneren Codes 208 der Entität 202 dar.
In 3 werden Abschnitte der Entität 202 detaillierter
gezeigt, um die logischen Beziehungen zwischen Datenblöcken 204,
Redundanzblöcken 206 und
Redundanzsymbolen eines inneren Codes 208 klarer zu veranschaulichen.
-
In 3 werden
Redundanzsymbole eines inneren Codes 208 als CRC-Codes
dargestellt. Es ist jedoch ersichtlich, dass verschiedene Arten
von Fehlererfassungs- oder Fehlerkorrekturcodes, wie beispielsweise
Reed-Solomon-Codes, verwendet werden können.
-
Bei
der vorliegenden beispielhaften Ausführungsform entsprechen Redundanzsymbole
eines inneren Codes 208 einem Datenblock 204 oder
Redundanzblock 208, und werden verwendet, um einen Fehler
in dem Datenblock 204 oder Redundanzblock 206 zu
erfassen. Beispielsweise entspricht ein CRC-Code CRC19 dem
Datenblock D19 der Entität 202. Somit wird,
um einen Fehler in dem Datenblock D19 zu
erfassen, nachdem der Datenblock D19 von dem
Speichermedium 106 (1) wiederhergestellt wurde,
ein neuer CRC-Code CRC19' für
den wiederhergestellten Datenblock D19 erzeugt.
Der neue CRC-Code CRC19' wird dann mit den von dem Speichermedium 106 wiederhergestellten
CRC-Code verglichen (1), der dem wiederhergestellten
Datenblock D19 (d.h. CRC-Code CRC19) entspricht. Wenn sich der neue CRC-Code CRC19' und der wiederhergestellte
CRC-Code CRC19 unterscheiden, dann wird
ein Fehler für
den Datenblock D19 erfasst.
-
Bei
der vorliegenden beispielhaften Ausführungsform bestimmt die Anzahl
von Redundanzblöcken
die maximale Anzahl von Datenblöcken,
die korrigiert werden können.
Somit kann bei dem in 2 dargestellten Beispiel eine
Gesamtzahl von vier Redundanzblöcken 206 verwendet
werden, um ein Maximum von vier fehlerhaften Datenblöcken 204 zu
korrigieren.
-
Bei
der vorliegenden beispielhaften Ausführungsform wird jeder Redundanzblock 204 jeweils basierend
auf den Daten in allen Datenblöcken
der Entität 202 erzeugt.
Beispielsweise werden Redundanzblöcke in E0,
E1, E2 und E3 basierend auf den Datenblöcken D4, D2, ..., und D19 erzeugt. Wie oben mit Bezug auf 1 beschrieben
ist, können
Redundanzblöcke
durch den Redundanzblockcodierer/-decodierer 116 erzeugt
werden. Wie oben ebenfalls beschrieben ist, werden Redundanzblöcke anfangs
für von
dem Host-Terminal 102 empfangene Daten erzeugt. Die erzeugten
Redundanzblöcke
und die empfangenen Daten werden dann in dem Speichermedium 106 gespeichert.
-
Mit
erneutem Bezug auf 3 ist, obwohl die Redundanzblöcke E0, E1, E2 und
E3 basierend auf dem gleichen Datensatz
(d.h. Datenblöcke 204 der Entität 202)
erzeugt werden, jeder Redundanzblock 206 zueinander eindeutig. Genauer
gesagt sind bei der vorliegenden Ausführungsform die Redundanzblöcke E0, E1, E2 und
E3 Bose-Chaudhuri-Hocquenghem-Codes (BCH-Codes)
und genauer gesagt Reed-Solomon-Codes.
-
In 1 arbeitet
bei der vorliegenden beispielhaften Ausführungsform der Redundanzblockcodierer/-decodierer 116 als
ein Codierer, um Redundanzblöcke
zu erzeugen, die mit Datenblöcken
in dem Speichermedium 106 zu speichern sind. Der Redundanzblockcodierer/-decodierer 116 arbeitet
als ein Decodierer, um Fehler in Datenblöcken zu korrigieren, die von
dem Speichermedium 106 wiederhergestellt werden. Es ist
jedoch ersichtlich, dass der Redundanzblockcodierer/-decodierer 116 als
getrennte Komponenten (z.B. eine Codiererkomponente und eine Decodiererkomponente)
in der Speichervorrichtung 106 implementiert werden können.
-
In 4 wird
ein beispielhafter Decodierer 400 dargestellt, um Fehler
in Datenblöcken
zu korrigieren, die von einem Speichermedium wiederhergestellt wurden.
Wie oben angemerkt ist, kann der Decodierer 400 als ein
integriertes Teil des Redundanzblockcodierers/-decodierers 116 (1)
oder als eine getrennte Komponente in der Speichervorrichtung 104 (1)
implementiert sein.
-
Wie
in 4 dargestellt ist, umfasst der Decodierer 400 eine
Mehrzahl von Zellen 402 und eine Summationslogik 404,
die mit der Mehrzahl von Zellen 402 verbunden ist. Jede
Zelle 402 erzeugt ein Teilsyndrom basierend auf den von
dem Speichermedium wiederhergestellten Datenblöcken und Redundanzblöcken. Jede
Zelle 402 erzeugt ebenfalls einen Teilfehlerwert basierend
auf einem Abschnitt der Inversen einer Fehlerpositionsmatrix, die
die Positionen aller von dem Speichermedium wiederhergestellten
Datenblöcke
kennzeichnet, die Fehler aufweisen. Wie oben beschrieben ist, kann
die Inverse der Fehlerpositionsmatrix durch Firmware oder Hardware
erzeugt werden. Die Summationslogik 404 erzeugt einen Fehlerwert,
der Fehler in einem von dem Speichermedium wiederhergestellten Datenblock
basierend auf den durch die Mehrzahl von Zellen 402 erzeugten
Teilfehlerwerten korrigiert.
-
In 1 werden,
wie oben beschrieben ist, von dem Speichermedium 106 wiederhergestellte Datenblöcke und
Redundanzblöcke
in dem Datenpuffer 114 gehalten. Genauer gesagt können in 2 bei
einer beispielhaften Ausführungsform
Datenblöcke 204 und
Redundanzblöcke 206 in
dem Datenpuffer 114 (1) in der
Form der Entität 202 gespeichert
werden.
-
In 4 wiederum
werden bei der vorliegenden beispielhaften Ausführungsform die Mehrzahl von
Zellen 402 mit dem Datenpuffer 114 (1) durch
Leitungen 406 verbunden. Jede Zelle 402 empfängt als
eine Eingabe einen Abschnitt der in dem Datenpuffer 114 (1)
gespeicherten Entität 202 (2).
Genauer gesagt liest jede Zelle 402 Abschnitte der Entität 202 (2)
in Cache-Bursts ein.
-
In 2 ist
bei der vorliegenden beispielhaften Ausführungsform jeder Cache-Burst
ein Abschnitt eines einzelnen Datenblocks 204 oder Redundanzblocks 206.
Außerdem
werden bei der vorliegenden beispielhaften Ausführungsform Abschnitte der Datenblöcke 204 und
der Redundanzblöcke 206 in
einem Rastermuster gelesen.
-
Es
sei beispielsweise angenommen, dass jeder Cache-Burst 32 Byte lang
ist. Die ersten 32 Byte des ersten Datenblocks 204 werden
in einem ersten Cache-Burst gelesen. Die ersten 32 Byte jedes der nächsten 15
Datenblöcke 204 und
vier Redundanzblöcke 206 der
Entität 202 werden
dann in 19 anschließende
Cache-Bursts gelesen. Nachdem die ersten 32 Byte des letzten Redundanzblocks 206 gelesen
sind, werden die zweiten anschließenden 32 Byte des ersten Datenblocks 204 gelesen,
und dann werden die zweiten anschließenden 32 Byte jedes der nächsten 15
Datenblöcke 204 und
vier Redundanzblöcke 206 der
Entität 202 gelesen.
Auf diese Art und Weise werden Datenblöcke 204 und Redundanzblöcke 206 der
Entität 202 in
Cache-Bursts in einem Rastermuster in 32-Byte-Abschnitten gelesen. Es ist jedoch ersichtlich,
dass die Größe des Cache-Burst
variieren kann, und Datenblöcke 204 und Redundanzblöcke 206 in
verschiedenen Mustern gelesen werden können. Beispielsweise kann jeder
Cache-Burst 64 Byte und nicht 32 Byte sein.
-
Bei
der vorliegenden beispielhaften Ausführungsform kann ein Abschnitt
jedes Datenblocks 204 und Redundanzblocks 206 in
der Entität 202 als
ein Codewort 210 logisch gruppiert werden. Beispielsweise
können
die ersten Abschnitte jedes Datenblocks 204 und Redundanzblocks 206 als
ein erstes Codewort 210 logisch gruppiert werden, das der
ersten Spalte in 2 entspricht. Das zweite Byte
jedes Datenblocks 204 und Redundanzblocks 206 kann
als ein zweites Codewort 210 logisch gruppiert werden, das
der zweiten Spalte in 2 entspricht.
-
Bei
der vorliegenden beispielhaften Ausführungsform ist das Codewort 210 ein
Bit breit. Somit können
dann, wenn Datenblöcke 204 und
Redundanzblöcke 206 2kByte
lang sind, die Datenblöcke 204 und
Redundanzblöcke 206 in
der Entität 202 in 2000
getrennte einzelne Codewörter 210 logisch gruppiert
werden. Außerdem
werden dann, wenn Datenblöcke 204 und
Redundanzblöcke 206 mit
einem Cache-Burst von 32 Byte gelesen werden, der jeweils 16 langen
Wörtern
von 32 Bit entspricht, Abschnitte von 32 Codewörter 210 jeweils gelesen.
-
In 4 wiederum
entspricht bei der vorliegenden beispielhaften Ausführungsform
die Anzahl von Zellen 402 in dem Decodierer 400 der
Anzahl von Redundanzblöcken 206 (2)
in der Entität 202,
was seinerseits der maximalen Anzahl von Datenblöcken 204 entspricht,
die korrigiert werden können.
Somit kann der Decodierer 400 basierend auf der maximalen
Anzahl von zu korrigierenden Datenblöcken 204 modifiziert
werden. Wenn beispielsweise ein Maximum von vier Datenblöcken 204 zu
korrigieren ist, wird der Decodierer 400 modifiziert, um vier
Zellen 402 aufzuweisen. Auf ähnliche Weise wird, wenn ein
Maximum von 16 oder 32 Datenblöcken 204 zu
korrigieren ist, der Decodierer 400 modifiziert, um 16
oder 32 Zellen 402 aufzuweisen.
-
In 5 wird
eine beispielhafte Zelle 402 dargestellt. Bei der vorliegenden
beispielhaften Ausführungsform
umfasst jede Zelle 402 eine Eingangslogik 502,
eine Warteschlange 504, einen Multiplizierer 506,
einen Multiplexer 508 und Warteschlangen 510 und 512.
-
Wie
oben beschrieben ist, erzeugt jede Zelle 402 ein Teilsyndrom
basierend auf Datenblöcken
und einem oder mehreren Redundanzblöcken, die von dem Speichermedium
wiederhergestellt werden. In 6 wird ein
beispielhafter Leseprozess 600 zum Erzeugen eines Teilsyndroms
in der Zelle 400 (4) dargestellt.
-
Bei 602 wird
die Zelle 402 (4) in einen Lesemodus eingestellt.
In 5 wird bei der vorliegenden beispielhaften Ausführungsform
die Eingangslogik 502 eingestellt, um Eingaben von der
Leitung 406, die mit dem Datenpuffer 114 (1)
verbunden ist, und der Rückkopplungsleitung 514,
die mit dem Ausgang des Multiplizierers 506 verbunden ist,
zu empfangen. Genauer gesagt wird in 7 der Multiplexer 702 eingestellt,
um eine Eingabe von einem Exklusiv-ODER-Gatter 704 zu empfangen,
das mit der Leitung 406 und der Rückkopplungsleitung 514 verbunden
ist. In 5 wird der Multiplizierer 506 eingestellt,
um Eingaben von der Warteschlange 504, die durch die Eingangslogik 502 erzeugten
Zwischenergebnisse hält,
und von der Warteschlange 510, die eine Wurzel eines Generatorpolynoms
hält, zu
empfangen. Genauer gesagt wird der Multiplexer 508 mit
Eingängen,
die mit Warteschlangen 510 und 512 verbunden sind,
eingestellt, um eine Eingabe von der Warteschlange 510 zu
empfangen.
-
In 6 liest
bei 604 die Zelle 402 (4) Daten
von dem Datenpuffer 114 (1). Bei
der vorliegenden beispielhaften Ausführungsform liest die Zelle 402 (4)
einen Abschnitt eines Datenblocks oder eines Redundanzblocks von
der Entität 202 (2),
die in dem Datenpuffer 114 gespeichert ist (1),
als einen Cache-Burst ein.
-
Beispielsweise
können
Daten von dem Datenpuffer 114 (1) in einem
Cache-Burst von 32 Byte gelesen werden, die 16 langen Wörtern entsprechen.
In 5 ist die Leitung 406 und die Rückkopplungsleitung 514 32
Bit breit, was der Zelle 402 ermöglicht, jeweils 32 Bit (ein
langes Wort) zu verarbeiten. Es ist jedoch ersichtlich, dass Leitungen 406 und die
Rückkopplungsleitung 514 von
einer beliebigen Größe sein
können
und die Zelle 402 eine beliebige Anzahl von Bits auf einmal
verarbeiten kann.
-
Bei 606 werden
die von dem Datenpuffer 114 (1) gelesenen
Daten mit der Ausgabe von dem Multiplizierer 506 (5)
summiert. In 5 führt bei der vorliegenden beispielhaften
Ausführungsform
die Eingangslogik 502 eine Exklusiv-ODER-Operation (XOR-Operation)
an einem von der Entität 202 (2)
gelesenen Cash-Burst durch die Leitung 406 und den Ausgang
des Multiplexers 506 durch die Rückkopplungsleitung 514 durch.
Wie oben in 7 beschrieben ist, umfasst die
Eingangslogik 502 das XOR-Gatter 704, das die
XOR-Operation durchführen
kann. Es sollte jedoch ersichtlich sein, dass die Eingangslogik 502 verschiedene
Komponenten umfassen kann, einschließlich verschiedene Arten und Anzahlen
von Logikgattern, um die von dem Datenpuffer 114 gelesenen
Daten (1) mit der Ausgabe von den Multiplizierern 504 (5)
zu summieren.
-
In 6 wird
bei 608 die Summe der von dem Datenpuffer 114 (1)
gelesenen Daten und die Ausgabe von dem Multiplizierer 506 (5)
als ein Zwischenergebnis gespeichert. In 4 wird bei der
vorliegenden beispielhaften Ausführungsform das
durch die Eingangslogik 502 erzeugte Zwischenergebnis in
der Warteschlange 504 gespeichert.
-
Bei
der vorliegenden beispielhaften Ausführungsform wird die Größe und die
Anzahl von Einträgen
in der Warteschlange 504 basierend auf der Größe des Cache-Burst,
der verwendet wird, um Daten von dem Datenpuffer 114 (1)
zu lesen, und der Größe der Leitung 406 und
der Rückkopplungsleitung 514 bestimmt.
Wenn Daten beispielsweise von dem Datenpuffer 114 (1)
in einem Cache-Burst von 32 Byte gelesen werden, der 16 langen Wörtern entspricht,
und die Leitung 516 und die Rückkopplungsleitung 514 gleich
32 Bit breit sind, dann wird jedes lange Wort in dem Cache-Burst
mit der Ausgabe von dem Multiplizierer 506 summiert und
als ein Eintrag in der Warteschlange 504 gespeichert. Somit umfasst
bei diesem Beispiel die Warteschlange 504 acht Einträge, wobei
jeder Eintrag 32 Bit lang ist. Wenn die Größe des Cache-Burst geändert wird, dann
kann die Größe der Warteschlange 504 ebenfalls
geändert
werden. Wenn der Cache-Burst beispielsweise 64 Byte lang ist, dann
kann die Warteschlange 504 gleich 16 Einträge aufweisen,
wobei jeder Eintrag 32 Bit lang ist.
-
In 6 wird
bei 610 das Zwischenergebnis mit einer Wurzel eines Generatorpolynoms
multipliziert. In 5 ist bei der vorliegenden beispielhaften Ausführungsform
der Multiplizierer 506 ein Galois-Feld-Multiplizierer,
der eine Galois-Feld-Multiplikation zwischen dem in der Warteschlange 504 gespeicherten
Zwischenergebnis und einer Wurzel eines in der Warteschlange 504 gespeicherten
Generatorpolynoms durchführt.
-
Bei
der vorliegenden beispielhaften Ausführungsform führt der
Multiplizierer 506 mehrere parallele Galois-Feld-Multiplikationen
durch. Wenn jeder Eintrag der Warteschlage 504 beispielsweise
32 Bit lang ist, dann können
die 32 Datenbit von einem Eintrag der Warteschlange 504 als
vier parallele acht Bit Galois-Feld-Elemente formatiert werden.
Der Multiplizierer 506 kann dann vier parallele acht-mal-acht Galois-Feld-Multiplikationen
zwischen dem 32 Bit langen Eintrag von der Warteschlange 504 und
einer acht Bit Wurzel eines Generatorpolynoms von der Warteschlange 510 durchführen.
-
In 6 wird
bei 612, wenn nicht alle Datenblöcke und Redundanzblöcke der
Entität 202 (2) verarbeitet
wurden, die Schleife 604 bis 612 iteriert, um
den nächsten
Datenblock oder Redundanzblock zu verarbeiten. Bei der vorliegenden
beispielhaften Ausführungsform
werden dann, wenn bestimmt wurde, dass der nächste zu verarbeitende Datenblock Fehler
aufweist, bei 604 nur Nullen gelesen, anstatt einen Cache-Burst von dem Datenpuffer 114 (1) zu
lesen. Wenn alle Datenblöcke
und Redundanzblöcke
verarbeitet wurden, endet der Leseprozess 600 bei 614.
-
Bei
der vorliegenden beispielhaften Ausführungsform entspricht die Anzahl
von Iterationen der Schleife 604 bis 612 der Anzahl
von Datenblöcken und
Redundanzblöcken
in der Entität 202 (2).
Es sei beispielsweise mit Bezug auf 3 angenommen,
dass Abschnitte der Entität 202 in
Cache-Bursts mit
einer Länge
von 32 Byte gelesen werden. Bei einer ersten Iteration der Schleife 604 bis 612 (6) wird
ein erster Cache-Burst, der die ersten 32 Byte des Datenblocks D19 enthält,
gelesen und verarbeitet. Bei einer zweiten Iteration der Schleife 604 bis 612 (6)
wird ein zweiter Cache-Burst, der die ersten 32 Byte des Datenblocks
D18 enthält,
gelesen und verarbeitet. Es sei angenommen, dass der Datenblock
D4 mit Fehlern gekennzeichnet wurde. Dann werden
bei der 16ten Iteration der Schleife 604 bis 612 (6)
nur Nullen gelesen und verarbeitet, statt einen Cache-Burst von
dem Datenblock D4 einzulesen. Bei diesem
Beispiel wird die Schleife 604 bis 612 (6)
20 mal iteriert, um alle 16 Datenblöcke und vier Redundanzblöcke zu verarbeiten.
-
In 5 sei
bemerkt, dass bei der ersten Iteration der Schleife 604 bis 612 (6)
das Ergebnis der Summe des ersten Cache-Burst und der Ausgabe des
Multiplizierers 506 die Daten sind, die bei dem ersten
Cache-Burst gelesen wurden, weil die Warteschlange 504 leer
und die Ausgabe des Multiplizierers 506 Null ist. Bei der
zweiten Iteration hält
die Warteschlange 504 die bei dem ersten Cache-Burst gelesenen
Daten, und die Ausgabe des Multiplizierers 506 sind die
Daten, die bei dem ersten Cache-Burst gelesen wurden, multipliziert
mit einer Wurzel eines Generatorpolynoms. Somit ist das Ergebnis
der Summe des zweiten Cache-Bursts und der Ausgabe des Multiplizierers 506 die
Summe der Daten, die bei dem zweiten Cache-Burst gelesen wurden,
und das Ergebnis des Multiplizierers der bei dem ersten Cache-Burst
gelesenen Daten mit einer Wurzel eines Generatorpolynoms. Dieses
Ergebnis wird dann in der Warteschlange 504 als das neue Zwischenergebnis
gespeichert. Wenn der Leseprozess 604 bei 614 (6)
beendet wird, nachdem alle Datenblöcke und Redundanzblöcke verarbeitet
wurden, ist das in der Warteschlange 504 jeder Zelle 402 gespeicherte
Endergebnis das Teilsyndrom für
jede Zelle 402.
-
In 4 wiederum
verwendet bei der vorliegenden beispielhaften Ausführungsform
jede Zelle 402 eine unterschiedliche Wurzel eines Generatorpolynoms.
Somit werden die unterschiedlichen Teilsyndrome in jeder der Mehrzahl
von Zellen 402 erzeugt.
-
Genauer
gesagt verwendet jede Zelle 402 eine Wurzel eines Generatorpolynoms
von αn, wobei n die Sequenznummer der Zelle ist.
Wenn es beispielsweise ρ Zellen 402 gibt,
dann können
den Zellen 402 Sequenznummern von Null bis (ρ-1) zugewiesen
werden (d.h. Zelle 402(0), Zelle 402(1), Zelle 402(2),
..., Zelle 402(ρ-1)).
Die Zelle 402(0) verwendet α0, die
Zelle 402(1) verwendet α1, die Zelle 402(2) verwendet α2,
..., und die Zelle 402(ρ-1) verwendet α(ρ-1) bei
diesem Beispiel. Die Wurzel eines Generatorpolynoms kann eine fest
verdrahtete Konstante oder ein durch Firmware eingestelltes Register
sein.
-
Während die
Wurzeln eines Generatorpolynoms für die Mehrzahl von Zellen 402 sequenziell sein
müssen,
kann die Sequenz bei irgendeiner Nummer starten. Beispielsweise
kann jede Zelle 402 eine Wurzel eines Generatorpolynoms
von αn+1 verwenden, wobei n die Sequenznummer
der Zelle und 1 eine feste Konstante für jede Zelle 402 ist.
-
Weil
jede Zelle 402 eine unterschiedliche Wurzel eines Generatorpolynoms
verwendet, wurden, nachdem der Prozess 600 (6)
beendet ist, wenn alle Datenblöcke
und Redundanzblöcke
in der Entität 202 (2)
bearbeitet wurden, unterschiedliche Teilsyndrome durch jede Zelle 402 erzeugt
und in den Warteschlangen 504 der Zellen 402 gespeichert. Wenn
es beispielsweise ρ Zellen 402 gibt
und Zellen 402 Sequenznummern von Null bis (ρ-1) zugewiesen werden
(d.h. Zelle 402(0), Zelle 402(1), Zelle 402(2), ...,
Zelle 402(ρ-1)),
erzeugt die Zelle 402(0) das Teilsyndrome S0,
die Zelle 402(1) das Teilsyndrome S1, ...,
und die Zelle 402(ρ-1) das
Teilsyndrom S(ρ-1).
-
Nachdem
der Leseprozess 600 (6) beendet
wurde, erzeugt jede Zelle 402 einen Teilfehlerwert basierend
auf dem erzeugten Teilsyndrom und einem Abschnitt der Inversen der
Fehlerpositionsmatrix. Mit Bezug auf 8 wird ein
beispielhafter Schreibprozess 800 zum Erzeugen eines Teilfehlerwerts
in der Zelle 402 (4) dargestellt.
-
Bei 802 wird
die Zelle 402 (4) in einem Schreibmodus eingestellt.
In 5 wird bei der vorliegenden beispielhaften Ausführungsform
die Eingangslogik 502 eingestellt, um Eingaben von der Rückkopplungsleitung 516 zu
empfangen, die mit der Warteschlange 504 verbunden ist,
die das in der Zelle 402 während des vorhergehenden Leseprozesses erzeugte
Teilsyndrom hält.
Genauer gesagt wird in 7 der Multiplexer 702 eingestellt,
um eine Eingabe von der Rückkopplungsleitung 516 zu
empfangen. In 5 wird der Multiplizierer 506 eingestellt,
um Eingaben von der Warteschlange 504 und der Warteschlange 512,
die einen Abschnitt der Inversen der Fehlerpositionsmatrix hält, zu empfangen.
Genauer gesagt wird der Multiplexer 508 mit Eingängen, die mit
Warteschlangen 510 und 512 verbunden sind, eingestellt,
um eine Eingabe von der Warteschlange 512 zu empfangen.
-
Wie
oben beschrieben ist, kennzeichnet eine Fehlerpositionsmatrix die
Positionen aller Datenblöcke,
die von dem Speichermedium mit Fehlern wiederhergestellt wurden.
Beispielsweise kann eine beispielhafte Fehlerpositionsmatrix ausgedrückt werden als:
wobei X die Position eines
Fehlers und ρ die
Gesamtzahl von fehlerhaften Datenblöcken und Redundanzblöcken ist.
Die Inverse der Fehlerpositionsmatrix kann wie folgt ausgedrückt werden:
-
Wie
oben ebenfalls beschrieben ist, kann bei der vorliegenden beispielhaften
Ausführungsform
die Inverse der Fehlerpositionsmatrix durch Firmware oder Hardware
erzeugt werden.
-
Bei
der vorliegenden beispielhaften Ausführungsform verwendet jede Zelle 402 einen
unterschiedlichen Abschnitt der Inversen der Fehlerpositionsmatrix.
Beispielsweise verwendet in 4, wenn es ρ Zellen 402 gibt,
denen Sequenznummern von Null bis (ρ-1) zugewiesen sind (d.h. Zelle 402(0),
Zelle 402(1), Zelle 402(2), ..., Zelle 402(ρ-1)),
die Zelle 402(0) die erste Zeile der Inversen der Fehlerpositionsmatrix
(d.h. U0,0, U1,0,
..., Uρ-1,0),
die Zelle 402(1) die zweite Zeile der Inversen der Fehlerpositionsmatrix
(d.h. U0,1, U1,1,
..., Uρ-1,1)
und die Zelle 402(ρ-1) die (ρ-1)-Zeile
der Inversen der Fehlerpositionsmatrix (d.h. U0,ρ-1,
U1,ρ-1,
..., Uρ-1,ρ-1).
-
In 5 erzeugt
bei 804 (8) der Multiplizierer 506 einen
Teilfehlerwert durch Multiplizieren des Teilsyndroms, das in der
Warteschlange 504 gehalten wird, mit einem Element des
Abschnitts der Inversen der Fehlerpositionsmatrix, das in der Warteschlange 512 gehalten
wird. Beispielsweise sei wiederum in 4 angenommen,
dass es ρ Zellen 402 gibt,
denen Sequenznummern von 0 bis (ρ-1)
zugewiesen sind (d.h. Zelle 402(0), Zelle 402(1),
Zelle 402(2), ..., Zelle 402(ρ-1)). In der Zelle 402(0) kann ein
erster Teilfehlerwert y0(0) durch Multiplizieren
des Teilsyndroms So mit dem ersten Element von der ersten Zeile
der Inversen der Fehlerpositionsmatrix U0,0 erzeugt
werden. Bei der Zelle 402(1) kann ein zweiter Teilfehlerwert
y0(1) durch Multiplizieren des Teilsyndroms
S1 mit dem ersten Element von der zweiten Zeile
der Inversen der Fehlerpositionsmatrix U0,1 erzeugt
werden. In der Zelle 402(ρ-1), kann ein (ρ-1)-Teilfehlerwert
y0(ρ-1)
durch Multiplizieren des Teilsyndroms S(ρ-1) mit
dem ersten Element von der (ρ-1)-Zeile
der Inversen der Fehlerpositionsmatrix U0,ρ-1 erzeugt
werden.
-
In 8 wird
bei 806 der durch die Zelle 402 (4)
erzeugte Teilfehlerwert zu der Summationslogik 404 (4)
gesendet. In 4 werden bei dem oben beschriebenen
Beispiel die durch Zellen 402(0), 402(1), ...,
und 402(ρ-1) erzeugten
Teilfehlerwerte y0(0), y0(1),
..., und y0(ρ-1) zu der Summationslogik 404 gesendet.
-
Um
einen Fehlerwert zu erzeugen, summiert die Summationslogik 404 die
durch die Zellen 402 erzeugten Teilfehlerwerte. Bei dem
oben beschriebenen Beispiel wird ein erster Fehlerwert Y0 durch Summieren der Teilfehlerwerte y0(0), y0(1), ..,
und y0(ρ-1) erzeugt,
die durch die Zellen 402(0), 402(1), ..., und 402(ρ-1) erzeugt
wurden.
-
In 9 kann
bei der vorliegenden beispielhaften Ausführungsform die Summationslogik 404 ein
Array von XOR-Gattern 902 umfassen,
das die Galois-Feld-Summe der Ausgaben der Zellen 402 (4)
berechnet. Es ist jedoch ersichtlich, dass die Summationslogik 404 verschiedene
Komponenten, einschließlich
verschiedene Arten und Anzahlen von Logikkomponenten umfassen kann,
um die Galois-Feld-Summe der Ausgaben der Zellen 402 (4)
zu berechnen.
-
Der
erzeugte Fehlerwert kann dann in den Datenpuffer 114 (1)
geschrieben werden, um die Daten in der Position zu korrigieren,
die den Elementen eines Abschnitts der Inversen der Fehlerpositionsmatrix
entspricht, die verwendet werden, um die Teilfehlerwerte in den
Zellen 402 zu erzeugen. In 4 werden
bei dem oben beschriebenen Beispiel Teilfehlerwerte y0(0),
yo(1), ..., und y0(ρ-1) in Zellen 402(0), 402(1),
..., und 402(ρ-1) mit
den Elementen U0,0, U0,1,
..., und U0,ρ-1 eines
Abschnitts der Inversen der Fehlerpositionsmatrix erzeugt. In 3 sei
beispielsweise angenommen, dass diese Elemente einem Abschnitt des
Datenblocks D4 entsprechen. Der Fehlerwert
Y0 kann dann in den Datenpuffer 114 (1)
geschrieben werden, um den Abschnitt des Datenblocks D4 zu korrigieren.
-
In 4 durchläuft, wenn
die Größe des Cache-Burst
größer als
die Datenmenge ist, die zu einer Zeit durch die Zelle 402 verarbeitet
wird, während des
Schreibprozesses 800 (8) die Zelle 402 zyklisch
durch den Cache-Burst, um den gesamten Cache-Burst zu verarbeiten.
Beispielsweise können, wie
oben beschrieben ist, die Zellen 402 Daten von dem Datenpuffer 114 (1)
in einem Cache-Burst von 32 Byte empfangen und jeweils ein langes
Wort des Cache-Burst verarbeiten. Wie ebenfalls oben beschrieben
ist, kann die Warteschlange 504 (5) acht
Einträge
aufweisen, die jeweils 32 Bit (ein langes Wort) lang sind. Somit multipliziert
bei dem obigen Beispiel, bei dem das Element U0,0 verwendet wird,
um einen Teilfehlerwert y0(0) in der Zelle 402(0) zu
erzeugen, der Multiplizierer 506 in der Zelle 402(0) jeden
Eintrag in der Warteschlange 504 (5) mit dem
Element U0,0, um acht Sätze von Teilfehlerwerten y0(0) zu erzeugen. Auf ähnliche Weise werden acht Sätze von
Teilfehlerwerten y0(1), ..., und y0(ρ-1) in
Zellen 402(1), ..., und 402(ρ-1) mit Elementen U0,1, ..., und U0,ρ-1 erzeugt.
-
Die
Summationslogik 404 erzeugt ebenfalls acht Sätze von
Fehlerwerten Y0, die dann wieder als ein
Cache-Burst in den Datenpuffer 114 (1) geschrieben
werden. Wenn beispielsweise in 3 angenommen
wird, dass Elemente U0,0, U0,1,
..., und U0,ρ-1 den
ersten 32 Byte des Datenblocks D4 entsprechen,
was den ersten 32 Codewörtern
des Datenblocks D4 entspricht, werden die acht Sätze von Fehlerwerten Y0 geschrieben, um die ersten 32 Byte des Datenblocks
D4 zu korrigieren.
-
In 5 kann
der Schreibprozess 800 (8) dann
iteriert werden, um einen weiteren Satz von Teilfehlerwerten zu
erzeugen, die dann summiert werden können, um einen weiteren Fehlerwert
zu erzeugen, der dann verwendet werden kann, um einen Abschnitt
eines anderen fehlerhaften Datenblocks zu korrigieren. Beispielsweise
werden bei einer zweiten Iteration ein zweiter Satz von Teilfehlerwerten
erzeugt und summiert, um einen zweiten Fehlerwert zu erzeugen.
-
Genauer
gesagt kann in 4 bei der zweiten Iteration
von 804 (8) bei der Zelle 402(0) ein erster
Teilfehlerwert y1(0) durch Multiplizieren
des Teilsyndroms S0 mit dem zweiten Element
von der ersten Zeile der Inversen der Fehlerpositionsmatrix U1,0 erzeugt werden. Bei der Zelle 402(1) kann
ein zweiter Teilfehlerwert y1(1) durch Multiplizieren
des Teilsyndroms S1 mit dem zweiten Element von
der zweiten Zeile der Inversen der Fehlerpositionsmatrix U1,1 erzeugt werden. Bei der Zelle 402(ρ-1) kann
ein (ρ-1)-Teilfehlerwert y0(ρ-1)
durch Multiplizieren des Teilsyndroms S(ρ-1) mit
dem zweiten Element von der (ρ-1)-Zeile
der Inversen der Fehlerpositionsmatrix U1,ρ-1 erzeugt
werden.
-
Bei
der zweiten Iteration von 806 (8) werden
der zweite Satz von Teilfehlerwerten y1(0), y1(1), ..., und y1(ρ-1), die durch die
Zellen 402(0), 402(1), ..., und 402(ρ-1) erzeugt
wurden, zu der Summationslogik 404 gesendet. Ein zweiter
Fehlerwert Y1 wird dann durch Summieren
der Teilfehlerwerte y1(0), y1(1),
..., und y1(ρ-1) erzeugt.
-
Durch
Iterieren des Schreibprozesses 800 (8) und Summieren
der erzeugten Sätze
von Teilfehlerwerten können
Fehlerwerte erzeugt werden, um Abschnitte der Datenblöcke zu korrigieren, die
mit Fehlern gekennzeichnet wurden. Die Anzahl von Malen, die der
Schreibprozess 800 (8) iteriert
wird, und die Anzahl von Fehlerwerten, die erzeugt wurden, können basierend
auf der Anzahl von Datenblöcken
bestimmt werden, die als fehlerhaft gekennzeichnet wurden (d.h. ρ). Alternativ
wird die Anzahl von Malen, die der Schreibprozess 800 (8) iteriert
wird, und die Anzahl von Fehlerwerten, die erzeugt werden, auf die
maximale Anzahl von Datenblöcken
eingestellt werden, die korrigiert werden können, die der Anzahl von Redundanzblöcken in
der Entität 202 (2)
entspricht.
-
Nachdem
der Schreibprozess 800 (8) abgeschlossen
wurde, kann der Leseprozess 600 (6) erneut
iteriert werden, um einen weiteren Abschnitt der Datenblöcke und
Redundanzblöcke,
die in dem Datenpuffer 114 (1) gespeichert
sind, zu verarbeiten, und dann kann der Schreibprozess 800 (8)
erneut iteriert werden, um Fehler in einem anderen Abschnitt der
Datenblöcke
mit Fehlern zu korrigieren. Bei der vorliegenden beispielhaften Ausführungsform
wird, bevor der Leseprozess 600 (6) erneut
iteriert wird, die Warteschlange 504 (5)
gelöscht.
-
Beispielsweise
sei in 3 angenommen, dass Abschnitte der Entität 202 in
einem Cache-Burst von 32 Byte Länge
gelesen werden. Der Leseprozess 600 (6)
wird iteriert, um die ersten 32 Byte jedes Datenblocks 204 und
jedes Redundanzblocks 206 zu lesen und zu verarbeiten,
um Teilsyndrome zu erzeugen. Der Schreibprozess 800 (8)
wird dann iteriert, um Fehlerwerte zu erzeugen und Fehler in den
ersten 32 Byte jedes Datenblocks 204 zu korrigieren, der
Fehler aufweist. Die Warteschlange 504 (5)
wird gelöscht,
dann wird der Leseprozess 600 (6) erneut
iteriert, um die zweiten 32 Byte jedes Datenblocks 204 und
jedes Redundanzblocks 208 zu lesen und zu verarbeiten,
um einen weiteren Satz von Teilsyndromen zu erzeugen. Der Schreibprozess 800 (8)
wird dann erneut iteriert, um Fehlerwerte zu erzeugen und Fehler
in den zweiten 32 Byte jedes Datenblocks 204 zu korrigieren,
der Fehler aufweist. Auf diese Art und Weise werden alle Abschnitte
jedes Datenblocks 204 und Redundanzblocks 206 mit
dem Leseprozess 600 (6) gelesen
und verarbeitet, und alle Abschnitte jedes Datenblocks, der Fehler
aufweist, wird mit dem Schreibprozess 800 (8)
korrigiert.
-
Obwohl
beispielhafte Ausführungsformen beschrieben
wurden, können
verschiedene Modifikationen durchgeführt werden ohne von dem Geist und/oder
Schutzumfangs der Erfindung abzuweichen. Beispielsweise ist in 4 ersichtlich,
dass, obwohl der Decodierer 4 in Verbindung mit einer Speichervorrichtung
beschrieben wurde, der Decodierer 4 in Verbindung mit verschiedenen
Vorrichtungen und bei verschiedenen Anwendungen verwendet werden
kann, bei denen Daten durch einen Kanal empfangen werden, der Fehler einführt, wie
beispielsweise als ein Teil eines Telekommunikationssystems. Daher
sollte die Erfindung nicht so verstanden werden, dass sie auf die
in den Zeichnungen und oben beschriebenen speziellen Formen beschränkt ist.