図1は、本発明の実施形態であるフラッシュROM制御装置の構成図である。
フラッシュROM制御装置1は、ホストI/F10を介してホストに(パーソナルコンピュータ)2と接続され、ホスト2からの要求に応じてフラッシュROM3に対するデータの読み書きを行う。
フラッシュROM制御装置1は、フラッシュROMI/F11を介して、1つ以上のフラッシュROM3と接続されている。このフラッシュROM制御装置1では、フラッシュROM3との接続ラインにおいて、データバスを共有し、制御信号の全て、もしくは一部を、それぞれのフラッシュROMに別々に接続することによって、複数のフラッシュROMと接続することが可能である。後述(図10参照)の様に、各フラッシュROMはグループ化されている。
フラッシュROM制御装置1は、上記I/Fの他、CPU、ROM、RAM、データ転送バッファ、シーケンサ及びECC付加/訂正の各要素を備えている。
フラッシュROM3は、ブロック消去型のNAND型フラッシュROMで構成され、データの消去をブロック単位で行う。また、バイトもしくはワード単位でアクセスするランダムアクセス方式ではなく、ページ単位でアクセスするシーケンシャルアクセス方式を採用したものである。
フラッシュROM3の読み込み時には、以下の動作を行うものとする。
図2に示すように、最初のコマンド発行時に、リードコマンド(1)を発行し、ページアドレス、カラムアドレスを指定して、リードコマンド(2)を発行する。すると、フラッシュROMはBUSY状態となり、ここで待ち時間が発生する。BUSY状態が解除されると、フラッシュROM内のバッファにページデータが準備されているので、本装置によってこのデータを読み込む。
フラッシュROM3への書き込み時には、以下の動作をするものとする。
図3に示すように、最初のコマンド発行時に、データ入力コマンドを発行し、続いてページアドレス、カラムアドレスを指定する。次に書き込むページデータをフラッシュROMへ転送し、図中のAでプログラムコマンドを発行する。するとフラッシュROMはBUSY状態となり、ここで待ち時間が発生する。フラッシュROM内での書き込み動作が終了すると、BUSY状態が解除され、本装置では図中のBでリードステータスコマンドを発行し、書き込み結果(図中のステータス)を読み込み、エラー判定を行う。
フラッシュROM3は、消去単位であるブロック単位、及びブロック単位よりも小さな単位(管理単位)であるクラスタ単位、及びフラッシュROMへのコマンドごとの読み書きや書き込み単位であるページ単位、及びホストからの要求のある論理アドレス(LBA)の単位であるセクタ単位で、制御と管理が行われる。これらの単位についての関係は以下の通りである。
単一もしくは複数のセクタによりページが構成される。
単一もしくは複数のページによりクラスタが構成される。
単一もしくは複数のクラスタによりブロックが構成される。
単一もしくは複数のブロックによりフラッシュROM3が構成される。
セクタは、512バイトのデータと16バイトの冗長部とで構成される。
セクタは、2つのECC単位と冗長部で構成される。ECC単位とは、256バイトのデータと、そのデータに対してランダムな1ビットのエラー訂正可能な4バイトのECC情報の集合体である。したがって、1セクタ当たり(それぞれのECC単位において)2ビットまでのランダムエラーを訂正できる。冗長部には、クラスタ情報等の管理情報が含まれている。
通常、クラスタ内には複数のセクタが存在するため、複数の管理情報が含まれている。そのため、多重化された管理情報を取得するため、高信頼性のある管理情報を得ることができる。
セクタ内の冗長部に書き込むデータは、前記の通り多重化してあるために、同じデータを何度も書き込むことになる。本装置では、ハードウェアのレジスタに一度設定するだけで、フラッシュROMへの転送時に自動的に付加することによって、ソフトウェアのオーバーヘッドを減少させ、高速化している。
本装置では、フラッシュROMへのデータ転送時にECC情報を付加し、フラッシュROMからのデータ転送時にECC情報を読み込み自動的にエラー訂正を行うことによって高信頼性を確保している。
本装置では、データ読み込み時において、データをホスト側に転送する時、図5に示す処理を行う。同図は、従来のデータ転送のタイムチャートと本装置でのデータ転送のタイムチャートを示している。
すなわち、従来の方式では、512バイトのデータと冗長部を完全に分離して記憶されていたために、512バイトのデータに対するECC情報は、512バイトのデータを読み込んだ後に取得され、その後、ECCによるエラーの判別/訂正が行われ、さらにその後に、ホストへのデータ転送が行われていた。
これに対し、本装置では、256バイトごとにECC情報を書き込んでいるために、Data1と、それに組になって記憶されるECC情報1とを読み込んだ後、そのECCによるエラーの判別/訂正を行い、ホストへのデータ転送を行う。そして、Data1のデータ転送を行っている時に、次のデータであるData2とECC情報2の読み込みを同時に行う。これにより、データの高速な読み込みが可能になる。
本装置では、RAM内に、論理クラスタアドレス(本発明の論理アドレス)からフラッシュROM内の物理クラスタ番号(本発明の物理アドレス)に変換するための論理→物理変換テーブルを備えている。ホスト2からの読み込み要求があった場合に、このテーブルを参照して物理クラスタ番号を獲得する。ホスト2からの書込み要求があった場合には、後述の未使用物理クラスタ番号テーブルを参照して未使用物理クラスタ番号を獲得し、この物理クラスタに対してクラスタデータを書き込む。そして、各テーブルの更新を行う。なお、本装置では、ブロック消去型のフラッシュROMを使用しているが、書き込みを行う前にブロック消去を行うシーケンスは必要ない。上記論理→物理変換テーブルを使用することによって、ホスト2から書き込み対象となるセクタ単位のLBAを含む論理クラスタアドレスに対応する物理クラスタ番号を決定し、この物理クラスタ番号に対する書き込みを行い、同時に論理→物理変換テーブルを更新する。なお、書き込み対象となる物理クラスタ番号は、フラッシュROM内の空きクラスタ領域である。
本装置では、世代番号管理(後述)等を行うための物理→論理変換テーブルを備えている。この物理→論理変換テーブルは、フラッシュROM3の物理アドレス(物理クラスタ番号)を論理クラスタアドレス(論理アドレス)に変換するためのテーブルである。
図6は、上記のテーブルを示している。
図6において、論理→物理変換テーブルT1は、ホスト側で管理される論理クラスタアドレスをフラッシュROM3の物理クラスタ番号に変換し、物理→論理変換テーブルT2は、上記物理クラスタ番号を論理クラスタアドレスに変換する。
本装置では、さらにブロックステータステーブル(BST)T3を備えている。このブロックステータステーブルT3は、ブロック内の有効クラスタ(本発明の有効エリアに相当)の数、不良ブロック状態、消去状態を保持している。
図7は、各テーブルの記憶内容について説明する図であり、説明を分かりやすくするために非常に単純化されたものとしている。
本装置は、ホストからの問い合わせに対してフラッシュROMの物理的な最大容量よりも少ない容量を報告する。図7では、フラッシュROMの最大物理クラスタ番号(番地)が7であるため、これよりも小さい値をホスト側に報告する。図では、ホスト側に対して、最大番地が5であることを知らせる。すなわち、論理→物理変換テーブルT1には0〜5のアドレスが用意され、これにより、ホスト側には0〜5のアドレス空間が準備される。また、物理→論理変換テーブルT2は、フラッシュROMと同じアドレス空間を持つものが用意される。ブロックステータステーブルT3は、フラッシュROMのブロック数分だけ用意される。ブロック数は、ここでは4(0〜3)であり、各ブロックは2つのクラスタで構成されている。
図7において、最初に、ホスト側でアドレス0に「A」を書き込むコマンドを発行すると、論理→物理変換テーブルT1ではフラッシュROMの空きクラスタ番地である0と対応づけ、さらに、世代番号が初期値1であることを記憶する。この結果、論理→物理変換テーブルT1のアドレス0には「0:1」(0はフラッシュROMの物理クラスタ番号0を示し、1は世代番号の初期値を示す)が記憶される。また、同時に、物理→論理変換テーブルT2のアドレス0には論理クラスタアドレス0が記憶される。さらに、フラッシュROMの物理クラスタ番地0には、データAが書き込まれるとともに、冗長部に「0:1」も記憶される。
次に、ホスト側において、ホスト側メモリのアドレス3にデータ「B」が書き込まれて書き込みコマンドが発行されると、フラッシュROMのクラスタ番号1にはデータ「B」が書き込まれるとともに、論理→物理変換テーブルT1の論理クラスタアドレス3には「1:1」(左側の1はフラッシュROMの物理クラスタ番号1を示し、右側の1世代番号の初期値を示す)が記憶される。また、物理→論理変換テーブルT2のアドレス1には論理クラスタアドレスの3が記憶される。また、フラッシュROMの物理クラスタ番号1には、上記データ「B」とともに、冗長部に「3:1」(3は論理クラスタアドレス、1は世代番号の初期値)が書き込まれる。
続いて、ホスト側においてアドレス0のデータを「C」に書き換える書き込みコマンドが発行されると、フラッシュROMの空き物理クラスタ番号2のエリアにデータ「C」が書き込まれる。また、論理→物理変換テーブルT1の論理クラスタアドレス0は、「2:2」(最初の2は物理クラスタ番号、後ろの2は1つ増えた世代番号)に更新される。また、物理→論理変換テーブルT2のアドレス2には論理クラスタアドレスである0が記憶される。さらに、フラッシュROMの物理クラスタ番号2の冗長部には、「0:2」(0は論理クラスタアドレス、2は世代番号)が書き込まれる。
ブロックステータステーブルT3には、0〜3の4ブロック分のステータスが記憶されている。ステータスは、有効クラスタ数(FFh、FEh以外)、不良ブロック状態(そのブロックが不良であるかどうかを示す:FEh)、消去状態(そのブロックが消去されて未使用状態にあるかどうか:FFh)を含んでいる。最初は、ブロックステータステーブルT3の各アドレスにはFFhが記憶され、消去状態(未使用状態)のステータスとなっている。データ「A」がブロック0の物理クラスタ番号0に書き込まれると、アドレス0には「1」(有効クラスタ数が1であることを示す)が記憶される。次に、データ「B」がブロック0の物理クラスタ番号1に書き込まれると、「1」→「2」(有効クラスタ数が1から2に変わったことを示す)となる。さらに、データ「C」がブロック1の物理クラスタ番号2に書き込まれると、「2」→「1」(有効クラスタ数が1になったことを示す)となる。ブロックステータステーブルT3のアドレス1では、データ「C」がブロック1の物理クラスタ番号2に書き込まれると、「1」となり有効クラスタ数が1になったことが記憶される。後述のように、物理クラスタを無効化するための無効化処理が行われる時に、同時に有効クラスタのないブロックも検出されて、そのブロックに対する消去処理が行われるが、この検出のためにブロックステータステーブルT3の有効クラスタ数が参照される。なお、この時にブロックに対する消去処理が行われると、そのブロックに対応するエリアにはFFhが記憶されて消去状態(未使用状態)に設定される。また、書込みエラー発生時等、ブロックが不良になった時には不良ブロックであるステータスFEhが記憶される。
図7に示すように、本装置では、フラッシュROMの物理的な最大容量よりも小さな容量を事前にホスト側に通知しているために、常に書き込み可能な(消去済の)ブロックを確保するようにしている。この空きブロックを論理的な空きブロック数という。
次に、世代番号管理について説明する。
本装置において世代番号管理とは、論理クラスタアドレスに対するデータの更新が行われるたびに、その論理クラスタアドレスに対する物理クラスタ番号の変更回数を世代番号として割り振ることをいう。また、この割り振った世代番号が所定の最大値になった時に当該論理クラスタアドレスに対応する全ての物理クラスタ番号を無効化することをいう。
世代番号は、図7に示すように、論理→物理変換テーブルT1に記憶されるとともに、フラッシュROMの対応物理クラスタ番号エリアにも記憶される。そして、データの書換えを行う時の世代番号が前記最大値になった時に行われる無効化処理では、当該論理クラスタに対応する全ての物理クラスタ(当該論理クラスタアドレスに対応する全ての物理クラスタ番号のクラスタデータ)を無効にし、新たに、世代番号の最小値を割り振る。この処理を世代交代動作と称する。
世代番号の初期値は、各論理クラスタアドレス毎に同一の初期値であってもよいが、この初期値を適当に異ならせておくことによって、各クラスタの世代番号が同時に最大値に達するのを防ぐことができる。これにより、一時的な著しいスループットの低下を防ぐことができて、システムの安定性を確保できる。
図7において、フラッシュROMの冗長部に「×」が記憶されると、その物理クラスタは上記無効化処理によって無効になったことを示す。この無効化された物理クラスタに対しては、当然データが書き込まれることはなく、将来、その無効物理クラスタが含まれるブロック内の全てのクラスタが有効でなくなった時に、そのブロックが消去されて初期状態にされる。
以上の世代番号管理によって、データを書き込む前にブロックを消去する必要がなく、また、消去対象のブロックが分散化されることによって未使用クラスタへの逐次書き込みが可能となって高速化と長寿命化が実現できる。すなわち、従来の方法では、まず、ブロックを消去してからデータの書き込み処理に移るが、本装置ではデータの書き込みの前にブロックを消去しておく必要がないから、ブロック消去の完了を待つことなくホストからの要求を終了できることになり、これによりシステム全体としてのスループットが著しく向上する。また、空き領域の確保は、物理クラスタの無効化と有効クラスタがなくなった時の消去処理によって行われるために、ガーベージコレクション等の従来の空き領域確保のための処理に対し、処理時間が分散化され、且つ短時間で行うことが可能である。
上記図7を参照しての説明では、説明を単純化するために、データを書き込む時の物理クラスタの選択を、クラスタ番号の小さい方から順に選ぶようにしている。そして、選択した物理クラスタが無効の時(×が記憶されている。)に、次の番号のクラスタを選択する。しかし、実際にはこのような方法では、無効化処理を繰り返すことによって選択される物理クラスタが歪なものになってしまう。すなわち、同一論理クラスタアドレスに対応する物理クラスタ番号は同一のブロック内に存在することが望ましいといえるが、書き込みのための空き物理クラスタを単に番号の小さいものから順に選んでいくだけでは、無効化処理を繰り返した時に同一論理クラスタアドレスに対応する物理クラスタが複数のブロック間に股がって歪に存在することになりうる。
そこで、本装置では、図7に示すように、未使用物理クラスタ番号テーブルT4を設けている。このテーブルT4は、未使用物理クラスタのあるブロック番号と、そのブロック番号に対する未使用クラスタ番号を示している。図7に示す例では、ブロック1については物理クラスタ番号3が未使用物理クラスタであることを示し、ブロック2については、物理クラスタ番号4及び5が未使用物理クラスタであることを示している。このテーブルT4は、フラッシュROMに対するデータの書き込み処理及び消去処理が行われた時に更新される。このテーブルT4を使用して、新たにデータを書き込む時の物理クラスタを選択すれば、同一論理クラスタアドレスに対応する物理クラスタ番号をなるべく多く同一ブロックに割り当てることが可能になる。
本装置においては、上述のようにフラッシュROMの管理単位を、消去単位であるブロック単位よりも小さく、且つ、フラッシュROMへの読み込み又は書き込み単位であるページ単位よりも大きいクラスタ単位としている(勿論、ホストからのコマンド発行時の単位であるセクタ単位よりも大きい)。このように、クラスタ単位で管理すると、ブロック単位で管理した時の書換え時のオーバーヘッドが大きくなりすぎるのを防ぐことができ、反対に、ページ単位で管理した時の管理の煩雑さを避けることができる。すなわち、全体のスループットを向上するための丁度よい大きさがクラスタ単位である。
さらに、クラスタは、通常のPCで使用されるFATファイルシステムへの適合性が良くなる。すなわち、FATファイルシステムでは、通常、データ領域はクラスタ単位でアクセスすることが知られているために、データ領域の開始セクタが、本装置のクラスタ境界と一致するようにし、また、本装置のクラスタサイズとファイルシステムにおけるクラスタサイズを一致するようにフォーマットを行えば、FATファイルシステムとフラッシュROMの適合性が極めて良くなり、効率的なアクセスが可能となって高速化が可能となる。
図8は、このように境界位置及びサイズを一致させた状態を示している。すなわち、フラッシュROMにおけるクラスタmから、ファイルシステムにおけるデータクラスタが開始されるようにフォーマットパラメータを調整する。なお、図8においては、図中の管理領域が一般にクラスタサイズ以下のアクセスが発生するために、クラスタ0〜クラスタm−1については、本装置において更に小さいサイズでの管理を行うようにすると、高速化を更に促進できる。
図9は、本装置での書き込み時の高速化が実現される理由を示している。
ブロック管理を行う従来の方式では、図示のようにフラッシュROMから既存のブロックデータを読み込んだ後そのブロックの消去を行い、さらにそのブロックに対して新しいブロックデータの書き込みを行い書き込み完了待ちを行って終了する。
従来のブロック管理を行う方式では、最初にブロック消去を行う必要があるために書き込み時間が長時間になるのを避けることができない。そこで、ブロック消去をしなくてもよいように、論理→物理変換テーブルを使用し、且つクラスタ管理を行う方針が考えられる。このクラスタ管理では、最初にフラッシュROM内の既存のクラスタデータを読み込んで新しいクラスタデータに更新した後書き込み、書き込みの完了を待ってから当該クラスタを無効化するための書き込みを行い、さらにその書き込み完了を待つ。しかしこの方式でも、既存のクラスタを無効化するための書き込み時間が必要である。これに対して、世代管理を行う本装置では、新しいクラスタデータを書き込み、その書き込み完了を待つか、又は必要な場合にフラッシュROM内から既存のクラスタデータを読み込んだ後、新しいクラスタデータを書き込み、その書き込み完了を待つだけでよい。この世代管理を行うことによってデータの書き込みごとに既存クラスタの無効化処理を行う必要がなくなるため、書き込み時間が非常に高速化する。
次に、本装置の実施例について説明する。
図10は第1の実施例の構成図である。この実施例では、フラッシュROM1、及びフラッシュROM2の2つをフラッシュROM制御装置1に接続する。接続は、データバスを共通化し、R/W Strobe信号をそれぞれのフラッシュROMに接続する。また、Chip Enable信号が共通の制御信号として各フラッシュROMに接続されている。ここでは、フラッシュROM1をグループ1、フラッシュROM2をグループ2とする。データの書込み及び読み込みの制御は、上述の様にクラスタ単位で行われる。また、図11に示すように、各クラスタは、各グループの複数のページを一組としている。ページは、フラッシュROM制御装置1からの最小アクセス単位である。図11のように割りつけることにより、物理クラスタ0のアクセス順序は、グループ1のページ0→グループ2のページ0→グループ1のページ1→グループ2のページ1というふうになる。なお、図11において、反転クラスタとは、詳細については後述するように、グループ間のデータ転送を行った時に読出しの際にデータの順番が反転しないようにするための情報(反転クラスタ情報)が付加されたクラスタをいう。これについては後述する。
反転クラスタは、一方の物理クラスタから他方の物理クラスタにデータ転送するときに生じる。図11に示す例では、物理クラスタは4つのページが構成されている。今、物理クラスタ1から物理クラスタ0にデータ転送することを考えると、図11に矢印で示す様に、次の様にページ毎のデータ転送処理が行われる。
「物理クラスタ1:グループ2:ページ2」→「物理クラスタ0:グループ1:ページ0」
「物理クラスタ1:グループ2:ページ3」→「物理クラスタ0:グループ1:ページ1」
「物理クラスタ1:グループ1:ページ2」→「物理クラスタ0:グループ2:ページ0」
「物理クラスタ1:グループ1:ページ3」→「物理クラスタ0:グループ2:ページ1」
となる。何故なら、グループ1、2には同時にそれぞれR/W Strobe信号が出されており、グループ2が転送元のときは、グループ2を転送先とすることは出来ないからであり、その場合には必ずグループ1が転送先となるからである。図に点線で示すような同じグループ内でのデータ転送は出来ないのである。
したがって、以上のデータ転送が行われると、物理クラスタ0は反転クラスタとなる。
したがって、図11において物理クラスタ0が反転クラスタの場合、アクセス順序は、グループ2のページ0→グループ1のページ0→グループ2のページ1→グループ1のページ1となる。この順序でのみ、物理クラスタを正しい順で読み込むことが出来る。
本装置では、読み込み時においては以下の例のように、2つのグループを交互に転送することによって、一方のフラッシュROMの待ち時間の間に他方のフラッシュROMのデータを転送させる制御を行う。
(1)グループ1にリードコマンドを発行する。
(2)グループ2にリードコマンドを発行する。
(3)グループ1のデータをホストに転送する。転送終了後、グループ1に次のリードコマンドを発行する。
(4)グループ2のデータをホストに転送する。転送終了後、グループ2に次のリードコマンドを発行する。
(5)(3)に戻る。
書き込み時においては、以下の例のように2つのグループを交互に転送することによって、一方のフラッシュROMの待ち時間の間に他方のフラッシュROMのデータを転送する制御を行う。
(1)グループ1にデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(2)グループ2にデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(3)グループ1の書き込み完了待ちをし、エラー判定を行う。正常に書き込みが完了すれば、データ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(4)グループ2の書き込み完了待ちをし、エラー判定を行う。正常に書き込みが完了すれば、データ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(5)(3)に戻る。
ガーベージコレクション時のクラスタデータの転送時には、従来の方式では、クラスタデータを一旦RAM等の記憶部に読み込んでから再び書き込む必要があった。本装置では、別々に制御されたR/W Strobe信号を両方のグループに同時に送り、一方をリード、他方をライトで動作させることによって、1回の動作で読み込みと書き込みを同時に行うことができる。この機能をデータコピー機能という。
例えば、図11に示す例では、物理クラスタ1のグループ2のページを転送するときは、グループ2がリード、グループ1がライトモードとなる。また、物理クラスタ1のグループ1のページを転送するときは、グループ2がリード、グループ1がライトモードとなる。
これにより、グループ間のデータ転送を高速化することが可能である。ただし、先に述べたように、データの転送に際してはクラスタデータが反転クラスタかどうかによって読出しの順番を変えることが必要になる。すなわち、グループ間のデータ転送時においては、グループ1→グループ2、もしくはグループ2→グループ1の転送を行うので、コピーしたクラスタデータは、コピー元のクラスタデータに対してページごとに順番が反転してしまう。そこで、転送時には、反転クラスタであることを示すクラスタ情報を記録し、読出しの際にはグループの選択時に他方のグループを選択するようにする。
なお、グループ1とグループ2の両方のブロックを消去する際においては、ほぼ同時にコマンドを発行できるために、1回の消去コマンドの実行時間で2つのブロックを同時に消去することが可能である。
次に、フラッシュROM制御装置1の具体的な動作について図12以下を参照して説明する。
図12は、ホストからリードコマンドが発行された時の動作を示している。ステップ100→・・・→ステップ107と進み、ステップ107において、コマンド発行に該当するグループを選択し、フラッシュROMへ該当ページ番号を伴ったリードコマンドを発行する。このとき、論理→物理変換テーブルのリード対象とする論理アドレス冗長部に、反転クラスタ情報が記憶されているかどうかで、選択するグループを変えることになる。また、ステップ108においてデータ転送を行うためにデータ転送セクタ数を保存しておく。
ステップ108において、データ転送に該当するグループを選択し、装置内のシーケンサを起動してフラッシュROMからのデータをホストI/Fを介してホストに転送する。ただし、このデータ転送に該当するグループは、前記のコマンド発行に該当するグループとは異なるもう一方のグループである。なお、フラッシュROMへのコマンドが発行されてないグループであればデータ転送は行わない。フラッシュROMへのコマンドが発行されているかどうかは、ステップ107で保存したデータ転送セクタ数を参照して判断する。
ステップ112では、ページ番号のインクリメント、及びグループ番号の切り換えを次のように行う。
グループ番号が1であれば2に変える。
グループ番号が2であれば1に変える。
ステップ113では、クラスタ内の転送が一度終了したので、次の転送からはクラスタの先頭からの転送であると判断し、クラスタ内オフセットページ数、クラスタ内オフセットセクタ数、ページ内オフセットセクタ数を0にしておく。
ステップ107〜112にて、グループ毎に処理を行うことにより、一方のフラッシュROMがBusy状態であっても、他方のフラッシュROMを制御できるため、高速に読み込むことができる。
図13はホストからライトコマンドが発行された時の動作を示す。
ステップ202において、ステップ200で算出したクラスタ内オフセットページ数、クラスタ内オフセットセクタ数、ページ内オフセットセクタ数、総転送セクタ数から、これから書き込もうとするデータが該当するクラスタ全体を書き換えるかどうかを判断する。
ステップ204〜209は、クラスタ内の一部を書き換える際に本装置内のRAMにデータを退避する手順、もしくはダミーデータを作成する手順と、RAM内で更新したデータを再びフラッシュROM内に書き込む手順を示している。なお、ステップ205でソースクラスタのクラスタデータをRAMへ保存する時に、読み込み完了待ちの時に別のページのフラッシュROMに対して書き込みコマンドを発行しておき、RAM上で更新されたデータをそのコマンド発行したページのフラッシュROMに書き込むことにより、高速の書き込みが可能となる。
ステップ213ではソースブロックの有効クラスタ数が1かどうかを判定し、有効クラスタ数が1であれば当該ソースブロックに対するブロック消去処理を行い、ブロックステータステーブル及び物理→論理変換テーブルの更新を行う。また、ソースブロックの有効クラスタ数が1以外であれば、ステップ215においてブロックステータステーブル及び物理→論理変換テーブルの更新を行う。
図14は、図13のステップ211の動作を示すフローチャートである。ホストI/FからフラッシュROMへのクラスタデータの書き込みを行う時は、図13のステップ202に示すように、書き込むデータがクラスタ全体を書き換えるデータの場合である。
ステップ302において、これから書き込もうとするクラスタに割り当てられているクラスタの世代番号に1を加算した値を書き込みクラスタに割り当てる。しかし、その前にステップ300において、世代番号が最大値に達しているかどうかを判断し、最大値に達する場合にはステップ301において世代交代処理を行う。
世代交代処理とは、これから書き込もうとする論理クラスタアドレスに割り当てられている物理クラスタを全て消去もしくは廃棄する処理である。この処理を行うことによって、これから書き込もうとするクラスタには、世代番号の初期値が割り当てられることになる。
ステップ306においては、これから書き込もうとするグループに対してReady状態になっていることを確認する。Ready状態になっていなければReady状態になるまで待機する。
ステップ307においては、これから書き込もうとするグループに対してデータ入力コマンドを送出し、シーケンサによりホストI/FからフラッシュROMへデータを転送する。転送し終われば、フラッシュROMへプログラムコマンドを発行する。ステップ309では、ステップ306で選択されているグループを切り換える。この実施例では、フラッシュROMが2つであるために、グループ番号2であればステップ307で発行するデータ入力コマンドに伴って発行されるページアドレスをインクリメントする。
ステップ306〜309での一連の処理にてグループごとに処理を行うことにより、一方のフラッシュROMがBusy状態の時でも、他方のフラッシュROMを制御することができる。このため書き込みを高速化することができる。
図15は、RAMからフラッシュROMへのクラスタデータの書き込み手順を示すフローチャートである。この動作は、図13のステップ209で行われ、書き込むデータがクラスタの一部に書き換える場合に選択される。
ステップ402において、これから書き込もうとするクラスタに割り当てられているクラスタの世代番号に1を加算した値を書き込みクラスタに割り当てる。しかし、その前にステップ400において、最大値に達するかどうかを判断し、最大値に達する場合にはステップ401において世代交代処理を行う。
世代交代処理については前述した通りである。
ステップ406では、これから書き込もうとするグループに対してReady状態になっていることを確認する。Ready状態になっていなければReady状態になるまで待機する。
ステップ407では、これから書き込もうとするグループに対して、データ入力コマンドを送出し、シーケンサによりRAMからフラッシュROMへデータを転送する。転送し終わればフラッシュROMへプログラムコマンドを発行する。
ステップ409では、ステップ406で選択されているグループを切り換える。この実施例では、フラッシュROMが2つであるためにグループ番号2であれば、ステップ407で発行するデータ入力コマンドに伴って発行されるページアドレスをインクリメントする。
ステップ406〜409での一連の処理にて、グループごとに処理を行うことにより、一方のフラッシュROMがBusy状態の時でも、他方のフラッシュROMを制御することができる。このため、書き込みの高速化を図ることができる。
図16は、ソースクラスタのデータをRAMに保存する手順を示すフローチャートである。この動作は、図13のステップ205で実行される。
ソースクラスタのデータ(クラスタデータ)を一旦RAMに保存するのは、RAMに保存した後クラスタデータを更新して再びフラッシュROMへ書き込むためである。
ステップ502において、算出されたページアドレスを伴うリードコマンドを、ステップ503にて発行しておく。
ステップ505にてデータ転送中であればデータ転送完了を待つ。この時に、データ転送エラーもしくはデータエラー(ECCにより誤り訂正不可能なエラー)が発生した場合は、ステップ592へ移行しエラー終了する。
ステップ505にて、まずグループaを選択しシーケンサを起動してデータ転送を行う。
グループaのフラッシュROMは、ステップ503もしくは前回のステップ505にて既にリードコマンドが発行されているために、シーケンサがReady状態になるのを待った後データ転送を行う。
次にステップ506にて、グループbを選択し、シーケンサを起動してデータ転送を行う。
グループbのフラッシュROMは、ステップ503もしくは前回のステップ506において既にリードコマンドが発行されているために、シーケンサがReady状態になるのを待った後データ転送を行う。
ステップ503〜508の一連の処理にて、グループごとに処理を行うことによって、一方のフラッシュROMがBusy状態の時でも、他方のフラッシュROMを制御することができる。これによって高速処理が可能になる。
図17は、書き込みエラー処理を示すフローチャートである。この書き込みエラー処理は、図13のステップ219で行われる処理である。
ステップ602〜604において、未使用クラスタ番号を取得するが、この未使用クラスタ番号を取得するのは図7に示す未使用物理クラスタ番号テーブルT4からである。ステップ602の未使用クラスタ番号リストは、このテーブルT4を示している。
もし、未使用クラスタ番号が見つからない場合には、本装置を読み込み専用モードに切り換え、これ以上書き込みが出来ないようにするとともに、読み込みを許可するモードとする。また、ホストからの書き込み要求の処理中であれば、ホストに対しては書き込みエラーを報告する。
ステップ607においては、本装置のフラッシュROM間のコピー機能を使用し、書き込みエラーの発生したブロック内の有効クラスタの内容を正常な未使用ブロックにコピーする。既に述べたように、このコピーはフラッシュROM間で直接行われるために非常に高速である。
図18は、新しい書き込みクラスタ番号を取得する動作を示すフローチャートである。この動作は、図13のステップ216で実行される。
ステップ700において、まず、未使用物理クラスタ番号テーブルT4(未使用クラスタ番号リスト)から、新しい書き込みクラスタ番号を取得するように試みる。こうすることにより、その都度、ブロックステータステーブルT3を検索しなくても良くなるために処理の高速化が図れる。
ステップ700〜701において、未使用クラスタ番号が取得できなければ、ブロックステータステーブルT3において消去済みブロックを検索する。
ステップ702〜703において、消去済みブロックが検索できない、もしくは規定未満の消去済みブロックしかなければ、後述のガーベージコレクション処理を行う。
ステップ706において、これまでの処理で未使用クラスタが見つからなければ、本装置を読み込み専用モードに切り換え、これ以上書き込みができないようにするとともに、読み込みを許可する。この場合、ホストからの書き込み要求の処理中であれば、ホストに対しては書き込みエラーを報告する。
図19は世代交代処理を示す。
世代交代処理は物理→論理テーブルT2を利用する。すなわち、ステップ900において、ブロックステータステーブルT3より、ブロック内の有効クラスタ数もしくはブロックステータスを取得する。なお、ブロックステータステーブルT3には、通常ブロックの場合有効クラスタ数が格納され、特殊ブロック(未使用ブロック、不良ブロック等)の場合、ブロックステータスが格納されている。 次に、ステップ901において、特殊ブロックかどうかを判定し、特殊ブロックの場合はステップ901→907に進んで、次のブロックに対する処理を行う。
ステップ901において、通常ブロックと判定したときは、ステップ902においてブロック内に有効クラスタがあるかどうかを判定する。有効クラスタがあれば、ステップ904において、該当ブロックについて、物理→論理変換テーブルT2により、指定された論理クラスタアドレスに割り当てられている物理クラスタ番号を検索する。そして、割り当てられている物理クラスタ番号が見つかれば、ブロック内のその物理クラスタ番号を記憶しておく。
ステップ902においてブロック内に有効クラスタがなければ、ステップ903においてブロック消去を行う。
ステップ904の処理の後にステップ905に進み、該当物理クラスタが1つ以上見つかったどうかを判定する。1つ以上見つかった場合は、ステップ906において、ステップ904で記憶しておいた物理クラスタに対し無効であることを示すマークを記憶する。ステップ905において該当物理クラスタが見つからなかった場合は、ステップ907に進む。
以上のステップ900以下をすべてのブロックに対して行う(ステップ907)。
以上の世代交代処理を行うと、指定された論理クラスタアドレスに割り当てられたクラスタが存在しなくなるために、この処理の後に、世代番号の初期値を割り当ててクラスタへの書き込みを行うことができる。
本装置では、通常の状態では上記のような無効化処理を行って未使用ブロック(有効ブロック)を確保していくが、未使用ブロックが少なくなってくると、無効化処理では対応できなくなる可能性がある。そこで、ブロックの消去処理をしても有効ブロック数が一定以上にならないときには、ガーベージコレクションを行って新しい未使用クラスタを確保する。ガーベージコレクションは,ブロックステータステーブルT3を参照して行い、最も有効クラスタ数の少ないブロックを対象にする。こうすることによって、クラスタデータの転送回数を少なくでき、それにより高速化が期待できる。
ガーベージコレクションはこのようにして検索された有効クラスタ数の少ないブロックを対象とし、これにより、有効クラスタの内容を未使用クラスタへコピーする時間を短縮するとともに、その後の未使用クラスタも最大限に確保できるようにする。
図21は、ガーベージコレクションの対象を有効クラスタ数の少ないブロックとした場合の利点について説明する図である。同図に示すように、ブロック内の有効クラスタ数が少ない場合には、このブロックをガーベージコレクションの処理対象とすることによって、未使用クラスタに対して有効クラスタをコピーする場合のコピー回数が少なくなり、且つ確保できる未使用クラスタ数が多くなる。これに対して、ガーベージコレクションの処理対象を有効クラスタ数の多いブロックとした場合、または何も考慮することなくガーベージコレクションを行う場合には、コピーする有効クラスタ数が多くなり、且つ確保できる未使用クラスタ数が少なくなる。
したがって、ガーベージコレクションの処理対象を有効クラスタ数の少ないブロックとすることにより、コピー時間を短縮することができるとともに未使用クラスタ数も最大限に確保できる。したがって、ガーベージコレクション処理の発生頻度も抑えることができる。
図20は、ガーベージコレクションの動作を示すフローチャートである。
ステップ801においては、論理→物理変換テーブルT1及び物理→論理変換テーブルT2によりソースブロック内の有効クラスタのクラスタ情報を取得する。
ステップ802において、未使用物理クラスタ番号テーブルT4(未使用クラスタ番号リスト)から新しい書き込みクラスタ番号を取得する。ここで、未使用クラスタ番号が取得されなけばエラー終了する。
ステップ805では、本装置のフラッシュROM間コピー機能を使用して高速にコピーする。すなわちシーケンサを起動して、グループ1のフラッシュROMに対してはリードモードに設定し、グループ2のフラッシュROMにはライトモードに設定し、それぞれにR/W Strobe信号を出すことによってグループ1 のフラッシュROMのページデータをグループ2のフラッシュROMに直接転送する。
ステップ803〜812において、クラスタの片方のグループのページのみコピーし、ステップ813〜814において判断し、グループを切り換えてステップ803に戻り、もう一方のグループのページをコピーする。このように、片方のグループごとにコピーすることにより、クラスタの内容はページごとに反転するが、本装置のフラッシュROM間のデータコピー機能を利用することができる。図22はこの様子を示している。
図23は、本発明の第2の実施例の構成図を示している。
図10に示す第1の実施例と相違する点は、フラッシュROM制御装置1に対してフラッシュROMを4つ接続し、フラッシュROM1、2でグループ1を構成し、フラッシュROM3、4でグループ2を構成している点である。グループ内の2つのフラッシュROMを選択するために、2つのChip Enable信号をグループ内のそれぞれのフラッシュROMに接続する。これにより、別々の制御が可能になる。図24は、ページの割りつけ方法を示している。物理クラスタ0のアクセス順序は、同図に示してある通りである。物理クラスタ1、物理クラスタ2についても同様である。
読み込み時においては、次のように4つのフラッシュROMを順番に転送することによって一方のフラッシュROMの待ち時間の間に他方のフラッシュROMのデータを転送することとなり、高速化することができる。
(1)フラッシュROM1にリードコマンドを発行する。
(2)フラッシュROM2にリードコマンドを発行する。
(3)フラッシュROM3にリードコマンドを発行する。
(4)フラッシュROM4にリードコマンドを発行する。
(5)フラッシュROM1のデータをホストに転送する。転送終了後、フラッシュROM1に次のリードコマンドを発行する。
(6)フラッシュROM2のデータをホストに転送する。転送終了後、フラッシュROM2に次のリードコマンドを発行する。
(7)フラッシュROM3のデータをホストに転送する。転送終了後、フラッシュROM3に次のリードコマンドを発行する。
(8)フラッシュROM4のデータをホストに転送する。転送終了後、フラッシュROM4に次のリードコマンドを発行する。
(9)(5)に戻る。
書き込み時には、次のように4つのフラッシュROMを順番に転送することにより、フラッシュROMの待ち時間の間に他のデータを転送することになり、高速化することができる。
(1)フラッシュROM1にデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(2)フラッシュROM2にデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(3)フラッシュROM3にデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(4)フラッシュROM4にデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(5)フラッシュROM1の書き込み完了待ちをし、エラー判定を行う。正常に書き込みが完了すればデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(6)フラッシュROM2の書き込み完了待ちをし、エラー判定を行う。正常に書き込みが完了すればデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(7)フラッシュROM3の書き込み完了待ちをし、エラー判定を行う。正常に書き込みが完了すればデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(8)フラッシュROM4の書き込み完了待ちをし、エラー判定を行う。正常に書き込みが完了すればデータ入力コマンドを発行し、書き込みデータを転送し、書き込みコマンドを発行する。
(9)(5)に戻る。
ガーベージコレクション時のクラスタデータの転送時には、従来は、クラスタデータを一旦RAM等の記憶部に読み込んでから書き込む必要があった。本装置では、別々に制御されたR/W Strobe信号を両方のグループに同時に出すことによって、1回の動作で読み込みと書き込みを同時に行うことができる。これにより、グループ間のデータ転送を高速に行うことができる。ブロックを消去する際にも、ほぼ同時にコマンドを発行するために、1回の実行時間で4つのブロックを消去できる。
本装置では、ECC単位内に含まれるECC情報は、ランダムな2ビットのエラー検出、1ビットのエラー訂正可能な3バイトのECC情報である。したがって、1セクタ当たり(それぞれのECC単位において)4ビットまでのエラー検出、2ビットまでのランダムエラーを訂正できる。この他にも、Read−Solomon符号等のより多くのビットのエラー検出/訂正ができるECCを使用すれば、より高信頼性を確保できる。。