以下、本発明の実施形態について、図面を参照して説明する。
図1は、本発明に係るフラッシュメモリシステム1を概略的に示すブロック図である。図1に示すように、フラッシュメモリシステム1は、フラッシュメモリ2と、それを制御するコントローラ3で構成されている。
なお、フラッシュメモリシステム1は、外部バス13を介してホストシステム4と接続される。ホストシステム4は、ホストシステム4の全体の動作を制御するためのCPU(Central Processing Unit)、フラッシュメモリシステム1との情報の授受を担うコンパニオンチップ等から構成される。ホストシステム4は、例えば、文字、音声、あるいは画像情報等の種々の情報を処理するパーソナルコンピュータやデジタルスチルカメラをはじめとする各種情報処理装置であってもよい。
フラッシュメモリ2は、不揮発性メモリであり、レジスタと、メモリセルアレイとから構成される。フラッシュメモリ2は、レジスタとメモリセルとの間でデータの複写を行って、データの書き込み又は読み出しを行う。
メモリセルアレイは、複数のメモリセル群と、ワード線とを備える。各メモリセル群は、複数のメモリセルが直列に接続されたものである。ワード線は、メモリセル群の特定のメモリセルを選択するためのものである。このワード線を介して選択されたメモリセルとレジスタとの間で、データの複写、即ち、レジスタから選択されたメモリセルへの複写又は選択されたメモリセルからレジスタへのデータの複写が行われる。
メモリセルアレイを構成するメモリセルは、2つのゲートを備えたMOSトランジスタによって構成される。ここで、上側のゲート、下側のゲートは、それぞれ、コントロールゲート、フローティングゲートと呼ばれており、フローティングゲートに電荷(電子)を注入若しくはフローティングゲートから電荷(電子)を排出することによって、データの書き込み若しくはデータの消去が行われる。
このフローティングゲートは、周囲を絶縁体で囲まれているので、注入された電子は長期間にわたって保持される。なお、フローティングゲートに電子を注入するときは、コントロールゲートが高電位側となる高電圧をコントロールゲートとフローティングゲート間に印加する。また、フローティングゲートから電子を排出するときは、コントロールゲートが低電位側となる高電圧をコントロールゲートとフローティングゲート間に印加する。
ここで、フローティングゲートに電子が注入されている状態が書き込み状態であり、論理値「0」に対応する。また、フローティングゲートから電子が排出されている状態が消去状態であり、論理値「1」に対応する。
このようなフラッシュメモリ2のアドレス空間を図2に示す。フラッシュメモリ2のアドレス空間は、“ページ”及び“ブロック(物理ブロック)”で構成されている。
ページは、フラッシュメモリ2にて行われるデータ読み出し動作及びデータ書き込み動作における処理単位である。物理ブロックは、フラッシュメモリ2にて行われるデータ消去動作における処理単位であり、複数個のページで構成されている。
図2に示したフラッシュメモリ2では、1つのページは、1セクタ(512バイト)のユーザ領域25と、16バイトの冗長領域26で構成され、1つの物理ブロックは32個のページで構成されている。なお、1つのページが4セクタのユーザ領域と64バイトの冗長領域で構成され、1つの物理ブロックが64個のページで構成されているフラッシュメモリもある。ユーザ領域25は、ホストシステム4から供給されるユーザデータを記憶するための領域である。
冗長領域26は、ECC(Error Correcting Code)、論理アドレス情報、ブロックステータス(フラグ)等の付加データを記憶するための領域である。
ECCは、ユーザ領域25に記憶されているデータに含まれる誤りを検出し、訂正するためのデータである。
論理アドレス情報は、フラッシュメモリ2の各物理ブロックに含まれている少なくとも1個のページのユーザ領域25に有効なデータが格納されているとき、そのデータに対応する論理ブロックを特定するための情報である。
なお、ユーザ領域25に有効なデータが格納されていない物理ブロックについては、そのブロックの冗長領域26に、論理アドレス情報は格納されていない。
したがって、冗長領域26に論理アドレス情報が格納されているか否かを判定することにより、その冗長領域26が含まれている物理ブロックに有効なデータが格納されているか否かを判定することができる。つまり、冗長領域26に論理アドレス情報が格納されていないとき、その物理ブロックには、有効なデータが格納されていないと判定される。
上述のように、1つの物理ブロックは、複数のページを含んでいる。これらのページには、データの上書きができない。このため、1つのページに格納されたデータのみを書き換えるときであっても、そのページが含まれた物理ブロック内の全ページに格納されたデータを、再度書き込まなければならない。
つまり、通常のデータ書き換えでは、書き換えるページが含まれる物理ブロックの全ページに格納されたデータが、別の消去されている物理ブロックに書き込まれる。この際、データが変更されないページに格納されているデータは、以前に格納されていたデータがそのまま再度書き込まれる。
上記のようにデータを書き換えるにあたっては、通常、書き換えられたデータは、以前に格納されていた物理ブロックとは異なる物理ブロックに書き込まれる。このため、論理ブロックアドレスと物理ブロックアドレスの間の対応関係は、フラッシュメモリ2にてデータが書き換えられる毎に、動的に変化する。
したがって、論理ブロックと物理ブロックとの対応関係を管理する必要があり、通常、この対応関係は、アドレス変換テーブルによって管理される。このアドレス変換テーブルは、相互対応する論理ゾーンと物理ゾーンとの組毎に構成され、論理ゾーンに含まれる論理ブロックと物理ゾーンに含まれる物理ブロックとの対応関係を示している。又、このアドレス変換テーブルは、各物理ブロックの冗長領域26に記憶されている論理アドレス情報(LZIBN又はLBN)に基づいて作成される。
ブロックステータス(フラグ)は、ブロックの良否を示すフラグである。正常にデータの書き込み等を行うことができないブロックは、不良ブロックと判別され、冗長領域26には、不良ブロックであることを示すブロックステータス(フラグ)が書き込まれる。
このようなフラッシュメモリ2は、コントローラ3から、データ、アドレス情報、内部コマンド等を受信して、データの読み出し処理、書き込み処理、ブロック消去処理、転送処理等の各処理を行う。
ここで、内部コマンドとは、コントローラ3がフラッシュメモリ2に処理の実行を指示するためのコマンドであり、フラッシュメモリ2は、コントローラ3から与えられる内部コマンドに従って動作する。これに対して、外部コマンドとは、ホストシステム4がフラッシュメモリシステム1に対して処理の実行を指示するためのコマンドである。
コントローラ3は、図1に示すように、マイクロプロセッサ6と、ホストインターフェースブロック7と、ワークエリア8と、バッファ9と、フラッシュメモリインターフェースブロック10と、ECCブロック11と、ROM(Read Only Memory)12と、から構成される。これら機能ブロックによって構成されるコントローラ3は、一つの半導体チップ上に集積される。以下に各機能ブロックについて説明する。
マイクロプロセッサ6は、ROM12に記憶されているプログラムに従って、コントローラ3の全体の動作を制御する。例えば、マイクロプロセッサ6は、各種処理等を定義したコマンドセットをROM12から読み出してフラッシュメモリインターフェースブロック10に供給し、フラッシュメモリインターフェースブロック10に処理を実行させる。
マイクロプロセッサ6は、たとえば、シフトレジスタとフラグレジスタとを備え、フラグレジスタはシフトレジスタの演算によりキャリーが発生した場合、キャリーフラグを立てる。
ホストインターフェースブロック7は、ホストシステム4との間の、データ、アドレス情報、ステータス情報、外部コマンド等の授受を行なう。ホストシステム4よりフラッシュメモリシステム1に供給されるデータ等は、ホストインターフェースブロック7を入口としてフラッシュメモリシステム1の内部(例えば、バッファ9)に取り込まれる。また、フラッシュメモリシステム1からホストシステム4に供給されるデータ等は、ホストインターフェースブロック7を出口としてホストシステム4に供給される。
ワークエリア8は、フラッシュメモリ2の制御に必要なデータが一時的に格納される作業領域であり、複数のSRAM(Static Random Access Memory)セルによって構成される。
バッファ9は、フラッシュメモリ2から読み出されたデータ及びフラッシュメモリ2に書き込むべきデータを一時的に蓄積する。すなわち、フラッシュメモリ2から読み出されたデータは、ホストシステム4が受け取り可能な状態となるまでバッファ9に保持され、フラッシュメモリ2に書き込むべきデータは、フラッシュメモリ2が書き込み可能な状態となるまでバッファ9に保持される。
フラッシュメモリインターフェースブロック10は、内部バス14を介して、フラッシュメモリ2とデータ、アドレス情報、ステータス情報、内部コマンド等の授受を行う。より詳細には、フラッシュメモリインターフェースブロック10は、アドレス処理部、コマンドレジスタ、命令処理ブロック等から構成される。
フラッシュメモリインターフェースブロック10は、命令処理ブロックによって出力される内部コマンド、アドレス情報等をフラッシュメモリ2に供給することにより、フラッシュメモリ2に読み出し、書き込み等を実行させる。
ECCブロック11は、フラッシュメモリ2に書き込むデータに付加されるECCを生成するとともに、読み出しデータに付加されたECCに基づいて、読み出したデータに含まれる誤りを検出・訂正する。
ROM12は、マイクロプロセッサ6による処理の手順を定義するプログラムを格納する不揮発性の記憶素子である。具体的には、ROM12は、例えば、アドレス変換テーブルの作成等の処理手順を定義するプログラムを格納する。
上述のアドレス変換テーブルの一例を図3に示す。このアドレス変換テーブル100は、論理ゾーンに含まれる論理ブロックと物理ゾーンに含まれる物理ブロックとの対応関係を、
論理ゾーン内ブロック番号LZIBNと物理ゾーン内ブロック番号PZIBNとを用いて示している。ここで、物理ゾーン内ブロック番号PZIBNは、各物理ゾーンに含まれる物理ブロックにつけられた、各物理ゾーン内での通番である。
アドレス変換テーブル100は、起動時に作成する場合や、アドレス変換テーブル100が未作成の論理ゾーンに対してアクセスがあったときに、その論理ゾーンについて作成する場合がある。なお、このアドレス変換テーブル100は、ワークエリア8に作成される。
又、本実施の形態のフラッシュメモリシステム1では、論理ゾーンを1000個の論理ブロックで構成し、物理ゾーンを1024個の物理ブロックで構成するようにしたので、図3に示したアドレス変換テーブル100では、LZIBN#0〜#999の論理ブロックとPZIBN#0〜#1023の物理ブロックの対応関係が示されている。例えば、LZIBN#0の論理ブロックに対応するデータはPZIBN#35の物理ブロックに、LZIBN#1の論理ブロックに対応するデータはPZIBN#10の物理ブロックに、LZIBN#2の論理ブロックに対応するデータはPZIBN#15の物理ブロックに記憶されている。又、LZIBN#13の論理ブロックに対応するデータは記憶されていない。
又、本実施の形態のフラッシュメモリシステム1では、上記アドレス変換テーブル100と共に、図4に示したような空きブロック検索テーブル200が作成される。この空きブロック検索テーブル200は、データの書き込み先となる空きブロックを検索するときに使用される。つまり、データの書き換え等で新規なデータを書き込むときには、この空きブロック検索テーブル200を用いて検出された空きブロックにデータが書き込まれる。
この空きブロック検索テーブル200は、物理ゾーンに含まれる物理ブロックの使用状況を示すテーブルであり、ワークエリア8上に物理ゾーン毎に作成される。物理ゾーンに含まれる1024個の物理ブロックは、それぞれ空きブロック検索テーブル200上の1個のビットに割り当てられ、各ビットの論理値(“0”又は“1”)によって、そのビットに対応する物理ブロックが空きブロックであるか否かを示している。 図4に示した空きブロック検索テーブル200では、物理ブロックが使用されている場合又は不良ブロックである場合を論理値の“0”で示し、物理ブロックが空きブロックである(書き込み可能である)場合を論理値の“1”で示している。又、空きブロック検索テーブル200では、上のビット列(行)から下のビット列(行)へ、各ビット列(各行)の8ビットについては下位側(右側)から上位側(左側)へPZIBNの順番で各物理ブロックが割り当てられている。
次に、アドレス変換テーブル100と空きブロック検索テーブル200との作成処理について説明する。
この作成処理では、マイクロプロセッサ6は、ワークエリア8にアドレス変換テーブル100を作成するための領域と空きブロック検索テーブル200を作成するための領域を確保する。アドレス変換テーブル100を作成するための領域については、LZIBN#0〜#999のそれぞれに対応するPZIBNを書き込むための領域を確保する。空きブロック検索テーブル200を作成するための領域については、PZIBN#0〜#1023の物理ブロックに対応する128バイト(1024ビット)の領域を確保する。更に、この空きブロック検索テーブル200を作成するための領域の全てのビットを論理値“0”に初期設定する。又、空きブロック検索テーブル200を作成するときは、空きブロック検索テーブル200を用いて空きブロックを検索するときに、走査を開始するビットを示す情報を設定しておくポインタ領域も確保し、このポインタ領域をクリア状態(走査を開始するビットを示す情報が設定されていない状態)に初期設定する。
続いて、マイクロプロセッサ6は、PZIBN#0〜#1023の物理ブロックの冗長領域26に書き込まれている論理アドレス情報(LZIBN)とブロックステータスとを順次読み出し、論理アドレス情報(LZIBN)が書き込まれている場合には、アドレス変換テーブル100を作成するための領域の、そのLZIBNに対応する箇所に、そのLZIBNが書き込まれていた物理ブロックのPZIBNを書き込む。一方、論理アドレス情報(LZIBN)が書き込まれていない場合は、ブロックステータスに基づいてその物理ブロックが不良ブロックであるか否かを判別する。その結果、不良ブロックでないと判別した場合は、空きブロック検索テーブル200を作成するための領域の、その物理ブロックのPZIBNに対応するビットの論理値を“1”に変更する。
ここで、空きブロック検索テーブル200の作成処理について、図5に示したフローチャートを参照して、詳細に説明する。このフローチャートでは、他のテーブル(アドレス変換テーブル100等)の作成処理を省略している。
最初に、マイクロプロセッサ6は、この空きブロック検索テーブル200の作成処理で、参照中の物理ブロックのPZIBN#n(#nは#0〜#1023)を設定する領域(以下、この領域を参照物理ブロック設定領域という。)をワークエリア8に確保し、この参照物理ブロック設定領域に“0”を設定(n=0)する(ステップS1)。
続いて、マイクロプロセッサ6は、参照物理ブロック設定領域に設定されているPZIBNの物理ブロック(PZIBN#nの物理ブロック)の冗長領域26の論理アドレス情報が書き込まれる領域を参照し、その領域に論理アドレス情報が記憶されているか否かを判別する(ステップS2)。論理アドレス情報が記憶されている場合は、その物理ブロックが使用されていると判別し、ステップS4に進む(ステップS2;Yes)。論理アドレス情報が記憶されていない場合は、その物理ブロックが使用されていないと判別し、ステップS3に進む(ステップS2;No)。
物理ブロックの冗長領域26に論理アドレス情報が記憶されていない場合(ステップS2;No)、続いて、マイクロプロセッサ6は、その物理ブロックの冗長領域26に記憶されているブロックステータスを参照し、その物理ブロックが不良ブロックであるか否かを判別する(ステップS3)。その物理ブロックが不良ブロックであると判別した場合は、ステップS4に進み(ステップS3;Yes)、その物理ブロックが不良ブロックでないと判別した場合は、ステップS5に進む(ステップS3;No)。
物理ブロックの冗長領域26に論理アドレス情報が記憶されている場合(ステップS2;Yes)又はブロックステータスが不良ブロックであることを示している場合(ステップS3;Yes)、マイクロプロセッサ6は、空きブロック検索テーブル200の、その物理ブロック(参照中の物理ブロック)に対応するビットに“0”を設定する(ステップS4)。ここで、対応するビットは、参照物理ブロック設定領域に設定されているn(10ビットの値)を、ビット列に含まれるビットの数である8で割ったときの商(nの上位7ビットの値に対応する)と余り(nの下位3ビットの値に対応する)に基づいて特定することができる。例えば、商がlで、余りがmの場合は、空きブロック検索テーブル200の上からl+1番目のビット列の下位からm+1ビット目のビットが、参照中の物理ブロックに対応するビットになる。
物理ブロックの冗長領域26に論理アドレス情報が記憶されておらず(ステップS2;No)、ブロックステータスが不良ブロックであることを示していない場合(ステップS3;No)、つまり、その物理ブロック(参照中の物理ブロック)が空きブロックであると判別された場合、マイクロプロセッサ6は、空きブロック検索テーブル200の、その物理ブロック(参照中の物理ブロック)に対応するビットに“1”を設定する(ステップS5)。
尚、ステップS4又はステップS5の処理の後にステップS6に進むが、空きブロック検索テーブル200を作成するための領域を最初に論理値“0”に初期設定しておけば、ステップS4の処理を行わずにステップS6に進むことができる。
ステップS4又はステップS5の処理が終了することにより、参照中の物理ブロックに対応するビットの設定が終了するので、マイクロプロセッサ6は、参照物理ブロック設定領域に設定されているnの値を1増加させ(ステップS6)、ステップS7に進む。
マイクロプロセッサ6は、参照物理ブロック設定領域に設定されているnの値、つまり、ステップS6で1増加させたnの値が、物理ゾーンに含まれる物理ブロックの数を超えているか否かを判別する。つまり、nの値が1023を越えているか否かを判別する(ステップS7)。nの値が1023以下の場合は、ステップS2に進み(ステップS7;Yes)、nの値が1023を越えている場合は空きブロック検索テーブル200の作成処理は終了する(ステップS7;No)。
次に、空きブロック検索テーブル200を用いた空きブロック検索の処理について、図6〜図8のフローチャートを参照して説明する。
空きブロック検索を開始するときは、ワークエリア8に設けられたポインタ領域が参照され、マイクロプロセッサ6は、ポインタ領域に設定されている値に対応する空きブロック検索テーブル200上のビットの次のビットから使用状況(論理値の“0”又な“1”で示された情報)の走査を開始する。ここで、空きブロック検索が2回目以降であれば、ポインタ領域には、前回の空きブロック検索で検出された空きブロックのPZIBNの値が設定されているが、最初の空きブロック検索の場合には、ポインタ領域に値が設定されていない。従って、本発明に係るフラッシュメモリシステムでは、このような場合に、検出した空きブロックに書き込む新データと対応関係にある旧データが記憶されている物理ブロックの次の物理ブロックに対応するビットからの走査を開始するように構成されている。つまり、新データに書き換えられる旧データが格納されている物理ブロックの次の物理ブロックに対応するビットから走査が開始され、検出された空きブロックには書き換え後のデータである新データが書き込まれる。
例えば、LZN#3に含まれるLZIBN#5の論理ブロックに対する書き込み処理が、ホストシステム4から与えられ、このアクセス要求を契機にPZN#3の空きブロック検索テーブル200作成された場合について具体的に説明する。この場合には、LZIBN#5の論理ブロックに対応する物理ブロックのPZIBNを、アドレス変換テーブル100を参照して求める。LZIBN#5の論理ブロックがPZIBN#11の物理ブロックに対応する場合には、PZIBN#12の物理ブロックに対応するビットから走査を開始する。
空きブロック検索テーブル200上の空きブロックに対応するビットを検出する走査は、例えば、8ビットのシフトレジスタ(図示せず)を用いることにより行うことができる。このシフトレジスタを用いた走査では、ポインタ領域に設定されている値に対応するビットの次のビットが含まれるビット列から順番に、ビット列が参照され、その値が0(二進数表記;000 0000)でない場合に、そのビット列の値がシフトレジスタに書き込まれる。尚、走査を開始するビットがビット列の最下位ビットでない場合には、走査を開始するビットより下位側のビットが全て“0”になるようなマスク処理が施される。例えば、走査を開始するビットがビット列の下位から5ビット目のときは、そのビット列の下位から数えて4ビット目から1ビット目までのビットが“0”になるようなマスク処理が施される。つまり、このマスク処理では、走査を開始するビットより下位側のビットが“0”で、それ以外のビットが“1”のマスクデータでAND演算を実行する。
続いて、シフトレジスタに設定されたビット列を下位方向にシフトさせ、何回のシフトでキャリーが立ったかで、下位から何ビット目のビットが空きブロックに対応するビットであるかを判別する。つまり、以上の処理により、空きブロックに対応するビットが、何番目のビット列であるかと、そのビット列の下位から何ビット目のビットであるかが判別される。このようにして空きブロックに対応するビットを判別した後に、このビットに割り当てられている物理ブロックのPZIBNが求められる。ここで、ビット列に含まれるビットの数がkで、a番目のビット列の下位からbビット目のビットが空きブロックに対応するビットである場合、そのビットに対応する物理ブロックのPZIBNはk×(a−1)+(b−1)で求められる。又、このようにして求めたPZIBNの値がポインタ領域に設定される。
まず、マイクロプロセッサ6は、ポインタ領域を参照し(ステップS102)、前回の空きブロック検索で検出された空きブロックのPZIBNの値(以下、ポインタ領域に設定されているPZIBNの値をpbという。)が設定されている場合は、ステップS103に進み(ステップS102;Yes)、PZIBNの値が設定されていない場合は、ステップS108に進む(ステップS102;No)。ここで、ポインタ領域には、pbが設定されているか否かを示すためのビット(フラグビット)が設けられており、このフラグビットの情報に基づいてpbが設定されているか否かが判断される。従って、ポインタ領域に最初にPZIBNの値を書き込むときに、このフラグビットが示す情報が、pbが設定されていることを示す情報に変更される。
ポインタ領域にpbが設定されている場合は(ステップS102;Yes)、マイクロプロセッサ6は、走査を開始する物理ブロックのPZIBNを設定するスタートポインタ領域(以下、スタートポインタ領域に設定されている値をjという。)に、pb+1の値を書き込む(ステップS103)。尚、スタートポインタ領域には、pb+1の下位10ビットだけを設定する。従って、pbが1023(二進数表記;11 1111 1111)の場合、jは0(二進数表記;00 0000 0000)になる。
ポインタ領域にpbが設定されていない場合は(ステップS102;No)、アクセス対象指示領域に設定されているLZIBNの値が参照され(ステップS108)、このLZIBNの値に対応するPZIBNが存在する場合は、ステップS112に進み(ステップS108;Yes)、このLZIBNに対応するPZIBNが存在しない場合は、ステップS109に進む(ステップS108;No)。
アクセス対象指示領域に設定されているLZIBNに対応するPZIBNが存在する場合は(ステップS108;Yes)、スタートポインタ領域にそのPZIBNに1を加算した値を書き込む(ステップS112)。つまり、jの値としてアクセス対象指示領域に設定されているLZIBNに対応するPZIBNに1を加算した値が設定される。尚、上記と同様にアクセス対象指示領域に設定されているLZIBNに対応するPZIBNの値が1023(二進数表記;11 1111 1111)の場合、jは0(二進数表記;00 0000 0000)になる。
アクセス対象指示領域に設定されているLZIBNに対応するPZIBNが存在しない場合は(ステップS108;No)、スタートポインタ領域に0を書き込む(ステップS109)。つまり、jの値として0が設定される。
尚、説明を簡略化するため、アクセス対象指示領域に設定されているLZIBNに対応するPZIBNが存在しない場合は、スタートポインタ領域に0を設定するようにしたが、アクセス対象指示領域に設定されているLZIBNを1ずつ減算していき、減算されたLZIBNに対応するPZIBNがあったときに、そのPZIBNをアクセス対象指示領域に設定するようにしてもよい。例えば、1回減算したLZIBNに対応するPZIBNがなく、2回減算したLZIBNに対応するPZIBNがなく、3回減算したLZIBNに対応するPZIBNがあった場合は、3回減算したLZIBNに対応するPZIBNに1を加算した値をスタートポインタ領域に設定する。又、このように順次LZIBNを1ずつ減算していき、LZIBNが0になっても対応するPZIBNが見つからなかった場合は、スタートポインタ領域に0を設定する。
ステップS103、ステップS109又はステップS112でスタートポインタ領域に空きブロック検索を開始する物理ブロックのPZIBNの値を設定した後にステップS115に進み、検索対象のビット列とそのビット列でマスクされるビット数を指定する情報を設定する。
図4に示した空きブロック検索テーブル200で、各ビット列は8ビットなので、j(10ビットの値)の上位7ビットの値を、ビット列を指定するビット列指定領域に書き込み、j(10ビットの値)の下位3ビットの値を、マスクされるビット数を指定するマスク情報領域に書き込む(ステップS115)。以下の説明では、ビット列指定領域に設定されている値をp、マスク情報領域に書き込まれる値をqとする。ここで、スタートポインタ領域に設定されている値jを各ビット列に含まれるビットの数で割ったときの商がj(10ビットの値)の上位7ビットの値に対応し、余りがj(10ビットの値)の下位3ビットの値に対応する。又、(p+1)番目のビット列の下位から(q+1)ビット目のビットが走査を開始するビットに対応する。
続いて、(p+1)番目のビット列の下位qビットにマスク処理を施し、マスク処理が施されたビット列のデータが0(二進数表記;0000 0000)の場合はステップS121に進み(ステップS120;Yes)、マスク処理が施されたビット列のデータが0(二進数表記;0000 0000)でない場合はステップS124に進む(ステップS120;No)。尚、q=0の場合はマスク処理が施されないため、そのままのビット列のデータが0であるか否かが判別される。
マスク処理が施されたビット列のデータ又はそのままのビット列のデータが0である場合は(ステップS120;Yes)、ビット列指定領域に設定されている値に1を加算し、マスク情報領域に設定されている値を0に変更し、ステップS120に進む(ステップS121)。ここで、ビット列指定領域に設定されている値pは7ビットの値なので、ビット列指定領域に設定されている値が127(二進数表記;111 1111)の場合、加算した値の下位7ビットに対応する0(二進数表記;000 0000)をビット列指定領域に書き込む。尚、ステップS121の後にステップS120に進んだ場合は、q=0なのでマスク処理を行わずに、(p+1)番目(pは新たにビット列指定領域に設定された値)のビット列のデータが0であるか否かを判別する。
マスク処理が施されたビット列のデータ又はそのままのビット列のデータが0でない場合は(ステップS120;No)、そのビット列のデータをシフトレジスタに書き込み、ステップS125に進む(ステップS124)。
シフトレジスタに書き込まれているビット列のデータを、キャリーフラグが立つまで下位(右)方向にシフトさせ、キャリーフラグが立つまでのシフト回数をカウントする(ステップS125)。
続いて、ビット列指定領域に設定されている値p(7ビット)の下位側に、キャリーフラグが立つまでのシフト回数から1を減算した値k(3ビット)を付加した10ビットの値をポインタ領域に書き込む(ステップS128)。ポインタ領域に書き込まれた10ビットの値が検出された空きブロックのPZIBNに対応する。
次に、図9のフローチャートにしたがって、フラッシュメモリ2にデータを書き込む際に行われる処理について説明する。なお、フラッシュメモリ2にデータを書き込む処理自体は、従来と同様なので、特に、空きブロック検索テーブル200の内容を変更する処理について説明する。
マイクロプロセッサ6は、空きブロックを検索し、空きブロックのPZIBNを取得し(ステップS201)、取得したPZIBNに基づいて、この空きブロックのPBAを求める。
続いて、マイクロプロセッサ6は、ステップS201で検出された空きブロックのPBAを含むアドレス情報と、ROM12から読み出したコマンドセット等をフラッシュメモリインターフェースブロック10に供給する。フラッシュメモリインターフェースブロック10は、与えられたアドレス情報とコマンドセット等に従ってステップS201で検出された空きブロックにデータを書き込む処理を実行する(ステップS202)。
空きブロックにデータが書き込まれると、マイクロプロセッサ6は、この空きブロックのPZIBNに対応する空きブロック検索テーブル200のビットを“0”に書き換えて(ステップS203)、処理を終了する。
次に、図10のフローチャートにしたがって、フラッシュメモリ2からデータを消去する際に行われる処理について説明する。なお、フラッシュメモリ2からデータを消去する処理自体は、従来と同様なので、特に、空きブロック検索テーブル200の内容を変更する処理について説明する。
消去処理は、例えば、書き換えデータが空きブロックに書き込まれ、旧データが不要になったときに行われる。このような場合、書き換えデータが空きブロックに書き込まれた後に、旧データが記憶されていた物理ブロックの消去処理が行われ、続いてアドレス変換テーブルのこの書き換え係る箇所のPZIBNが、旧データが記憶されていた物理ブロックのPZIBNから書き換え後の新データが記憶されている物理ブロックのPZIBNに変更される。
旧データが記憶されている物理ブロックのデータを消去する場合は、まず、アドレス変換テーブルに用いて旧データが記憶されている物理ブロックのPBIZNを取得し、更に、取得したPBIZNに基づいて、旧データが記憶されている物理ブロックのPBAを求める(ステップS301)。
続いて、マイクロプロセッサ6は、旧データが記憶されている物理ブロックのPBAと、ROM12から読み出したコマンドセット等をフラッシュメモリインターフェースブロック10に供給する。フラッシュメモリインターフェースブロック10は、与えられたPBAとコマンドセット等に従って旧データが記憶されている物理ブロックの記憶データを消去する(ステップS302)。
ステップS302の消去処理が終了した後に、フラッシュメモリ2から処理ステータスを読み出し、処理ステータス(処理が正常に終了したか否かの情報を含むステータス)に基づいて旧データが記憶されていた物理ブロックが不良ブロックか否かを判断する(ステップS303)。
旧データが記憶されていた物理ブロックが不良ブロックでないと判断した場合は(ステップS303;No)、この物理ブロックに対応する空きブロック検索テーブル200上のビットを“1”に書き換える(ステップS304)。
旧データが記憶されていた物理ブロックが不良ブロックであると判断した場合は(ステップS303;Yes)、空きブロック検索テーブル200の更新は行わず処理を終了する。尚、旧データが記憶されていた物理ブロックの冗長領域26には、不良ブロックであることを示すブロックステータスを書き込む。
以上説明したように、本発明に係るコントローラ3は、前回の検索で検出された空きブロックに関する情報が保持されていない場合に、空きブロックに書き込む新データと対応関係にある旧データ(新データで書き換えられるデータ)が記憶されている物理ブロックの次の物理ブロックから空きブロックの検索を開始する。従って、前回の検索で検出された空きブロックに関する情報が保持されていない場合に、空きブロック検索を開始する物理ブロックが特定の物理ブロックに偏ることを回避することができる。
尚、上記の実施の形態では、前回の検索で検出された空きブロックに関する情報が保持されていない場合にだけ、つまり、起動した後の最初の空きブロック検索の場合だけ、空きブロックに書き込む新データと対応関係にある旧データ(新データで書き換えられるデータ)が記憶されている物理ブロックの次の物理ブロックから空きブロックの検索を開始するようにしたが、毎回、旧データが記憶されている物理ブロックの次の物理ブロックから空きブロックの検索を開始するようにしてもよい。
この発明は、上述の実施形態に限定されず、種々の変形及び応用が可能である。
各物理ゾーンの物理ブロック数は1024個に限られず、自由に設定できる。同様に各論理ゾーンの論理ブロック数は1000個に限られず、自由に設定できる。
本実施形態では、空きブロック検索テーブル200の各ビット列は8ビットであったが、8ビットに限られず、自由に設定してもよい。尚、シフトレジスタのビット長は、ビット列のビット数に合わせて適宜設定しなければならない。
空きブロック検索テーブル200を作成せずに、冗長領域26に記憶されている論理アドレス情報とブロックステータスを直接参照して空きブロック検索を行ってもよい。