[実施形態の概要]
メモリシステムは、セルアレイの微細化、セルアレイ等の構造の3次元化、メモリセルに用いる物理現象に対する工夫などによって、記憶容量の高密度化を実現している。そして、安定した製造工程が達成された後のメモリシステムの高密度化には、メモリセルの多値化が有効な手段となる。
特に、NANDフラッシュメモリに関しては、いち早く多値化が進み、1セル当たり8値を記憶する3ビットセルが実用化されている。しかし、それ以上のメモリセルの多値化は、急激な信頼性の悪化を伴い、単ビットセルに対して、少なくとも2桁以上のエラー率の増加につながる。このように、信頼性と生産の歩留まりの問題から、メモリセルの多値化の進行は、大容量ファイルメモリの実現手段として期待されながらも、困難な問題を抱えている。
このメモリセルの多値化に際しての問題点を克服して、有効に活用できれば、安定したNANDフラッシュメモリの製造工程を長期に亘って利用しながらも、NANDフラッシュメモリの記憶容量の高密度化を達成することができる。
そこで、第1の実施形態では、以下のような趣旨のもと、リー・メトリック・コードを利用したメモリシステムを提案する。
(1) メモリセルのエラーは、多くの場合、メモリセルに対する隣接レベルへの書き込みや、メモリセルからの隣接レベルとしての読み出し等によって生じる。このような場合であっても、従来のメモリセルに対するバイナリビットの割り付けの場合、エラー量が大きくなってしまうことがある。そこで、以下で説明する実施形態に係るメモリシステムは、メモリセルに対する値の割り付けを簡素化することで信頼性を向上させた多値記憶セルを利用する。
(2) メモリセルの多値レベルは、基底レベルからの高さとして捉えることができる。つまり、多値化されたメモリセルは、本来、バイナリでデジタル化さされた情報ではなく、素数でデジタル化された情報の記憶に適している。そこで、以下で説明する実施形態に係るメモリシステムは、物理量レベルを素数pの有限体Zpの各要素に割り付けたメモリセル(以下、「p−adicセル」と呼ぶ)を用いて構成する。
(3) メモリセルに対する隣接レベルへの書き込みや、メモリセルへの隣接レベルとしての読み出し等のよって生じるエラーの場合の有効なECC(Error Correcting Code)は、有限体Zpのリー・メトリック・コード(Lee metric code)である。そこで、以下で説明する実施形態に係るメモリシステムでは、エラーの検索漏れが生じないように工夫されたリー・メトリック・コードを用いたECCシステムを利用する。
(4) p−adicセルを利用したNANDフラッシュメモリの構成は、従来のNANDフラッシュメモリの構成とは異なる。そこで、以下で説明する実施形態では、具体的なメモリシステムの仕様の骨子案を提示し、これに基づいて構成されたメモリシステムについて説明する。
(5) 訂正できるエラー量を大きく設定したい場合、リー・メトリック・コードのECCを利用するエラー訂正方法として、ユークリッド反復法を用いたエラー訂正方法を利用すると有効な場合がある。そこで、ユークリッド反復法を用いてエラー訂正するメモリシステムを実現するために必要となる具体的な回路について説明する。
[第1の実施形態]
<リー・メトリック・コード>
先ず、リー・メトリック・コードについて概要を説明する。
コードを表すシンボルcは、数1に示す整数となる。
[数1]
これら整数の計量をリー・メトリックとして|cj|で表わし、全てのリー・メトリック|cj|はp/2以下の整数で表されて、リー・メトリック|cj|の定義は数2のようになる。
[数2]
コードCは、n=p−1個のシンボルcjの並びと考えられるため、C=(c1,c2,…,cn)で表すことができる。コードCの計量w(C)は、数3のように各シンボルcjのリー・メトリック|cj|の和として定義される。
[数3]
また、コード間の距離はコードに対応する各シンボルの差のリー・メトリックの和で定義される。ここで2つのシンボルcとyの差(リー距離)dL(c,y)は数4のようになる。
[数4]
さらに、コードCの最小リー距離は、数5に示すようにコードCの計量w(C)の最小の計量で定義される。
[数5]
このとき、リー・メトリック・コードは、数6に示す生成行列G及びシンドローム行列Hを持ったコード間の最小距離が2γであり、且つ、γ−1以下のリー・メトリックのエラー訂正が可能なコードである。
[数6]
ここで、コードCの語長をn、データの語長をkとすると、γ=n−kであり、γはコードCに含まれる冗長語長を表している。
この様に構成されるリー・メトリック・コードを生成するために入力変換されたデータをk桁のp進数で表す。このp進数の各桁の数はZpの要素であるから、これをリー・メトリック・コードのデータ語Xとして、生成行列Gから演算C=XGとしてコード表現が得られる。得られたコード語をメモリに記憶する。記憶したZpの数に生じたエラーの情報は、メモリから読み出したリー・メトリック・コードのデータ語Yとして、演算S=YHt(HtはHの転置行列)からシンドロームを得て、エラーの位置と量が計算できエラーが訂正できる。
<データ処理の原理、シンドローム変換法>
次に、p−adicセルを用いたNANDフラッシュメモリにおけるデータ処理の方法の原理について説明する。以下において、この原理を「シンドローム変換法」と呼ぶ。
p−adicセルに保持されたコード語Cの成分は、Zpの数であり、成分毎に様々な擾乱を受けて変化を起こし、数7に示すように、異なる成分からなるコード語Yへと変化する。
[数7]
このYからCを復元するのがデコードである。デコードに先立ちシンドロームを求める。
シンドローム<m>Sは、3個の成分を持つベクトル<m>=<m1,m2,m3)(mi=0〜p−2)をZpから選択した上で、これらベクトルとH行列からなる数8のような行列演算によって、要素S<m>+0、S<m>+1、・・・、S<m>+εとして求まる。ここで、ε=γ−1である。
[数8]
<m>S=(S<m>+l)(l=0〜ε)とした上で、<m>+l=0からS0を得て、|S0|≦εならばデコードを開始する。
これは、生成行列Gとシンドローム行列Hの構成がGHt=0(mod p)となるように構成されていることなどによって、Y=C+Eと置くと、Cについては数9のようにその対応部分がゼロになり、SはEの成分で表わすことができる。
[数9]
なお、<m>=<0>、l=0として、E=(e1,e2,・・・,en)とすると、S<0>+0=S0=Σejと表わすことができ、S0は各エラーの総和となることが分かる。
|S0|≦γ−1の場合、以下のシンドローム変換法でエラーを求めることができる。この条件を満たさなくても計算上はコード成分に対するエラーの値を得るが、真のコードに対するエラーか、或いは隣のコードに対するエラーかを判別できないため、エラー訂正に用いることはできない。これは、リー・メトリック・コードのエラー訂正可能な必要条件が、コード間のリー・メトリックの最小値が2γであるためであり、この場合、必ず、S0のリー・メトリックがε以下、つまり、エラー成分のリー・メトリックの総和がε以下となるためである。
|S0|≦εの場合、シンドローム変換法によるエラー探索に入るが、始めに行うのが、シンドロームの変換である。ここでは、S<m>+0≠0になる<m>に対して数10から、uS<m>+0≡εとなるu=ε(S<m>+0)−1を求め、これから新たなシンドロームu<m>S=(uS<m>+0,uS<m>+1,・・・,uS<m>+ε)を得る。
[数10]
続いて、変換されたシンドロームを用いてエラーのデコードを行うが、この方法を説明する。
メモリセルアレイに記憶されたコードは、エラーE=(e1,e2,・・・,en)(n=p−1)を持つので、新たなシンドロームにとって仮想的なエラーは{u(1)<m>e1,u(2)<m>e2,・・・,u(n)<m>ep−1}となる。これらn=p−1個のエラー成分を変換したものを2つの組J+とJ−に数11のように分類する。
[数11]
すなわち、シンボルのエラー量がu(j)<m>ej<p/2の場合、シンボルcjの位置jの集まりであるJ+と、シンボルのエラー量がu(j)<m>ej>p/2の場合のシンボルcjの位置jの集まりであるJ−とに分類される。Zp上の多項式Λ(x)、V(x)をこれらの組をもとに数12のように構成する。
[数12]
このように、多項式Λ(x)はJ+のエラー成分位置jの逆数を根として持ち、そのエラー成分のリー・メトリックであるu(j)<m>ejを根の多重度として持つ多項式となる。一方、多項式V(x)はJ−のエラー成分位置jの逆数を根として持ち、そのエラー成分のリー・メトリックp−u(j)<m>ejを根の多重度として持つ多項式となる。デコードは、最終的にこれらの多項式をシンドロームの情報のみから構成して解くことによってエラーの情報を得る過程となる。つまり、これら多項式Λ(x)、V(x)とシンドロームとの関係を求める必要がある。各シンドロームu<m>Sをその次数の係数に持つ級数多項式で構成すると、数13のように、エラー成分の位置と仮想エラー成分の値をその因子に持つ有理多項式で表わされる。
[数13]
数13から、多項式Λ(x)、V(x)、シンドロームS(x)の間には数14に示す関係式が成立する。
[数14]
続いて、数14に示す関係式を利用して、シンドロームS(x)から多項式Λ(x)、V(x)を求める。
シンドロームS(x)から、数15に示す次数がγ−1以下の多項式Ψ(x)を求める。
[数15]
多項式Ψ(x)の展開式において、数15に示す式の両辺の同次次数の係数の比較から、係数ψjは、シンドロームuS<m>+jと既に求まっている係数ψj−1とを用いて反復法で求めることができる。シンドロームuS<m>+0〜uS<m>+εから多項式Ψ(x)の係数ψ0〜ψεを求めた結果を数16に示す。
[数16]
この多項式Ψ(x)はΛ(x)/V(x)に等価な多項式であるが、互いに素なλ(x)とv(x)のキー条件は数17のようになるため、V(x)=1とでき、Ψ(x)をΛ(x)そのものとして採用することができる。
[数17]
多項式の次数に関する条件deg λ(x)−deg v(x)=ε、deg λ(x)+deg v(x)≦εから0≦2deg v(x)≦0なので、deg v(x)=0になることが分かる。即ち、V(x)=1且つΛ(x)=Ψ(x)とできて、Ψ(x)はこの条件を満たす。このときシンドロームから求めたΨ(x)が予め決めたεとε=deg Ψ(x)=deg Λ(x)が成立するはずである。成立する場合、キー条件を全て満たすため、Ψ(x)を用いて解を得ることができる。一方、不成立の場合、エラーがキー条件を満たさず、解無しとなる。
この方法は全てのエラーコード成分位置を集合J+に集める変換をエラーに対して施せることに相当する。また、別の観点からは変換したエラーの総和がεになるように変換することによってエラー修正ができるようになる可能性があることを示す。
ここで、可能性と言ったのはふたつの意味があり、第1は、全てのエラー成分位置がJ+に集められて、シンドロームから求めたΨ(x)の次数がちょうどεに等しいことが必要だからである。第2は、|S0|≦εでなくても計算上はエラー量を得ることができるが、誤訂正を排除するためにこの条件を加える必要があるからである。
解探索の方法は、Λ(x)=Ψ(x)、V(x)=1とおいてZpの要素から方程式を満たす解を見つけ、得られた根の多重度とから、逆変換を施して真のエラーEを得る。
次に、以上の原理によるシンドローム変換法に関して、エラー探索の有効な条件を考察する。
実際には不明な真のエラーコード語の点をE=(e1,e2,・・・,ep−1)とすると、シンドローム変換法では、これを仮想的なエラーコード語の点<m>E=(u(1)<m>e1,u(2)<m>e2,・・・,u(n)<m>ep−1)に変換している。このとき成分座標自体は不変であることに注意する。この場合、シンドロームは数18のようになる。数18において、ji(i=1〜ξ)は、ゼロとは異なるEの成分座標である。j1<j2<・・・<jξとなる。
[数18]
ここでξ≧2で<m>≠<m´>の場合、仮想エラーへの変換は全て独立になる。何故ならば、等しいものがあるとするとjiは変換によって不変であるので、u(j)<m>=u´(j)<m´>がξ個の異なるjに対して成り立つ必要があるためである。これは、以下に示す数19が全てのjiで成立することであり、ξ=1の場合のみ成立する。
[数19]
以上から、シンドローム変換法によれば、<m>をスキャンすると、異なる<m>毎に異なる仮想エラー点の多項式を構成できる。ξ=1の場合、シンドロームのuを掛ける変換のみで仮想エラー対応ができることに相当する。
また、仮想的な、エラーの1つの成分に着目すると、例えば、u(j)<m>ej=ε(S<m>+0)−1(j)<m>ejがゼロ以外の全てのZp成分を動く条件は以下の通りである。つまり、<m>の成分のいずれかが0からp−2を変動させれば、
[数20]
がZpの0を除く1〜p−1の成分で動くので、その逆元である(S<m>+0)−1(j)<m>もゼロ以外の全ての成分を取る。結局、u(j)<m>ejがゼロ以外の全ての成分を一回は取ることになるので、<m>の成分のどれかを0からp−2へとスキャンさせれば十分条件となる。
シンドローム変換法では、シンドロームをp−1個の対角行列を導入して、これらの個々の0〜p−2乗を用いて、仮想的なエラーを発生させている。そこで、次に、このような仮想的なエラーへの変換でカバーできるエラーと、シンドローム変換法の条件について説明する。
真のエラーコード語の点をE=(e1,e2,・・・,ep−1)とすると、シンドローム変換法による仮想的なエラーコード語の点は、<m>E={u(1)<m>e1,u(2)<m>e2,・・・,u(p−1)<m>ep−1}となる。
ξ個のエラー成分位置があり、これらをji(i=1〜ξ、j1<j2<・・・<jξ)で表し、数21のようにおく。
[数21]
数21では、εi(i=1〜p−1)を変数と考え、ε1〜εp−1の和がεに固定されている。
そこで、和がεとなるξ個の成分の場合の数を計算する。
ξ−1個の成分については1〜p−1を自由に選択できる。このξ−1の和に対して最後のξ個目の値を選択して、ξ個の成分の和がεと合同になるようにできるため、変数の選択の場合の数は(p−1)ξ−1となる。
ただし、このままでは最後の選択に0を取らなければならない場合も含むので、この場合は排除する。ξ個の1〜p−1で和がεと合同になる場合の数をn(ξ)とすると、最後の選択の前に和がεとなる場合を除いておかなければならないため、n(ξ)=(p−1)ξ−1−n(ξ−1)となる。これから、数22のようなn(ξ)を得る。
[数22]
このεのξ個への分割の場合の中には成分が全て0〜p/2の間にあるもの、即ちJ+のみに成分が属するものがある。異なる仮想的なエラーへの変換の数がこのn(ξ)個の場合の数以上であれば、J+の仮想エラーを作ることができる。この場合、発生した真のエラーがリー・メトリック・コードのエラー訂正の条件を満たせばシンドローム変換法で漏れなく解けることになる。
続いて、真のエラーからシンドローム変換法で発生可能な異なる仮想的エラーの数を求める。前述の場合、ベクトル<m>の次数は3である。したがって、<m>=(m1,m2,m3)であり、εの分割の成分が1からp−1の全てを動くように、それぞれの成分を0からp−2に独立にスキャンする。今の具体例の場合、<m>≠<m´>の変換の数は(p−1)3である。
ξ個の自由変数εiの和がεとなる場合の数n(ξ)と比較すると、
[数23]
が漏れのないスキャン条件となる。これから、ξ=4がこの条件を満たし、対角行列を3つ用いる方法では、ξ=4までなら漏れのない探索が可能となる。
さらに、jが1〜p−1まで動くとき、ゼロ以外のZpの全ての要素である1からp−1までを動く関数を対角行列とする行列のm乗を追加すると、上記と同様に変換の数をp−1倍ずつ増やすことができる。
ζ個の行列を並べれば変換の数は、(p−1)ζになり、漏れのない条件を常にξ=ζ+1とできる。
これらの関数の例は、今までに用いた、j、p−j、p−j−1の他に、aをZp内のa≠1、2であり、且つ、ある数の累乗以外の数をaとするaj、p−ajがあり、十分な数の変換を作ることができる。したがって、適当にaを選んで対角行列を作れば、<m>の次数を拡大することができ、ξはこの次数より常に1だけ大きく設定できる。そのため、リー・メトリック・コードの訂正可能条件を満たす場合の全てに対して、ユークリッド反復法を用いる代わりにシンドローム変換法を用いても漏れの無いエラーの探索が可能になる。
ただし、変換の場合の数はζが1増えるとp−1倍になるので、探索の数は指数的に大きくなる。したがって、場合によっては従来のユークリッド反復法を用いた方がシンドローム変換法より処理時間が短くなると考えられる。この場合、適用するメモリシステムに応じて、最適な選択を行う必要がある。特に、ε=1、2等の場合、シンドローム変換法を用いた方が有利になる。
<p−adic・NANDフラッシュメモリのデータインタフェース>
以上を踏まえ、ここでは、エラー訂正にシンドローム変換法を用いたNANDフラッシュメモリの具体例について説明する。以下において、このNANDフラッシュメモリを「p−adic・NANDフラッシュメモリ」と呼ぶ。また、特に断りがない場合、「メモリシステム」はp−adic・NANDフラッシュメモリを指すものとする。
先ず、どのようなp−adicセルを選択するかの比較検討を行う。
図1は、第1の実施形態に係るメモリシステムのp−adicセルのレベル数毎のデータ記憶効率等の関係を示す表である。表中1列目が評価項目となる。各評価項目は以下の通りである。
L: p−adicセルの閾値レベルの区分数
p: 使用する素数
h: Zpをバイナリ表示するために必要な最小ビット数
ε: エラー訂正できるエラーのリー・メトリック総量
M: M=h(p−ε−3)によって決定する値であり、ECCで一括処理を行う「binary world」のバイナリのデータ量であるビット数
ここで、「binary world」とは、本実施形態に係るメモリシステム外にあるIT機器などバイナリでデータを取り扱う環境をいう。
δ: Mの2h進数としての桁数(δ=M/h)
M/(p−1): 1つのp−adicセルがバイナリの何ビット記憶に相当するかの指標
バイナリMビットを、p−1個のコード成分のコード語としてp−1個のp−adicセルに記憶する。
p−1: リー・メトリック・コードのコード語を記憶するのに必要なp−adicセル数
log2L: p−adicセルをバイナリを記憶する多値セルとした場合に、p−adicセルに記憶できるビット数
ε/(p−1): εを用いた場合の最大訂正できるセル数の割合。又は、一つのp−adicセル内で訂正できる最大エラーレベル距離の割合
log2L/{M/(p−1)}: メモリセルをリー・メトリック・コードを用いたECCを記憶するp−adicセルとして使用した場合の、メモリセルをバイナリ多ビットセルとして見なした場合に対する冗長度
表の点々を施した部分が、p−adicセルのレベルやバイナリに対する冗長度の観点から実用的な場合と思われる範囲である。
ここでは、実用的なメモリシステムとして、図1中星印で示したL=17、ε=4の場合であり、16セル中4セルを訂正できる場合を例として説明する。
これは、実用されているNANDフラッシュメモリの1セル当たりのレベル数が16レベルである点を考慮している。また、εが1増えるとシンドローム変換法の処理の規模は、ほぼp倍で増えるので、p=17を用いる場合、図1中二重丸で示した16セル中2セルを訂正可能なε=2の場合が当面実用的とも考えられるが、実施形態の理解を助けるためε=4の場合を取り上げることとした。
続いて、p=17、ε=4の場合の具体例に対して、NANDフラッシュメモリシステムを構成するが、始めに、このNANDフラッシュメモリシステムの仕様を示す。なお、ここで示す仕様は、他のpやεを用いた場合にもその仕様の骨子(スケルトン)となるものであり、pやεの値よってこのスケルトンの値を対応する値に変更してやれば良い。
以下が、p−adic・NANDフラッシュメモリの仕様である。
(1) データインタフェースの構成を×8の1バイト構成とする。
(2) クロックに同期して動作する。
(3) データ転送の単位としてのセクタは512バイトとする。
(4) バイナリからp進数への変換処理の単位を50ビットとする。以下において、この50ビットのバイナリからp進数への変換処理を「プロセス」と呼ぶ。なお、他の一般的な用語としての「プロセス」と区別するため「PROCESS」と表記する。したがって、1セクタ分のバイナリは、82PROCESSでp進数に変換される。
(5) ページサイズを4セクタ(2048バイト)とする。ブロックサイズは、特に決めないが、64ページなどセルアレイの構成に依存した大きさとする。
(6) ページを構成する各セクタへのアクセスはランダムとする。
(7) セクタ内のアクセス方法として、種々のモードを用意する。アクセスモードは、大別して「高速モード」と「ランダムモード」の2つとする。
高速モード: セクタ内の固定されたアドレス順にアクセスするモードである。書き込み動作では、セクタアクセス開始後10サイクル経過後に、PROCESSを開始して順次データを処理していく。読み出し動作では、1PROCESSが終了するとセクタのアクセスを可能にする。書き込み動作、読み出し動作共にセクタに対するPROCESSと、そのセクタの対するアクセスは同時進行される。
ランダムモード: セクタへのアクセスのバースト長、バーストモード、バーストの先頭アドレスが設定可能なアクセスモードである。
例えば、バースト長としては、4/8/16/32/256ビット等、バーストモードとしては、インタリーブモード/ラップアラウンドモード等に設定可能である。
セクタに格納するデータに対するPROCESSが終了した後に、セクタへのアクセスが可能になる。
書き込み動作時のPROCESSは、セクタアクセスへのデータ格納が終了してから開始する。
なお、ランダムモードではセクタへのデータがまとまってからアクセスやプロセスが開始されるため、同一セクタへのアクセスとPROCESSが同時進行することは無い。
次に、上記仕様スケルトンを実現するメモリシステムの概要を説明する。このシステムは、Zpの数をデータとして直接扱うシステムである。
なお、前述の通り、メモリシステム外にあるIT機器などバイナリでデータを取り扱う環境を「binary world」と呼ぶことにする。これに対し、演算処理などバイナリのデータを取り扱う部分も含め、データをZpで取り扱うp−adic NANDフラッシュメモリシステム内の環境を「p−adic Zp world」と呼ぶことにする。この場合、「binary world」は、「p−adic Z2 world」と呼ぶこともできる。
図2は、メモリシステムの概念図である。このメモリシステムは、主に、データ(コード)を記憶する“p−adic NAND cell”部分と、この“p−adic NAND cell”部分に対する書き込みや読み出しの際のエラー処理を行う“Lee metric code & ECC”部分を有する。これら、“p−adic NAND cell”部分や“Lee metric code & ECC”部分は、「p−adic Zp world」に属する部分である。
更に、このメモリシステムには、「binary world」と「p−adic Zp world」とのインタフェースとして、バイナリのデータをZpのデータに変換する“binary to p−adic”変換部と、Zpのデータをバイナリのデータに変換する“p−adic to binary”変換部とを有する。
メモリシステムの外部は「binary world」であるので、“binary to p−adic”変換部によって、「binary world」から入力されるバイナリデータが50ビット毎に処理される。その後、これらデータは、p−adicセルに記憶され、更に、“p−adic to binary”変換部によって50ビット毎に「binary world」に出力される。
“p−adic NAND cell”部分に記憶されたデータに対するECCは、リー・メトリック・コードをZpに適用することによって容易に行うことができる。本メモリシステムでは、“Lee metric code & ECC”部分を備えることで、このECCの処理も行うことができる。
また、メモリシステムは、binary to p−adic”部分と、“p−adic to binary”変換部を備えているため、ユーザは、メモリシステム内部の「p−adic Zp world」を意識することなく、「binary world」のままメモリシステムを扱うことができる。
なお、“p−adic NAND cell”部分に対するデータの書き込み及び読み出しはその閾値レベルとZpの要素を直接対応付けて扱うが、この対応付けの方法には2通りある。
1つ目は、従来通りのNAND接続された多値記憶セル(以下、「NAND MLC」と呼ぶ)へのデータの書き込み及び読み出しに対してインタフェースで対応する方法である。MLCが記憶するZpレベル(1〜p−1)をNAND MLCのページ等の情報として一旦変換する必要があるため、NAND MLCと周辺回路の「p−adic Zp world」を仲介する部分にはロジック部分を持たせる必要がある。この方法の場合、MLCが記憶するZpの情報は複数のNAND MLCのページ情報にまたがるので、データの転送に時間がかかる。
2つ目は、Zpレベルを物理量レベルとしてp−adicセルに直接書き込む方法である。この方法によれば、1つ目の方法に比べて、データの書き込み/読み出しの処理を高速にすることができる。
本実施形態では、2つ目の方法を採用している。
次に、前述したメモリシステムの仕様に適合するデータ転送と、内部のp−adicセルとの整合をとるためのインタフェース回路について説明する。
本実施形態に係るメモリシステムの場合、データの処理結果は、全て、ページを構成するページレジスタ上に現れる。また、p−adicセルは、このページレジスタとそのデータのやり取りを行う。したがって、このページレジスタをどのような構成にするかがデータ転送仕様のキーとなる。
始めに、データインタフェースの仕様について、今一度確認しておく。
(1) メモリシステムのI/Oの転送速度は、1バイト/サイクルである。つまり、転送単位は1バイトとなる。
(2) 50ビット分のバイナリデータを処理単位としてリー・メトリック・コードへの変換を行う。
(3) 1セクタは、512バイトである。したがって、1セクタ分のバイナリデータの転送には、512サイクルを要する。
(4) 1セクタ分のバイナリデータをリー・メトリック・コードに変換するためには82PROCESS要する。82PROCESSによって処理できるバイナリデータは、82×50=4100ビットとなる。したがって、1セクタよりも4ビットだけ多く処理することになる。
(5) バイナリデータをp進数データに変換した場合、50ビット当たり55ビットに増大する。したがって、1セクタ当たり、82×55=4510ビット分のレジスタが必要となる。
(6) p進数データへの変換を経て、バイナリデータをリー・メトリック・コードに変換した場合、50ビット当たり80ビットに増大する。したがって、1セクタ当たり、82×80=6560ビット(820バイト)分のレジスタが必要となる。
続いて、上記(2)を考慮し、50ビット毎のデータ処理を効率的に行えるようなレジスタ構成について説明する。
データは、上記(1)より、1バイト/サイクルの速度で転送されるため、50ビットのバイナリデータを転送するには、最低でも7サイクル必要になる。また、上記(6)より、50ビットのバイナリデータをリー・メトリック・コードに変換した場合、そのサイズは80ビットに増大する。
ここで、50ビットは5×10ビット、80ビットは8×10ビットで表わすことができる。そこで、本実施形態に係るメモリシステムでは、10×8のレジスタブロックをバイト単位の複数のレジスタで構成し、このように構成されたレジスタを用いたデータ処理を行う。これによって、メモリシステムにおける最適なレジスタ構成とデータ処理を実現することができる。なお、10×8のレジスタブロックについては後述する。
続いて、データ処理のフローについて、図3を参照しながら説明する。
1レジスタブロックに対する50ビットのバイナリデータの転送は、10サイクルで実行される。
したがって、データ転送のアドレス順が決まっている場合、10サイクル毎に1PROCESSの処理が可能になる。ただし、PROCESSではI/O毎のデータがマージされて処理されるため、I/Oにマスクをかけて無効にした場合には、そのI/Oについては、固定されたデータがあるものとして処理される。
一方、データ転送のアドレス順がランダムである場合、セクタを構成するレジスタのどこにデータが転送されるか判断できないため、1セクタ分のデータ転送の完了のコマンドを受けて、処理データの準備が完了したと判断し、PROCESSを開始する。
PROCESSは、10×8のレジスタブロックを後述する“D−r”レジスタとみなし、この“D−r”レジスタに対するオーバーライトを利用して処理される。
始めに、“D−r”レジスタに記憶された処理データをh=5、δ=10 のバイナリデータ(第1のデータ)として、p進数(第2のデータ)に変換される(図3中S1)。続いて、p進数に変換されたデータは“D−r”レジスタに上書きされる(図3中S2)。続いて、“D−r”レジスタに記憶されているp進数データに対して生成行列Gを掛けてリー・メトリック・コード(第3のデータ)に変換する(図3中S3)。最後に、このリー・メトリック・コードを、“D−r”レジスタに上書きする(図3中S4)。
これによって、“D−r”レジスタとしての10×8の80ビットのレジスタブロックのレジスタに記憶されていた1PROCESS分のバイナリデータは、リー・メトリック・コードに変換された上で、同一のレジスタブロックに上書きされて記憶される。
以上のPROCESSシーケンスを繰り返しによって、512バイトあるセクタのデータを、82PROCESSで処理する。なお、82PROCESSで処理できるデータ量は、512バイトに対して4ビット多くなるため、4ビットの固定ダミービットを付加して処理を行うことになる。
次に、レジスタブロックの構成と、バーストデータ転送の関係を説明する。
図4は、セクタレジスタを構成する最初のレジスタブロックを示す図である。
1個のレジスタブロックは80個のビットレジスタからなりこのうち図4中aで示した8×5のレジスタ群に1〜5サイクル目の転送データが保持される。
6〜10サイクル目の転送データは、8×5のレジスタ群の下側に並列に配置された図4中bで示したレジスタ群に保持される。6〜10サイクル目の転送データの一部は、図4に示す最初のレジスタブロックに保持される1PROCESS分のデータの一部を構成し、その他は、次のレジスタブロックに保持される1PROCESS分のデータの一部を構成する。
入力されるバイトデータの転送の走査は、図4中破線矢印で示すように、波状に進行する。つまり、最初の10サイクルの転送データによって、最初のレジスタブロックのデータが確定し、その後、データ処理が可能になる。
また、サイクルを跨いで転送されたバイトデータは、処理上はマージされるため、バイトデータのビット毎に用いられるサイクル数が異なることが分かる。図4の場合、バイトデータのうち、最初の2ビットは10サイクル、残りの6ビットは5サイクル分のデータとなっている。
次に、データ書き込み時のセクタレジスタにおけるデータ処理の過程について、図5を参照しながら説明する。
図5は、左から順に、バイナリデータのバースト転送のセクタレジスタの様子(図5中S1)、p進数変換後のセクタレジスタの様子(図5中S2)、リー・メトリック・コード変換後のセクタレジスタの様子(図5中S3)を示している。なお、図5中の破線は、8ビット毎のバイトレジスタの境界を示している。
セクタレジスタは、820個のレジスタを8列並べた構成となっており、820行で102.5バイトのデータ転送の受け口を持つ。8列のうち、1〜5列目をデータ転送で利用し、残りの6〜8列目をデータ転送後の処理データの保持に利用する。
図5中S1では、レジスタブロックに対し、512サイクル掛けて1PROCESS分のバイナリデータが転送される。始めに、512サイクルで転送されるバイナリデータのうち、最初の1〜510サイクル目に転送されるバイナリデータは、5サイクル毎に、1〜5行目のバイトレジスタに順に格納される。510サイクル目に転送されるバイナリデータの格納が完了した時点では、820行のうち1〜816行のレジスタはデータが埋まる。
続く、511、512サイクル目に転送されるデータは、それぞれ4ビットずつに分割された上で、図5中S1下図に示すように、それぞれ817〜820行目の1〜4列目のレジスタに保持される。なお、817〜820行目の5列目のレジスタには、4ビットの固定されたダミーデータが格納される。
以上によって、セクタレジスタには、10桁の25進数のh=5、δ=10に相当する50ビットのバイナリデータが82PROCESS分格納されることになる。
図5中S2では、50ビットのバイナリデータが11桁のp(=17)進数である55ビットのデータに変換されセクタレジスタに上書きされる。このPROCESSはレジスタ10行毎に行われる。変換されたp進数のデータは、各10行8列のレジスタブロックのうちの55ビットに格納される。セクタレジスタは、820行8列のレジスタからなり、1PROCESSで10行ずつデータが上書きされることになるため、82PROCESSで全てのセクタレジスタはp進数データで埋められることになる。
以上で、図5中S1、S2によって、1セクタにおけるバイナリデータからp進数データへの変換が完了する。
図5中S3では、p進数データをリー・メトリック・コードに変換する。
リー・メトリック・コードは、p−1(=16)個のZpの要素を成分とするデータとなる。1PROCESS分のリー・メトリック・コードは、55ビットのp進数データに対してG行列を掛けて得られる80ビットのデータであり、この1PROCESS分のリー・メトリック・コードは、10行8列のレジスタブロック1つに上書き格納される。この場合、82PROCESSで1セクタレジスタ全体がリー・メトリック・コードで満たされることになる。これによって、セクタレジスタには、p−adicセル164バイト個に書き込むためのデータが保持される。
以上、図5中S1〜S3に示す3段階の処理は、10行8列のレジスタブロック毎に順時進行して行く。
なお、セクタレジスタへのデータ転送には、前述の通り、高速モードとランダムモードがある。高速モードの場合、転送されて来たバイナリデータは、セクタレジスタの先頭から順に埋められていく。したがって、高速モードでは、10行8列のレジスタブロックに1PROCESS分のバイナリデータが格納された時点でPROCESSをシリアルに順時実行することができる。
一方、ランダムモードの場合、バースト長毎に先頭アドレスを指定してデータの格納場所を設定できると共に、インタリーブとラップアラウンドの2つのアドレッシングモードを選択することができる。この場合、レジスタブロックにはデータが格納されていない領域が飛び飛びに発生することになる。したがって、ランダムモードでは、セクタレジスタへのバイナリデータ格納完了を示すコマンドを待って、PROCESSを開始するなどの制御が必要となる。
このように、本実施形態に係るメモリシステムでは、バイナリデータ(第1のデータ)からp進数データ(第2のデータ)への変換の際とp進数データ(第2のデータ)からリー・メトリック・コード(第3のデータ)への変換の際の2回、セクタレジスタに対するデータの上書きが実行される。
因みに、従来のメモリシステムの場合、バイナリデータからp進数データへの変換に相当する処理がなく、バイナリデータを直接リード・ソロモン(Reed−Solomon)等を用いたコードに変換していたため、レジスタに対する上書きはせいぜい1回となる。
次に、データ読み出し時のセクタレジスタにおけるデータ処理の過程について、図6を参照しながら説明する。
図6中S1では、p−adicセルアレイの164バイト個のp−adicセルに記憶されたデータが、82PROCESS分の820バイトのセクタレジスタに読み出される。
セクタレジスタに格納されたデータは、10行8列のレジスタブロックに格納された1PROCESS分のデータ毎に、セクタレジスタの端からECCによる計算処理を受け、エラーが訂正できるものは訂正され、できないものはそのままにされる。そして82PROCESSによって1セクタ全てのデータに対するECC処理が完了し、リー・メトリック・コードが復元される。
図6中S2では、図6中S1において復元されたリー・メトリック・コードが順次p進数データに変換される。ここでは、1セクタ分のリー・メトリック・コードは、1PROCESS分の80ビット毎に生成行列Gの逆変換が行われ、5ビットの11桁で表されるp進数データに変換された上で、各レジスタブロックに上書きされる。
図6中S3では、図6中S2において生成されたp進数データが25進数のバイナリデータに変換される。「p−adic to binary」部分では、1PROCESS分のp進数データを5ビット10桁の50ビットのバイナリデータへと変換した上で、このバイナリデータを10行8列のレジスタブロックの単位で上書きしていく。
その後、バイナリデータは8行5列のレジスタ群毎に、1バイト/サイクルの速度で列順に読み出され、1セクタ分のデータとして出力される。なお、セクタレジスタからの最後の2サイクル分のデータ読み出しについては、図6中S3下図に示すように、データ書き込み時と同様、4ビット2列のバイナリデータをバイトデータとして1サイクルで読み出される。
なお、高速アクセスモードではセクタレジスタの先頭からデータが読み出されるため、1PROCESSの処理のレイテンシでセクタレジスタのデータを順次読み出すことができる。一方、ランダムモードではセクタ内のバーストの先頭が予め分かっているわけではないため、セクタレジスタに1セクタ分のバイナリデータが再現される82PROCESSの終了後に初めてアクセスすることができる。
このように、本実施形態に係るメモリシステムでは、ECC処理後に実行されるリー・メトリック・コード(第3のデータ)からp進数データ(第2のデータ)への変換の際とp進数データ(第2のデータ)からバイナリデータ(第1のデータ)への変換の際の2回、セクタレジスタに対するデータの上書きが実行される。
因みに、従来のメモリシステムの場合、リー・メトリック・コードからp進数データへの変換に相当する処理がないため、レジスタに対する上書きはせいぜい1回であった。
<p−adicセルへのZpの要素の割り付け>
次に、p−adicセルに対してリー・メトリック・コードC=(c1,c2,・・・,c16)の各コードcjを記憶する際に最適な、p−adicセルのレベルに対するZpの要素の割り付けについて説明する。
本実施形態では、図7に示すように、p−adicセルの最下位レベルから、0、1、・・・、16のようにZpの要素を連続的に割り付ける。この場合、エラーの量と、レベルの変化量とが比例することになる。
p=17の場合、p−adicセルに必要なレベル数は17であり、これら17段階のレベルの境界(閾値)数は16となる。
また、ε=4の場合、1セルのみでエラーが生じた場合は、図7中の太い矢印で示す範囲のレベルの誤認識に対してエラーの訂正が可能となる。但し、エラーは、隣接レベルの範囲内の誤認識によって生じることが主である。
つまり、本実施形態に係るメモリシステムは、図7に示す割り付け方によって、実質的に16セル中4セルのエラー訂正を実現する強力なエラー訂正能力を持つことができる。
<データの読み出し/書き込み>
次に、p−adicセルアレイに対するデータの書き込み/読み出し方法の一例を図8を参照しながら説明する。なお、ここでいう「p−adicセルアレイ」とは、p−adicセルとして浮遊ゲート型トランジスタを用い、複数のp−adicセルをNAND接続してなるセルアレイを意味している。
ここで、予め、図8に示す各記号の意味について説明しておく。
p=17の場合、リー・メトリック・コードのコード成分は16個となる。これら各コードをc1〜c16とする。各コードcは、5ビットからなるバイナリhで表わすことができる。また、バイナリhの最下位ビットから最上位ビットの各ビットをCj0〜Cj4とする。
データ書き込み/読み出しの際、データ書き込み部或いはデータ読み出し部の一部として機能するロウデコーダ/ワード線ドライバ(Row Dec./WLDriver)から供給される書き込み電圧/読み出し電圧によってワード線WLのレベルは17段階に変化する。このときのワード線WLのレベルを示す信号をΔ1〜Δ17とする。また、ビットXを反転させたものを‘/’を付加し、‘/X’で表わす。
始めに、p−adicセルに対するデータの書き込みについて説明する。
p−adicセルとなるNANDセルの閾値は、ワード線WLとビット線BL間に一定の電圧をかけて浮遊ゲートに注入される電子の量によって設定する。
データ書き込みの際、ワード線WLの電位は、16段階で上昇していく。一方、ビット線BLは、一定電源Vssに接続されており、p−adicセルが所望の閾値になった時点で、一定電圧Vssから切り離されるフローティング状態になる。これによって、浮遊ゲートに電圧が印加されることはなく、浮遊ゲートに対する余計な電子の注入を回避することができる。
本実施形態では、この方法を用いてコードを構成する成分に対応するp−adicセルに対して一括に閾値の設定を行なう。コード成分c1〜c16にはZpの要素が対応しているので、これをバイナリで表現する。p−adicセルのレベルとなる閾値には、最低の閾値にZpの要素0を割り付け、以降、低い方からZpの要素を昇順に割り付ける。ここで、各ZpのレベルLに対応した閾値区分の上限をL、この閾値に対応した電子量を注入するためのワード線WLのレベルをWVL、このワード線のレベルWVLを発生させる信号をΔLとする。
p−adicセルの消去状態を閾値の一番低い状態とすると、Zpの成分0を書き込むべきp−adicセルの閾値は変化させる必要はないが、Zpの他の成分を書き込むべきp−adicセルの閾値は変化させる必要がある。
そこで、本実施形態では、p−adicセルの閾値を変化させるために、ワード線WLの電圧を低い側から順次上げていき、浮遊ゲートに電子を注入していく。その際、ワード線WLの電圧がp−adicセルに設定すべき閾値に対応する電圧以上になった場合、上記の通り、そのp−adicセルに接続されるビット線BLをフローティング状態にして、余計な電子注入が生じないようにする。この制御を行なうのが図8中aで示すプログラム設定回路である。
プログラム設定回路は、ビット線BLを電圧Vssに接続するためのNMOSトランジスタQN1を有する。このトランジスタQN1のゲートは、後述する制御信号/pで制御されるNMOSトランジスタVccを介して一定電圧Vccに接続される。また、トランジスタQN1のゲートは、Zpの各要素に対応した並列に並ぶ16のパスを介して電圧Vssに接続される。これら16のパスは、それぞれ5つのNMOSトランジスタを直列接続させた回路となっている。各パスは、/Cj0∧/Cj1∧/Cj2∧/Cj3∧/Δ1、Cj0∧/Cj1∧/Cj2∧/Cj3/Δ2、・・・、Cj0∧Cj1∧Cj2∧Cj3∧Δ16の場合に導通するようになっている。
データ書き込みの際、ワード線のレベルは、WV0からWV16へと変化するが、この際、プログラム設定回路は、ワード線のレベルに応じて、ビット線BLを電圧Vssに接続するか、電圧Vssから切り離してフローティング状態にするかを制御する。
すなわち、ワード線のレベルがWVLの時、つまり信号ΔLがアクティブになっている時、L−1を設定すべきp−adicセルに接続されたビット線BLを電圧Vssから切り離す。これによって、そのp−adicセルの閾値はL−1の区分に設定されることになる。ビット線BLと電圧Vssとの切り離しは、トランジスタQN1で制御される。このトランジスタQN1のゲートのノードn1は、最初、信号/pによって制御されるトランジスタQP1を介してプリチャージされている。そして、コード成分を表すビットの情報Cj0〜Cj3とワード線のレベルを表す信号Δ1〜Δ16によるデコード結果によって、ノードn1を放電する。これによって、トランジスタQN1がオフし、ビット線BLはフローティング状態となる。なお、Zpの要素16を書き込むべきp−adicセルに関しては、ノードn1を放電させる必要がなく、Zpの要素0〜15をデコードできれば良いため、Cj0〜Cj3の4ビットの情報を用いれば良い。
このプログラム設定回路は、同一のワード線WLに属し、コードの異なる成分に対応するp−adicセルに接続されたビット線BL毎に設けても良い。この場合、ワード線WLの電圧を順次上昇させていくことによって、p−adicセルは、コード成分のZpに対応する閾値レベルに設定される。
また、p−adicセルに対する正確な閾値レベルの設定のために、ワード線のレベルの変化の際に、p−adicセルの閾値の状態を検証するベリファイ読み出し動作を入れても良い。
続いて、p−adicセルからのデータの読み出しについて説明する。
データ読み出しの際に、p−adicセルに流れる電流Icellから、p−adicセルのレベルを検知するのが、ビット線BLの一旦に設けられたセンスアンプ部t−SAである。
センスアンプ部t−SAは、参照電流Irefとセル電流Icellを比較するセンスアンプsa、このセンスアンプsaによる最新の比較結果を保持するラッチL1、センスアンプsaの1つ前の比較結果を保持するラッチL2、ラッチL1とラッチL2の結果からセンスアンプsaの比較結果の変化を検知するXORゲートG1、並びに、p−adicセルがZpの16に対応した閾値に変化したかを検知するXORゲートG2からなる。このXORゲートG2の出力がセンスアンプ部t−SAの出力Zとなる。
参照電流Irefは、閾値レベルの区分の上限とその閾値レベルに対応するワード線WLの電圧をp−adicセルに印加したときのセル電流よりも少し大きな電流に設定しておく。
センスアンプ部t−SAのセンスアンプsaは、参照電流Irefとセル電流Icellを比較して、セル電流Icellが大きい場合に、ラッチL1に対して‘1’を出力する。ワード線WLの電圧は、WV1〜WV16の範囲で順次変化させるが、ワード線のレベルがWVLで‘0’、WVL+1で‘1’の場合にのみp−adicセルの閾値レベルは区分がLとなっており、p−adicセルは、Zpの要素Lを保持していることになる。
センスアンプsaによる比較結果は、2つのラッチL1とL2に順次転送される。これらラッチL1及びL2の内容が異なる場合、センスアンプ部t−SAの出力はZ=‘1’となる。これによって、ワード線のレベルWVLからp−adicセルに書き込まれた閾値の状態を判別することができる。
なお、ワード線のレベルがWV1の時に、既にZ=‘1’の場合、p−adicセルの閾値は区分0以下であることを判別する必要がある。また、ワード線のレベルがWV16の時に、Z=‘0’ならp−adicセルの閾値は区分16以上であることを判別する必要がある。そこで、これらの判断ができるように、ラッチL1、L2の初期状態を‘0’に設定し、更に信号Δ16の後に信号Δ17を発生させる。これによって、センスアンプ部t−SAの出力がZ=‘1’になった際の信号ΔLからp−adicセルの閾値のレベルがL−1であるとの判断が可能になる。
各ビット線BLにぶら下がるCj0〜Cj4を保持する5ビットのレジスタについて説明する。
レジスタは、ビット毎に図8中bのような回路を有する。つまり、レジスタは、ビット毎に、2つのインバータからなるフリップフロップFF、このフリップフロップFFの一端のノードn2を入力とするインバータIV1、ノードn2の電圧を放電するための2つの直列接続されたNMOSトランジスタQN2、QN3、並びに、フリップフロップFFの他端のノードn3の電圧を放電するためのトランジスタQN4からなる。この構成によって、ノードn2は、/rj、インバータIV1の出力がrjとなる。また、ノードn2は、j∧Z=‘1’の場合に電圧Vssに接続され、ノードn3は、RS=‘1’の場合に電圧Vssに接続される。
図8に示す“Zp→h dec”回路ブロックは、信号Δ1〜Δ17を0〜16の5ビット表示に変換するデコーダである。
図8中bで示すレジスタは、この“Zp→h dec”回路ブロックが出力するバイナリ信号Cj0〜Cj4の配線とセンスアンプ部t−SAの出力Zの配線との各交点に配置されている。これによって、センスアンプ部t−SAが出力するZが5つのレジスタによって保持される。この場合、これら5つのレジスタが保持するデータは、コード成分cのバイナリ表示として利用することができる。
また、これらのレジスタは、データ書き込み/読み出し時の制御に利用することができる。例えば、データ書き込みの際、これらのレジスタに設定するコードの成分のバイナリ表示を格納しておけば、プログラム設定回路でベリファイを行い、ビット線BLをフローティング状態にするなどの制御に利用できる。
続いて、ロウデコーダ/ワード線ドライバからワード線WLに供給される書き込み電圧/読み出し電圧の設定について説明しておく。
同時にアクセスするp−adicセルの全てについてp−adicセルのレベルとコードの値の対応付けは同時にされるため、ワード線WLを、全ての電圧WV0〜WV16についてスキャンする必要がある。
図9は、ワード線WLの電圧を順に上げたり下げたりするスキャンの例である。
データ書き込み(Write)では、p−adicセルの閾値を順に上げるしか変化の方法がないため、ワード線の電圧は、低電圧側から高電圧側へと変化させる。一方、データ読み出し(Read)では、上記の通り、スキャン中に全てのレベルを移動すれば良い。
図9の場合、スキャン1では、ワード線レベルはWV0からWV16に上昇するため、上昇に先立ちコードデータCをレジスタに設定してデータ書き込みをすることができる。また、データ読み出しの場合、スキャン1が終了した時点で、コードデータが確定しているため、データの読み出しをすることができる。
スキャン1終了後に、データ書き込みをする場合は、スキャン2の点線で示すように、ワード線電圧を再びWV0に戻し、WV16まで順次上昇させていく必要がある。一方、データ読み出しをする場合は、スキャン2の点線で示すように、ワード線電圧を順次上昇させていっても、実線で示すように、スキャン1に続き、順次下降させても良い。スキャン2が終了した時点で、コードデータは確定しているため、スキャン1終了時点と同様、データの読み出しをすることができる。
スキャン1とスキャン2でワード線WLに属する全てのp−adicセルにアクセスする場合、これらのスキャン1及び2で異なるワード線WLを選択する必要があるが、センスアンプ部t−SAを複数のビット線BLで共用した場合など、同じワード線WLに属するp−adicセルをシリアルに読み出す場合、スキャン1及び2で同じワード線WLを選択することもできる。
<バイナリデータから17進数への変換>
次に、本実施形態に係るメモリシステムの入口と出口において必要となるバイナリとp進数(17進数)との変換回路について説明する。
図10は、p=17とした場合の「binary world」のδ桁の2h進数D(d0,d1,・・・,dδ−1)から「p−adic Zp mod p world」のδ+1桁のp進数D(a0,a1,・・・,aδ−1,aδ)への変換計算の過程の構成を模式的に示した図である。
なお、図10に示す“5 res”と示した四角は、入力されたバイナリデータを17で割り、商と剰余を求める演算回路である。この演算回路の入力は6ビットのバイナリデータであり、出力はこのバイナリデータを17で割った剰余となる。また、入力されたバイナリデータが17以上の場合、商をキャリーCとして出力する。以下、この演算回路素子を“5 res”回路ブロックと呼ぶ。
始めに、第0ステップ(図10中S0)では、10桁の25進数のデータD(d0,d1,・・・,d9)に対して最右側のd9側から17の数え上げを行う。ここでは、d9に対して、“5 res”回路ブロックに入力された6ビットのバイナリデータの最上位ビットに0を入れてd9を17で割った剰余と共に商であるキャリーC1 45を直接生成する。
続いて、5〜1ビット目が先の“5 res”回路ブロックの出力(5ビットで表現された剰余)、0ビット(最下位ビット)目がd8の最上位ビットD8 4(=D39)である6ビットのバイナリデータを入力とする次の“5 res”回路ブロックによって、入力されたバイナリデータを17で割った剰余と共に商であるキャリーC1 44を作る。
以降、“5 res”回路ブロックに入力される6ビットのバイナリデータのうちの0ビット目がd0の最下位ビットD0 0(=D0)になるまで、46個の“5 res”回路ブロックを用いてキャリーC1 0〜C1 45を生成する。これら生成されたキャリーC1 0〜C1 45によって表現されるバイナリデータは、データDに含まれる17の個数になっている。
そして、d0を入力とする“5 res”回路ブロックの出力が、11桁の17進数D(a0,a1,・・・,a10)のうち、a0のバイナリ表示になる。
続いて、第1ステップ(図10中S1)では、第0ステップで得られたデータDに含まれる17の個数に対して、更に17がいくつ含まれるかを計算して172の個数を求め、17進数Dの重み171の桁の係数a1のバイナリを求める。
第1ステップでは、キャリーC1 0〜C1 45に対して最右側のC1 45側から17の数え上げを行う。キャリーC1 41〜C1 45に対する17の数え上げに際しては、6ビットの入力バイナリデータの最上位ビットに0を入れて入力バイナリデータを17で割った剰余と共にキャリーC2 41を直接生成する。
続いて、5〜1ビット目が先の“5 res”回路ブロックの出力(5ビットで表現された剰余)、0ビット(最下位ビット)目がC1 40である6ビットのバイナリデータを入力とする次の“5 res”回路ブロックによって、入力されたバイナリデータを17で割った剰余と共に商であるキャリーC2 40を生成する。
以降、“5 res”回路ブロックに入力される6ビットのバイナリデータのうちの0ビット目がC1 Xの最下位ビットC1 0になるまで、41個の“5 res”回路ブロックを用いてキャリーC2 0〜C2 41を生成する。これら生成されたキャリーC2 0〜C2 41によって表現されるバイナリデータは、データDに含まれる素数172の個数になっている。
そして、C1 0を入力とする“5 res”回路ブロックの出力が、11桁の17進数D(a0,a1,・・・,a10)のうち、a1のバイナリになる。
続く第2ステップ(図10中S2)では、第1ステップで得られたデータDに含まれる172の個数に対して、更に素数pがいくつ含まれるかを計算して173の個数を求め、17進数Dの重み172の桁の係数a2のバイナリを求める。
以降、同様にp進数の重み1710の桁の係数a10のバイナリ表示を求める第10ステップ(図10中S10)まで行う。
なお、第10ステップのキャリーC11 0〜C11 5は計算には使用しない。
次に、“6 bit mod p”回路ブロックを用いた“binary to p−adic”変換部の構成について考える。ここで、“6 bit mod p”回路ブロックとは、6ビットのバイナリデータである入力Aと、素数17を比較し、Aが17以上の場合にPF0=‘1’を出力すると共に、Aの素数17による剰余Qを出力する回路である。詳細については後述する。
図11中(A)は、“binary to p−adic”変換部の第kステップの回路を、“6 bit mod 17”回路ブロックを用いて構成したものである。
ここでは、データを10桁の25進数表現にした場合の第j桁目をdjとする。この場合、djは5ビットのバイナリで表示できるが、この表示の係数Dを他のdの係数Dと共通に表現するために、数24に示すようにサブインデックスを用いる。
[数24]
また、第kステップの演算の入力である前ステップ(第k−1ステップ)のキャリーはCk 0〜Ck 5(10−k)+k−1であり、サブインデックスを2の累乗の指数とする2進数としての係数となっていて、この2進数によって表現される数がデータに含まれる17kの個数となる。
第kステップでは、図11中(A)に示すように、入力は5(10−k)+k個のバイナリ(キャリーCk 0〜Ck 5(10−k)+k−1)であり、これを5(10−(k+1))+k+1個の“6 bit mod 17”回路ブロックで受ける。
1つ目の“6 bit mod 17”回路ブロック<1>は、入力バイナリA0〜A4、A5に、それぞれCk 5(10−k)+k−5〜Ck 5(10−k)+k−1、0を入力し、出力Q0〜Q4、キャリーPF0から、それぞれR5(10−(k+1))+k 0〜R5(10−(k+1))+k 4、Ck+1 5(10−(k+1))+kを出力する。
図示しない2つ目の“6 bit mod p”回路ブロック<2>は、入力バイナリA0、及びA1〜A5にそれぞれキャリーCk 5(10−(k+1))+k−1、及び1つ目の“6 bit mod 17”回路ブロック<1>の出力R5(10−(k+1))+k 0〜R5((10−(k+1))+k 4を入力し、出力Q0〜Q4、及びキャリーPF0から、それぞれR5(10−(k+1))+k−1 0〜R5(10−(k+1))+k−1 4、及びCk+1 5(10−(k+1))+k−1を出力する。
以降、図11中(A)に示すように、同様の入出力を持つ“6 bit mod 17”回路ブロックが、合計5(10−(k+1))+k+1個並び、各“6 bit mod 17”回路ブロックから出力されるキャリーCk+1 0〜Ck+1 5(10−(k+1))+kが、次のステップである第k+1ステップの入力となる。
このように、バイナリからp進数への変換は、図11中(B)に示す模式図のように、キャリーCの最上位ビット側から順次実行される。
図11中(A)は、第kステップに関係する回路構成であるが、各ステップを時分割で処理することで、図11中(A)に示す回路構成を各ステップで使い回すことができる。この場合、各“6 bit mod 17”回路ブロックの入出力を単純なオン/オフによって制御可能にするために、“6 bit mod 17”回路ブロックの必要数が最大となる第0ステップの回路構成に、更に、10個の“6 bit mod 17”回路ブロックが付加される。
この様に構成された56個の“6 bit mod 17”回路ブロックからなる回路を図12に示す。以下において、この回路を“X to p”回路ブロックと呼ぶ。
図13に示すように、この“X to p”回路ブロックの入力は、図12中(A)においてk=0とした場合よりも10個多く、C0 0〜C0 59の合計60個となっている。また、出力は、5個おきの“6 bit mod 17”回路ブロックから出力される11個の5ビットのバイナリR0 0〜R0 4、R5 0〜R5 4、・・・、R45 0〜R45 4、R50 0〜R50 4と、次のステップの入力となる55個のキャリーC1 0〜C1 55となる。
次に、図10に示した“5 res”回路ブロックである“6 bit mod 17”回路ブロックについて具体的に説明する。
図14は、“6 bit mod 17”回路ブロックの回路記号を示す図である。“6 bit mod 17”回路ブロックは、6ビットのバイナリA0〜A5を入力し、5ビットのバイナリQ0〜Q4及びキャリーPF0を出力する。
“6 bit mod 17”回路ブロックは、入力バイナリAの素数17による剰余Qを出力すると共に、入力バイナリAが17以上の場合にPF0から‘1’、17未満の場合にPF0から‘0’を出力する。
ここで、h=5、p=17の場合、バイナリA、バイナリQ、素数pの間には、数25に示す関係が成立する。
[数25]
図15は、“6 bit mod 17”回路ブロックの回路図である。
“6 bit mod 17”回路ブロックは、PF0生成部U1、2個の半加算器(Half adder)HA1、HA2、及び3個の全加算器(Full adder)FA1〜FA3を有する。
PF0生成部U1は、所定の電圧が供給されるVcc端子と、接地電圧が供給されるVss端子との間に、直列に接続されたPMOSトランジスタQP1〜QP5及びNMOSトランジスタQN1〜QN2を有する。これらトランジスタQP1、QP2、QP3、QP4、QP5、QN1、及びQN2は、それぞれA0、A1、A2、A3、A5、A0、及びA4で制御される。
また、PF0生成部U1は、その他に、PMOSトランジスタQP6、4個のNMOSトランジスタQN3〜QN6、及びインバータIV1を有する。
トランジスタQP6は、トランジスタQP1のソース及びトランジスタQP4のドレイン間に並列に接続されている。トランジスタQN3〜N5は、それぞれ、トランジスタQN1のソース及びドレイン間に並列に接続されている。また、トランジスタQN6は、トランジスタQN1のソース及びトランジスタQN2のドレイン(Vss端子)間に並列に接続されている。これらトランジスタQP6、QN3、QN4、QN5、及びQN6は、それぞれA4、A2、A3、及びA5で制御される。
インバータIV1は、入力がトランジスタQN1、QN3〜QN6のソースに接続されている。このインバータIV1の出力がキャリーPF0になる。
半加算器HA1は、入力がA0及びPF0、出力がQ0、桁上げ出力がC0となっている。全加算器FA1は、入力がC0及びA1、桁上げ入力がPF0、出力がQ1、桁上げ出力がC1となっている。全加算器FA2は、入力がC1及びA2、桁上げ入力がPF0、出力がQ2、桁上げ出力がC2となっている。全加算器FA3は、入力がC2及びA3、桁上げ入力がPF0、出力がQ3、桁上げ出力がC3となっている。半加算器HA2は、入力がC3及びA4、出力がQ4となっている。
以上の構成によって、PF0生成部U1は、“6 bit mod 17”回路ブロックに入力されるバイナリAが17以上か否かを判断し、その結果をPF0から出力する。バイナリAが17以上の場合、17をバイナリAから引くために、半加算器HA1、HA2、及び全加算器FA1〜FA3によって、6ビットバイナリの17の補数である15をバイナリAに加えている。
次に、“binary to p−adic”変換部のコア部分となる“p−adic”回路ブロックについて説明する。
図16は、“p−adic”回路ブロックの回路記号を示す図である。
“p−adic”回路ブロックは、図16に示すように、B0〜B11、I0〜I59を入力し、r0〜r60を出力する。
図17は、“p−adic”回路ブロックのブロック図である。“p−adic”回路ブロックは、1ステップの回路構成を“X to p”回路ブロックとして、これに“X to p”回路ブロックの入出力を制御する制御スイッチSWが付加された構成となっている。
具体的には、入力I0〜I4、I5〜I19、・・・、I54〜I59は、それぞれ、制御スイッチSW1を介してC0 0〜C0 4、C0 5〜C0 19、・・・C0 54〜C0 59として“X to p”回路ブロックに入力される。これら制御スイッチSW1は、それぞれ入力B1〜B10によって制御される。
1個の制御スイッチSW1は、入力INと出力OUTを接続するトランスファトランジスタTQと、出力OUTを接地電圧に引き下げるNMOSトランジスタQNを有する。トランスファトランジスタTQは、制御信号がCNT=‘0’の場合にオンし、トランジスタQNは、制御信号がCNT=‘1’の場合にオンする。
制御スイッチSW1の場合、制御信号CNTは、/B1〜/B10となる。したがって、B=‘1’の場合、I0〜I59がそのままC0 0〜C0 59として出力され、B=‘0’の場合、入力に依らず出力は‘0’となる。これは、“p−adic”回路ブロックへの入力I0〜I59が不定であっても、“X to p”回路ブロックの入力が不定になることを回避するためである。
C0 0〜C0 59が入力された“X to p”回路ブロックは、前述の通り、R0 0〜R50 4、C1 0〜C1 55を出力する。
“X to p”回路ブロックから出力されたC1 0〜C1 55は、制御スイッチSW2を介して“p−adic”回路ブロックの出力であるr5〜r60となる。これら制御スイッチSW2は、入力B1〜B10によって制御される。したがって、これら制御スイッチSW2は、B=‘0’の場合、C1 0〜C1 55をそのままr5〜r60として出力する。
また、“X to p”回路ブロックから出力されたR0 0〜R50 4は、制御スイッチSW3を介して、“p−adic”回路ブロックの出力であるr0〜r54となる。これら制御スイッチSW3は、それぞれB0∧/B1〜B10∧/B11で制御される。これによって、例えば、R0 0及びr0間にある制御スイッチSW3は、B0=‘1’、B1=‘0’の場合のみ、R0 0をそのままr0として出力する。
制御スイッチSWを制御するB1〜B11は、タイミング信号であり、順次立ち上がる信号である。これに合わせて入力Iのパスが下位ビット側から5ビットずつ開通し、出力rのパスが出力Rのパスと切り替わる。
17進数の各桁の係数Aに相当するRは、次のステップの計算過程に入るまでに、そのステップの結果を出力するため、隣接するタイミング信号Bと論理演算した信号によってオン/オフ制御される制御スイッチSW3を介して後述する外部の“D−r”レジスタに出力される。
次に、以上説明した回路をまとめて構成された“binary to p−adic”変換部について説明する。
図18は、“binary to p−adic”変換部のブロック図である。“binary to p−adic”変換部は、“p−adic”回路ブロックに“D−r”レジスタが結合されて構成される。
“D−r”レジスタは、図18に示すように、タイミング信号B及びクロックclkで制御されるレジスタで、入力r0〜r60、D0〜D60、出力I0〜I59を持つ。
図19は、“D−r”レジスタの回路図である。
“D−r”レジスタは、ビット毎に2つのインバータからなるフリップフロップFFを有している。このフリップフロップFFには、制御スイッチSW1を介してDj(j=0〜60)が入力され、制御スイッチSW2を介してrjが入力される。一方、フリップフロップFFの出力側には、制御スイッチSW3を介してインバータIV1が接続されている。このインバータIV1の出力がIjとなる。
制御スイッチSW1〜SW3は、タイミング信号B0及びクロックclkによって制御される。具体的には、制御スイッチSW1は/clk∧/B0=‘1’の場合、制御スイッチSW2は/clk∧B0=‘1’の場合、制御スイッチSW3はclk=‘1’の場合にそれぞれオンする。
なお、“D−r”レジスタのデータ入力にないD50〜D60は‘0’とする。
“D−r”レジスタの初期状態は、バイナリD0〜D49が設定され、残りは‘0’で埋められた状態となっている。以後、B0が立ち上がるとclkの立ち下がりに同期してデータrjを取り込み、clkの立ち上がりに同期して取り込んだrjをIjとして出力する。
この“D−r”レジスタは、“p−adic”回路ブロックと結合してタイミング信号Bj毎に計算のステップを進める。各クロックの変化の様子は図20に示す。クロックclkからクロックckが作られ、更にタイミング信号Bjが作られる。
各計算ステップで17進数の各桁Ajが下位側から出力rとして得られ、これをタイミング信号Bjの後半のIjの取り込みと同じタイミングで保持していく。
全計算ステップが終了すると“D−r”レジスタには、17進数のデータDの各桁の係数aをバイナリに変換した場合の各桁の係数Aj mが保持されている。
なお、p=17の場合、計算ステップの数は12、“p−adic”回路ブロックに含まれる“6 bit mod 17”回路ブロックの数は56となる。
<17進数から25進数への変換>
図21は、「p−adic Zp world」の11桁の17進数D(a0,a1,・・・,a9,a10)から「binary world」の10桁の25進数D(d0,d1,・・・,d9)への変換回路の構成を模式的に示した図である。
なお、図21中“5 add 17”と示した四角は、入力された5ビットのデータに対して、入力されたキャリーCに応じて17を加え、6ビットのバイナリを出力する演算回路である。以下、この回路を“5 add 17”回路ブロックと呼ぶ。
始めに、第0ステップ(図21中S0)では、17進数の9次の桁のバイナリ表示に対して10次の桁のバイナリ表示をキャリーすなわち1710の個数のバイナリ表現として上述した計算を行う。これによって、179の個数としてキャリーC1 0〜C1 9の10ビットを得る。このキャリーC1 0〜C1 9が次の第1ステップの入力となる。
続いて、第1ステップ(図21中S1)では、17進数の8次の桁のバイナリ表示に対して、第0ステップで得られたキャリーC1 0〜C1 9を179の個数のバイナリ表現として前述の計算を行う。これによって、178の個数としてキャリーC2 0〜C2 14の15ビットを得る。このキャリーC2 0〜C2 14が次の第2ステップ(図21中S2)の入力となる。
以降、第0ステップ及び第1ステップと同様のステップを重ね、第9ステップ(図21中S9)では、17進数表現の0次の桁のバイナリ表示に対して、前の第8ステップ(図21中S8)で得られたキャリーC9 0〜C9 49をpの個数のバイナリ表現として前述の計算を行ない、170の個数すなわちDの2進数表現としてキャリーC10 0〜C10 54の55ビットを得る。但し、上位の5ビットはDの17進数と25進数との設定からゼロとなる。これらのキャリーC10 0〜C10 54からC10 50〜C10 54を除いたC10 0〜C10 49を5ビット毎にまとめるとDのバイナリ表現D(d0,d1,・・・,d9)を得ることができる。
次に、“p−adic to binary”変換部の構成について考える。
図22は、“p−adic to binary”変換部の第kステップの回路構成を、“6 bit add 17”回路ブロックを用いて構成したものである。ここで、“6 bit add 17”回路ブロックは、5ビットのバイナリデータである入力Bに素数17を加えてその結果をバイナリデータQとして出力する回路である。詳細については後述する。
データを11桁の17進数表現のj次の桁の係数ajは、5ビットのバイナリで表現できるが、このバイナリ表現の係数Aを他の桁の係数aと共通の表現とするめに、数26に示すようなサブインデックスを用いる。
[数26]
また、第kステップの演算の入力である前ステップ(第k−1ステップ)のキャリーはCk 0〜Ck 5(k+1)−1であり、サブインデックスが2の累乗の指数の2進数としての係数となっていて、この2進数が表現する数がデータに含まれる1710−kの個数となる。
第kステップでは、図22中(A)に示すように、5(k+1)個の“6 bit add 17”回路ブロックで処理される。各“6 bit add 17”回路ブロックには、1個のキャリー(carry)と、17進数表現の1桁分の係数を表示する5個のバイナリが入力される。
1つ目の“6 bit add 17”回路ブロック<1>は、carry、入力B0〜B4に、それぞれCk 0、Q−1 0〜Q−1 4が入力され、Q0、Q1〜Q5に、それぞれCk+1 0、Q0 0〜Q0 4が出力される。
図示しない2つ目の“6 bit add 17”回路ブロック<2>は、carry、入力B0〜B4に、それぞれCk 1、Q0 0〜Q0 4が入力され、Q0、Q1〜Q5に、それぞれCk+1 1、Q1 0〜Q1 4が出力される。
以降、図22中(A)に示すように、同様の入出力を持つ“6 bit add 17”回路ブロックが、合計5(k+1)個並び、各“6 bit add 17”回路ブロックから出力されるキャリーCk+1 0〜Ck+1 5(k+1)−1が、次にステップである第k+1ステップの入力となる。
このように、17進数からバイナリへの変換は、図22中(B)に示す模式図のように、キャリーCの最下位ビット側から順次実行される。
図22中(A)は、上記の通り、第kステップに関係する回路構成であるが、各ステップを時分割で処理することで、図22中(A)に示す回路構成を各ステップで使い回すことができる。この場合、各“6 bit add 17”回路ブロックの入出力を単純なオン/オフによって制御可能にするために、図23に示すように、k=0とした場合の5個の“6 bit add 17”回路ブロックを最小構成の回路ブロックとする。
この様に構成された5個の“6 bit add 17”回路ブロックからなる回路を“a to X”回路ブロックと呼ぶ。
図24に示すように、この“a to X”回路ブロックの入力は、Q−1 0〜Q−1 4とC0 0〜C0 4の10個となり、出力はQ4 0〜Q4 4とC1 0〜C1 4の10個となる。
次に、図21に示した“5 add 17”回路ブロックである“6 bit add 17”回路ブロックについて具体的に説明する。
図25は、“6 bit add 17”回路ブロックの回路記号である。“6 bit add 17”回路ブロックは、5ビットのバイナリB0〜B4と1ビットのキャリー(carry)を入力し、6ビットのバイナリQ0〜Q5を出力する。この“6 bit add 17”回路ブロックは、入力Bに対し、carryが‘1’なら素数17を加え、その結果をQとして出力する。
ここで、h=5、p=17の場合、バイナリB、バイナリQの間には、数27に示す関係が成立する。
[数27]
図26は、“6 bit add 17”回路ブロックのブロック図である。
“6 bit add 17”回路ブロックは、4個の半加算器(Half Adder)HA1〜HA4、及び1個の全加算器(Full Adder)FA1を有する。
半加算器HA1は、入力がB0及びcarry、出力がQ0、桁上げ出力がC0となっている。半加算器HA2は、入力がC0及びB1、出力がQ1、桁上げ出力がC1となっている。半加算器HA3は、入力がC1及びB2、出力がQ2、桁上げ出力がC2となっている。半加算器HA4は、入力がC2及びB3、出力がQ3、桁上げ出力がC3となっている。全加算器FA1は、入力がB4及びcarry、桁上げ入力がC3、出力がQ4、桁上げ出力がQ5となっている。
以上の構成によって、“6 bit add 17”回路ブロックは、carry=‘1’なら、入力バイナリBに素数17を加える。
次に、前述の“a to X”回路ブロックを用いて、17進数の次数を1つ下げるための1ステップ分の回路を構成する。以下では、この回路を“p to X”回路ブロックと呼ぶ。この“p to X”回路ブロックは、全計算ステップに共通に使用することができる。
図27は、“p to X”回路ブロックの回路記号を示す図である。“p to X”回路ブロックはタイミング信号B1〜B9で制御され、入力であるQ−1 0〜Q44 4、C9 0〜C9 49から、C10 0〜C10 54を出力する。
図28は、“p to X”回路ブロックのブロック図である。
“p to X”回路ブロックは、10個の“a to X”回路ブロックからなる。
1個目の“a to X”回路ブロック<1>は、“p to X”回路ブロックの入力の一部であるQ−1 0〜Q−1 4、及びC9 0〜C9 4を入力し、Q´4 0〜Q´4 4、及び“p to X”回路ブロックの出力の一部であるC10 0〜C10 4を出力する。
2個目の“a to X”回路ブロック<2>は、Q4 0〜Q4 4、及び“p to X”回路ブロックの入力の一部であるC9 5〜C9 9を入力し、Q´9 0〜Q´9 4、及び“p to X”回路ブロックの出力の一部であるC10 5〜C10 9を出力する。入力のうち、Q4 0〜Q4 4は、1個目の“a to X”回路ブロック<1>の出力Q´4 0〜Q´4 4がタイミング信号B9で制御される制御スイッチSW1を介して入力される信号である。
3個目の“a to X”回路ブロック<3>は、Q9 0〜Q9 4、及び“p to X”回路ブロックの入力の一部であるC9 10〜C9 14を入力し、Q´14 0〜Q´14 4、及び“p to X”回路ブロックの出力の一部であるC10 10〜C10 14を出力する。入力のうち、Q9 0〜Q9 4は、2個目の“a to X”回路ブロックの出力Q´9 0〜Q´9 4がタイミング信号B8で制御される制御スイッチSW2を介して入力される信号である。
以降、10個目の“a to X”回路ブロック<10>まで同様に接続される。
このように、“a to X”回路ブロックの入出力間を制御スイッチSWで接続するのは、計算ステップ毎に入力の接続が外部入力と内部入力で切り替わるためであり、外部入力の場合に内部回路の出力が干渉しないようにするためである。
図28の回路構成の場合、タイミング信号B0だけが‘1’のタイミングにおいて、全ての制御スイッチSWがオフされ、1番目の“a to X”回路ブロックだけが活性化する。これが第0ステップに相当する。
続いて、タイミング信号B1も‘1’になると、2番目の“a to X”回路ブロック<2>までが活性化する。これが第1ステップに相当する。
以降、タイミング信号B2〜B9が順次立ち上がっていく毎に、各ステップで必要な“a to X”回路ブロックが活性化されていく。
次に、“p−adic to binary”変換部のコア部分となる“binary”回路ブロックについて説明する。
図29は、“binary”回路ブロックの回路記号である。
“binary”回路ブロックは、図29に示すように、B0〜B10、I0〜I54を入力し、r0〜r54を出力する。
図30は、“binary”回路ブロックのブロック図である。“binary”回路ブロックは、1ステップの回路構成を“p to X”回路ブロックとして、これに“p to X”回路ブロックの入出力を制御する制御スイッチSWが付加された構成となっている。
具体的には、入力I5〜I54は、それぞれ、制御スイッチSW1を介してC9 0〜C9 49として“p to X”回路ブロックに入力される。これら制御スイッチSW1は、それぞれタイミング信号B1〜B10によって制御される。したがって、制御スイッチSW1は、B=‘1’の場合、I5〜I54がそのままC9 0〜C9 49として出力され、B=‘0’の場合、入力に依らず出力は‘0’となる。
また、入力I0〜I49は、それぞれ、制御スイッチSW2を介してQ−1 0〜Q44 4として“p to X”回路ブロックに入力される。これら制御スイッチSW2は、それぞれB10∧/B9〜B1∧/B0によって制御される。したがって、例えば、I0及びQ−1 0間にある制御スイッチSW2は、B10=‘1’、B9=‘0’の場合のみ、I0をそのままQ−1 0として出力する。
“p to X”回路ブロックから出力されたC10 0〜C10 54は、制御スイッチSW3を介して、“binary”回路ブロックの出力であるr0〜r54となる。これら制御スイッチSW3は、タイミング信号B9〜B0によって制御される。したがって、制御スイッチSW3は、B=‘1’の場合、C10 0〜C10 54をそのままr0〜r54として出力する。
以上の回路構成によって、“p to X”回路ブロックは、入力と出力のビット幅を5ビットずつ順次増やしながら各計算ステップに対応する。各計算ステップで17進数の桁の数Aを順次上位桁から取り込み、全ての計算ステップが終了したときに得られるのがデータのバイナリ表現となる。
前述のように、タイミング信号B0〜B10は、順次立ち上がる信号である。これに合わせて入力Iと出力rへのパスが上位ビット側から5ビットずつ導通していく。
17進数の各桁の数Aは、後述する外部の“A−r”レジスタに初期設定されて、次の計算ステップに入るまでに、選択的にパスが切り替わるように、隣接するタイミング信号Bでオン/オフ制御される制御スイッチSW3を介して“A−r”レジスタに出力される。
次に、以上説明した回路をまとめて構成された“p−adic to binary”変換部について説明する。
図31は、“p−adic to binary”変換部のブロック図である。“p−adic to binary”変換部は、“binary”回路ブロックに“A−r”レジスタが結合されて構成される。
“A−r”レジスタは、図31に示すように、タイミング信号B0及びクロックclkで制御されるレジスタで、入力r0〜r54、A0〜A54、出力I0〜I54を持つ。
図32は、“A−r”レジスタの回路図である。
“A−r”レジスタは、ビット毎に2つのインバータからなるフリップフロップFFを有している。このフリップフロップFFには、制御スイッチSW1を介してAj(j=0〜54)が入力され、制御スイッチSW2を介してrjが入力される。一方、フリップフロップFFの出力側には、制御スイッチSW3を介してインバータIV1が接続されている。このインバータIV1の出力がIjとなる。
制御スイッチSW1〜SW3はタイミング信号B0及びクロックclkによって制御される。具体的には、制御スイッチSW1は/clk∧/B0=‘1’の場合、制御スイッチSW2は/clk∧B0=‘1’の場合、制御スイッチSW3はclk=‘1’の場合にそれぞれオンする。
“A−r”レジスタの初期状態は、17進数の桁A0〜A54となっている。
以後、タイミング信号B0が立ち上がるとクロックclkの立ち下がりに同期して取り込んだrjを、クロックclkの立ち上がりに同期してIjとして出力する。
この“A−r”レジスタは“binary”回路ブロックと結合してタイミング信号Bj毎に計算ステップを進める。各クロックの変化の様子は、図20と同様である。クロックclkからckが作られ、更にタイミング信号Bjが作られる。
全計算ステップが終了すると“A−r”レジスタには、入力であるp進数Aのバイナリ表現Djが保持される。
以上で、p−adic・NANDフラッシュメモリを構成するための準備が整ったことになる。
次に、本実施形態に係るメモリシステムの構成についてのデータ処理の流れにそって説明する。
本実施形態に係るメモリシステムのデータ処理は、リー・メトリック・コードを用いて行われる。このデータ処理の方法には、前述のシンドローム変換法と、ユークリッド反復法がある。第1の実施形態では、シンドローム変換法を用いてデータ処理するメモリシステムについて説明する。
シンドローム変換法の一般的な原理については、前述の通りである。ここでは、前述の仕様に基づいてp=17、ε=4、δ=10など、具体的な数値を入れた場合について説明する。
図33は、p−adicメモリシステムの構成を示すブロック図である。
「binary world」のバイナリデータとしてのデータDは、「p−adic Zp world」への入口として、17進数変換部101によって17進数に変換し、ZpでのコードとしてのデータAに変換される。
この17進数変換部101は、“X to p”回路ブロックなど図10〜図20を用いて説明した回路によって構成することができる。
続いて、エンコード部102は、17進数変換部101から出力されたデータAに生成行列Gを作用させる。これによって、データAは、リー・メトリック・コードに変換されコードCとなる。
続いて、エンコード部102から出力されたコードCは、p−adicセルフラッシュメモリ103に記憶される。
続いて、p−adicセルフラッシュメモリ103からp−adicセルが保持するコードを読み出す。ここで、p−adicセルフラッシュメモリから読み出されるコードはコードY(第4のデータ)である。このコードYは、コードCが記憶されるp−adicセルに書き込まれる際、p−adicセルに記憶されている際、或いは、p−adicセルから読み出される際に生じるエラーによってコードCが変形したものである。
読み出されたコードYは、シンドローム生成部104に入力される。シンドローム生成部104では、シンドローム<m>Sを転置シンドローム行列Htと、3種類の対角行列のそれぞれの累乗を用いた数28によって計算する。
[数28]
そこでm=0として、<m>S=0の場合、エラーが生じていないので、「p−adic Zp world」における最後の処理のステップをすべくコードYをデコード部109に出力する。一方、<m>S≠0の場合、<m>=(0,0,0)の場合の<m>Sの最初の成分S0が|S0|>5なら、エラー訂正は確実には不可能なのでNG信号を出力した上で、エラー込みのコードYをデコード部109に出力する。その他の場合には、シンドローム<m>Sを解探索多項式生成部105に出力する。
解探索多項式生成部105では、このシンドローム<m>Sから解探索多項式Ψ(x)を求め、その4次の次数の係数がψ4≠0の場合、そのψ(x)をハッセ微分多項式生成部106に出力する。一方、ψ4=0の場合、<m>を変えてシンドローム<m>Sを新たに求めるステップを繰り返し再び多項式Ψ(x)を求める。そして、<m>=(15,15,15)まで繰り返してもΨ(x)の4次の係数がψ4=0なら、エラー訂正は不可能であるのでNG信号を出力した上で、エラー込みのコードYをデコード部109に出力する。
ハッセ微分多項式生成部106では、入力されたΨ(x)からハッセ微分多項式を求め、これらの根rとその根の多重度nを算出し、t=r−1としてエラー量算出部107に出力する。
エラー量算出部107では、t=r−1からエラーの生じたコード語の位置座標と、nからエラー量et(={u(t)<m>}−1n)を求めて、エラー量のリー・メトリックの総量Σ|et|を求める。そしてΣ|et|≦4の場合、リー・メトリック・コードのコードCを復元すべくコード復元部108に処理が移る。Σ|et|≧5の場合、誤訂正の可能性があるため訂正ができないものとして取り扱う。この場合、次の<m>について、シンドローム生成部104からの処理を繰り返す。また、<m>=(15,15,15)の場合、エラー訂正は不可能であるのでNG信号を出力した上で、エラー込みのコードYをデコード部109に出力する。
コード復元部108では、コードC=(c1,c2,・・・,c3)をct=yt−etによって復元する。復元されたコードCはデコード部109に出力される。
デコード部109では、コードCに生成行列Gの逆変換を実行し、17進数のコードAを得る。このコードAは、25進数変換部110に出力される。
25進数変換部110では、コードAを25進数に変換してバイナリ表現としたものを出力する。これが復元されたバイナリデータDとなる。
この25進数変換部110は、“p to X”回路ブロックなど図21〜図32を用いて説明した回路によって構成することができる。
<リー・メトリック・コードの生成、エラー訂正、リー・メトリック・コードの復元>
次に、図33を用いて説明したデータ処理の手順について詳細に説明する。
以下では、「p−adic Zp world」でのECCの演算について、Zpデータとしてメモリシステムに入力されたデータをエンコードする手順と、メモリシステムから読み出されたコードをデコードし、データAを得るまでの手順についてまとめる。
エンコードの手順は以下のようになる。
始めに、入力されたデータDは、“binary to p−adic”変換部によって数29に示す17進数表現の11桁のデータ語D(h)に変換する(図34中S1)。
[数29]
続いて、このデータDに生成行列Gを乗じてコードCの16個のコード語成分c1〜c16を得る(図34中S2)。各コード語成分の値は数30に示す通りである。
[数30]
最後に、このコード語成分cjをメモリセルに記憶する(図34中S3)。各コード語成分は5ビットのバイナリ表示として処理されるが、p−adicセルに対応する閾値レベルとして、Zpの数の表示のままレベルが設定される。
p−adicセルアレイから読み出されたコードYをデコードする手順は、以下の通りである。
始めに、p−adicセルアレイから読み出されたコードYを読み出す(図35中S4)。コードYは数31に示す構成となっている。ここで、ejは、コードYの位置jにあるコード語シンボルのエラーのリー・メトリックを示す。
[数31]
続いて、コードYからシンドロームを計算する(図35中S5)。(j)<m>=(p−j−1)m3(p−j)m2jm1とし、<m>=(m1,m2,m3)とおいて、<m>Y={(1)<m>y1,(2)<m>y2,(3)<m>y3,・・・,(15)<m>yn−1,(16)<m>yn }、<m>S=<m>YHtからシンドローム<m>S=(S<m>+0,S<m>+1,・・・,S<m>+4)を求める。
続いて、<m>=0の場合のS<0>+0=S0から、|S0|≦4の場合、エラーのリー・メトリック総量が5以上ということはないので、以下の手順2及び手順3を開始し、|S0|>4の場合、エラーのリー・メトリック総量が5以上なので訂正不可能と判断して解無しとして解の探索を終了する(図35中S6、S7)。
(手順1) <m>の成分を順に変えたそれぞれに対し、数32から、シンドローム<m>S=(S<m>+0,S<m>+1,・・・,S<m>+4)を求める(図35中S8)。
[数32]
(手順2) 訂正可能なコード語成分の数の上限であるε=4に対して、まずu=4(S<m>+0)−1を計算し、手順1で求めたシンドロームからシンドロームu<m>S=(uS<m>+0,uS<m>+1,・・・,uS<m>+4)を求める(図35中S9)。そして、このシンドロームu<m>Sから数33を使って解探索多項式Ψ(x)の係数ψjを順次計算する(図35中S10)。
[数33]
Ψ(x)の次数が4の場合、つまり、ψ4≠0の場合、解を得るために手順3に進む(図35中S11)。一方、ψ4=0の場合、<m>を進めて(手順1)を繰り返す(図35中S12)。ここで、ψ4=0の場合であって、mζ=15(ζ=1〜3)の場合、解無しとしてエラー訂正を断念する(図35中S13)。
(手順3) 手順2で解を得られることが分かったら、その解を求めるために手順3以降の処理を進める。
手順2で求めた多項式Ψ(x)の解の多重度を得るために必要なハッセ微分多項式の係数を求める(図35中S15)。手順2で得られた係数ψjに対して、数34のように、一連の二項係数jCiを掛けることによってハッセ微分多項式の係数のベクトルΨ[i]=(iCiψi,i+1Ciψi+1,・・・)が得られる。
[数34]
(手順4) 手順3で得られたハッセ微分多項式に対して、Zpの要素1〜16を代入して、0次微分多項式(=Ψ(x))がゼロとなる要素rを求める。続いて、数35に示すように、各rに対してn−1次微分多項式はゼロであるが、n次微分多項式はゼロでない次数nを求める(図35中S16)。
[数35]
得られたrは、エラーが生じたコード成分の位置番号tの逆元であり、それに対応するnは、生じたエラー量etから変換された量となる。この過程を要素rの全てに対して行う。
(手順5) 手順5では、解の多重度nからエラー量を変換で求める(図35中S17)。エラーのあるコード語成分の位置番号はt=r−1となり、解を得るための多項式を得るために行なった変換の逆変換をnに施すことになる。u(t)<m>et=nの関係があるので、et=(u(t)<m>)−1nとすればnから本来のエラー量etを得ることができる。ここで、エラーの誤訂正の可能性を確認する。Σ|et|≦4の場合、エラー量etをメモリセルから読み出したコードYのシンボル値ytから引いて、訂正されたコードCのシンボル値ctを得て、手順6に処理を移す(図36中S18、S21)。一方、Σ|et|>4の場合、誤訂正の可能性があるため、次のmξを変更して手順1から処理を繰り返す(図36中S19)。但し、mξ=15(ξ=1〜3)でも手順6に処理に移せなかった場合、解無しとしてエラー訂正を断念する(図36中S20)。
ここまでで、p−adicセルアレイに記憶された正しいコードCが得られたので、手順6によって、p−adicメモリシステムに入力されたバイナリデータを求める。
(手順6) コードC及びコードAと生成行列Gの関係AG=Cなる多元連立一次方程式を介して、11個のZpの要素a0〜a10とA(=a0,a1,・・・a10)を求める。これによって、11個のZpの要素a0〜a10が得られたことになる。得られた要素a0〜a10から、11桁の17進数のデータA(=a0,a1,・・・,a10))を作る(図36中S22)。
以上で、「p−adic Zp world」内でのデータ処理は終了したため、続いて「p−adic Zp world」の出口においてデータAをバイナリデータに戻す変換を行う。データAを11桁の17進数表現から10桁の25進数表現に変換し、10桁として各桁の数字をバイナリ表示する。これがp−adicメモリシステムに入力されたバイナリデータDとなる。
以上でデータの復元が完了する。
次に、Zpの積を求める計算回路について説明する。以下においてこの計算回路を“X Zp”回路ブロックと呼ぶ。
図37は、“X Zp”回路ブロックの回路記号を示す図、図38中(a)は、“X Zp”回路ブロックのブロック図、図38中(b)、及び(c)は“X Zp”回路ブロックによる演算処理を模式的に示した図である。
“X Zp”回路ブロックは、大別して、前半の計算ステップ群を処理する回路と、後半の計算ステップ群を処理する回路とからなる。
前半の計算ステップ群を処理する回路は、ANDゲートG1と、4個の“5 bit AD mod 17”回路ブロックとで構成される。
ANDゲートG1は、掛けられる数aの第i(i=0〜4)ビットと、掛ける数bの第j(j=0〜4)ビットとの論理積を取り、これをMijとして出力する。
“5 bit AD mod 17”回路ブロックは、Zpの2数の17を法としての和を求める回路である。“5 bit AD mod 17”回路ブロックは、A0〜A4、及びB0〜B4を入力し、Q0〜Q4を出力する。詳細については後述する。
1つ目の“5 bit AD mod 17”回路ブロック<1>は、A0〜A3、A4、及びB0〜B4に、それぞれM10〜M40、‘0’、M01〜M41を入力し、Q0〜Q4からQ0 0〜Q0 4を出力する。
2つ目の“5 bit AD mod 17”回路ブロック<2>は、A0〜A3、A4、及びB0〜B4に、それぞれ“5 bit AD mod 17”回路ブロック<1>の出力であるQ0 1〜Q0 4、‘0’、及びM02〜M42を入力し、Q0〜Q4にQ1 0〜Q1 4を出力する。
以上のように、前半の計算ステップ群を処理する回路は、“5 bit ADmod 17”回路ブロック<1>〜“5 bit ADmod 17”回路ブロック<4>の出力と入力とを順次接続して構成されている。
後半の計算ステップ群を処理する回路は、4個の“6 bit mod 17”回路ブロックで構成されている。この“6 bit mod 17”回路ブロックは図25、図26に示す回路である。
1つ目の“6 bit mod 17”回路ブロック<1>は、A0、及びA1〜A5に、それぞれQ2 0、及びQ3 0〜Q3 4を入力し、Q0〜Q4からQ4 0〜Q4 4を出力する。
2つ目の“6 bit mod 17”回路ブロック<2>は、A0、及びA1〜A5に、それぞれQ1 0、及びQ4 0〜Q4 4を入力し、Q0〜Q4からQ5 0〜Q5 4を出力する。
以上のように、後半の計算ステップ群を処理する回路は、“6 bit mod 17”回路ブロック<1>〜“6 bit mod 17”回路ブロック<4>の出力と入力とを順次接続して構成されている。
全ての回路はクロック非同期で動作し、入力Mabを与えることによって出力Qが確定する。
ここで、“X Zp”回路ブロックの回路規模に言及する。
本例のように、p=17、h=5の場合、“X Zp”回路ブロックは、4個の“5 bit AD mod 17”回路ブロックと4個の“6 bit mod 17”回路ブロックで構成することができる。
なお、“X Zp”回路ブロックは、8個必要となる。
次に、図38に示された“5 bit AD mod 17”回路ブロックを詳述する。
図39は、“5 bit AD mod 17”回路ブロックの回路記号である。
“5 bit AD mod 17”回路ブロックは、A及びBから入力される数a及びbの和を求めて、得られた和の素数pによる剰余をQから出力する。
h=5、p=17の場合、数a、b、剰余のバイナリ表示Qの間には、数36に示す関係が成立する。
[数36]
図40は、“5 bit AD mod 17”回路ブロックの回路図である。
“5 bit AD mod 17”回路ブロックは、PF0生成部U1、3個の半加算器HA1〜HA3、及び7個の全加算器FA1〜FA7を有する。
PF0生成部U1は、所定の電圧が供給されるVcc端子と、Vss端子との間に、直列に接続されたPMOSトランジスタQP1〜QP4、NMOSトランジスタQN1、及びQN2を有する。これらトランジスタQP1、QP2、QP3、QP4、QN1、及びQN2は、それぞれS0、S1、S2、S3、S0、及びS4で制御される。
また、PF0生成部U1は、その他に、PMOSトランジスタQP5、3個のNMOSトランジスタQN3〜QN5、及びインバータIV1を有する。
トランジスタQP5は、トランジスタQP1のソース及びトランジスタQP4のドレイン間に並列に接続されている。トランジスタQN3〜QN5は、それぞれ、トランジスタQN1のソース及びドレイン間に並列に接続されている。これらトランジスタQP5、PN3、QN4、及びQN5は、それぞれS4、S1、S2、及びS3で制御される。また、インバータIV1は、入力がトランジスタQN1、QN3〜QN5のソースに接続されている。このインバータIV1の出力がキャリーPF0になる。
半加算器HA1は、入力がA0及びB0、出力がS0、桁上げ出力がC0´となっている。全加算器FA1は、入力がA1及びB1、桁上げ入力がC0´、出力がS1、桁上げ出力がC1´となっている。全加算器FA2は、入力がA2及びB2、桁上げ入力がC1´、出力がS2、桁上げ出力がC2´となっている。全加算器FA3は、入力がA3及びB3、桁上げ入力がC2´、出力がS3、桁上げ出力がC3´となっている。全加算器FA4は、入力がA4及びB4、桁上げ入力がC3´、出力がS4、桁上げ出力がC4´となっている。半加算器HA2は、入力がS0及びPF0、出力がQ0、桁上げ出力がC0となっている。全加算器FA5は、入力がS1及びPF0、桁上げ入力がC0、出力がQ1、桁上げ出力がC1となっている。全加算器FA6は、入力がS2及びPF0、桁上げ入力がC1、出力がQ2、桁上げ出力がC2となっている。全加算器FA7は、入力がS3及びPF0、桁上げ入力がC2、出力がQ3、桁上げ出力がC3となっている。半加算器HA3は、入力がC3及びS4、出力がQ4となっている。
以上の構成によって、PF0生成部U1は、“5 bit mod 17”回路ブロックに入力されるバイナリA及びBの和が17以上か否かを判断し、A及びBの和が17以上の場合、17をA及びBの和から引くために、半加算器HA1〜HA3、及び全加算器FA1〜FA7によって、5ビットバイナリの17の補数である15をA及びBの和に加えている。
ここからは、「p−adic Zp world」の各ブロックの回路構成について具体例を示して説明する。
以下において、エンコード部102の回路構成例を説明する。
図41中(A)は、Zpのコード語Aをリー・メトリック・コードCに変換する回路のブロック図であり、図41中(B)は、図41中(A)に示す回路を制御する2重のクロックck及びclを示す図である。
図41中(B)に示すように、クロックclは、ckの立ち上がりに遅れて立ち上がるパルスであり、クロックck毎にcl0〜cl10の合計11個のクロックclが順次立ち上がる。そして、cl10が立ち上がると、これに遅れて次にクロックckが立ち上がる。同様の波形がck0からck17まで繰り返される。
これらクロックck、clのうち、ckは“Counter(1 to 16)”回路ブロック及び“Ri(1〜16)”レジスタ部を制御し、clは、“Ro(0〜16)”レジスタ部、及び“Rgstr”レジスタを制御する。
“Counter(1 to 16)”回路ブロックは、初期状態が0で、クロックckが立ち上がる毎に改めてクロック数を数えて出力する回路である。すなわちckj(j=1〜16)のうち、ckjの立ち上がりでjを“X k−times”回路ブロックに出力する。
“Ri(1〜16)”レジスタ部は、コード語Cの成分cjを記憶するレジスタで、合計16個の数を記憶することができる。この“Ri(1〜16)”レジスタ部は、ckの立ち上がりのタイミングに合わせて順次個々のレジスタに数を記憶していく。即ちckj+1の立ち上がりのタイミングで要素cjとなるデータをレジスタに取り込む。ck17の立ち上がりによって、レジスタに16個の要素cjが取り込まれる。つまり、コード語Cを記憶することができる。
“X k−times”回路ブロックは、クロックclが立ち上がる度に出力に入力を乗じる回路である。“X k−times”回路ブロックでは、入力されるjを合計11回のclの立ち上がりの度に出力に乗じる。即ち、cli(i=0〜10)の立ち上がりによって、“X k−times”回路ブロックの出力は(j)i+1となる。この出力は“X Zp”回路ブロックに出力される。
“Ro(0〜10)”レジスタ部は、11個の数を記憶できるレジスタであり、初期状態では、コードAの11個の成分a0〜a10を記憶している。“Ro(0〜10)”レジスタ部には、クロックclが入力されており、このクロックclが立ち上がる度にコードAの成分a0〜a10を順次出力する。即ち、cli(i=0〜10)を受けてaiを出力する。
“X Zp”回路ブロックは、入力の掛け算をZpで行なう回路である。“X Zp”回路ブロックには、クロックcli毎に“X k−times”回路ブロックの出力(j)i+1と“Ro(0〜10)”レジスタ部の出力aiが入力され、(j)i+1aiを出力する。この出力された数(j)i+1aiを加算していくのが、“5 bit AD mod 17”回路ブロック及び“Rgstr”レジスタの組み合わせである。
“5 bit AD mod 17”回路ブロックは、2つの入力の数の和を17を法として求める回路である。一方、“Rgstr”レジスタは、初期状態が‘0’でクロックclの入力毎に、“5 bit AD mod 17”回路ブロックからの入力を遮断し、自身が保持する内容を“5 bit AD mod 17”回路ブロックに出力するレジスタである。図41に示すような、“5 bit AD mod 17”回路ブロック及び“Rgstr”レジスタの接続によって、クロックclの入力毎に前回出力した数に新たな“X Zp”回路ブロックから出力される数を加算していく。即ち、クロックcl0〜cl10が立ち上がると、コードAをリー・メトリック・コードに変換した後のCの成分cjが、クロックckjのサイクルで出力される。これが次のckj+1のサイクルの頭で“Ri(1〜16)”レジスタ部に保持される。これによって、コードAから変換されたコードCを得ることができる。
図41に示す“X k−times”回路ブロックについて説明する。
図42は、“X k−times”回路ブロックの回路記号を示す図であり、図43は、“X k−times”回路ブロックのブロック図である。
“X k−times”回路ブロックは、図42に示すように、入力Xの累乗(X)jを算出し出力する回路であり、クロックclj(j=1〜16)で制御される。
“X k−times”回路は、図43に示すように、“X Zp”回路ブロックと、クロックclに同期して動作する“Rgstr”レジスタ<1>及び“Rgstr”レジスタ<2>とを有する。
“Rgstr”レジスタ<1>は、入力がXに接続され、出力が“X Zp”回路ブロックの一方の出力に接続されている。“Rgstr”レジスタ<2>は、入力に“X k−tims”回路ブロックの出力が接続され、出力に“k−times”回路ブロックの一方の入力が接続されている。“Rgstr”レジスタ<2>には初期状態として‘1’が保持されている。
この回路構成によって、“X k−times”回路ブロックは、自身の出力を1サイクル遅れで取り込み、これによって入力Xと出力(X)jの積を得る。
クロックclが入るごとに出力(X)jに入力Xを累積的に掛ける。クロックclj(j=1〜k)の立ち上がる前に“Rgstr”レジスタ<1>にデータXを設定しておき、初期設定が‘1’の“Rgstr”レジスタ<2>を同期させることで、j発目のcljで(X)jを得る。
以下において、シンドローム生成部104の回路構成例を説明する。
先ず、シンドローム<m>Sの成分要素を求める回路について説明する。
<m>=(m1,m2,m3)をそれぞれの成分に対して0から15とスキャンする。各<m>が与えられると、これに対してシンドロームの成分を計算する。このシンドロームの成分の演算処理に必要な式を数37に示す。
[数37]
始めに、計算に必要なZpの要素の<m>に対応した累乗を全て求めておく。この累乗をシンドロームの和を求める際に用いる計算の方法は、まずZpの各要素の累乗を求めておき、Zpの要素jを選択したときに、17−jや17−j−1をデコードして対応する要素の累乗を選択することによって、積の和を計算する。
そこで、Zpの要素の累乗を求める計算回路について説明する。
図44中(A)は、Zpの要素jの累乗jmを求める計算回路のブロック図であり、図44中(B)は、この回路を制御するクロッck、cl、及びタイミング信号B0〜B15のタイミングチャートである。
この計算回路は、選択回路U1、“(j)i(j=1 to 16)”回路ブロック、“R1(0〜15)”レジスタ部、“R2(0〜15)”レジスタ部(図示せず)、及び“R3(0〜15)”レジスタ部を有する。
選択回路U1は、16個のANDゲートG1〜G16を有する。ANDゲートG1は、B0及び/B1を入力し、信号“m=0”を出力する。ANDゲートG2は、B1及び/B2を入力し、信号“m=1”を出力する。以降、同様な入出力によって、ANDゲートG3〜B16は、それぞれ信号“m=2”〜“m=15”を出力する。これら、信号“m=0”〜“m=15”は、それぞれ制御スイッチSW1〜SW16を介して、選択回路U1の出力rξ(ξ=1、2、3)となる。信号“m=0”〜“m=15”は、制御スイッチSW1〜SW16によって、それぞれ<m>の成分mξの値毎にデコードされる。
図44中(B)に示すように、クロックckに続けてクロックclを16サイクル発生させて、これを15回繰り返すことによって、“(j)i(j=1 to 16)”回路ブロックからクロックcki及びcljのサイクルで、(j)iが出力される。
この出力(j)iを“R1(0〜15)”レジスタ部、“R2(0〜15)”レジスタ部、及び“R3(0〜15)”レジスタ部で適当なサイクルでデータとしてラッチすることによって、Zpの要素の3つの累乗が得られる。
“R1(0〜15)”レジスタ部、“R2(0〜15)”レジスタ部、及び“R3(0〜15)”レジスタ部にデータを取り込むタイミングを決めるために、クロックckに同期して順に立ち上がる図44中(B)に示す信号B0〜B16を作り利用する。これらの信号B0〜B16から、ckの立ち上がりから次のckの立ち上がりまでの間だけ活性化する信号m=0、m=1、・・・、m=15を作る。
選択回路U1は、これらの信号m=0、m=1、・・・、m=15を<m>の成分mζの値毎にデコード選択して、i=mζのckiの回でのみ有効な信号rξとして出力する。
“R1(0〜15)”レジスタ部、“R2(0〜15)”レジスタ部、及び“R3(0〜15)”レジスタ部は、それぞれ、この信号rξとクロックcljとの論理和を取った信号jでデータ取り込みの回を決める。そして、クロックclに同期させてデータをラッチする。その結果、クロックサイクルの終了時には、“R1(0〜15)”レジスタ部、“R2(0〜15)”レジスタ部、及び“R3(0〜15)”レジスタ部にはZpの要素のmζ(ζ=1,2,3)乗が格納されることになる。
これでZpの要素の<m>に対応した累乗が生成されたことになる。
続いて、Zpの各要素jについて、シンドローム変換法で変換されたエラーの成分ε<m>+l j(l=1、2、3、4;j=1〜16)を計算する計算回路について説明する。エラー成分は、ε<m>+l j=(17−j−1)m3(17−j)m2(j)m1+lyjとして定義されている。
図45は、ε<m>+l jを計算する計算回路のブロック図である。以下では、この計算回路を「エラー成分生成回路」と呼ぶ。
エラー成分生成回路は、デコード部U1、及び積演算部U2を有する。
デコード部U1は、“Couter(1 to 16)”回路ブロック、“17−j dec”回路ブロック、“17−j−1”回路ブロック、“j2 dec”回路ブロック、“j3 dec”回路ブロック、及び“j4 dec”回路ブロック、並びに、図44に示したZpの要素のmξ(ξ=1、2、3)乗が格納された“R1(0〜15)”レジスタ部、“R2(0〜15)”レジスタ部、及び“R3(0〜15)”レジスタ部を有する。
デコード部U1は、“Counter(1 to 16)”回路ブロックはクロックclj(j=1〜16)のタイミングで、jを順次出力され発生させる。この“Counter(1 to 16)”回路ブロックから出力されたjは、“17−j dec”回路ブロック、“17−j−1”回路ブロック、“j2 dec”回路ブロック、“j3 dec”回路ブロック、及び“j4 dec”回路ブロックにそれぞれ入力される。
“17−j dec”回路ブロックは、入力されるjから17−jをデコードして出力する。“17−j−1 dec”回路ブロックは、入力されるjから17−j−1をデコードして出力する。“j2 dec”回路ブロックは、入力されるjからj2をデコードして出力する。“j3 dec”回路ブロックは、入力されるjからj3をデコードして出力する。“j4 dec”回路ブロックは、入力されるjからj4をデコードして出力する。
“R1(0〜15)”レジスタ部は、入力されるjに基づいて(j)m1を出力する。“R2(0〜15)”レジスタ部は、“17−j dec”回路ブロックから出力された17−jに基づいて(17−j)m2を出力する。“R3(0〜15)”レジスタ部は、“17−j−1”レジスタ部は、“17−j−1 dec”回路ブロックから出力された17−j−1に基づいて(17−j−1)m3を出力する。
以上によって、デコード部U1は、出力(j)m1、(17−j)m2、(17−j−1)m3を得る。
積演算部U2は、“Ro(1〜16)”レジスタ部、及び7つの“X Zp”回路ブロック<1>〜<7>を有する。
“Ro(1〜16)”レジスタ部は、16個のラッチから構成されている。これら16個のラッチには、それぞれp−adicセルから読み出されたコードYの16個の成分であるZpの要素y1〜y16が保持されている。“Ro(1〜16)”レジスタ部は、クロックclj(j=1〜16)に同期してラッチに保持するyjを出力する。
“X Zp”回路ブロック<1>は、“Ro(1〜16)”レジスタ部から出力されるyjと“R1(0〜15)”レジスタ部から出力される(j)m1とのZpの積を算出し出力する。
“X Zp”回路ブロック<2>は、“R2(0〜15)”レジスタ部から出力される(17−j)m2と“R3(0〜15)”レジスタ部から出力される(17−j−1)m3とのZpの積を算出し出力する。
“X Zp”回路ブロック<3>は、“X Zp”回路ブロック<1>の出力と“X Zp”回路ブロック<2>の出力とのZpの積ε<m>+0 jを算出し出力する。
“X Zp”回路ブロック<4>は、“X Zp”回路ブロック<3>から出力されたε<m>+0 jとjとの積ε<m>+1 jを算出し出力する。
“X Zp”回路ブロック<5>は、“X Zp”回路ブロック<3>から出力されたε<m>+0 jと“j2 dec”回路ブロックから出力されたj2との積ε<m>+3 jを算出し出力する。
“X Zp”回路ブロック<6>は、“X Zp”回路ブロック<3>から出力されたε<m>+0 jと“j3 dec”回路ブロックから出力されたj3との積ε<m>+3 jを算出し出力する。
“X Zp”回路ブロック<7>は、“X Zp”回路ブロック<3>から出力されたε<m>+0 jと“j4 dec”回路ブロックから出力されたj4との積ε<m>+4 jを算出し出力する。
以上の構成による積演算部U2によって、クロックcljに同期して、選択して読み出されたデータYが、Zpの要素jに対応したε<m>+0 j、ε<m>+1 j、ε<m>+2 j、ε<m>+3 j、ε<m>+4 jとして得られる。
続いて、ε<m>+l j(l=1,2,3,4)の各j=1〜16の和を求める計算回路について説明する。ε<m>+l j(l=1,2,3,4)の各j=1〜16の和を求めることで、シンドロームS<m>+lが得られる。以下では、この計算回路を「シンドローム生成回路」と呼ぶ。
図46は、シンドローム生成回路のブロック図である。
シンドローム生成回路は、“Rgstr”レジスタ、及び“5 bit AD mod 17”回路ブロックを有する。
シンドローム生成回路は、クロックclj(j=1〜16)と同期して、“5 bit AD mod 17”回路ブロック及び“Rgstr”レジスタのループによってε<m>+l jを加算していき、シンドローム成分S<m>+l(l=0〜4)を作る。
次に、図44で示したjmを求める回路に用いられていたZpの要素jのi乗を計算する回路ブロックを説明する。以下では、この回路ブロックを“(j)i(j=1 to 16)”回路ブロックと呼ぶ。
図47は、“(j)i(j=1 to 16)”回路ブロックの回路記号を示す図である。
“(j)i(j=1 to 16)”回路ブロックは、クロックcki(i=0〜15)とclj(j=1〜16)で制御され、クロックcljの立ち上がるに同期して(j)iと(j)i+1を出力する。
図48は、“(j)i(j=1 to p−1)”回路ブロックのブロック図である。
“(j)i(j=1 to 16)”回路ブロックは、Zpのゼロ以外の全ての要素1〜16に対して、0〜15乗を順次算出し、レジスタに保持する回路である。
“(j)i(j=1 to 16)”回路ブロックは、図48に示す通り、“X Zp”回路ブロック、“Counter(1 to 16)”回路ブロック、及び“R(1〜16)”レジスタ部を有する。
指数を決めるクロックがckiで、何回目のクロックckiであるかで指数iが決まる。一方、Zpの要素を1から順次指定するのがクロックclで、クロックcljの回数jが要素数となる。
“Counter(1 to 16)”回路ブロックは、“X Zp”回路ブロックの一方の入力に接続されている。ckiをスタート信号とし、cljの立ち上がりのタイミングで1〜16の範囲でカウントアップする。
“R(1〜16)”レジスタ部は、16個のレジスタからなり、inのクロック/cljの立ち上がりで入力i1〜i16を順次1〜16番目のレジスタに格納し、outのクロックcljの立ち上がりで順次1〜16番目のレジスタの内容i1〜i16を出力する。
図48に示すように、“Counter(1 to 16)”回路ブロックと“R(1〜16)”レジスタ部への入力クロックck及びclを同期させ、“R(1〜16)”レジスタ部の出力と“Counter(1 to 16)”回路ブロックの出力とを“X Zp”回路ブロックで乗算すると、クロックckiが立ち上がった後、cljが立ち上がる毎に“R(1〜16)”レジスタ部から(j)iが出力される。また、“X Zp”回路ブロックから(j)i+1が出力される。この(j)i+1は、計算回路ごとに必要に応じて用いることができる。
以下において、解探索多項式生成部105の回路構成例として、解探索多項式Ψ(x)を求める演算回路について説明する。この演算回路を「解探索多項式生成回路」と呼ぶ。
解探索多項式Ψ(x)のxの各次数jの係数ψjを求める演算の処理に必要な処理式を数38に示す。
[数38]
図49は、解探索多項式生成回路のブロック図である。
解探索多項式生成回路は、シンドロームu<m>S=(uS<m>+0,uS<m>+1,uS<m>+2,uS<m>+3,uS<m>+4)を用いてエラーを探索するステップで用いる回路である。
解探索多項式生成回路によれば、複雑なユークリッド反復法を用いることなく、単純な巡回回路で解探索多項式Ψ(x)を生成できる。
解探索多項式生成回路は、数38に示す第2式右辺のうちΣψj−1S<m>+iを求める第1の部分回路U1と、同じく数38に示す第2式右辺のうちu(j)−1を求める第2の部分回路U2とを有する。
第1の部分回路U1は、4個の直列接続された“Rgstr”レジスタ<1>〜<4>と、各“Rgstr”レジスタの出力に接続された4個の“X Zp”回路ブロック<1>〜<4>を有する。
“Rgstr”レジスタ<1>の初期値は‘1’であり、その他の、“Rgstr”レジスタ<2>〜<4>の初期値は‘0’である。
第1の部分回路U1は、各“Rgstr”レジスタに入力されるクロックckで制御され、j回目のクロックckjの立ち上がりで、“Rgstr”レジスタの接続点から各次数の係数ψj−1、ψj−2、ψj−3、ψj−4を出力する。係数が存在しない接続点は‘0’になるため、“X Zp”回路ブロック<1>〜<4>によるシンドローム成分S<m>+1〜S<m>+4との積演算に寄与しない。“X Zp”回路ブロック<1>〜<4>の出力は2つずつ“5 bit AD mod 17”回路ブロックで和演算され、これら“5 bit AD mod 17”回路ブロックのラダーによって最終的にΣψj−iS<m>+iを得る。
第2の部分回路U2は、“Counter(1 to 4)”回路ブロック、“X Zp”回路ブロック<a>、<b>、及び“j−1 dec”回路ブロックを有する。
第2の部分回路U2は、クロックckjに応じて“Counter(1 to 4)”回路ブロックで生成されたjとシンドローム成分S<m>+0から“X Zp”回路ブロック<a>及び“j−1 dec”回路ブロックによって(jS<m>+0)−1を生成する。そして、この生成された(jS<m>+0)−1と設定されたε=4から“X Zp”回路ブロック<b>によってu(j)−1を得る。
そして、“X Zp”回路ブロック<c>によって、第1の部分回路U1で生成されたΣψj−iS<m>+iと第2の部分回路U2で生成されたu(j)−1との乗算を行い、係数ψjを得る。
係数ψjは、hビットのバイナリであり、負数の表示にするために補数表現となっている。そこで、“X Zp”回路ブロック<c>の出力に対し、インバータIV1で反転させた上で、“5 bit AD mod 17”回路ブロックで‘1’を加算する。これによって、5ビットのバイナリの補数表現を得ることができる。
なお、図49に示す“j−1 dec”回路ブロックは、Zpの要素jの逆元j−1を求める回路である。“j−1 dec”回路ブロックの詳細については、後述する。
以上説明した解探索多項式生成回路によれば、クロックckを4回入れると各ノードにj=4とした係数ψ4〜ψ0が得られる。
以下において、ハッセ微分多項式生成部106の回路構成例を説明する。
Ψ(x)の次数が4に一致した場合、このΨ(x)の根とその多重度を求める必要がある。そこで、次は、根の多重度を求める際に必要となるハッセ微分多項式の係数を計算する演算回路を説明する。以下では、この演算回路を「ハッセ微分多項式係数生成回路」と呼ぶ。
ハッセ微分多項式の係数とその係数とΨ(x)の係数との関係は、数39のようになる。
[数39]
つまり、数39からも分かるように、ハッセ微分多項式係数生成回路は、Ψ(x)の係数と2項係数の掛け算を行い、各微分の階数での各次数の係数をクロックck及びclを用いて生成し、全ての係数をレジスタに格納する。
図50中(A)は、ハッセ微分多項式係数生成回路のブロック図であり、図50中(B)は、ハッセ微分多項式係数生成回路を制御するクロックck及びclのタイミングチャートである。
ハッセ微分多項式係数生成回路は、Zpの各要素iの階乗i!が記録された“i!”テーブル、その逆元が記録された“(i!)−1”テーブル、及び解探索多項式Ψ(x)の係数ψiが記録された“ψi”テーブルを有する。“i!”テーブル及び“(i!)−1”テーブルに関しては、本例のように、p=17の場合、実用上十分小さい規模に抑えることができる。
また、“ψi”テーブルに関しては、図49で示す解探索多項式生成回路で生成されるため、これを使う。
ハッセ微分多項式係数生成回路は、図50に示すように、“i!”テーブル、“(i!)−1”テーブル、及び“ψi”テーブルと、“X Zp”回路ブロックと、これらの接続を切り替える制御スイッチSWを有する。非選択のノードは、“X Zp”回路ブロックによる積演算の結果が‘0’となるように、制御スイッチSWの出力側のノードを、初期状態で‘0’に放電されている。
クロックckのクロック数は、微分の階数に対応しており、ckiのiは1〜4の値をとる。一方、クロックclは、次数に相当し、微分の階数が上がれば不要な次数が増える。そのため、クロックckに対して毎回同じ数の発生をする必要はないが、図50の回路では毎回同じ4回だけ発生させる。したがって、格納タイミングは42個あるが、係数を格納する“R i(0〜4)/j(0〜3)”レジスタ部は、全てのクロックに対応したレジスタがある必要はなく、ほぼ半分のレジスタがあれば良い。
なおck0はレジスタにΨ(x)の係数、すなわちΨ[0]に相当する係数を予め格納しておくために便宜上設けたものである。
図51は、ハッセ微分多項式係数生成回路でも利用可能なp=17の場合のZpの各要素に対する固定した演算(逆元、階乗、累乗等)の表である。
これらの数字の5ビットでのバイナリ表示を用いることでデコーダを作ることができる。なお、jがZpの全ての要素1〜16に変化したとき、Zpの全ての要素を過不足なくスキャンすることができる関数の一例は、表の通りであるが、偶数乗や階乗を除いたものが多い。例えば、aiはaが条件を満たせば、jの変化でZpのゼロ以外の全ての要素をスキャンすることができる。例えば、a=3、5、6、7、10の場合については、図51に示す通りである。
これらの関数を利用してシンドローム変換法の仮想エラーによる探索範囲を広げることができるわけである。
次に、デコーダを構成する回路の例として、Zpの要素jの逆元j−1を求めるデコーダについて説明する。以下では、このデコーダを“j−1 dec”回路ブロックと呼ぶ。
要素jから逆元j−1を求めるには、j×j−1≡1(mod 17)の関係を求めておき、j及びj−1を5ビットのバイナリ表示を数40に示すように構成し、これの変換デコーダを作れば良い。
[数40]
図52は、“j−1 dec”回路ブロックのブロック図である。
“j−1 dec”回路ブロックは、5ビットのバイナリデータIを5ビットの他のバイナリデータOにデコードする一般的な回路で構成することができる。この場合、数40に示すように、I=j、O=j−1とすれば良い。
“j−1 dec”回路ブロックは、NANDゲートG1及びG2によってよって、ビットI0〜I3を2ビットずつ部分デコードして信号/A0〜/A3、/B0〜/B3を生成し、更に、3入力のNORゲートG3によって/Am、/Bm、I4(又は/I4)からOm(m=0〜4)を生成する。なお、j=0場合、j−1=0とする。
次に、解探索多項式Ψ(x)の根とその多重度を計算する演算回路を説明する。以下、この演算回路を「解探索多項式根/多重度演算回路」と呼ぶ。
解探索多項式根/多重度演算回路は、ハッセ微分多項式の0階微分をΨ(x)とみなし、Zpの各要素に対してハッセ微分多項式がゼロでなければ次の要素に計算を移し、ハッセ微分多項式がゼロである間は微分の階数を上げる。各Zpの要素に対して、ハッセ微分多項式がゼロでない最初のハッセ微分の階数をレジスタに残していくと、階数がゼロではない要素が根であり、その残された階数がその根の多重度になる。つまり、レジスタから内容が‘0’ではないものを選び、その保持された値がその根の多重度となる。
具体的に、解探索多項式Ψ(x)の根をαとし、Ψ(x)のi階のハッセ微分多項式を[Ψ(x)][i]とすると、αの多重度をnとした場合の関係式は数41のようになる。
[数41]
解探索多項式根/多重度演算回路は、この数41を具備するnを、Zpの各要素αに対して、Ψ(x)の根であるか否かに関わらず求める。n=0の場合、αが根でないことを意味する。
図53中(A)は、解探索多項式根/多重度演算回路のブロック図であり、図53中(B)は、解探索多項式根/多重度演算回路を制御するクロックck、cl、及びclkのタイミングチャートである。
解探索多項式根/多重度演算回路は、クロックckでZpの要素1〜16についてスキャンし、クロックclでハッセ微分の階数、クロックclkでその階数のハッセ微分多項式の値を求める。クロックckは、計算しているハッセ微分多項式の値がゼロでなくなった場合に発生させ、次のZpの要素でのサイクルに入る。
解探索多項式根/多重度演算回路は、図53中(A)に示すように、“(j)i(j=1 to 16)”回路ブロック、“Ro i(0〜4)/j(0〜4)”レジスタ部、“X Zp”回路ブロック、“Rgstr”レジスタ<1>、“5 bit AD mod 17”回路ブロック、“Rgstr”レジスタ<2>、“clock cl gen.”回路ブロック、“Counter(0 to 4)”回路ブロック、“Li(1〜16)”レジスタ部を有する。
“(j)i(j=1 to 16)”回路ブロックは、クロックckをα回受けて要素αを選択し、クロックclkをj−1回受けてαのj乗を出力する。
“Ro i(0〜4)/j(0〜4)”レジスタ部は、クロックcli及びclkjを受けてハッセ微分多項式の係数ψ[i] jを出力するレジスタである。
“X Zp”回路ブロックは、“(j)i(j=1 to 16)”回路ブロックからの出力αjと、“Ro i(0〜4)/j(0〜4)”レジスタ部からの出力ψ[i] jを積演算し、αjψ[i] jを出力する。
以上、“(j)i(j=1 to 16)”回路ブロック、“Ro i(0〜4)/j(0〜4)”レジスタ部、及び“X Zp”回路ブロックに対し、クロックclkを5回与えてやることでハッセ微分多項式の値を得ることができる。なお、クロックck、cl、及びclkの制御を簡単にするため、この計算では存在しない0の値の項の和も計算する。したがって、本来は必要なクロックclkの総数は半分程度となる。
微分多項式の値[Ψ(α)][i]は、ゼロの場合‘0’、その他の場合‘1’として“Rgstr”レジスタ<1>に取り込まれる。
“Rgstr”レジスタ<1>で保持された値は、クロックclk0のタイミングで、クロックckα(α=1〜16)として出力される。このクロックckαは、クロックclk4でリセットされるまで保持される。
“Rgstr”レジスタ<1>は、初期値が‘1’であるため、クロックck1は最初のclk0で立ち上がる。クロックck2以降は、計算結果にしたがってclkのいずれかのサイクルのclk0で立ち上がる。
“clock cl gen.”回路ブロックは、クロックclk0に同期してクロックcliを発生させて、クロックckαが立ち上がる毎にクロックcl0にリセットする。
”Counter(0 to 4)”回路ブロックは、クロックckαで0にリセットされ、クロックclが入るたびにカウントアップし、クロックclの回数−1を出力する。この出力は、“Li(1〜16)レジスタ部に格納される。
“Li(1〜16)”レジスタ部は、入力をクロックckαによって切り換えていくので、α番目のレジスタにはその多重度が格納されることになる。
以下において、エラー量算出部107の回路構成例を説明する。
ハッセ微分多項式の根と多重度α、[n]のペアから真のエラーを求めてコード訂正する変換回路について説明する。ここでは、この変換回路を「コード訂正回路」と呼ぶ。
シンドローム変換法で求められた解、仮想エラーn、エラーが生じた位置t、及び真のエラーetの関係は数42のようになる。
[数42]
変換には数(j)<m>=(17−j−1)m3(17−j)m2(j)m1を利用するが、この数は数43に示すシンドローム成分の関係式S<m>+lと比べると、l=0でのシンドローム成分としてY=(0,0,・・・,yj=1,・・・,0,0)を用いたS<m>+0に等しい。これを利用して、Yのt成分が1で他が0ものを代入したシンドローム成分をT<m>+0と表し、回路入力として用いたものが、図54のブロック図で示された回路である。
[数43]
コード訂正回路は、エラーが生じた位置tを求める第1の部分回路U1と、真のエラーetを求める第2の部分回路U2と、真のエラーetによってコード訂正をする第3の部分回路U3を有する。
第1の部分回路U1は、“j−1 dec”回路ブロック<1>を有する。
“j−1 dec”回路ブロック<1>は、根αを入力し、エラーが生じた位置tを出力する。
第2の部分回路U2は、3つの“X Zp”回路ブロック<1>〜<3>、及び“j−1 dec”回路ブロック<2>を有する。
“X Zp”回路ブロック<1>は、シンドローム成分S<m>+0及び4−1(=13)を入力し、変換に出てくる数uの逆元であるu−1を出力する。
“j−1 dec”回路ブロック<2>は、T<m>+0を入力し、(t)<m>の逆元である{(t)<m>}−1を出力する。
“X Zp”回路ブロック<2>は、多重度n及び“X Zp”回路ブロック<1>の出力であるu−1を入力し、これらの積nu−1を出力する。
“X Zp”回路ブロック<3>は、“X Zp”回路ブロック<2>が出力したnu−1及び“j−1 dec”回路ブロック<2>が出力した{(t)<m>}−1を入力し、真のエラーetを出力する。
第3の部分回路U3は、2つの“5 bit AD mod 17”回路ブロック<1>、及び<2>を有する。
“5 bit AD mod 17”回路ブロック<1>は、/et及び‘1’を入力し、etの補数である−etを出力する。
“5 bit AD mod 17”回路ブロック<2>は、p−adicセルから読み出したコードyt及び“5 bit AD mod 17”回路ブロック<1>が出力した−etを入力し、エラー訂正された正しいコードctを出力する。
以上の構成によるコード訂正回路によって、正しいコードctを復元することができる。
次に、エラーコード語Eのリー・メトリックw(E)=Σ|ej|(j=1〜16)を計算する演算回路について説明する。以下、この演算回路を「リー・メトリック演算回路」と呼ぶ。
図55は、リー・メトリック演算回路のブロック図である。
リー・メトリック演算回路は、“Ro(0〜16)”レジスタ部、“5 bit LM 17”回路ブロック、“5 bit AD mod 17”回路ブロック、及び“Rgstr”レジスタを有する。
多項式Ψ(x)から得られたエラーコード語Eは、“Ro(0〜16)”レジスタ部に初期値として格納されている。“Ro(0〜16)”レジスタ部からは、Eの成分ejをクロックckjによって順次取り出される。
“5 bit LM 17”回路ブロックは、この取り出された成分ejからそのリー・メトリック|ej|を計算する。“5 bit LM 17”回路ブロックは、クロックckj毎に計算された成分のリー・メトリック|ej|を“5 bit AD mod 17”回路ブロックに出力する。
“Rgstr”レジスタと“5 bit AD mod 17”回路ブロックによって構成されるループで、この|ej|を加算していく。そして、16回目のクロックckが立ち上がった時点の“5 bit AD mod 17”回路ブロックの出力がw(E)=Σ|ej|となる。
w(E)≦4の場合、一連のエラー探索が終わり、Eによって、訂正を行うことができる。
演算処理で求めたエラーEについては、そのリー・メトリックがε以下であることを確認して、誤訂正とならいないことが分かってから訂正される。
そこで、次は、Zpの要素のリー・メトリックを計算する演算回路素子について説明する。以下において、この演算回路素子を“5 bit LM 17”回路ブロックと呼ぶ。
5ビットのバイナリ表示のZpの要素aについて、そのリー・メトリックQ=|a|は、Q=/PF0×a+PF0×(17−a)と表現できる。ここでPF0は、a≧9の場合に‘1’、a<9の場合に‘0’になる。したがって、aのリー・メトリックを求めるには、a≧9の場合、17からaを引く、即ち、17にaの補数を加えれば良い。
h=5、p=17の場合のAとQの関係は数44のようになる。
[数44]
図56は、“5 bit LM 17”回路ブロックの回路記号であり、図57は、“5 bit LM 17”回路ブロックのブロック図である。
“5 bit LM 17”回路ブロックは、5ビットのバイナリA0〜A4を入力し、5ビットのバイナリQ0〜Q4を出力する。
“5 bit LM 17”回路ブロックは、PF0生成部U1、XORゲートG1、3個の半加算器HA1〜HA3、及び2個の全加算器FA1、FA2を有する。
PF0生成部U1は、Vcc端子及びVss端子間に、直列に接続されたPMOSトランジスタQP1〜QP4、NMOSトランジスタQN1、及びQN2を有する。これらトランジスタQP1、QP2、QP3、QP4、QN1、及びQN2は、それぞれ入力A4、A2、A1、A0、A0、及びA3で制御される。
また、PF0出力部U1は、その他に、PMOSトランジスタQP5、3個のNMOSトランジスタQN3〜QN5、及びインバータIV1を有する。
トランジスタQP5は、トランジスタQP2のソース及びトランジスタQP4のドレイン間に接続されている。トランジスタQN3及びQN4は、トランジスタQN1のソース及びドレイン間に接続されている。また、トランジスタQN5は、トランジスタQN1のソース及びトランジスタQN2のドレイン(Vss端子)間に接続されている。これらトランジスタQP5、QN3、QN4、及びQN5は、それぞれ入力A3、A1、A2、及びA4で制御される。インバータIV1は、入力がトランジスタQN1、QN3、QN4、及びQN5のソースに接続されている。このインバータIV1の出力がキャリーPF0になる。
XORゲートG1は、Aj(j=0〜4)及びPF0を入力し、Bjを出力する。
全加算器FA1は、入力がB0及びPF0、桁上げ入力がPF0、出力がQ0、桁上げ出力がC0となっている。半加算器HA1は、入力がC0及びB1、出力がQ1、桁上げ出力がC1となっている。半加算器HA2は、入力がC1及びB2、出力がQ2、桁上げ出力がC2となっている。半加算器HA3は、入力がC2及びB3、出力がQ3、桁上げ出力がC3となっている。全加算器FA2は、入力がB4及びPF0、桁上げ入力がC3、出力がQ4となっている。
この具体例では入力が9以上になったらaの補数を17に加えている。aの補数は、PF0=1の場合、XORゲートG1でaの各ビット表示Ajを反転してBjとし、これに1を加えて生成されている。
p=17は、17=(10001)2であるので、これをPF0で表し、更に、1としてPF0を使い、これらとバイナリの和としてBjと加えている。
“5 bit LM 17”回路は、クロックに非同期で動作し、入力を入れると計算されたリー・メトリックを出力する。
以下において、デコード部109の回路構成例を説明する。
エラー探索を終了し、エラーコードEによって訂正されたリー・メトリック・コードCが得られたら、これをZpのデータコードAに戻す必要がある。この演算はGを生成行列として、C=AGの逆演算を行うことに相当するが、行列の逆を得るのは規模の大きな演算となる。そのため、Aの要素を逐次的にCの要素から求めて行く。計算の過程を数45に示す。
[数45]
数45に示したように、cj=Σ(j)i+1aiの関係を順次変形して、a0からa1、続いてa1からa2、・・・と逐次的にamを求めて行くことが計算の原理となる。
両辺にjの累乗の逆元を掛けてjのZpの全ての元についての項として足し合わせる。このときZpの全ての元の和はゼロとなることを利用して変形している。
数46は、Cの成分とAの成分の関係式である。
[数46]
次に、数46に示した関係式を使って具体的な演算回路として実現したものを説明する。
なお、am−1を得てから、amを求めるときには、c(m−1) jを求めながらamでのjについての和を順次計算して行くことによってクロックの並列利用を行う。
始めに、数46に示すc(m−1) j=c(m−2) j−(j)mam−1に基づき、リー・メトリック・コードCの成分の変換を都度行う回路について説明する。以下において、この回路を“c(m−1) j”回路ブロックと呼ぶ。
図58は、“c(m−1) j”回路ブロックの回路記号を示す図であり、図59は、“c(m−1) j”回路ブロックのブロック図である。
“c(m−1) j”回路ブロックは、クロックclj、/cljに同期して動作する回路であり、(j)m、am−1、及びコード成分c1〜c16を入力し、c(m−1) jを出力する。
“c(m−1) j”回路ブロックは、“X Zp”回路ブロック、2つの“5 bit AD mod 17”回路ブロック<1>、<2>、及び“R(1〜16)”レジスタ部を有する。
“X Zp”回路ブロックでは、(j)mとam−1との積を生成しインバータIV1を介して“5 bit AD mod 17”回路ブロック<1>に出力する。
“5 bit AD mod 17”回路ブロック<1>では、インバータIV1を介して出力された出力(j)mam−1の補数を求め、−jmam−1を生成し、“5 bit AD mod 17”回路ブロック<2>に出力する。
“5 bit AD mod 17”回路ブロック<2>では、“5 bit AD mod 17”回路ブロック<1>から出力された−jmam−1と、クロックclに同期して“R(1〜16)”レジスタ部から出力されるcj(=c(m−2) j)との和を生成する。この和が“c(m−1) j”回路ブロックの出力であるc(m−1) jとなる。この“5 bit AD mod 17”回路ブロック<2>から出力されたc(m−1) jは、クロックclの立ち下がりに同期して“R(1〜16)”レジスタ部の第j番目のレジスタに記録される。
続いて、数46に示すam=16−1Σ(jm+1)−1c(m−1) j(j=1〜16)に基づき、amを生成する回路について説明する。以下において、この回路を“am”回路ブロックと呼ぶ。
図60は、“am”回路ブロックの回路記号を示す図であり、図61は、“am”回路ブロックのブロック図である。
“am”回路ブロックは、クロックcljに同期して動作する回路であり、(j)m+1、及びc(m−1) jを入力し、amを出力する。
“am”回路ブロックは、“j−1 dec”回路ブロック、2つの“X Zp”回路ブロック<1>、<2>、“5 bit AD mod 17”回路ブロック、及び“Rgstr”レジスタを有する。
“j−1 dec”回路ブロックでは、(j)m+1を、その逆元(j)−(m+1)に変換し、“X Zp”回路ブロック<1>に出力する。
“X Zp”回路ブロック<1>は、“j−1 dec”回路ブロックから入力された(j)−(m+1)と、“c(m−1) j”回路ブロックから出力されるcj(=c(m−1) j)との積演算をし、“5 bit AD mod 17”回路ブロックに出力する。
“5 bit AD mod 17”回路ブロックから出力された積は、初期値が‘0’の“Rgstr”レジスタと“5 bit AD mod 17”回路ブロックからなるループによって加算されて行く。この結果は、“5 bit AD mod 17”回路ブロックから“X Zp”回路ブロック<2>に出力される。
“X Zp”回路ブロック<2>では、“5 bit AD mod 17”回路ブロックから出力された和と16−1=16との積を演算し、“am”回路ブロックの出力であるamを得る。
最後に、上記の“c(m−1) j”回路ブロック及び“am”回路ブロックを用いてデータコードAを得る計算回路について説明する。以下では、この計算回路を「逆変換回路」と呼ぶ。
図62中(A)は、逆変換回路のブロック図であり、図62中(B)は、この逆変換回路を制御するクロックck及びclのタイミングチャートである。
図62中(B)に示すように、クロックck及びclは、所定のクロックckの立ち上がりから次のクロックckの立ち上がりまでの間に、クロックclが16回立ち上がる関係となっている。
逆変換回路は、逆変換のために必要なリー・メトリック・コードCの成分の変換を都度行う第1の部分回路U1と、データコードAの要素を一つ一つ求める第2の部分回路U2を有する。
第1の部分回路U1は、“(j)i (j=1 to 16)”回路ブロック、“Rgstr”レジスタ、及び“c(m−1) j”回路ブロックを有する。
第2の部分回路U2は、“(j)i (j=1 to 16)”回路ブロック、“am”回路ブロック、及び“Li(0〜10)”レジスタ部を有する。
このうち“(j)i (j=1 to 16)”回路ブロックは、第1の回路部分U1と共有されている。“(j)i (j=1 to 16)”回路ブロックは、“am”回路ブロックと“c(m−1) j”回路ブロックで用いるZpの要素jのm+1乗とm乗を発生する回路である。この回路ブロックは、クロックckのサイクル数m+1及びこのサイクル回数よりも1少ない数mを指数とし、クロックclのサイクル数をjとして、(j)m+1及び(j)mを出力する。
“(j)i (j=1 to 16)”回路ブロックは、ckの1サイクル目では、“am”回路ブロックに対してZpの要素そのものを出力し、“c(m−1) j”回路ブロックに対しては‘1’を出力する。この“c(m−1) j”回路ブロックに出力される‘1’は本来計算で利用されないものであるため、この‘1’が演算結果に影響を及ぼさないようにする工夫を施す必要がある。そこで、この‘1’の影響を無くすために、第1の部分回路U1の積演算では、クロックckの最初のサイクルの際、もう一方の入力を‘0’とし、積演算の結果がゼロになるようにしている。
第1の部分回路U1の“Rgstr”レジスタにはamが設定される。この設定されたamは、クロックck1以降のクロックckのタイミングで“Rgstr”レジスタから出力される。即ち、“Rgstr”レジスタの出力am−1は、クロックckmのタイミングで出力される。
クロックckの最初のクロックサイクルck0では、“Rgstr”レジスタの出力ノードの初期値は‘0’に設定されており、上記のように計算結果に影響を与えないようになっている。
“c(m−1) j”回路ブロックは、クロックckmに同期して、“Rgstr”レジスタ及び“(j)i (j=1 to 16)”回路ブロックからそれぞれ出力されるam−1及び(j)mが入力される。“c(m−1) j”回路ブロックは、これらの入力am−1及び(j)mから第1の部分回路U1の出力であるc(m−1) jを得る。
なお、“c(m−1) j”回路ブロックの初期値は、復元されたコードデータCとなっており、クロックck0での“Rgstr”レジスタの設定からc(−1) j=init Cである。
第2の回路部分U2の“am”回路ブロックは、クロックclの16サイクル毎に、数46に示した計算式に従ってamを得る。“am”回路ブロックが生成したamは、次の16回のクロックclのサイクルの開始タイミングとなるクロックckm+1によって“Li(0〜10)”レジスタ部の第m番目のレジスタに格納される。
全てのクロックサイクルが終了すると“Li(0〜10)”レジスタ部には、コードデータA設定され格納されている。
<まとめ>
以上、第1の実施形態では、エラー訂正にシンドローム変換法を用いたp−adic・NANDフラッシュメモリについて、具体的な構成を例示しながら説明した。
第1の実施形態によれば、p−adicセルに対するデータの書き込み、p−adicセルに対するデータの読み出し等におけるレベル設定が甘い場合であっても、強力なエラー訂正能力によってデータの信頼性を確保することができる。 [第2の実施形態]
第1の実施形態では、シンドローム変換法を「p−adic Zp world」のデータ(コード)の処理に利用するメモリシステムについて説明した。この場合、メモリシステムに用いる回路の構成を単純にできる。しかし、訂正できるエラー量を増やした場合、エラー訂正に漏れのない探索をするためには探索の繰り返しが大きくなってしまい、処理時間が増大してしまう。
第1の実施形態のようにエラー訂正にシンドローム変換法を用いた場合、エラー探索の際に必要となる計算の繰り返し回数は、例えば、p=17の場合であって、訂正可能なリー・メトリックがε=3の場合には最大で16×16=256回、ε=2の場合には最大で16回で済む。一方、第1の実施形態で説明したように、訂正可能なリー・メトリックがε=4の場合、エラーの探索の際に最大で16×16×16=4096回の計算処理を繰り返す必要がある。
以上の点から、シンドローム変換法は、エラー量が小さいメモリシステムに搭載するエラー訂正システムに対しては有効であるが、逆に、エラー訂正可能量が大きい場合(例えば、p=17、ε=4)には、シンドローム変換法よりも従来のユークリッド反復法を用いた方が処理時間及び回路規模を小さくすることができる場合がある。
そこで、第2の実施形態では、エラー訂正にユークリック法を用いたp−adic・NANDフラッシュメモリについて説明する。
図63は、エラー訂正にユークリッド反復法を用いたメモリシステムのブロック図である。このメモリシステムは、p=17、最大訂正可能エラー量をε=4とした場合の構成となる。
p−adicメモリシステムは、17進数変換部201、エンコード部202、p−adicセルメモリ部203、シンドローム生成部204、解探索多項式生成部205、ユークリッド反復法処理部206、第1のハッセ微分多項式生成部207、第2のハッセ微分多項式生成部208、コード復元部209、デコード部210、及び25進数変換部211を備える。
このうち、17進数変換部201、エンコード部202、及びp−adicセルフラッシュメモリ203の処理過程に関しては、図33に示すp−adicメモリシステムにおける17進数変換部101、エンコード部102、及びp−adicセルフラッシュメモリ103の処理過程と同じである。したがって、ここでは、p−adicセルフラッシュメモリ103からコードYを読み出した後の処理過程から説明する。
エンコード部202でリー・メトリック・コード化されたコードCは、p−adicセルフラッシュメモリ203からエラーを含むコードYとして読み出される。このコードYは、シンドローム生成部204に入力される。
シンドローム生成部204は、シンドローム行列H及びコードYの各コード語成分を用いてS=YHtからシンドロームSの計算を行う。S=0の場合、コードYはエラーを含まないので、最後の処理のためにコードYをデコード部210に出力する。一方、S≠0の場合であって、且つ、Sの最初の成分S0が|S0|>5の場合、コードYのエラーは確実に訂正できないため、NG信号を出力すると共に、最初の処理のためにエラーを含むコードYをそのままデコード部210に出力する。その他の場合、シンドロームSを解探索多項式生成部205に出力する。
解探索多項式生成部205は、数47に示す計算式より、シンドロームSから多項式Ψ(x)を求める。この多項式Ψ(x)は、ユークリッド反復法処理部206に出力される。
[数47]
ユークリッド反復法処理部206は、ユークリッド反復法によってλ=fn、v=pn−1の生成を試みる。λ及びvを生成できた場合、これらの多項式λ(x)及びv(x)をそれぞれ第1及び第2のハッセ微分多項式生成部207及び208に出力する。一方、λやvを生成できなかった場合、NG信号を出力するともに、最初の処理のためにエラーを含むコードYをそのままエンコード部210に出力する。このユークリッド反復法処理部206の回路構成については後で詳述する。
第1及び第2のハッセ微分多項式生成部207及び208は、それぞれ多項式λ(x)とv(x)からハッセ微分多項式を求め、これらの根rとその根の多重度nを求める。第1及び第2のハッセ微分多項式生成部207及び208は、得られた根rとその多重度nから、コード復元部210にt=r‐1を出力する。
コード復元部210は、エラーの生じたコード語の位置座標tと、多重度nからエラー量etを求める。そして、ct=yt−etからリー・メトリック・コードのコードC=(c1,c2,・・・,c16)を復元する。
以降のデコード部210及び25進数変換部211の処理については、図33に示すp−adicメモリシステムにおけるデコード部109及び25進数変換部110と同じであるため省略する。
以上、本実施形態に係るメモリシステムの場合、処理の反復と複雑さは全てユークリッド反復法に押し込められ、全体の処理フローは単純となる。
なお、全体のシステム構成には大きく分けて2つ考えられ、図63中aで示す破線で囲まれたシステム構成と、図63中bで示す一点鎖線で囲まれたシステム構成が考えられる。
破線で囲まれたシステムは、p−adicセルフラッシュメモリを搭載しており、これだけで1つのメモリシステムとして機能するものである。したがって、このメモリシステムの場合、第1の実施形態でも説明したp−adicセルフラッシュメモリを開発する必要がある。また、これに伴い、p−adicセルへのレベル設定方法を、従来のNAND MLCを用いるメモリシステムの場合から変更する必要がある。
一点鎖線で囲まれたシステムは、メモリデバイスとして従来のNAND MLCをそのまま用いるメモリコントローラとなる。したがって、このシステムは、データの書き込みの際にZpの要素をMLCのレベルに対応させるようにデコードするI/Oを設けるだけで実現することができる。これにより、従来のNAND MLCを利用してリー・メトリック・コードを用いたメモリシステムを構築することができる。但し、メモリコントローラを用いたメモリシステムの場合、MLCとZpとのマッピングのために多くの時間が必要となるため、高速なデータ処理システムとはならない。但し、データの信頼性を上げたデータ管理が可能であることには変わりない。
MLCとZpのマッピングはMLCのレベルのグループごとにページが異なるため、異なるページ間のデータをまとめて管理しない場合、1つのメモリセルのレベルをZpの要素として連続して対応付けすることができない。そこで、全てのページデータに対応するレジスタを設けて、Zpの要素のバイナリ表示とのマッピングを行い、このレジスタ群の全てのページとのNAND MLCメモリデバイス内の個別のページの一連のデータ転送を行なう必要がある。そのため、このマッピングに多くのロジックを要することになる。このマッピングは大きなレジスタとデコーダの集合とみなせるので詳細は記述しない。なお、NAND MLCのレベル数は2の累乗でありZpの要素数は素数であるから、8値セルの場合はp=7、16値セルの場合はp=13までの素数しか使えず、メモリセルの効率の観点からは、最適なシステムとはいえない。
いずれのシステムを構築するかは、市場要求によるが、第1の実施形態或いは以下に示す第2の実施形態の説明によって、いずれのメモリシステムも実現することは可能である。
<ユークリッド法>
先ず、ユークリッド反復法を用いたメモリシステムの前提として、ユークリッド法を用いる場合の一般的な関係式などをまとめて説明しておく。ここではγ=ε+1として説明する。
p−adicセルに記録されたコードCのバイナリデータは、hビットからなるコード語シンボルがp−1個集まったものであり、ビット毎に様々な擾乱を受けて変化を起こす。そこで、コードYからコードCを復元するのがデコードである。このデコードに先立ち、始めにシンドロームを求める。
シンドロームSはシンドローム行列Hを利用したS=YHtの演算をして数48に示す要素S0、S1、…、Sγ−1として求まる。
[数48]
ここで、HtはHの転置行列である。生成行列Gとシンドローム行列Hの構成がGHt=0(mod p)となるように構成されていることにより、Y=C+EとおくとS=EHtとなる。またE=(e1,e2,・・・,ep−1)とすると、シンドロームS0は各コード語シンボルのエラーの総和になっていることが分かる。これらのシンドロームSが唯一のエラーの情報であり、これらシンドロームSを基にして以下のように、正しいコードCの復元を行う。
続いて、デコードの原理を説明する。n(=p−1)個のエラーのシンボルを二つの組J+とJ−に、数49のように分類する。
[数49]
すなわち、シンボルのエラー量がej<p/2の場合、コードシンボルcjの位置jの集まりであるJ+と、シンボルのエラー量がej>p/2の場合のコードシンボルcjの位置jの集まりであるJ−とに分類される。ガロア体GF(p)上の多項式Λ(x)、V(x)をこれらの組を基に数50のように構成する。
[数50]
このように、多項式Λ(x)はJ+のエラーコード語シンボルの位置jの逆数を根として持ち、そのコード語シンボルのリー・メトリックejを根の多重度として持つ多項式となる。一方、多項式V(x)はJ−のエラーコード語シンボルの位置jの逆数を根として持ち、そのコード語シンボルのリー・メトリックp−ejを根の多重度として持つ多項式となる。デコードは、最終的にこれらの多項式をシンドロームSlの情報のみから構成して解くことによってエラーの情報を得る過程となる。つまり、これら多項式Λ(x)、V(x)とシンドロームSlとの関係を求める必要がある。
続いて、数51に示すように各シンドロームSlをその次数の係数に持つ級数多項式で構成すると、シンボルのエラー量ej、位置jとその値を持つ有理多項式で表される。
[数51]
数51から、多項式Λ(x)、V(x)、シンドロームS(x)の間には数52に示す関係式が成立する。
[数52]
続いて、数52に示す関係式を利用して、シンドロームS(x)から多項式Λ(x)、V(x)を求める。
シンドロームS(x)から、数53に示す次数がγ−1以下の多項式Ψ(x)を求める。
[数53]
多項式Ψ(x)の展開式において、数53に示す式の両辺の同次次数の係数の比較から、係数ψjは、シンドロームSiと既に求まっている係数ψj−1とを用いて反復法で求めることができる。シンドロームS1〜Sγ−1から多項式Ψ(x)の係数ψ0〜ψγ−1を求めた結果を数54に示す。
[数54]
この多項式Ψ(x)はΛ(x)/V(x)に等価な多項式であるが、多項式Λ(x)、V(x)には、数55に示すキー条件がある。そのため、xγと多項式Ψ(x)に対してユークリッド法で定数倍を除いて求めることができる。
[数55]
したがって、シンドロームS1〜Sγ−1から多項式Ψ(x)が構成できれば、反復法の停止条件としてシンドロームS0を用いて多項式Λ(x)、V(x)が求まる。すなわち、反復法によって(S0,Ψ(x))の組から求めた多項式Λ(x)、V(x)は、エラーコード語シンボルの位置jとエラー量ejを表している。
<ユークリッド反復法によるエラー訂正>
次に、ユークリッド反復法について説明する。ここでは、合同式v(x)Ψ(x)≡λ(x)(mod xγ)を停止条件deg λ(x)−deg v(x)≡S0(mod p)で求める反復法について説明する。
ユークリッド反復法は、関数f0、f1、…、fnを多項式の割り算を用いて順に求めて行く方法である。これらの量の間には数56に示す関係がある。
[数56]
ここで、数57の示すように、特に割り算の過程で得られる商多項式knからpnやqnを逐次導入することによって、これらの多項式が簡単な関係を満足することから、fnをf0、f1、pn−1、及びqn−1で表すことができる。そこでf0=xγ、f1=Ψ(x)とおいてxγでの合同式を作ると、反復の停止条件はdeg fn−deg pn−1≡S0(mod p)となる。この停止条件を満たすnについてdeg fn+deg pn−1<γならλ(x)=fn、V(x)=pn−1とおくことができる。
γ=ε+1であるので、例えば、エラー4に対する計算では反復回数も4回程度で良い。その点、ユークリッド反復法を用いた場合、演算回路の規模は増大するが、計算回数はシンドローム変換法に比べて格段に少なくできる。
以下では、具体的な回路構成について、シンドローム変換法から大きく異なる点について詳述していく。
<シンドローム生成部の回路構成>
次に、シンドローム生成部204の回路構成例として、シンドロームSの成分要素を一括して求める演算回路を説明する。以下、この演算回路を「シンドローム成分要素生成回路」と呼ぶ。
シンドローム成分要素生成回路は、数57に示す関係式に基づいて構成されている。
[数57]
図64中(A)は、シンドローム成分要素生成回路のブロック図であり、図64中(B)は、シンドローム成分要素生成回路を制御するクロックcki(i=0〜ε+1)、clj(j=1〜p−1)のタイミングチャートである。
シンドローム成分要素生成回路は、図64中(A)に示すように、“Ro(1〜p−1)”レジスタ部、“(j)i(j=1 to p−1)”回路ブロック、“X Zp”回路ブロック、“h bit AD mod p”回路ブロック、“Rgstr”レジスタ、及び“Ri(0〜ε)”レジスタ部を有する。
p−adicセルアレイから読み出されたデータYは“Ro(1〜p−1)”レジスタに初期設定として格納される。“(j)i(j=1 to p−1)”回路ブロックからは(j)iを発生させる。これら“Ro(1〜p−1)”レジスタ及び“(j)i(j=1 to p−1)”回路ブロックは、クロックcliによって同期され、Yの成分yjが出力されると同時に(j)iが出力されるように制御される。これらの積(j)iyjを“X Zp”回路ブロックで生成し、クロックclj(j=1〜p−1)と同期して、“h bit AD mod p”回路ブロック及び“Rgstr”レジスタのループによって加算していき、シンドローム成分Siを作る。得られたSiをクロックcki+1で“Ri(0〜ε)”レジスタの第i番目のレジスタに格納する。この過程をクロックckiのi=0〜εについて処理し、全てのシンドローム成分を得て“Ri(0〜ε)”レジスタ部に格納する。
以下において、ユークリッド反復法処理部206の回路構成例を説明する。
始めに、fn=knfn+1+fn+2の計算のknを求める回路について説明する。以下において、この回路を“kn”回路ブロックと呼ぶ。
“kn”回路ブロックは、数58に示す関係式に基づいて構成されている。
[数58]
“kn”回路ブロックは、数58に示した係数間の関係を用いて既知の係数から未知の係数を求める。なお、knの多項式は1次であるとして、計算の過程では最高次の係数が0になる場合も係数を0として、計算の手順は逐次進めるようにする。このとき0の逆元は0として、係数間の関係式は常に成り立つようにする。
図65は、“kn”回路ブロックの回路記号を示す図であり、図66は、“kn”回路ブロックのブロック図である。
“kn”回路ブロックは、図65に示すように、a(n) m−1及びa(n) mを入力し、a(n+1) m−1、a(n+1) m−2、b(n) 1、及びb(n) 0を出力する。
“kn”回路ブロックは、3つの“X Zp”回路ブロック<1>、<2>、<3>、2つの“h bit AD mod p”回路ブロック<1>、<2>、“j−1 dec”回路ブロック、XNORゲートG1、及びORゲートG2を有する。
“X Zp”回路ブロック<1>は、a(n+1) m−2及びb(n) 1で積演算する。この結果b(n) 1a(n+1) m−2は、インバータIV1を介して“h bit AD mod p”回路ブロック<1>に出力される。
“h bit AD mod p”回路ブロック<1>は、インバータIV1の出力及び‘1’を入力し、b(n) 1a(n+1) m−2の補数を得る。
“h bit AD mod p”回路ブロック<2>は、“h bit AD mod p”回路ブロック<1>の出力及びa(n) m−1を入力し、その結果a(n) m−1−b(n) 1a(n+1) m−2を“X Zp”回路ブロック<2>に出力する。
“j−1 dec”回路ブロックは、a(n+1) m−1を入力し、その逆元(a(n+1) m−1)−1を“X Zp”回路ブロック<2>及び<3>に出力する。
“X Zp”回路ブロック<2>は、“h bit AD mod p”回路ブロック<2>の出力a(n) m−1−b(n) 1a(n+1) m−2及び“j−1 dec”回路ブロックの出力(a(n+1) m−1)−1で積演算し、その結果b´(n) 0を得る。
“X Zp”回路ブロック<3>は、a(n) m及び“j−1 dec”回路ブロックの出力(a(n+1) m−1)−1で積演算し、“kn”回路ブロックの出力であるb(n) 1を得る。
XNOR回路G1は、“X Zp”回路ブロック<2>の出力b´(n) 0及び“X Zp”回路ブロック<3>の出力b(n) 1を入力する。また、OR回路G2は、XNOR回路の出力及びb´(n) 0を入力する。この場合、OR回路Gの出力が“kn”回路ブロックの出力b(n) 0になる。
続いて、fn=knfn+1+fn+2の計算のfn+2を求める回路について説明する。以下において、この回路を“fn”回路ブロックと呼ぶ。
“fn”回路ブロックは、数59に示す関係式に基づいて構成されている。
[数59]
“fn”回路ブロックは、数59に示した係数間の関係を用いて既知の係数から未知の係数を求める。なお、既に得られているknの多項式の係数を利用する。
図67は、“fn”回路ブロックの回路記号を示す図であり、図68は、“fn”回路ブロックのブロック図である。
“fn”回路ブロックは、図67に示すように、a(n+1) m−1、a(n+1) m、a(n) m、b(n) 1、及びb(n) 0を入力しa(n+2) mを出力する。
“fn”回路ブロックは、2つの“X Zp”回路ブロック<1>、<2>、3つの“h bit AD mod p”回路ブロック<1>、<2>、及び<3>を有する。
“X Zp”回路ブロック<1>は、a(n+1) m−1及びb(n) 1で積演算し、この結果b(n) 1a(n+1) m−1を“h bit AD mod p”回路ブロック<1>に出力する。
“X Zp”回路ブロック<2>は、a(n+1) m及びb(n) 0で積演算し、この結果b(n) 0a(n+1) mを“h bit AD mod p”回路ブロック<1>に出力する。
“h bit AD mod p”回路ブロック<1>は、“X Zp”回路ブロック<1>の出力b(n) 1a(n+1) m−1及び“X Zp”回路ブロック<2>の出力b(n) 0a(n+1) mを入力する。この“h bit AD mod p”回路ブロック<1>の出力は、インバータIV1を介して“h bit AD mod p”回路ブロック<2>に入力される。
“h bit AD mod p”回路ブロック<2>は、インバータIV1の出力及び‘1’を入力し、(b(n) 0a(n+1) m+b(n) 1a(n+1) m−1)の補数を得る。
“h bit AD mod p”回路ブロック<3>は、a(n) m及び“h bit AD mod p”回路ブロック<2>の出力を入力し、この“fn”回路ブロックの出力であるa(n+2) mを得る。
続いて、pn=kn−1pn−1+pn−2の計算のpn−2を求める回路について説明する。以下において、この回路を“pn”回路ブロックと呼ぶ。
“pn”回路ブロックは、数60に示す関係式に基づいて構成されている。
[数60]
“pn”回路ブロックは、数60に示した係数間の関係を用いて既知の係数から未知の係数を求める。なお、既に得られているknの多項式の係数を利用する。
図69は、“pn”回路ブロックの回路記号を示す図であり、図70は、“pn”回路ブロックのブロック図である。
“pn”回路ブロックは、図69に示すように、a(n) m−1、a(n) m、及びa(n−1) mを入力し、a(n+1) mを出力する。
“pn”回路ブロックは、図70に示すように、2つの“X Zp”回路ブロック<1>、<2>、2つの“h bit AD mod p”回路ブロック<1>、及び<2>を有する。
“X Zp”回路ブロック<1>は、a(n) m−1及びb(n) 1で積演算し、この結果b(n) 1a(n) m−1を“h bit AD mod p”回路ブロック<1>に出力する。
“X Zp”回路ブロック<2>は、a(n) m及びb(n) 0で積演算し、この結果b(n) 0a(n) mを“h bit AD mod p”回路ブロック<1>に出力する。
“h bit AD mod p”回路ブロック<1>は、“X Zp”回路ブロック<1>の出力b(n) 1a(n) m−1及び“X Zp”回路ブロック<2>の出力b(n) 0a(n) mを入力し、b(n) 0a(n) m+b(n) 1a(n) m−1を“h bit AD mod p”回路ブロック<1>に出力する。
“h bit AD mod p”回路ブロック<2>は、a(n−1) m及び“h bit AD mod p”回路ブロック<1>の出力b(n) 0a(n) m+b(n) 1a(n) m−1を入力し、“pn”回路ブロックの出力であるa(n+1) mを得る。
続いて、fn=knfn+1+fn+2の計算回路について説明する。以下において、この回路を“fn=knfn+1+fn+2”回路ブロックと呼ぶ。
図71は、“fn=knfn+1+fn+2”回路ブロックの回路記号を示す図であり、図72は、“fn=knfn+1+fn+2”回路ブロックのブロック図である。
“fn=knfn+1+fn+2”回路ブロックは、図71に示すように、fnの係数a0〜aγ、及びfn+1の係数b0〜bγを入力し、fn+2の係数c0〜cγ、及びknの係数β0〜β1を出力する。
計算は、f0=xγ、f1=Ψ(x)とおいて開始されるため、fnの最大次数はγとなり、fn+2の最大次数もknが1の場合もあるためγとなる。このため、“fn=knfn+1+fn+2”回路ブロックは、図72に示すように、γ+1個の“kn”回路ブロック<1>〜<γ+1>、及びγ+1個の“fn”回路ブロック<1>〜<γ+1>を有する。
“kn”回路ブロック<1>は、a(n+1) m−2、a(n) m−1、a(n+1) m−1、及びa(n) mとして、それぞれ‘0’、a0、b0、及びa1を対応付け、b(n) 0、及びb(n) 1として、それぞれβ(0) 0、及びβ(0) 1を対応付ける。
“kn”回路ブロック<2>は、a(n+1) m−2、a(n) m−1、a(n+1) m−1、及びa(n) mとして、それぞれb0、a1、b1、及びa2を対応付け、b(n) 0、及びb(n) 1として、それぞれβ(1) 0、及びβ(1) 1を対応付ける。
以降、“kn”回路ブロック<3>〜<γ+1>についても、“kn”回路ブロック<1>及び<2>と同様の入出力となっている。
“kn”回路ブロック<1>〜<γ+1>の出力β(m)0及びβ(m)1(m=0〜γ)は、それぞれdeg(b1,b2,・・・,bγ)=mで制御される制御スイッチSWを介して“fn=knfn+1+fn+2”回路ブロックからβ0及びβ1として出力される。また、このβ0及びβ1は、“fn”回路ブロック<1>〜<γ+1>の入力としても利用される。ここで、deg()は、fn+1の次数判別回路出力を表わす。
“fn”回路ブロック<1>は、a(n+1) m−1、a(n+1) m、a(n) m、b(n) 0、及びb(n) 1として、それぞれ‘0’、b0、a0、β0、及びβ1を入力し、a(n+2) mとしてc0を出力する。
“fn”回路ブロック<2>は、a(n+1) m−1、a(n+1) m、a(n) m、b(n) 0、及びb(n) 1として、それぞれb0、b1、a1、β0、及びβ1を入力し、a(n+2) mとしてc1を出力する。
以降、“fn”回路ブロック<3>〜<γ+1>についても、“fn”回路ブロック<1>及び<2>と同様の入出力となっている。
“fn”回路ブロック<1>〜<γ+1>の出力が、“fn=knfn+1+fn+2”回路ブロックの出力であるc0〜cγとなる。
続いて、pn+1=knpn+pn−1の計算回路について説明する。以下において、この回路を“pn+1=knpn+pn−1”回路ブロックと呼ぶ。
図73は、“pn+1=knpn+pn−1”回路ブロックの回路記号を示す図であり、図74は、“pn+1=knpn+pn−1”回路ブロックのブロック図である。
“pn+1=knpn+pn−1”回路ブロックは、図73に示すように、knの係数β0、β1、pn−1の係数a0〜aγ−1、及びpnの係数b0〜bγ−1を入力し、pn+1の係数c0〜cγ−1を出力する。
計算は、p−1=0、p0=1とおいて開始し、mod xγでpn+1を利用するため、pn+1の最大次数はγ−1となる。このため、“pn+1=knpn+pn−1”回路ブロックは、γ個の“pn”回路ブロック<1>〜<γ>を有する。
“pn”回路ブロック<1>は、a(n) m−1、a(n) m、a(n−1) m、b(n) 0、及びb(n) 1として、それぞれ‘0’、b0、a0、β0、及びβ1を入力し、a(n+1) mとしてc0を出力する。
“pn”回路ブロック<2>は、a(n) m−1、a(n) m、a(n−1) m、b(n) 0、及びb(n) 1として、それぞれb0、b1、a1、β0、及びβ1を入力し、a(n+1) mとしてc1を出力する。
以降、“pn”回路ブロック<3>〜<γ>についても、“pn”回路ブロック<1>及び<2>と同様の入出力となっている。
“pn”回路ブロック<1>〜<γ>の出力が、“pn+1=knpn+pn−1”回路ブロックの出力であるc0〜cγ−1となる。
続いて、0からnまでの反復計算によってfn及びpn−1を求める計算回路について説明する。
図75は、fnを求める計算回路であり、図76は、pn−1を求める計算回路である。
fnを求める計算回路は、図75に示すように、“fn=knfn+1+fn+2”回路ブロックの他、3つの“h(γ+1)”レジスタ部<1>〜<3>を有する。“h(γ+1)”レジスタ部<1>〜<3>は、それぞれhビットのラッチをγ+1個有する。“h(γ+1)”レジスタ部<1>〜<3>には、対応する入力がない場合‘0’が設定される。fnの計算は、“fn=knfn+1+fn+2”回路ブロックとこの周辺に設けられた3つの“h(γ+1)”レジスタ部<1>〜<3>によって、データを巡回転送して進められる。
pn+1を求める計算回路は、図76に示すように、“pn+1=knpn+pn−1”回路ブロックの他、“hγ”レジスタ部<1>〜<3>を有する。“hγ”レジスタ部<1>〜<3>は、それぞれhビットのラッチをγ個有する。“hγ”レジスタ部<1>〜<3>には、対応する入力がない場合‘0’が設定される。pn+1の計算は、“pn+1=knpn+fn−1”回路ブロックとこの周辺に設けられた3つの“hγ”レジスタ部<1>〜<3>によって、データを巡回転送して進められる。
fn及びpn−1の計算は、クロックclのサイクル毎に進行し、このクロックclのサイクルを0から数えた数がユークリッド反復法のnに対応する。最終的に、“h(γ+1)”レジスタ部<1>にfnが保持され、“hγ”レジスタ部<1>にpn−1が保持される。
最初のクロックサイクルcl0において、“h(γ+1)”レジスタ部<1>〜<3>、及び“hγ”レジスタ部<1>〜<3>レジスタには、それぞれ図75、及び図76に示すような初期値が設定される。
即ち、fnを求める回路では、f0=xγの係数が“h(γ+1)”レジスタ部<1>に、f1=Ψ(x)の係数が“h(γ+1)”レジスタ部<3>にそれぞれ設定さる。また、pn−1を求める回路では、p−1=‘0’が“hγ”レジスタ部<1>に、p0=‘1’が“hγ”レジスタ部<3>に設定される。以後、クロックサイクルを進める度に、clnサイクルの始めにfnやpn−1が、それぞれ対応するレジスタ部に保持される。
“h(γ+1)”レジスタ部<1>、“hγ”レジスタ部<1>は、信号/ISTOPによって入力が遮断されるため、その時点で“h(γ+1)”レジスタ部<1>、“hγ”レジスタ部<1>のデータは確定する。ここで、信号/ISTOPは、後述するユークリッド反復法の停止条件を満たす場合に活性化される信号である。
以上によって、“h(γ+1)”レジスタ部<1>、“hγ”レジスタ部<1>に、それぞれ所望の結果の多項式の係数を得ることができる。
これら係数を、第1のハッセ微分多項式生成部207、第2のハッセ微分多項式生成部208に入力することで、ハッセ微分多項式の根と多重度を求めることができる。
図75及び図76に示す信号/ISTOP、即ちユークリッド反復法の停止条件を求めるためには、計算の結果の多項式の次数を判別する必要がある。そこで、得られたfnやpn−1の係数aj(j=0〜γ)から次数をバイナリ表示する回路について説明する。以下において、この回路を“DEG”回路ブロックと呼ぶ。
図77は、“DEG”回路ブロックの回路記号を示す図であり、図78は、“DEG”回路ブロックのブロック図である。
“DEG”回路ブロックは、図77に示すように、a1〜aγを入力し、次数のバイナリ表示b0〜bh−1を出力する。
“DEG”回路ブロックは、図78に示すように、“h bit reg.”レジスタ<1>〜<γ>、ORゲートG0<1>〜<γ>、G1<0>〜<γ−1>、及び“A to deg DEC.”回路ブロックを有する。
“h bit”レジスタには、それぞれγ次の多項式の係数a1〜aγを示すhビットのバイナリデータが保持されている。これら係数a1〜aγを示すhビットのバイナリデータは、それぞれORゲートG0<1>〜<γ>に入力される。
ORゲートG0<n>(n=1〜γ)には、anを示すhビットのバイナリデータが入力される。ORゲートG0<1>は、an=0の場合‘0’を出力し、an≠0の場合‘1’を出力する。つまり、ORゲートG0<n>は、anが0から0以外かを判別している。
ORゲートG1<m>(m=1〜γ−1)には、ORゲートG0<m>〜<γ>が入力される。そして、ORゲートG1<1>〜<γ−1>の出力がそれぞれA1〜Aγ−1となる。また、ORゲートG0<γ>の出力が、そのままAγとなる。これらA1〜Aγは、“A to deg DEC.”回路ブロックに入力される。
“A to deg DEC.”回路ブロックは、図78中T1で示すA1〜Aγと次数のバイナリ表示との対応関係を実現するデコーダ回路である。Aj(j=1〜γ)の‘1’の総和が次数のバイナリ表示に対応している。
“A to deg DEC.”は、図78中T1に示す対応表に基づいて、A1〜Aγから“DEC”回路ブロックの出力であるb0〜bh−1を得る。なお、次数γはp以下であるので、hビットで表示することができる。
最後に、ユークリッド反復法で得られたfn及びpn−1から、リー・メトリック・コードのキー条件を満たして反復を停止し、且つ、エラー訂正可能条件を満たしているかどうかの判定を行なう回路について説明する。
図79は、ユークリッド反復法の停止条件の判定、つまり信号/ISTOPを生成する回路のブロック図である。
この回路は、2つの“DEG”回路ブロック<1>、<2>、2つの“h bit AD mod p”回路ブロック<1>、<2>、及び複数の論理ゲートからなる部分回路U1を有する。
“DEG”回路ブロック<1>は、a1〜aγとしてfnを入力し、b0〜bh−1としてfnのバイナリ表示であるdeg fnを出力する。このdeg fnは、“h bit AD mod p”回路ブロック<2>に入力される。
“DEG”回路ブロック<2>は、a1〜aγとしてpn−1を入力し、b0〜bh−1としてpn−1のバイナリ表示であるdeg pn−1を出力する。このdeg pn−1は、インバータIV1を介して“h bit AD mod p”回路ブロック<1>に入力される。
“h bit AD mod p”回路ブロック<1>は、インバータIV1を介して入力されるdeg pn−1及び‘1’からdeg pn−1の補数を得る。このdeg pn−1の補数は、“h bit AD mod p”回路ブロック<2>に出力される。
ユークリッド反復法の停止条件は、deg fn−deg pn−1≡S0(mod p)であるため、“h bit AD mod p”回路ブロック<2>にdeg fn及びdeg pn−1の補数を入力し、deg fn−deg pn−1をZpの数として得る。この結果は、バイナリ表示のビット毎にS0と比較するために、部分回路U1に出力される。
部分回路U1は、deg fn−deg pn−1とS0とをビット毎に比較するためビット毎の排他的論理和を取る。全てのビット(deg fn−deg pn−1)j(j=0〜h−1)と(S0)jが一致する場合、部分回路U1は、信号/ISTOPとして‘0’を出力する。つまり、信号/ISTOPは、(deg fn−deg pn−1)0(+)(S0)0∨・・・∨(deg fn−deg pn−1)m(+)(S0)m∨・・・∨(deg fn−deg pn−1)h−1(+)(S0)h−1となる。以上によって、部分回路U1は、deg fn−deg pn−1とS0が一致するか否かを実現している。
図80は、ユークリッド反復法の成功条件を判定する回路のブロック図である。
この回路は、NANDゲートG1、“h bit AD mod p”回路ブロック、後述する“h bit γ≦”回路ブロック、及びNORゲートG2を有する。
NANDゲートG1は、ユークリッド反復法が停止条件を満たさず停止しない場合に備えて設けられている。fnの次数が1、fn+1の次数が0、信号/ISTOPの逆論理の信号/ISTOPnが1のとき、つまり、(deg fn=1)∧(deg fn+1=0)∧(/ISTOPn=1)を条件に、NANDゲートG1は、信号Ifailとして‘1’を出力する。
ユークリッド反復法の停止が行なわれた時点でエラー訂正が可能か否かは、deg fn+deg pn−1<γに基づいて判断する。
そこで、“h bit AD mod p”回路ブロックにdeg fn及びdeg pn−1を入力し、これらの和deg fn+deg pn−1を求める。この和deg fn+deg pn−1は、“h bit γ≦”回路ブロックに出力される。
“h bit γ≦”回路ブロックは、入力がγ以上か否かを判定する回路である。“h bit γ≦”回路ブロックは、“h bit AD mod p”回路ブロックから入力されたdeg fn+deg pn−1がγ以上の場合、信号gtγとして‘1’を出力する。
なお、この“h bti γ≦”回路ブロックの詳細は、省略するが、図40に示す“h bit AD mod p”回路ブロックのPF0生成部U1と同様に構成することができる。
ORゲートG2は、NANDゲートG1の出力Ifail又は“h bit γ≦”回路ブロックの出力gtγを入力し、Ifail∨gtγの場合、ユークリッド反復法によるエラー訂正ができないことを意味するNG信号を出力する。
<まとめ>
以上、第2の実施形態では、エラー訂正にユークリッド反復法を用いたp−adic・NANDフラッシュメモリについて、具体的な構成を例示しながら説明した。
第2の実施形態によれば、第1の実施形態と同様、p−adicセルに対するデータの書き込み、p−adicセルに対するデータの読み出し等におけるレベル設定が甘い場合であっても、強力なエラー訂正能力によってデータの信頼性を確保することができる。また、第1の実施形態と比べ、高速なエラー訂正処理を実現することができる。
[その他]
以上、発明の実施の形態を説明したが、本発明はこれらに限定されるものではなく、発明の趣旨を逸脱しない範囲内において、種々の変更、追加等が可能である。