図1は、本実施形態のメモリシステム100の概略構成例を示すブロック図である。図1に示すように、メモリシステム100は、コントローラ10と、メモリセルアレイ20とを含んで構成される。メモリセルアレイ20は、マトリクス状に配列された複数のメモリセルMSを有する。各メモリセルMSは、行方向に延びる複数のワード線21と列方向に延びる複数のデータ線22との各交差に配置される。図1の例では、メモリセルアレイ20は、所定本数(例えば64本)のデータ線22ごとに、複数の領域に分割され、その分割された一つの領域をプレーンと呼ぶ。各プレーンは、互いに独立した周辺回路(例えばバッファ23、不図示のロウデコーダ、不図示のカラムデコーダ等)を備えている。各プレーンに属するデータ線22は、冗長部分を含む。
図1の例では、各プレーンは、行方向に複数の領域に分割され、その分割された一つの領域をブロックと呼ぶ。各ブロックは、複数のページと呼ばれる領域で構成される。図1の例では、各ページは、1本のワード線21を含む領域である。見方を変えれば、各ページは、1本のワード線21に接続された64個のメモリセルを含んで構成されると捉えることもできる。また、図1の例では、各プレーンは、列方向に複数の領域に分割され、その分割された一つの領域をセクタと呼ぶ。各セクタは、所定本数のデータ線22を含む領域である。図1の例では、各セクタは、8本のデータ線22を含む領域であるので、ひとつのプレーンは、8つのセクタに分割されていると捉えることができる。なお、これに限らず、各セクタに含まれるデータ線22の本数は任意である。また、図1の例では、各ページ(または各ブロック)も、列方向において、セクタによって8つに分割されていると捉えることができる。
メモリセルMSに対するデータの書き込みはページ単位で行われる。例えば所定のページに対するデータの書き込みが行われる場合、コントローラ10は、シリアル形式の書き込みデータをセクタごとに順番に生成してバッファ23へ送る。図1の例では、バイト単位(8ビット単位)の書き込みデータが順番に生成されてバッファ23へ送られる。1ページ分の書き込みデータがバッファ23に送られた後、書き込みが行われるページに対応するワード線21が選択され、バッファ23と各データ線22との間に介在する複数の選択トランジスタSWが一斉にオン状態にされることにより、選択されたワード線21に接続された複数(64個)のメモリセルMSの各々に対してデータが書き込まれる。
また、メモリセルMSからのデータの読み出しもページ単位で行われる。例えば所定のページからデータが読み出される場合、そのページ(読み出し対象のページ)に対応するワード線21が選択され、複数の選択トランジスタSWが一斉に選択されることにより、選択されたワード線21に接続された複数のメモリセルMSの各々に格納されたデータが、データ線22を介して一斉にバッファ23へ送り込まれる。バッファ23へ送り込まれたデータは、バイト単位に分割されて順次にコントローラ10へ送られる。
(書き込みデータの生成)
次に、書き込みデータを生成するコントローラ10の機能について説明する。コントローラ10は、書き込みデータを生成するデータ生成装置であると捉えることもできる。図2は、コントローラ10の概略構成例を示すブロック図である。図2の例では、書き込みデータの生成に必要な部分を中心に記載しており、例えば後述の読み出しデータの生成に必要な部分等については記載を省略している。図2に示すように、コントローラ10は、全体制御部30と、入出力部32と、ライトバッファメモリ34と、出力FIFO部36と、不良カラム情報作成部40と、不良カラム記憶部50と、書き込みデータ生成部60と、コマンド生成部70とを含む。
全体制御部30は、コントローラ10全体を制御する。入出力部32は、不図示のホスト装置から送られてくるデータを、ページ単位でライトバッファメモリ34へ送る。ライトバッファメモリ34に書き込まれたデータは、全体制御部30の制御の下、バイト単位で出力FIFO部36へ供給される。本実施形態の出力FIFO部36は、図2に示すように、8ビットの第1レジスタ37と、8ビットの第2レジスタ38とが直列に接続されて構成される。第1レジスタ37および第2レジスタ38の各々は、1ビットのデータを格納可能な記憶領域を8個ずつ有する。本実施形態では、出力FIFO部36には、8ビット単位でデータが入力される。出力FIFO部36は、8ビットのデータの入力を受け付けた場合、第1レジスタ37に既に格納されていた8ビットのデータを第2レジスタ38に書き込み、入力された8ビットのデータを第1レジスタ37に書き込む。すなわち、出力FIFO部36に格納されたデータは、8ビットのデータが入力されるたびに、8ビット単位でシフトする。また、見方を変えれば、出力FIFO部36は、16個の記憶領域が直列に接続されていると捉えることもできる。以下の説明では、一例として、第2レジスタ38が格納可能な8ビットのデータのうち最上位の桁のビットに対応する記憶領域を「先頭の記憶領域」と呼び、第1レジスタ37が格納可能な8ビットのデータのうち最下位の桁のビットに対応する記憶領域を「末端の記憶領域」と呼ぶ。出力FIFO部36は、8ビットのデータの入力を受け付けた場合、記憶領域に既に記憶されているデータを8個だけ先頭側の記憶領域に書き込み、入力された8ビットデータを、末端から数えて8個分の記憶領域の各々に書き込むと捉えることもできる。
不良カラム情報作成部40は、工場出荷前の段階において、各データ線22の欠陥の有無を検出して不良カラム情報を作成し、その作成した不良カラム情報を不良カラム記憶部50に書き込む。不良カラム情報の作成方法は任意であり、例えば各データ線22に流れる電流値から当該データ線22が不良であるか否かを判断し、その判断結果を用いて不良カラム情報を作成することもできる。
書き込みデータ生成部60は、出力FIFO部36に格納された16個のデータと、不良カラム記憶部50に記憶された不良カラム情報とを用いて、バイト単位(8ビット単位)の書き込みデータを順次に生成して不図示のバッファ23へ出力する。詳細な内容については後述する。コマンド生成部70は、全体制御部30の制御の下、書き込みコマンドを生成してメモリセルアレイ20へ出力する。
図3は、不良カラム記憶部50および書き込みデータ生成部60の詳細な構成例を示す図である。不良カラム記憶部50は、プレーンごとに、セクタを識別するバイト位置(識別情報)と、当該バイト位置で識別されるセクタに属するデータ線22の欠陥の有無を示す不良ビットベクタとを対応付けて記憶する。例えば各プレーン(ページ)において、左から数えて第x番目(1≦x≦8)のセクタを、バイト位置「x」と表すことができる。この場合、左から数えて第1番目のセクタはバイト位置「1」で表され、第2番目のセクタはバイト位置「2」で表される。また、例えば不良ビットベクタが「10000000」で表される場合、このセクタに属する8本のデータ線22のうち左から数えて第1番目のデータ線22に欠陥があり、第2番目〜第8番目のデータ線22には欠陥が無いことを示す。なお、不良カラム記憶部50は、全てのセクタの各々と、当該セクタの不良ビットベクタとを対応付けて記憶することができる。また、不良カラム記憶部50は、欠陥のあるデータ線22が属さないセクタについては、当該セクタを識別するバイト位置と不良ビットベクタとを対応付けて記憶しないこともできる。この場合、不良カラム記憶部50のデータ領域を圧縮できるという利点がある。
書き込みデータ生成部60は、カレントテーブルポインタ61と、生成部62と、バイトポジションカウンタ63と、ポインタコントローラ64とを備える。不良カラム記憶部50のデータ領域は、プレーンごとの領域(プレーン領域と呼ぶ)に区分され、各プレーン領域は、所定数のエントリを含んで構成される。また、各プレーン領域は、当該プレーン領域を特定可能なプレーン情報で識別される。各プレーン領域におけるエントリ位置は、カレントテーブルポインタ61で指定される。つまり、プレーン情報とカレントテーブルポインタ61は、不良カラム記憶部50の特定のエントリを指定するアドレス情報として機能する。書き込みデータが生成されるとき、当該書き込みデータが供給されるセクタを示すバイト位置と、不良ビットベクタとが格納されたエントリを指定するアドレス情報が生成される。そして、そのアドレス情報で指定されたエントリに格納された不良ビットベクタは生成部62へ供給され、当該エントリに格納されたバイト位置はポインタコントローラ64へ供給される。
生成部62は、出力部65とシフト数決定部66と入力制御部67とを有する。シフト数決定部66は、欠陥のあるデータ線22の数に応じた値を示すシフト数を決定する。出力部65は、各セクタに供給される書き込みデータを生成するとき、当該セクタのバイト位置(識別情報)に対応する不良ビットベクタに基づいて、出力FIFO部36を構成する16個の記憶領域の先頭の記憶領域から数えて、今回のシフト数だけ後の記憶領域から順番に、当該記憶領域に格納されたデータを、当該セクタ内の欠陥の無いデータ線22に供給されるデータとして出力する一方、不良ビットを示す「1」(記憶領域に格納されたデータとは別の所定情報)を、当該セクタ内の欠陥のあるデータ線22に供給されるデータとして出力することで、当該セクタに供給される書き込みデータを出力する。入力制御部67は、データを出力済みの記憶領域の数が所定数(ここでは8個)以上になるたびに、バイト単位のデータを出力FIFO部36へ入力するように入出力部32を制御する。本実施形態では、入力制御部67は、データを出力済みの記憶領域の数が8個以上になるたびに、「1」に設定されたインクリメントイネーブルをバイトポジションカウンタ63へ出力する一方、データを出力済みの記憶領域の数が8個未満の場合は、「0」に設定されたインクリメントイネーブルをバイトポジションカウンタ63へ出力する。
バイトポジションカウンタ63は、「1」に設定されたインクリメントイネーブルを生成部62から供給されるたびに、カウント値を1だけインクリメントする。カウント値が1インクリメントされるたびに、1バイト分のデータがライトバッファメモリ34から出力FIFO部36へ供給される。
ポインタコントローラ64は、不良カラム記憶部50から読み出されたバイト位置とバイトポジションカウンタ63のカウント値とが一致した場合は、カレントテーブルポインタ61のポインタ位置はそのままでマッチフラグをセットする。また、ポインタコントローラ64は、不良カラム記憶部50から読み出されたバイト位置がバイトポジションカウンタ63のカウント値よりも小さい場合は、カレントテーブルポインタ61のポインタ位置はそのままでマッチフラグをリセットする。また、ポインタコントローラ64は、不良カラム記憶部50から読み出されたバイト位置がバイトポジションカウンタ63のカウント値よりも大きい場合は、カレントテーブルポインタ61のポインタ位置を1だけインクリメント(次のエントリを指定)してマッチフラグをリセットする。
次に、生成部62の機能を具体的に説明する。図4は、生成部62の機能を具体的に説明するための概念図である。出力FIFO部36は、各8ビットの第1レジスタ37および第2レジスタ38が2段に接続される。ここでは、一例として、第2レジスタ38が格納可能な8ビットのデータのうち最上位の桁のビットに対応する記憶領域は「b0」であり、「b0」を先頭の記憶領域と呼ぶ。また、ここでは、第1レジスタ37が格納可能な8ビットのデータのうち最下位の桁のビットに対応する記憶領域は「a7」であり、「a7」を末端の記憶領域と呼ぶ。ここでは、これから生成する書き込みデータが供給されるセクタに対応する不良ビットベクタが「00101000」、今回のシフト数が「3」である場合を想定する。書き込みデータを構成する8ビットのデータ(c0〜c7)は、当該書き込みデータが供給されるセクタに属する8本のデータ線22の各々に対応する。例えば書き込みデータの第1番目のビットデータc0は第1番目のデータ線22に対応するデータ(第1番目のデータ線22に供給するデータ)である。第2番目のビットデータc1は第2番目のデータ線22に対応するデータである。第3番目のビットデータc2は第3番目のデータ線22に対応するデータである。第4番目のビットデータc3は第4番目のデータ線22に対応するデータである。第5番目のビットデータc4は第5番目のデータ線22に対応するデータである。第6番目のビットデータc5は第6番目のデータ線22に対応するデータである。第7番目のビットデータc6は第7番目のデータ線22に対応するデータである。第8番目のビットデータc7は第8番目のデータ線22に対応するデータである。
前述したように、各セクタに供給される書き込みデータが生成されるとき、先頭の記憶領域(「b0」)よりも今回のシフト数だけ後の記憶領域から順番に、当該記憶領域に格納されたデータが、当該セクタ内の欠陥の無いデータ線22に供給されるデータとして出力される一方、不良ビットを示す「1」のデータが、当該セクタ内の欠陥のあるデータ線22に供給するデータとして出力される。不良ビットベクタが「00101000」の場合、c0に対応する第1番目のデータ線22には欠陥がない。そして、今回のシフト数は「3」であるので、先頭の記憶領域b0よりも3だけ後の記憶領域b3に格納された「3」のデータが第1番目のデータ線22に対応するデータc0として出力される。c1に対応する第2番目のデータ線22にも欠陥がないので、先頭の記憶領域b0よりも4だけ後の記憶領域b4に格納された「4」のデータが第2番目のデータ線22に対応するデータc1として出力される。c2に対応する第3番目のデータ線22には欠陥があるので、不良ビットを示す「1」のデータが、第3番目のデータ線22に対応するデータc2として出力される。c3に対応する第4番目のデータ線22には欠陥がないので、先頭の記憶領域b0よりも5だけ後の記憶領域b5に格納された「5」のデータが第4番目のデータ線22に対応するデータc3として出力される。
c4に対応する第5番目のデータ線22には欠陥があるので、不良ビットを示す「1」のデータが、第5番目のデータ線22に対応するデータc4として出力される。c5に対応する第6番目のデータ線22には欠陥がないので、先頭の記憶領域b0よりも6だけ後の記憶領域b6に格納された「6」のデータが第6番目のデータ線22に対応するデータc5として出力される。c6に対応する第7番目のデータ線22には欠陥がないので、先頭の記憶領域b0よりも7だけ後の記憶領域b7に格納された「7」のデータが第7番目のデータ線22に対応するデータc6として出力される。c7に対応する第8番目のデータ線22には欠陥がないので、先頭の記憶領域b0よりも8だけ後の記憶領域a0に格納された「8」のデータが第8番目のデータ線22に対応するデータc7として出力される。以上のようにして、書き込みデータが生成されてバッファ23へ出力される。
図4の例では、記憶領域b3から記憶領域a0までの各記憶領域に格納されていたデータ(「3」〜「8」)は出力されるので、記憶領域b3から記憶領域a0までの各記憶領域は、データを出力済みの記憶領域(データが格納されていない状態の記憶領域)となる。なお、先頭の記憶領域b0から記憶領域b2までの各記憶領域に格納されていたデータは、前回の書きこみデータの生成時に出力されているので、先頭の記憶領域b0から記憶領域b2までの各記憶領域もデータを出力済みの記憶領域となる。したがって、先頭の記憶領域b0から第9番目の記憶領域a0までの各記憶領域がデータを出力済みの記憶領域となり、データを出力済みの記憶領域の数は「9」となる。データを出力済みの記憶領域の数が「8」以上なので、次の書き込みデータの生成時に1バイト分のデータを出力FIFO部36に入力しても、全ての入力データを出力FIFO部36に格納することができる。したがって、インクリメントイネーブルは「1」に設定され、次の書き込みデータの生成時には1バイト分のデータが出力FIFO部36に入力される。
また、次の書き込みデータの生成時に1バイト分のデータが出力FIFO部36に入力されると、記憶領域a1〜a7に格納されていたデータは、それぞれ8つ分だけ先頭側の記憶領域に移動するので、次の書き込みデータ生成時には、先頭の記憶領域b0よりも1だけ後の記憶領域b1から順番にデータが出力されることになる。つまり、次回のシフト数は「1」に設定される。本実施形態では、シフト数決定部66は、出力部65が書き込みデータを出力するたびに、データを出力済みの記憶領域の数に応じて、次の書き込みデータを生成するときのシフト数を決定する。より具体的には、シフト数決定部66は、データを出力済みの記憶領域の数が8以上の場合は、データを出力済みの記憶領域の数から1バイト分のビット数である「8」を差し引いた値を、次回のシフト数として決定する。一方、データを出力済みの記憶領域の数が8未満の場合は、そのデータを出力済みの記憶領域の数を、次回のシフト数として決定する。上記のように、データを出力済みの記憶領域の数が「9」の場合は、次回のシフト数は「1」に設定される。
次に、図5を参照しながら、これから生成する書き込みデータが供給されるセクタに対応する不良ビットベクタが「11111111」、今回のシフト数が「0」である場合について説明する。この場合、c0に対応する第1番目のデータ線22には欠陥がある。そして、今回のシフト数は「0」であるので、不良ビットを示すデータ「1」が第1番目のデータ線22に対応するデータc0として出力される。c1に対応する第2番目のデータ線22にも欠陥があるので、不良ビットを示すデータ「1」が第2番目のデータ線22に対応するデータc1として出力される。c2に対応する第3番目のデータ線22にも欠陥があるので、不良ビットを示すデータ「1」が第3番目のデータ線22に対応するデータc2として出力される。c3に対応する第4番目のデータ線22にも欠陥があるので、不良ビットを示すデータ「1」が第4番目のデータ線22に対応するデータc3として出力される。c4に対応する第5番目のデータ線22にも欠陥があるので、不良ビットを示すデータ「1」が第5番目のデータ線22に対応するデータc4として出力される。c5に対応する第6番目のデータ線22にも欠陥があるので、不良ビットを示すデータ「1」が第6番目のデータ線22に対応するデータc5として出力される。c6に対応する第7番目のデータ線22にも欠陥があるので、不良ビットを示すデータ「1」が第7番目のデータ線22に対応するデータc6として出力される。c7に対応する第8番目のデータ線22にも欠陥があるので、不良ビットを示すデータ「1」が第8番目のデータ線22に対応するデータc7として出力される。以上のようにして、書き込みデータが生成される。
図5の例では、記憶領域b0から記憶領域a7までの各記憶領域に格納されていたデータはひとつも出力されないので、データを出力済みの記憶領域の数は「0」となる。データを出力済みの記憶領域の数が「8」未満なので、次の書き込みデータの生成時に1バイト分のデータを出力FIFO部36に入力することはできない。したがって、インクリメントイネーブルは「0」に設定される。これにより、次の書き込みデータの生成時には、出力FIFO部36に対する1バイト分のデータの入力は行われない。また、前述したように、データを出力済みの記憶領域の数が8未満の場合(この場合は「0」)は、データを出力済みの記憶領域の数が、次回のシフト数として決定される。この場合は、データを出力済みの記憶領域の数は「0」であるので、次回のシフト数は「0」に決定される。
図6および図7は、生成部62の具体的な構成例を示す図である。図6に示すように、生成部62は、図7に示す回路Gを複数組み合わせることで構成される。生成部62には、出力FIFO部36を構成する記憶領域の各々に格納されたデータ、今回のシフト数を示す信号shift_now、および、不良ビットベクタを示す信号d0〜d7が入力され、書き込みデータc0〜c7、次のシフト数を示す信号shift_next、および、インクリメントイネーブルが生成(出力)される。例えば今回のシフト数が「x」(0≦x≦7)の場合、信号shift_nowxがアクティブレベル(ここでは一例としてハイレベル)に設定される。また、cxに対応する第x番目のデータ線22に欠陥がある場合、信号dxはアクティブレベル(ここでは一例としてハイレベル)に設定される。さらに、次のシフト数が「x」の場合、生成された信号shift_nextxはアクティブレベル(ここでは一例としてハイレベル)に設定される。
図6の左上端に配置された回路Gに着目して、回路Gの構成例を説明する。なお、他の回路Gの構成も同様である。図7に示すように、回路Gは、AND回路101と、AND回路102と、AND回路103と、OR回路111と、OR回路112とを含んで構成される。AND回路101には、信号d0および信号shift_now0(図7のs_wに相当)が入力される。また、AND回路102には、信号shift_now0(図7のs_wに相当)および信号d0を反転した信号が入力される。AND回路102の出力は、下の段の回路GにおけるOR回路111に入力(図7のs_sに相当)されるとともに、AND回路103に入力される。また、AND回路101の出力は、OR回路111に入力されるとともに、OR回路112に入力される。OR回路111の出力(図7のs_eに相当)は、右隣の段の回路GにおけるAND回路101およびAND回路102に入力される(図7のs_wに相当)。AND回路103には、記憶領域b0に格納されたデータが入力され、AND回路103の出力は、OR回路112に入力される。OR回路112の出力(図7のcy_sに相当)は、下の段の回路GにおけるOR回路112に入力(図7のcy_nに相当)される。
いま、図8を参照しながら、図4に示す書き込みデータを生成するときの生成部62の動作例を説明する。この場合、今回のシフト数は「3」なので、信号shift_now3がハイレベルに設定される。また、不良ビットベクタは「00101000」なので、c0に対応する第1番目のデータ線22には欠陥が無い。したがって、信号d0は非アクティブレベルを示す「0」に設定される。信号shift_now3および記憶領域b3に格納されたデータが入力される回路G1に着目すると、信号d0はローレベルに設定されるので、AND回路102の出力がハイレベルに遷移する。ハイレベルに遷移したAND回路102の出力は、AND回路103に入力される。記憶領域b3に格納されたデータが「1」の場合、AND回路103の出力はハイレベルに遷移するので、OR回路112の出力(図7のcy_sに相当)もハイレベルに遷移して下の段の回路G2のOR回路112に入力(図7のcy_nに相当)される。OR回路112の出力がハイレベルに遷移した場合、その出力は、下の段に配置された全ての回路Gを通過する。回路G1および回路G2が属する列(第1列目)の最下段の回路GにおけるOR回路112の出力は、第1番目のデータ線22に対応するデータc0となるので、この場合は、記憶領域b3に格納されたデータが、第1番目のデータ線22に対応するデータc0として出力される。
また、回路G1においてハイレベルに遷移したAND回路102の出力(図7のs_sに相当)は下の段の回路G2のOR回路111に入力(図7のs_nに相当)される。これにより、下の段の回路G2のOR回路111の出力もハイレベルに遷移し、その出力は、右隣の回路G3のAND回路101およびAND回路102に入力される。ここで、c1に対応する第2番目のデータ線22には欠陥が無いので、信号d1は「0」に設定される。したがって、回路G3におけるAND回路102の出力はハイレベルに遷移し、その出力は、AND回路103に入力される。記憶領域b4に格納されたデータが「1」の場合、AND回路103の出力はハイレベルに遷移するので、OR回路112の出力もハイレベルに遷移して下の段の回路G4のOR回路112に入力される。回路G3および回路G4が属する列(第2列目)の最下段の回路GにおけるOR回路112の出力は、第2番目のデータ線22に対応するデータc1となるので、この場合は、記憶領域b4に格納されたデータが、第2番目のデータ線22に対応するデータc1として出力される。
また、回路G3においてハイレベルに遷移したAND回路102の出力は下の段の回路G4のOR回路111に入力(図7のs_nに相当)される。これにより、下の段の回路G4のOR回路111の出力もハイレベルに遷移し、その出力(図7のs_eに相当)は、右隣の回路G5のAND回路101およびAND回路102に入力(図7のs_wに相当)される。ここで、c2に対応する第3番目のデータ線22には欠陥があるので、信号d2は「1」に設定される。したがって、回路G5におけるAND回路101の出力はハイレベルに遷移するので、OR回路112の出力もハイレベルに遷移して下の段の回路G6のOR回路112に入力される。回路G5および回路G6が属する列の最下段の回路GにおけるOR回路112の出力は、第3番目のデータ線22に対応するデータc2となるので、この場合は、不良ビットを示すデータ「1」が、第3番目のデータ線22に対応するデータc2として出力される。
また、回路G5におけるAND回路101の出力がハイレベルに遷移することにより、OR回路111の出力もハイレベルに遷移し、そのハイレベルの信号が、右隣の回路G7のAND回路101およびAND回路102に入力される。ここで、c3に対応する第4番目のデータ線22には欠陥が無いので、信号d3は「0」に設定される。したがって、回路G7におけるAND回路102の出力はハイレベルに遷移し、その出力は、AND回路103に入力される。記憶領域b5に格納されたデータが「1」の場合、AND回路103の出力はハイレベルに遷移するので、OR回路112の出力もハイレベルに遷移して下の段の回路G8のOR回路112に入力される。回路G7および回路G8が属する列の最下段の回路GにおけるOR回路112の出力は、第4番目のデータ線22に対応するデータc3となるので、この場合は、記憶領域b5に格納されたデータが、第4番目のデータ線22に対応するデータc3として出力される。
同様にして、不良ビットを示すデータ「1」が第5番目のデータ線22に対応するデータc4として出力され、記憶領域b6に格納されたデータが第6番目のデータ線22に対応するデータc5として出力され、記憶領域b7に格納されたデータが第7番目のデータ線22に対応するデータc6として出力され、記憶領域a0に格納されたデータが第8番目のデータ線22に対応するデータc7として出力される。以上のようにして、書き込みデータが生成されてバッファ23へ出力される。そして、図8の例では、信号shift_next1が「1」に設定(ハイレベルに設定)され、インクリメントイネーブルが「1」に設定される。
次に、図9を参照しながら、図5に示す書き込みデータを生成するときの生成部62の動作例を説明する。この場合、今回のシフト数は「0」なので、信号shift_now0がハイレベルに設定される。また、不良ビットベクタは「11111111」なので、c0に対応する第1番目のデータ線22には欠陥がある。したがって、信号d0はハイレベルに設定される。信号shift_now0および記憶領域b0に格納されたデータが入力される回路G10に着目すると、信号d0はハイレベルに設定されるので、AND回路101の出力がハイレベルに遷移する。したがって、OR回路112の出力もハイレベルに遷移して下の段の回路G11のOR回路112に入力される。OR回路112の出力がハイレベルに遷移した場合、その出力は、下の段に配置された全ての回路Gを通過する。回路G10および回路G11が属する列の最下段の回路GにおけるOR回路112からの出力は、第1番目のデータ線22に対応するデータc0となるので、この場合は、不良ビットを示すデータ「1」が、第1番目のデータ線22に対応するデータc0として出力される。
また、回路G10におけるAND回路101の出力がハイレベルに遷移することにより、OR回路111の出力もハイレベルに遷移し、そのハイレベル信号が、右隣の回路G12のAND回路101およびAND回路102に入力される。ここで、c1に対応する第2番目のデータ線22には欠陥があるので、信号d1は「1」に設定される。したがって、AND回路101の出力がハイレベルに遷移し、OR回路112の出力もハイレベルに遷移して、そのハイレベル信号が、下の段の回路G13のOR回路112に入力される。回路G12および回路G13が属する列の最下段の回路GにおけるOR回路112からの出力は、第2番目のデータ線22に対応するデータc1となるので、この場合は、不良ビットを示すデータ「1」が、第2番目のデータ線22に対応するデータc1として出力される。また、回路G12におけるAND回路101の出力がハイレベルに遷移することにより、OR回路111の出力もハイレベルに遷移し、そのハイレベル信号が、右隣の回路G14のAND回路101およびAND回路102に入力される。
同様にして、不良ビットを示すデータ「1」が、第3番目〜第8番目のデータ線22の各々に対応するデータ(c2〜c7)として出力される。以上のようにして、不良ビットベクタ「11111111」に対応するセクタに供給される書き込みデータが生成される。そして、図9の例では、信号shift_next0が「1」に設定(ハイレベルに設定)され、インクリメントイネーブルが「0」に設定(ローレベルに設定)される。
(読み出しデータの生成)
次に、読み出しデータを生成するコントローラ10の機能について説明する。コントローラ10は、読み出しデータを生成するデータ生成装置であると捉えることもできる。図10は、コントローラ10の概略構成例を示すブロック図である。図10の例では、読み出しデータの生成に必要な部分を中心に記載しており、例えば書き込みデータの生成に必要な部分等については記載を省略している。図10に示すように、コントローラ10は、全体制御部30と、入出力部32と、リードバッファメモリ134と、入力FIFO部136と、不良カラム情報作成部140と、不良カラム記憶部150と、読み出しデータ生成部160と、コマンド生成部170とを含む。
全体制御部30は、コントローラ10全体を制御する。入力FIFO部136には、メモリセルアレイ20(バッファ23)からバイト単位のデータが順次に入力される。本実施形態の入力FIFO部136は、図10に示すように、8ビットの第3レジスタ137と、8ビットの第4レジスタ138と、8ビットの第5レジスタ139とが直列に接続されて構成される。第3レジスタ137、第4レジスタ138および第5レジスタ139の各々は、1ビットのデータを格納可能な記憶領域を8個ずつ有する。本実施形態では、入力FIFO部136には、8ビット単位でデータが入力される。入力FIFO部136は、8ビットのデータの入力を受け付けた場合、第4レジスタ138に既に格納されていた8ビットのデータを第5レジスタ139に書き込み、第3レジスタ137に既に格納されていた8ビットのデータを第4レジスタ138に書き込み、入力された8ビットのデータを第3レジスタ137に書き込む。すなわち、入力FIFO部136に格納されたデータは、8ビットのデータが入力されるたびに、8ビット単位でシフトする。また、見方を変えれば、入力FIFO部136は、24個の記憶領域が直列に接続されていると捉えることもできる。以下の説明では、一例として、第5レジスタ139が格納可能な8ビットのデータのうち最上位の桁のビットに対応する記憶領域を「先頭の記憶領域」と呼び、第3レジスタ137が格納可能な8ビットのデータのうち最下位の桁のビットに対応する記憶領域を「末端の記憶領域」と呼ぶ。入力FIFO部136は、8ビットのデータの入力を受け付けた場合、記憶領域に既に記憶されているデータを8個だけ先頭側の記憶領域に書き込み、入力された8ビットデータを、末端から数えて8個分の記憶領域の各々に書き込むと捉えることもできる。
不良カラム情報作成部140は、工場出荷前の段階において、各データ線22の欠陥の有無を検出して不良カラム情報(欠陥情報)を作成し、その作成した不良カラム情報を不良カラム記憶部150に書き込む。不良カラム情報の作成方法は任意であり、例えば各データ線22に流れる電流値から当該データ線22が不良であるか否かを判断し、その判断結果を用いて不良カラム情報を作成することもできる。
読み出しデータ生成部160は、入力FIFO部136に格納された24個のデータと、不良カラム記憶部150に記憶された不良カラム情報とを用いて、バイト単位の読み出しデータを順次に生成してリードバッファメモリ134へ出力する。詳細な内容については後述する。リードバッファメモリ134に書き込まれた読み出しデータは、入出力部32を介して不図示のホスト装置へ送られる。コマンド生成部170は、全体制御部30の制御の下、読み出しコマンドを生成してメモリセルアレイ20へ出力する。本実施形態では、コマンド生成部170は、全体制御部30の制御の下、複数のデータ線22の各々から出力されるデータを、バイト単位に分割して(セクタごとに分割して)順次に入力FIFO部136へ入力するようにメモリセルアレイ20を制御する。
図11は、不良カラム記憶部150および読み出しデータ生成部160の詳細な構成例を示す図である。不良カラム記憶部150は、バイト単位の読み出しデータを識別するためのバイト位置と、積算バイトシフトと、次の読み出しデータを生成するときのシフト数を示す積算ビットシフトと、当該バイト位置が示す読み出しデータの生成時にデータの出力がスキップされる記憶領域を特定するための不良ビットベクタとを対応付けて記憶する。例えば、先頭から数えてxバイト目の読み出しデータを識別するためのバイト位置を「x」と表記することができる。この場合、第1番目に生成される読み出しデータ(先頭バイトの読み出しデータ)を識別するためのバイト位置は「1」、2番目に生成される読み出しデータ(2バイト目の読み出しデータ)を識別するためのバイト位置は「2」と表される。積算バイトシフトは、バッファ23から送られたバイト単位のデータ数と、これまでに生成されたバイト単位の読み出しデータ数との差を示す情報であり、ページの途中から読み出しデータを生成する場合に、バイトポジションカウンタ164のカウンタ値を設定(プリセット)するのに用いられる。なお、不良カラム記憶部150は、全ての読み出しデータの各々に対応するデータ(セクタ位置、積算バイトシフト、積算ビットシフト、不良ビットベクタ)を記憶することができる。また、不良カラム記憶部150は、読み出しデータのうち、記憶領域からのデータの出力がスキップされることなく生成される読み出しデータについては、当該読み出しデータに対応するデータ(セクタ位置、積算バイトシフト、積算ビットシフト、不良ビットベクタ)を記憶しないこともできる。この場合、不良カラム記憶部150のデータ領域を圧縮できるという利点がある。
読み出しデータ生成部160は、カレントテーブルポインタ161と、シフト数決定部162と、生成部163と、バイトポジションカウンタ164と、ポインタコントローラ165とを備える。不良カラム記憶部150のデータ領域は、プレーンごとの領域(プレーン領域と呼ぶ)に区分され、各プレーン領域は、所定数のエントリを含んで構成される。また、各プレーン領域は、プレーン情報で識別される。各プレーン領域におけるエントリ位置は、カレントテーブルポインタ161で指定される。つまり、プレーン情報とカレントテーブルポインタ161は、不良カラム記憶部150の特定のエントリを指定するアドレス情報として機能する。読み出しデータが生成されるとき、当該読み出しデータに対応するエントリを指定するアドレス情報が生成される。そして、そのアドレス情報で指定されたエントリに格納された積算ビットシフトはシフト数決定部162へ供給され、不良ビットベクタは生成部163へ供給され、バイト位置はポインタコントローラ165へ供給される。
シフト数決定部162は、不良カラム記憶部150から読み出された積算ビットシフトを用いて今回のシフト数を決定し、その決定したシフト数を生成部163へ出力する。生成部163は、不良カラム記憶部150から読み出された不良ビットベクタと、シフト数決定部162で決定されたシフト数とを用いて、読み出しデータを順次に生成する。本実施形態では、生成部163は、入力FIFO部136を構成する24個の記憶領域の先頭の記憶領域から数えて今回のシフト数だけ後の記憶領域から順番に、欠陥のあるデータ線22から出力されたデータ(つまりは不良ビットを示すデータ)が格納された記憶領域以外の記憶領域に格納されたデータを8つ出力することで、バイト単位(8ビット)の読み出しデータを生成する。また、生成部163は、データの出力がスキップされた記憶領域の数に応じて、読み出しデータの生成を停止する期間(サイクル数)を決定する。本実施形態では、生成部163は、今回のシフト数と、読み出しデータの生成時にデータの出力がスキップされた記憶領域の数との和が1以上かつ8未満の場合は、読み出しデータの生成を1サイクル停止することを示す休止サイクル情報をバイトポジションカウンタ164へ出力する。また、生成部163は、今回のシフト数と、読み出しデータの生成時にデータの出力がスキップされた記憶領域の数との和が8以上の場合は、読み出しデータの生成を2サイクル停止することを示す休止サイクル情報をバイトポジションカウンタ164へ出力する。
バイトポジションカウンタ164は、バイト単位の読み出しデータが生成されるたびに、カウント値を1だけインクリメントする。ポインタコントローラ165は、不良カラム記憶部150から読み出されたバイト位置とバイトポジションカウンタ164のカウント値とが一致した場合は、カレントテーブルポインタ161のポインタ位置はそのままでマッチフラグをセットする。また、ポインタコントローラ165は、不良カラム記憶部150から読み出されたバイト位置がバイトポジションカウンタ164のカウント値よりも大きい場合は、カレントテーブルポインタ161のポインタ位置はそのままでマッチフラグをリセットする。また、ポインタコントローラ165は、不良カラム記憶部150から読み出されたバイト位置がバイトポジションカウンタ164のカウント値よりも小さい場合は、カレントテーブルポインタ161のポインタ位置を1だけインクリメント(次のエントリを指定)してマッチフラグをリセットする。
次に、生成部163の機能を具体的に説明する。図12は、生成部163の機能を具体的に説明するための概念図である。入力FIFO部136は、各8ビットの第3レジスタ137、第4レジスタ138および第5レジスタ139が3段に接続される。ここでは、一例として、第5レジスタ139が格納可能な8ビットのデータのうち最上位の桁のビットに対応する記憶領域は「c0」であり、「c0」を先頭の記憶領域と呼ぶ。また、ここでは、第3レジスタ137が格納可能な8ビットのデータのうち最下位の桁のビットに対応する記憶領域は「a7」であり、「a7」を末端の記憶領域と呼ぶ。ここでは、これから生成する読み出しデータに対応する不良ビットベクタが「0011001010000000」、今回のシフト数が「5」である場合を想定する。読み出しデータを構成する各ビットデータは、d0〜d7で表される。
前述したように、生成部163は、バイト単位の読み出しデータを生成するとき、先頭の記憶領域c0よりも今回のシフト数だけ後の記憶領域から順番に、欠陥のあるデータ線22から出力されたデータが格納された記憶領域以外の記憶領域に格納されたデータを8つ分だけ出力することで、読み出しデータを生成する。今回のシフト数は「5」であるので、生成部163は、先頭の記憶領域c0よりも5だけ後の記憶領域c5から順番に、不良ビットベクタ「0011001010000000」を参照しながら、欠陥のあるデータ線22から出力されたデータが格納された記憶領域以外の記憶領域に格納されたデータを出力する。不良ビットベクタ「0011001010000000」を構成する各ビットデータは、記憶領域c5〜記憶領域a0の各々に対応するとともに、対応する記憶領域に格納されたデータが、欠陥のあるデータ線22から出力されたデータであるか否かを示すように予め設定されている。
不良ビットベクタの第1番目のビットデータは「0」であるので、対応する記憶領域c5に格納されたデータは、欠陥のないデータ線22から出力されたデータである。したがって、記憶領域c5に格納されたデータは、読み出しデータの第1番目のビットデータd0として出力される。不良ビットベクタの第2番目のビットデータは「0」であるので、対応する記憶領域c6に格納されたデータは、読み出しデータの第2番目のビットデータd1として出力される。
不良ビットベクタの第3番目のビットデータは「1」であるので、対応する記憶領域c7に格納されたデータは、欠陥のあるデータ線22から出力されたデータである。したがって、記憶領域c7に格納されたデータは出力されない(データの出力がスキップされる)。不良ビットベクタの第4番目のビットデータは「1」であるので、対応する記憶領域b0に格納されたデータは出力されない(データの出力がスキップされる)。
不良ビットベクタの第5番目のビットデータは「0」であるので、対応する記憶領域b1に格納されたデータは、読み出しデータの第3番目のビットデータd2として出力される。不良ビットベクタの第6番目のビットデータは「0」であるので、対応する記憶領域b2に格納されたデータは、読み出しデータの第4番目のビットデータd3として出力される。不良ビットベクタの第7番目のビットデータは「1」であるので、対応する記憶領域b3に格納されたデータは出力されない。不良ビットベクタの第8番目のビットデータは「0」であるので、対応する記憶領域b4に格納されたデータは、読み出しデータの第5番目のビットデータd4として出力される。不良ビットベクタの第9番目のビットデータは「1」であるので、対応する記憶領域b5に格納されたデータは出力されない。
不良ビットベクタの第10番目のビットデータは「0」であるので、対応する記憶領域b6に格納されたデータは、読み出しデータの第6番目のビットデータd5として出力される。不良ビットベクタの第11番目のビットデータは「0」であるので、対応する記憶領域b7に格納されたデータは、読み出しデータの第7番目のビットデータd6として出力される。不良ビットベクタの第12番目のビットデータは「0」であるので、対応する記憶領域a0に格納されたデータは、読み出しデータの第8番目のビットデータd7として出力される。なお、不良ビットベクタの第13番目以降のビットデータは、読み出しデータの生成に無関係なので、ここでは全て「0」に設定されている。以上のようにして、読み出しデータが生成されてリードバッファメモリ134へ出力される。
本実施形態では、読み出しデータが生成されるとき、今回のシフト数と、当該読み出しデータの生成時にデータの出力がスキップされた記憶領域の数との和が8未満の場合は、その和が次回のシフト数となり、その和が8以上の場合は、その和から8を差し引いた値が次回のシフト数となるように、不良カラム記憶部150の各エントリにおける積算ビットシフトが予め設定されている。例えば、所定のエントリに含まれるバイト位置に対応する読み出しデータが生成されるとき、今回のシフト数が「0」で、当該読み出しデータの生成時にデータの出力がスキップされた記憶領域の数が「3」である場合は、次回のシフト数は「3」となるように、当該エントリに含まれる積算ビットシフトが予め設定されている。図12の例では、今回のシフト数は「5」であり、読み出しデータの生成時にデータの出力がスキップされた記憶領域の数は「4」であるので、当該読み出しデータに対応する積算ビットシフトは、次回のシフト数が(5+4)−8=1となるように予め設定されている。要するに、シフト数は、出力がスキップされる記憶領域の数に応じて可変に設定される。また、図12の例では、今回のシフト数と、読み出しデータの生成時にデータの出力がスキップされた記憶領域の数との和が9(=5+4)となり8を超えるので、生成部163は、読み出しデータの生成を2サイクル停止することを示す休止サイクル情報をバイトポジションカウンタ164へ出力する。
次に、図13を参照しながら、これから生成する読み出しデータに対応する不良ビットベクタが「1111111100000000」、今回のシフト数が「7」である場合について説明する。今回のシフト数は「7」であるので、生成部163は、先頭の記憶領域c0よりも7だけ後の記憶領域c7から順番に、不良ビットベクタ「1111111100000000」を参照しながら、欠陥のあるデータ線22から出力されたデータが格納された記憶領域以外の記憶領域に格納されたデータを8個分だけ出力する。図12の例と同様に、不良ビットベクタ「1111111100000000」を構成する各ビットデータは、記憶領域c7〜記憶領域a6の各々に対応するとともに、対応する記憶領域に格納されたデータが、欠陥のあるデータ線22から出力されたデータであるか否かを示すように予め設定されている。
不良ビットベクタの第1番目のビットデータは「1」であるので、記憶領域c7に格納されたデータは、欠陥のあるデータ線22から出力されたデータである。したがって、記憶領域c7に格納されたデータは出力されない(データの出力がスキップされる)。同様に、不良ビットベクタの第2番目〜第8番目の各々のビットデータは「1」であるので、記憶領域b0〜b6の各々に格納されたデータは出力されない。
不良ビットベクタの第9番目のビットデータは「0」であるので、記憶領域b7に格納されたデータは、欠陥のないデータ線22から出力されたデータである。したがって、記憶領域b7に格納されたデータは、読み出しデータの第1番目のビットデータd0として出力される。同様に、不良ビットベクタの第10番目〜第15番目の各々のビットデータは「0」であるので、記憶領域a0に格納されたデータは読み出しデータの第2番目のビットデータd1として出力され、記憶領域a1に格納されたデータは読み出しデータの第3番目のビットデータd2として出力され、記憶領域a2に格納されたデータは読み出しデータの第4番目のビットデータd3として出力され、記憶領域a3に格納されたデータは読み出しデータの第5番目のビットデータd4として出力され、記憶領域a4に格納されたデータは読み出しデータの第6番目のビットデータd5として出力され、記憶領域a5に格納されたデータは読み出しデータの第7番目のビットデータd6として出力され、記憶領域a6に格納されたデータは読み出しデータの第8番目のビットデータd7として出力される。以上のようにして、読み出しデータが生成されてリードバッファメモリ134へ出力される。
図13の例では、今回のシフト数は「7」であり、読み出しデータの生成時にデータの出力がスキップされた記憶領域の数は「8」であるので、図13の例で生成される読み出しデータに対応する積算ビットシフトは、次回のシフト数が(7+8)−8=7となるように予め設定されている。また、今回のシフト数と、読み出しデータの生成時にデータの出力がスキップされた記憶領域の数との和が8を超えるので、生成部163は、読み出しデータの生成を2サイクル停止することを示す休止サイクル情報をバイトポジションカウンタ164へ出力する。
図14および図15は、生成部163の具体的な構成例を示す図である。図14に示すように、生成部163は、図15に示す回路Hを複数組み合わせることで構成される。生成部62には、入力FIFO部136を構成する記憶領域の各々に格納されたデータ、今回のシフト数を示す信号sft、および、生成する読み出しデータに対応する不良ビットベクタを今回のシフト数だけシフトした信号evectが入力され、読み出しデータd0〜d7が生成(出力)される。例えば今回のシフト数が「x」(0≦x≦7)の場合、信号sftxはハイレベルに設定される。
図14の左上端に配置された回路Hに着目して、回路Hの構成例を説明する。なお、他の回路Hの構成も同様である。図15に示すように、回路Hは、AND回路201と、AND回路202と、AND回路203と、OR回路211と、OR回路212とを含んで構成される。AND回路201には、信号sft0(図15のs_wに相当)、先頭の記憶領域c0に格納されたデータ(図15のabcxに相当)、および、信号evect0(図15のe_sftxに相当)を反転した信号が入力される。AND回路201の出力はOR回路211に入力され、OR回路211の出力(図15のd_sに相当)は、下の段の回路HにおけるOR回路211に入力(図15のd_nに相当)される。
OR回路212には、信号sft0(図15のs_wに相当)が入力され、OR回路212の出力はAND回路202に入力される。AND回路202には、信号evect0(図15のe_sftx)が入力され、AND回路202の出力(図15のs_sに相当)は、下の段の回路HにおけるOR回路212に入力(図15のs_nに相当)される。また、AND回路203には、OR回路212の出力と、信号evect0(図15のe_sftxに相当)を反転した信号とが入力される。AND回路203の出力(図15のs_seに相当)は、下の段の回路Hに入力(図15のs_nwに相当)された後、その右隣の回路Hへ向かって出力(図15のs_e、s_wに相当)される。
図16は、信号evectを生成する第1回路部220の構成例を示す図である。生成部163は、第1回路部220を含んで構成される。図16に示すように、第1回路220は、図17に示す回路Sを複数組み合わせることで構成される。第1回路部220には、不良ビットベクタを示す信号e、および、今回のシフト数に応じて設定される3つの信号sft_enc0〜sft_enc2が入力され、信号evectが生成(出力)される。
図16の左上端に配置された回路Sに着目して、回路Sの構成例を説明する。図17に示すように、回路Sは、AND回路301と、AND回路302と、OR回路311とを含んで構成される。AND回路301には、不良ビットベクタの第1番目のビットデータを示す信号e0(図17のdin_sに相当)、および、信号sft_enc0を反転した信号が入力される。AND回路301の出力はOR回路311に入力され、OR回路311の出力(図17のdout_sに相当)は、右隣の回路SにおけるAND回路310およびAND回路302に入力(図17のdin_sに相当)される。AND回路302には、不良ビットベクタの第1番目のビットデータを示す信号e0(図17のdin_sに相当)、および、信号sft_enc0が入力される。AND回路302の出力(図17のcarry_outに相当)は、当該回路Sから1つだけ下に配置された回路SにおけるOR回路311へ入力(図17のcarry_inに相当)される。なお、本実施形態では、第2列目に属する回路Sにおいては、AND回路302の出力は、当該回路Sから2つだけ下に配置された回路SにおけるOR回路へ入力され、最終の第3列目に属する回路Sにおいては、AND回路302の出力は、当該回路Sから4つだけ下に配置された回路SにおけるOR回路へ入力される。また、上述したように、図16の左上端(第1列目の最上段)の回路Sには、信号sft_enc0が入力されるが、図16に示すように、第2列目の最上段の回路Sには信号sft_enc1が入力され、第3列目の最上段の回路Sには信号sft_enc2が入力される。
図18は、信号sft_enc0〜sft_enc2を生成する第2回路部230の構成例を示す図である。生成部163は、第2回路部230を含んで構成される。図18に示すように、第2回路部230は、OR回路401とOR回路402とOR回路403とを含んで構成される。OR回路401には、シフト数「1」を示す信号sft1、シフト数「3」を示すsft3、シフト数「5」を示すsft5、および、シフト数「7」を示すsft7が入力される。OR回路401の出力が信号sft_enc0となる。OR回路402には、シフト数「2」を示す信号sft2、シフト数「3」を示すsft3、シフト数「6」を示すsft6、および、シフト数「7」を示すsft7が入力される。OR回路402の出力が信号sft_enc1となる。OR回路403には、シフト数「4」を示す信号sft4、シフト数「5」を示すsft5、シフト数「6」を示すsft6、および、シフト数「7」を示すsft7が入力される。OR回路403の出力が信号sft_enc2となる。
いま、図12に示す読み出しデータを生成するときの生成部163の動作例を説明する。この場合、今回のシフト数は「5」なので、信号sft5がハイレベルに設定される。したがって、図19に示すように、OR回路401の出力はハイレベルに遷移し、OR回路402の出力はローレベルに遷移し、OR回路403の出力はハイレベルに遷移する。すなわち、信号sft_enc0はハイレベル、信号sft_enc1はローレベル、信号sft_enc2はハイレベルに遷移する。また、不良ビットベクタは「0011001010000000」なので、第1回路部220で生成される信号evect0〜evect22の状態は図20のようになる。
図21において、シフト数5を示す信号sft5、信号evect5、および、記憶領域c5に格納されたデータが入力される回路H1に着目すると、信号sft5はハイレベル、信号evect5はローレベルなので、記憶領域c5に格納されたデータが「1」の場合は、AND回路201の出力はハイレベルに遷移する。これにより、OR回路211の出力もハイレベルに遷移し、そのハイレベル信号が下の段の回路H2におけるOR回路211に入力される。OR回路211の出力がハイレベルに遷移した場合、その出力は、下の段に配置された全ての回路Hを通過する。回路H1および回路H2が属する列(第1列目)の最下段の回路HにおけるOR回路211の出力は、読み出しデータの第1番目のビットデータd0となるので、この場合は、記憶領域c5に格納されたデータが、第1番目のビットデータd0として出力される。
また、回路H1におけるOR回路212の出力もハイレベルに遷移するので、AND回路203の出力もハイレベルに遷移し、そのハイレベル信号は、下の段の回路H2に入力された後、回路H2の右隣の回路H3に入力(図15のs_wに相当)される。
次に、シフト数6を示す信号sft6、信号evect6、および、記憶領域c6に格納されたデータが入力される回路H2に着目すると、信号sft6および信号evect6はローレベルなので、AND回路201、202および203の出力はローレベルとなる。ローレベルの信号evect6はそのまま右隣の回路H3へ入力(図15のe_sftxに相当)される。記憶領域c6に格納されたデータが「1」の場合、ハイレベルの信号abcxが回路H3へ入力される。さらに、前述したように、回路H1から入力されたハイレベル信号(図15のs_nwに相当)が、そのまま回路H3へ入力(図15のs_eに相当)される。これにより、回路H3におけるAND回路201の出力はハイレベルに遷移するので、回路H3におけるOR回路211の出力もハイレベルに遷移し、そのハイレベル信号が下の段の回路H4におけるOR回路211に入力される。回路H3および回路H4が属する列(第2列目)の最下段の回路HにおけるOR回路211の出力は、読み出しデータの第2番目のビットデータd1となるので、この場合は、記憶領域c6に格納されたデータが、第2番目のビットデータd1として出力される。
また、回路H3において、OR回路212の出力はハイレベルに遷移し、信号evect6はローレベルなので、AND回路203の出力はハイレベルに遷移する。これにより、AND回路203から出力されたハイレベル信号は、下の段の回路H4に入力された後、回路H4の右隣の回路H5に入力(図15のs_wに相当)される。
次に、シフト数7を示す信号sft7、信号evect7、および、記憶領域c7に格納されたデータが入力される回路H6に着目すると、信号sft7はローレベルなのでAND回路201の出力はローレベルとなる。また、信号evect7はハイレベルなので、そのハイレベル信号は、右隣の回路H4へ入力(図15のe_sftxに相当)される。また、記憶領域c7に格納されたデータも右隣の回路H4へ入力(図15のabcxに相当)される。回路H4に入力された信号e_sftxおよび信号abcxは、そのまま右隣の回路H5に入力される。ここで、回路H5に着目すると、回路H4から入力された信号e_sftxはハイレベルなので、AND回路201の出力はローレベルとなる。したがって、OR回路211の出力もローレベルとなる。回路H5が属する列(第3列目)の最下段の回路HにおけるOR回路211の出力は、読み出しデータの第3番目のビットデータd2となるが、この場合、記憶領域c7に格納されたデータ(信号abcx)は、第3番目のビットデータd2として出力されない。
一方、回路H5において、回路H4から入力される信号s_wおよび信号e_sftxはハイレベルなので、OR回路212の出力はハイレベルに遷移し、AND回路202の出力(図15のs_sに相当)もハイレベルに遷移する。AND回路202からのハイレベル信号は下の段の回路H7におけるOR回路212に入力(図15のs_nに相当)される。
次に、シフト数8を示す信号sft8、信号evect8、および、記憶領域b0に格納されたデータが入力される回路H8に着目すると、信号sft8はローレベルなのでAND回路201の出力はローレベルとなる。また、信号evect8はハイレベルなので、そのハイレベル信号は、右隣の回路H9へ入力(図15のe_sftxに相当)される。また、記憶領域b0に格納されたデータも右隣の回路H9へ入力(図15のabcxに相当)される。回路H9に入力された信号e_sftxおよび信号abcxは、そのまま右隣の回路H7に入力される。ここで、回路H7に着目すると、回路H9から入力された信号e_sftxはハイレベルなので、AND回路201の出力はローレベルとなる。したがって、記憶領域b0に格納されたデータ(信号abcx)は、第3番目のビットデータd2として出力されない。
一方、回路H7において、回路H5から入力される信号s_n、および、回路H9から入力される信号e_sftxの各々はハイレベルなので、OR回路212の出力はハイレベルに遷移し、AND回路202の出力(図15のs_sに相当)もハイレベルに遷移する。AND回路202からのハイレベル信号は下の段の回路H10におけるOR回路212に入力(図15のs_nに相当)される。
次に、シフト数9を示す信号sft9、信号evect9、および、記憶領域b1に格納されたデータが入力される回路H11に着目すると、信号sft9はローレベルなのでAND回路201の出力はローレベルとなる。また、信号evect9はローレベルなので、そのローレベル信号は、右隣の回路H12へ入力(図15のe_sftxに相当)される。また、記憶領域b1に格納されたデータも右隣の回路H12へ入力(図15のabcxに相当)される。回路H12に入力された信号e_sftxおよび信号abcxは、そのまま右隣の回路H10に入力される。ここで、回路H10に着目すると、回路H12から入力された信号e_sftxはローレベルなので、記憶領域b1に格納されたデータが「1」の場合は、AND回路201の出力はハイレベルに遷移する。これにより、OR回路211の出力もハイレベルに遷移し、そのハイレベル信号が下の段の回路H2におけるOR回路211に入力される。OR回路211の出力がハイレベルに遷移した場合、その出力は、下の段に配置された全ての回路Hを通過する。回路H10が属する列(第3列目)の最下段の回路HにおけるOR回路211の出力は、読み出しデータの第3番目のビットデータd2となるので、この場合は、記憶領域b1に格納されたデータが、第3番目のビットデータd2として出力される。
また、回路H10において、回路H7から入力される信号s_nはハイレベルなので、OR回路212の出力はハイレベルに遷移する。また、回路H12から入力される信号e_sftxはローレベルなので、AND回路203の出力はハイレベルに遷移する。これにより、AND回路203から出力されたハイレベル信号は、下の段の回路H13に入力された後、回路H13の右隣の回路H14に入力(図15のs_wに相当)される。
以下、同様にして、記憶領域b2に格納されたデータが第4番目のビットデータd3として出力され、記憶領域b4に格納されたデータが第5番目のビットデータd4として出力され、記憶領域b6に格納されたデータが第6番目のビットデータd5として出力され、記憶領域b7に格納されたデータが第7番目のビットデータd6として出力され、記憶領域a0に格納されたデータが第8番目のビットデータd7として出力される。以上のようにして、シフト数「5」、不良ビットベクタ「0011001010000000」を用いて読み出しデータが生成される。
次に、ページの途中から読み出しデータを生成する場合について説明する。いま、4バイト目(バイト位置「3」)から読み出しデータを生成する場合を想定する。図22は、この場合における不良カラム記憶部150のデータ構成例の一部を示す図である。ここでは、読み出しデータのうち、記憶領域からのデータの出力がスキップされることなく生成される読み出しデータ(つまり、対応する不良ビットベクタが「0000000000000000」となる読み出しデータ)に対応するデータ(バイト位置、積算バイトシフト、積算ビットシフト、不良ビットベクタ)は、不良カラム記憶部150に記憶されない。図22の例では、バイト位置「3」が示す読み出しデータ(4バイト目の読み出しデータ)に対応する不良ビットベクタは「0000000000000000」であり、当該読み出しデータに対応するデータは不良カラム記憶部150に記憶されない。
4バイト目から読み出しデータを生成する場合、生成部163は、バイト位置「4」まで検索して行き過ぎたことが分かり、1個戻ってバイト位置「2」の積算バイトシフト=1と、積算ビットシフト=5を採用する。図23を参照しながら説明を続ける。バッファ23から送られたバイト単位のデータ数と、これまでに生成されたバイト単位の読み出しデータ数との差は「1」であり、次のシフト数は「5」であるので、4バイト目の読み出しデータを生成する場合、バッファ23から送られた第4番目のデータの先頭からのシフト数は1バイト+5ビット=13ビットとなる。前述したように、4バイト目の読み出しデータは、記憶領域からのデータの出力がスキップされることなく生成されるので、バッファ23から送られた第4番目のデータの先頭ビットよりも13ビットだけ後のビットから順番に取り出される8ビットのデータにより、4バイト目の読み出しデータが生成される。
以上に説明したように、本実施形態では、不良カラムを置き換えたデータ(書き込みデータまたは読み出しデータ)がバイト単位で順番に(時分割に)生成されるので、不良カラムを置き換えたデータを生成するための共通の回路を繰り返し使用することで、各バイト単位のデータを生成することができる。したがって、不良カラムを置き換えたデータを生成するための回路の規模を小さくできるとともに、置き換えの単位をビット単位とすることで冗長部の利用効率を向上させることができる。つまり、簡易な構成で、不良カラムを置き換えたデータを生成可能なデータ生成装置を提供することができる。
以上、本発明の実施形態を説明したが、この実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。例えば各セクタに属するデータ線22の本数は8本に限らず、任意に変更可能である。