(57)【要約】【課題】コードレートを効率的に制御すること。【解決手段】一つの実施形態によれば、メモリシステムは、記憶領域を備えリード電圧が設定可能なメモリと、コントローラとを備える。記憶領域は、複数のメモリセルを備える。メモリは、複数のメモリセルのそれぞれのしきい値電圧とリード電圧との比較に基づいて記憶領域内のデータをリードして出力する。コントローラは、コードレートが可変の方式において第１コードレートで第１データを符号化し、第２データを記憶領域に書き込ませる。第２データは符号化された第１データである。コントローラは、複数回の第１リードを実行する。各第１リードはリード電圧の設定値を変更して記憶領域に対してリードする処理である。そして、コントローラは、複数回の第１リードの結果に応じてコードレートを第１コードレートよりも小さい第２コードレートに変更する。【選択図】図９
2018045744.tif 000002
【特許請求の範囲】
【請求項１】
複数のメモリセルを備える記憶領域を備え、リード電圧が設定可能なメモリと、前記メモリは、前記複数のメモリセルのそれぞれのしきい値電圧と前記リード電圧との比較に基づいて前記記憶領域内のデータをリードして出力する、
コントローラと、
を備え、
前記コントローラは、
コードレートが可変の方式において第１コードレートで第１データを符号化し、
第２データを前記記憶領域に書き込ませ、前記第２データは符号化された前記第１データであり、
複数回の第１リードを実行し、各第１リードは前記リード電圧の設定値を変更して前記記憶領域に対してリードする処理であり、
前記複数回の第１リードの結果に応じて、前記記憶領域のコードレートを前記第１コードレートから第２コードレートに変更する、前記第２コードレートは前記第１コードレートよりも小さい、
メモリシステム。
【請求項２】
前記コントローラは、
複数の第３データそれぞれに含まれるエラービットの数を第３データ毎に取得し、前記複数の第３データのそれぞれは、対応する第１リードによって前記記憶領域から出力された前記第２データであり、
前記複数の第３データそれぞれに含まれるエラービットの数のうちの最小値を選択し、
前記コードレートを変更するか否かを前記最小値に基づいて判定する、
請求項１に記載のメモリシステム。
【請求項３】
前記コントローラは、
前記最小値と判定しきい値とを比較し、
前記最小値が前記判定しきい値より大きい場合、前記コードレートを変更すると判定し、
前記最小値が前記判定しきい値より小さい場合、前記コードレートを変更しないと判定する、
請求項２に記載のメモリシステム。
【請求項４】
前記コントローラは、
複数の第３データ、それぞれの第３データは対応する第１リードによって前記記憶領域から出力された前記第２データである、に基づいて第１電圧値を推定し、前記第１電圧値は前記リード電圧に対する前記メモリセルの分布が極小となり得る前記リード電圧の電圧値であり、
第２リードを実行し、前記第２リードは第２電圧値を前記リード電圧に設定して前記記憶領域に対してリードする処理であり、前記第２電圧値は前記推定された第１電圧値であり、
第４データに含まれるエラービットの数を取得し、前記第４データは前記第２リードによって前記記憶領域から出力された前記第２データであり、
前記コードレートを変更するか否かを前記エラービットの前記数に基づいて判定する、
請求項１に記載のメモリシステム。
【請求項５】
前記コントローラは、
前記エラービットの前記数と判定しきい値とを比較し、
前記エラービットの前記数が前記判定しきい値より大きい場合、前記コードレートを変更すると判定し、
前記エラービットの前記数が前記判定しきい値より小さい場合、前記コードレートを変更しないと判定する、
請求項４に記載のメモリシステム。
【請求項６】
前記コントローラは、
複数の第３データ、それぞれの第３データは対応する第１リードによって前記記憶領域から出力された前記第２データである、に基づいて第１電圧値を推定し、前記第１電圧値は前記リード電圧に対する前記メモリセルの分布が極小となり得る前記リード電圧の電圧値であり、
第２電圧値を含む範囲にしきい値電圧が含まれるメモリセルの数をカウントし、前記第２電圧値は前記推定された第１電圧値であり、
前記コードレートを変更するか否かを前記メモリセルの前記数に基づいて判定する、
請求項１に記載のメモリシステム。
【請求項７】
前記コントローラは、
第２リードを実行し、前記第２リードは第３電圧値を前記リード電圧に設定して前記記憶領域に対してリードする処理であり、前記第３電圧値は前記範囲の上限値であり、
第３リードを実行し、前記第３リードは第４電圧値を前記リード電圧に設定して前記記憶領域に対してリードする処理であり、前記第４電圧値は前記範囲の下限値であり、
第４データと第５データとの比較に基づいて前記メモリセルの前記数をカウントする、前記第４データは前記第２リードによって前記記憶領域から出力された前記第２データであり、前記第５データは前記第３リードによって前記記憶領域から出力された前記第２データである、
請求項６に記載のメモリシステム。
【請求項８】
前記コントローラは、
前記メモリセルの前記数と判定しきい値とを比較し、
前記メモリセルの前記数が前記判定しきい値より大きい場合、前記コードレートを変更すると判定し、
前記メモリセルの前記数が前記判定しきい値より小さい場合、前記コードレートを変更しないと判定する、
請求項６に記載のメモリシステム。
【請求項９】
前記コントローラは、前記第２データを前記記憶領域に格納してからの経過時間が設定時間に達するに応じて、前記第１リードを実行する、
請求項１に記載のメモリシステム。
【請求項１０】
前記コントローラは、前記記憶領域に対するイレースの回数が設定回数に達した場合、前記第２データの書き込みを実行する、
請求項１に記載のメモリシステム。
【請求項１１】
複数のメモリセルを備える記憶領域を備え、リード電圧が設定可能なメモリを制御する方法であって、この方法は、
前記メモリは、前記複数のメモリセルのそれぞれのしきい値電圧と前記リード電圧との比較に基づいて前記記憶領域内のデータをリードして出力するメモリであり、
コードレートが可変の方式において第１コードレートで第１データを符号化し、
第２データを前記記憶領域に書き込ませ、前記第２データは符号化された前記第１データである、
複数回の第１リードを実行し、各第１リードは前記リード電圧の設定値を変更して前記記憶領域に対してリードする処理である、
前記複数回の第１リードの結果に応じて、前記記憶領域のコードレートを前記第１コードレートから第２コードレートに変更する、前記第２コードレートは前記第１コードレートよりも小さい、
を備える。
【請求項１２】
前記コードレートを変更するは、
複数の第３データそれぞれに含まれるエラービットの数を第３データ毎に取得し、前記複数の第３データのそれぞれは、対応する第１リードによって前記記憶領域から出力された前記第２データである、
前記複数の第３データそれぞれに含まれるエラービットの数のうちの最小値を選択し、
前記コードレートを変更するか否かを前記最小値に基づいて判定する、
を含む請求項１１に記載の方法。
【請求項１３】
前記判定するは、
前記最小値と判定しきい値とを比較するし、
前記最小値が前記判定しきい値より大きい場合、前記コードレートを変更すると判定し、前記最小値が前記判定しきい値より小さい場合、前記コードレートを変更しないと判定する、
を含む請求項１２に記載の方法。
【請求項１４】
前記コードレートを変更するは、
複数の第３データ、それぞれの第３データは対応する第１リードによって前記記憶領域から出力された前記第２データである、に基づいて第１電圧値を推定し、前記第１電圧値は前記リード電圧に対する前記メモリセルの分布が極小となり得る前記リード電圧の電圧値である、
第２リードを実行し、前記第２リードは第２電圧値を前記リード電圧に設定して前記記憶領域に対してリードする処理であり、前記第２電圧値は前記推定された第１電圧値である、
第４データに含まれるエラービットの数を取得し、前記第４データは前記第２リードによって前記記憶領域から出力された前記第２データである、
前記コードレートを変更するか否かを前記エラービットの前記数に基づいて判定する、
を含む請求項１１に記載の方法。
【請求項１５】
前記判定するは、
前記エラービットの前記数と判定しきい値とを比較し、
前記エラービットの前記数が前記判定しきい値より大きい場合、前記コードレートを変更すると判定し、前記エラービットの前記数が前記判定しきい値より小さい場合、前記コードレートを変更しないと判定する、
を含む請求項１４に記載の方法。
【請求項１６】
前記コードレートを変更するは、
複数の第３データ、それぞれの第３データは対応する第１リードによって前記記憶領域から出力された前記第２データである、に基づいて第１電圧値を推定し、前記第１電圧値は前記リード電圧に対する前記メモリセルの分布が極小となり得る前記リード電圧の電圧値である、
第２電圧値を含む範囲にしきい値電圧が含まれるメモリセルの数をカウントし、前記第２電圧値は前記推定された第１電圧値である、
前記コードレートを変更するか否かを前記メモリセルの前記数に基づいて判定する、
を含む請求項１１に記載の方法。
【請求項１７】
前記カウントするは、
第２リードを実行し、前記第２リードは第３電圧値を前記リード電圧に設定して前記記憶領域に対してリードする処理であり、前記第３電圧値は前記範囲の上限値である、
第３リードを実行し、前記第３リードは第４電圧値を前記リード電圧に設定して前記記憶領域に対してリードする処理であり、前記第４電圧値は前記範囲の下限値である、
第４データと第５データとの比較に基づいて前記メモリセルの前記数をカウントする、前記第４データは前記第２リードによって前記記憶領域から出力された前記第２データであり、前記第５データは前記第３リードによって前記記憶領域から出力された前記第２データである、
を含む請求項１６に記載の方法。
【請求項１８】
前記判定するは、
前記メモリセルの前記数と判定しきい値とを比較し、
前記メモリセルの前記数が前記判定しきい値より大きい場合、前記コードレートを変更すると判定し、前記メモリセルの前記数が前記判定しきい値より小さい場合、前記コードレートを変更しないと判定する、
を含む請求項１６に記載の方法。
【請求項１９】
前記第２データを前記記憶領域に格納してからの経過時間が設定時間に達するに応じて、前記複数回の第１リードを実行する、または、
前記記憶領域に対するイレースの回数が設定回数に達した場合、前記第２データの書き込みを実行する、
をさらに含む請求項１１に記載の方法。
【請求項２０】
不揮発性のメモリと、
前記メモリのリード電圧にそれぞれ異なる電圧値を設定して複数回のリードを実行し、前記メモリにライトされるデータのコードレートを前記複数のリードの結果に基づいて変更する、コントローラと、
を備えるメモリシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本実施形態は、メモリシステムおよび方法に関する。
【背景技術】
【０００２】
ＮＡＮＤ型のフラッシュメモリなどの不揮発性メモリを用いたメモリシステムにおいては、プログラミング／イレースのサイクル（Ｐ／Ｅサイクル）を繰り返すことにより不揮発性メモリのメモリセルが物理的に疲弊する。これにより、リードエラーが発生する確率が高まる。リードエラーに対応するために、データに予めエラー訂正符号を付加して書き込みを実行し、リード時には、エラー訂正によって正しいデータに復元することが一般的に行われている。
【０００３】
エラー訂正符号の方式として、コードレート可変方式がある。この方式によれば、コードレートを変更することによって、エラー訂正能力を変更することが可能である。メモリシステムにコードレート可変方式が適用される場合、コードレートが減少するに従ってエラー訂正能力が強化される。しかしながら、コードレートが減少するに従って符号を除いた正味のデータを保持できる容量が減少する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第５３６４９１１号公報
【特許文献２】特表２０１５−５２４９７５号公報
【特許文献３】特表２０１３−５４２５３３号公報
【特許文献４】米国特許第８９６６３４７号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
一つの実施形態は、コードレートを効率的に制御することができるメモリシステムを提供する。
【課題を解決するための手段】
【０００６】
一つの実施形態によれば、メモリシステムは、複数のメモリセルを備える記憶領域を備えるメモリと、コントローラとを備える。前記メモリは、リード電圧が設定可能である。前記メモリは、前記複数のメモリセルのそれぞれのしきい値電圧と前記リード電圧との比較に基づいて前記記憶領域内のデータをリードして出力する。前記コントローラは、コードレートが可変の方式において第１コードレートで第１データを符号化し、第２データを前記記憶領域に書き込ませる。前記第２データは符号化された前記第１データである。前記コントローラは、複数回の第１リードを実行する。各第１リードは前記リード電圧の設定値を変更して前記記憶領域に対してリードする処理である。前記コントローラは、前記複数回の第１リードの結果に応じて、前記記憶領域のコードレートを前記第１コードレートから第２コードレートに変更する。前記第２コードレートは前記第１コードレートよりも小さい。
【図面の簡単な説明】
【０００７】
【図１】図１は、第１の実施形態のメモリシステムの構成例を示す図である。
【図２】図２は、第１の実施形態のメモリチップの構成例を説明する図である。
【図３】図３は、第１の実施形態のブロックの構成例を示す回路図である。
【図４】図４は、２ビット記憶方式が採用された場合におけるメモリセルのしきい値電圧に対する分布を示す図である。
【図５】図５は、変化後の各分布の例を説明するための図である。
【図６】図６は、第１の実施形態の電圧情報の一例を示す図である。
【図７】図７は、第１の実施形態の判定情報の一例を示す図である。
【図８】図８は、コードレート情報の一例を示す図である。
【図９】図９は、第１の実施形態のメモリシステムの動作を説明するフローチャートである。
【図１０】図１０は、Ｖｔｈトラッキングを説明するための図である。
【図１１】図１１は、第２の実施形態のメモリシステムの動作の一例を説明するフローチャートである。
【図１２】図１２は、第３の実施形態のカウント対象のメモリセルを説明するための図である。
【図１３】図１３は、第３の実施形態のメモリシステムの動作を説明するフローチャートである。
【図１４】図１４は、第４の実施形態のメモリシステムの動作を説明するフローチャートである。
【図１５】図１５は、各電圧値をＶ＿ＥＡとＶ＿ＢＣとを座標成分とする平面座標にプロットしたグラフを示す図である。
【図１６】図１６は、メモリシステムの実装例を示す図である。
【発明を実施するための形態】
【０００８】
以下に添付図面を参照して、実施形態にかかるメモリシステムおよび方法を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【０００９】
（第１の実施形態）
図１は、第１の実施形態のメモリシステムの構成例を示す図である。メモリシステム１００は、ホスト装置２００と接続される。ホスト装置２００は、例えば、サーバ、パーソナルコンピュータ、またはモバイル型の情報処理装置などが該当する。メモリシステム１００は、ホスト装置２００の外部記憶装置として機能する。ホスト装置２００は、メモリシステム１００に対してアクセス要求（リード要求およびライト要求）を発行することができる。メモリシステム１００とホスト装置２００とを接続する通信インタフェースが準拠する規格は、特定の規格に限定されない。例えば、通信インタフェースは、ＡＴＡ（Advanced  Technology  Attachment）規格、ＳＡＳ（Serial  Attached  SCSI）規格、ＰＣＩ（Peripheral  Components  Interconnect）  Ｅｘｐｒｅｓｓ規格などに準拠する。
【００１０】
メモリシステム１００は、ＮＡＮＤ型のフラッシュメモリ（ＮＡＮＤメモリ）１と、ホスト装置２００とＮＡＮＤメモリ１との間のデータ転送を実行するメモリコントローラ２と、を備えている。なお、メモリシステム１００は、ＮＡＮＤメモリ１の代わりに他の種類のメモリを具備してもよい。例えば、メモリシステム１００は、ＮＡＮＤメモリ１の代わりにＮＯＲ型のフラッシュメモリを具備してもよい。
【００１１】
ＮＡＮＤメモリ１は、複数（ここでは４つ）の、半導体メモリとしてのメモリチップ１１により構成される。また、メモリコントローラ２は２個のチャネル（ch.0、ch.1）を備えている。１個または３個以上のチャネルを備えてもよい。各チャネルには夫々２つのメモリチップ１１が接続されている。各チャネルは、制御信号線、Ｉ／Ｏ信号線、ＣＥ（チップイネーブル）信号線、ＲＹ／ＢＹ信号線を含んで構成される。Ｉ／Ｏ信号線は、データ、アドレス、および各種指示を伝送するための信号線である。メモリコントローラ２は、Ｉ／Ｏ信号線を介して、リード指示、プログラム指示、およびイレース指示をメモリチップ１１に送信することができる。制御信号線は、ＷＥ（ライトイネーブル）信号線、ＲＥ（リードイネーブル）信号線、ＣＬＥ（コマンドラッチイネーブル）信号線、ＡＬＥ（アドレスラッチイネーブル）信号線、ＷＰ（ライトプロテクト）信号線等を含む。
【００１２】
図２は、各メモリチップ１１の構成例を説明する図である。メモリチップ１１は、Ｉ／Ｏ信号処理回路１１０、制御信号処理回路１１１、チップ制御回路１１２、コマンドレジスタ１１３、アドレスレジスタ１１４、カラムデコーダ１１５、データレジスタ１１６、センスアンプ１１７、メモリセルアレイ１１８、ロウデコーダ１１９、およびＲＹ／ＢＹ生成回路１２０を備えている。
【００１３】
チップ制御回路１１２は、制御信号処理回路１１１を介して受信する各種制御信号に基づいて状態遷移する回路である。チップ制御回路１１２は、メモリチップ１１全体の動作を制御する。ＲＹ／ＢＹ生成回路１２０は、チップ制御回路１１２による制御の下でＲＹ／ＢＹ信号線の状態をレディー状態（ＲＹ）とビジー状態（ＢＹ）との間で遷移させる。
【００１４】
Ｉ／Ｏ信号処理回路１１０は、メモリコントローラ２との間でＩ／Ｏ信号を送受信するためのバッファ回路である。Ｉ／Ｏ信号処理回路１１０がラッチしたコマンド、アクセス先を指定するアドレス、データは、夫々、アドレスレジスタ１１４、コマンドレジスタ１１３、データレジスタ１１６に振り分けられて格納される。
【００１５】
アドレスレジスタ１１４に格納されたアドレスは、チップ番号、ロウアドレス、およびカラムアドレスを含んでいる。チップ番号は、各メモリチップ１１を区別するための識別情報である。チップ番号はチップ制御回路１１２、ロウアドレスはロウデコーダ１１９、カラムアドレスはカラムデコーダ１１５に夫々読み出される。
【００１６】
制御信号処理回路１１１は、制御信号の入力を受け付ける。制御信号処理回路１１１は、受け付けた制御信号に基づいて、Ｉ／Ｏ信号処理回路１１０が受け付けたＩ／Ｏ信号の格納先のレジスタの振り分けを実行する。また、制御信号処理回路１１１は、受け付けた制御信号をチップ制御回路１１２に転送する。
【００１７】
メモリセルアレイ１１８は、複数のブロックを備える。ブロックは、イレースの物理的な実行単位に対応する記憶領域である。即ち、１つのブロックに格納されている全てのデータは、一括してイレースされる。
【００１８】
図３は、メモリセルアレイ１１８に含まれる１個のブロックの構成例を示す回路図である。図示するように、各ブロックは、Ｘ方向に沿って順に配列された（ｐ＋１）個のＮＡＮＤストリングを備えている（ｐ≧０）。（ｐ＋１）個のＮＡＮＤストリングにそれぞれ含まれる選択トランジスタＳＴ１は、ドレインがビット線ＢＬ０〜ＢＬｐに接続され、ゲートが選択ゲート線ＳＧＤに共通接続されている。また、選択トランジスタＳＴ２は、ソースがソース線ＳＬに共通接続され、ゲートが選択ゲート線ＳＧＳに共通接続されている。
【００１９】
各メモリセルトランジスタＭＴは、半導体基板上に形成された積層ゲート構造を備えたＭＯＳＦＥＴ（Metal  Oxide  Semiconductor  Field  Effect  Transistor）から構成される。積層ゲート構造は、半導体基板上にトンネル酸化膜を介在して形成されたフローティングゲート、及びフローティングゲート上にゲート間絶縁膜を介在して形成された制御ゲート電極を含んでいる。フローティングゲートに蓄えられる電子の数に応じてしきい値電圧が変化する。メモリセルトランジスタＭＴは、しきい値電圧の違いに応じてデータを記憶する。即ち、メモリセルトランジスタＭＴは、フローティングゲートに、データに応じた量の電荷を保持する。
【００２０】
各ＮＡＮＤストリングにおいて、（ｑ＋１）個のメモリセルトランジスタＭＴは、選択トランジスタＳＴ１のソースと選択トランジスタＳＴ２のドレインとの間に、それぞれの電流経路が直列接続されるように配置されている。そして、最もドレイン側に位置するメモリセルトランジスタＭＴから順に、制御ゲート電極がワード線ＷＬ０〜ＷＬｑにそれぞれ接続されている。従って、ワード線ＷＬ０に接続されたメモリセルトランジスタＭＴのドレインは選択トランジスタＳＴ１のソースに接続され、ワード線ＷＬｑに接続されたメモリセルトランジスタＭＴのソースは選択トランジスタＳＴ２のドレインに接続されている。
【００２１】
ワード線ＷＬ０〜ＷＬｑは、ブロック内のＮＡＮＤストリング間で、メモリセルトランジスタＭＴの制御ゲート電極を共通に接続している。つまり、ブロック内において同一行にあるメモリセルトランジスタＭＴの制御ゲート電極は、同一のワード線ＷＬに接続される。各メモリセルトランジスタＭＴに１ビットの値を保持可能に構成される場合には、同一のワード線ＷＬに接続される（ｐ＋１）個のメモリセルトランジスタＭＴは１ページとして取り扱われ、このページごとにデータのプログラム及びデータのリードが行われる。
【００２２】
各メモリセルトランジスタＭＴに複数ビットの値を保持可能に構成される場合がある。例えば、各メモリセルトランジスタＭＴがｎ（ｎ≧２）ビットの値を格納可能な場合、ワード線当たりの記憶容量はｎページ分のサイズに等しくなる。ここでは一例として、各メモリセルトランジスタＭＴが２ビットの値の記憶を行う記憶方式（以下、２ビット記憶方式）について説明する。２ビット記憶方式によれば、各ワード線に２ページ分のデータが保持される。１つのワード線によって構成される２つのページのうち、先に書き込みがなされるページをロアーページ、ロアーページの後から書き込みがなされるページをアッパーページと表記する。また、メモリセルトランジスタＭＴを、単にメモリセルと表記する。なお、１つのワード線によって構成される複数または全てのページに対して一括にプログラムが実行されるモードがあってもよい。
【００２３】
図４は、２ビット記憶方式が採用された場合におけるメモリセルのしきい値電圧に対する分布を示す図である。本図において、横軸はしきい値電圧を表し、縦軸はメモリセル数を表す。２ビット記憶方式によれば、各メモリセルは、アッパーページに属するデータ“ｘ”とロアーページに属するデータ“ｙ”とで定義される４値データ“ｘｙ”を保持可能である。データ“ｘ”およびデータ“ｙ”の値は、符号“０”または符号“１”である。各メモリセルのしきい値電圧が、分布Ｅ、分布Ａ、分布Ｂ、および分布Ｃの４つのグループの何れかに属するように制御される。各分布と４値データ“ｘｙ”のデータ値との対応は、予め設定される。例えば、分布Ｅにはデータ値“１１”が割り当てられる。分布Ａにはデータ値“０１”が割り当てられる。分布Ｂにはデータ値“００”が割り当てられる。分布Ｃにはデータ値“１０”が割り当てられる。なお、各分布とデータ値との対応は、上記に限定されない。一例では、隣接する分布間のハミング距離が１となるように各分布に各データ値が割り当てられる。
【００２４】
図２に戻り、ロウデコーダ１１９、カラムデコーダ１１５、データレジスタ１１６、およびセンスアンプ１１７は、メモリセルアレイ１１８に対する周辺回路を構成する。周辺回路は、チップ制御回路１１２による制御に基づいて、メモリセルアレイ１１８に対するアクセス（リード、プログラミング、およびイレース）を実行する。
【００２５】
例えばプログラミング時には、カラムデコーダ１１５は、カラムアドレスに対応したビット線を選択して活性化する。センスアンプ１１７は、カラムデコーダ１１５により選択されたビット線の電位を０ボルトとする。ロウデコーダ１１９は、ロウアドレスに対応したワード線に、プログラミングパルスを印加する。すると、選択されたビット線および選択されたワード線との交点に位置するメモリセルのフローティングゲートに電子が注入され、その結果、フローティングゲートのしきい値電圧が上昇する。センスアンプ１１７は、プログラミングパルスが印加される毎に、しきい値電圧がデータレジスタ１１６に格納されているデータに応じた電圧に到達したか否かを確認する。センスアンプ１１７は、しきい値電圧がデータに応じた電圧に到達するまで、ロウデコーダ１１９にプログラムパルスの印加を継続させる。
【００２６】
リード時においては、センスアンプ１１７は、ビット線ＢＬに電源電位Ｖｃｃをプリチャージし、ロウデコーダ１１９は、選択されたワード線ＷＬにデータ値（“１１”、“０１”、“００”、“１０”）毎の分布を特定するための複数種類の判定電位（以下、リード電圧）を順次印加する。なお、ロウデコーダ１１９は、非選択のワード線ＷＬには転送電位を印加し、非選択のワード線ＷＬに属するメモリセルを導通状態にしておく。センスアンプ１１７は、プリチャージにより蓄えられた電荷がどのリード電圧が印加されたときにソース線ＳＬに流出したかを検知することによって対象のメモリセルに記憶されているデータ値を判定する。
【００２７】
例えば、図４に示すように、分布Ｅと分布Ａとの間にリード電圧Ｖ＿ＥＡが設定され、分布Ａと分布Ｂとの間にリード電圧Ｖ＿ＡＢが設定され、分布Ｂと分布Ｃとの間にリード電圧Ｖ＿ＢＣが設定される。
【００２８】
リード対象がロアーページである場合においては、リード電圧Ｖ＿ＡＢが判定に用いられる。センスアンプ１１７は、リード電圧Ｖ＿ＡＢが印加された場合にソース線ＳＬに電荷の流出を検知したとき、対象のメモリセルはデータ値“１”を記憶していると判定する。また、センスアンプ１１７は、リード電圧Ｖ＿ＡＢが印加された場合にソース線ＳＬに電荷の流出を検知しなかったとき、対象のメモリセルはデータ値“０”を記憶していると判定する。
【００２９】
リード対象がアッパーページである場合においては、リード電圧Ｖ＿ＥＡおよびリード電圧Ｖ＿ＢＣが判定に用いられる。センスアンプ１１７は、リード電圧Ｖ＿ＥＡが印加された場合に電荷の流出を検知したとき、または、リード電圧Ｖ＿ＥＡおよびリード電圧Ｖ＿ＢＣの何れが印加された場合でも電荷の流出を検知しなかったとき、対象のメモリセルはデータ値“１”を記憶していると判定する。センスアンプ１１７は、リード電圧Ｖ＿ＥＡが印加された場合に電荷の流出を検知せず、かつ、リード電圧Ｖ＿ＢＣが印加された場合に電荷の流出を検知したとき、対象のメモリセルはデータ値“０”を記憶していると判定する。
【００３０】
イレース時においては、電位発生回路（図示せず）によってメモリセルアレイ１１８の基板にイレース電圧が印加される。そして、ロウデコーダ１１９はイレース対象のブロックの全てのワード線ＷＬを接地電位に導通させる。すると、選択されたブロック内の各メモリセルにおいては、フローティングゲートに蓄えられていた電荷が放出される。その結果、選択されたブロック内の各メモリセルの状態は消去状態（すなわちデータ値“１１”を記憶している状態）に遷移する。
【００３１】
センスアンプ１１７は、リードしたデータをデータレジスタ１１６に格納する。データレジスタ１１６に格納されたデータは、データ線を通してＩ／Ｏ信号処理回路１１０に送られ、Ｉ／Ｏ信号処理回路１１０からメモリコントローラ２へ転送される。
【００３２】
なお、各リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣの値は、メモリチップ１１内に設けられた不揮発性の記憶部に記憶される。例えば、メモリチップ１１は、リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣの基準値（固定値）を記憶する。各リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣの基準値としては、複数のメモリチップ１１で共通の値が設定されてもよいし、メモリチップ１１毎に異なる基準値が設定されてもよい。また、各リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣの基準値としては、ブロック毎またはブロックとは異なる単位毎に共通の値が設定されてもよい。基準値の設定方法は特定の方法に限定されない。メモリコントローラ２は、対象のメモリチップ１１に所定のコマンドを送信することによって各リード電圧の基準値を設定してもよい。
【００３３】
メモリチップ１１においては、フローティングゲートに保持される電荷の量が時間経過とともに変化する。また、リードまたは隣接するメモリセルへのプログラムによっても、フローティングゲートに保持される電荷の量が変化する。図５は、変化後の各分布の例を説明するための図である。本図では、簡単のために、分布Ａと分布Ｂとのみ示している。また、分布Ａと分布Ｂとを区別して示している。この例によれば、分布Ａの裾野と分布Ｂの裾野とが重なり合っている。分布Ａの最大値がリード電圧Ｖ＿ＡＢを超えており、かつ、分布Ｂの最小値がリード電圧Ｖ＿ＡＢを下回っている。分布Ａに属し、かつ、しきい値電圧がＶ＿ＡＢよりも大きいメモリセル（即ち、領域３００に含まれるメモリセル）がリードされた場合、そのメモリセルは分布Ｂに属するとして認識される。即ち、“０１”としてプログラムされたデータ値が“００”としてリードされる。分布Ｂに属し、かつ、しきい値電圧がＶ＿ＡＢよりも小さいメモリセル（即ち、領域３０１に含まれるメモリセル）がリードされた場合、そのメモリセルは分布Ａに属するとして認識される。即ち、“００”としてプログラムされたデータ値が“０１”としてリードされる。プログラム時から変化したデータ値は、メモリコントローラ２においてリード時にエラービットとして検出される。メモリコントローラ２においては、検出されたエラービットは、後述のＥＣＣ（Error  Checking  and  Correction）回路２５（図１を参照）によって訂正が試みられる。
【００３４】
図１に戻り、さらに、メモリコントローラ２は、リード電圧の設定値を変更してデータをリードすることができる。リード電圧の設定値を変更することによって、データリード時のエラービットの数を少なくすることができる場合がある。リード電圧の設定値を変更してリードを行うことを、以降、シフトリードと表記する。
【００３５】
一つの例では、メモリコントローラ２は、リードしたデータの、プログラム時から変化した値をＥＣＣ回路２５によって訂正することによって、プログラム時のデータを復元する。メモリコントローラ２は、ＥＣＣ回路２５によるエラー訂正が失敗した場合、シフトリードによって再びデータをリードする。メモリコントローラ２は、シフトリードによって得られたデータに対し、再度、ＥＣＣ回路２５によってエラー訂正を実行することができる。シフトリードの際のリード電圧の設定値の変更方法は、特定の方法に限定されない。例えば、エラー訂正が成功するまでシフトリードが繰り返し実行され、それぞれのシフトリードでは、後述の電圧情報２２１に記録された電圧値が順次設定される。
【００３６】
なお、エラー訂正に失敗するとは、リードされたデータからプログラム時のデータを復元できないことをいう。具体的には、エラー訂正に失敗するとは、リードされたデータに含まれるエラービットが訂正できないことをいう。エラー訂正に成功するとは、リードされたデータに含まれる全てのエラービットが訂正されることをいう。
【００３７】
メモリコントローラ２は、ホストインタフェースコントローラ（ホストＩ／Ｆコントローラ）２１、ＲＡＭ（Random  Access  Memory）２２、ＮＡＮＤコントローラ（ＮＡＮＤＣ）２３、ＣＰＵ（Central  Processing  Unit）２４、およびＥＣＣ回路２５を備えている。ホストＩ／Ｆコントローラ２１、ＲＡＭ２２、各ＮＡＮＤコントローラ２３、ＣＰＵ２４、およびＥＣＣ回路２５は、バスで互いに接続されている。なお、メモリコントローラ２は、ホストＩ／Ｆコントローラ２１、ＲＡＭ２２、各ＮＡＮＤコントローラ２３、ＣＰＵ２４、およびＥＣＣ回路２５が集積された一つのＩＣ（回路）であってもよい。また、ホストＩ／Ｆコントローラ２１、ＲＡＭ２２、各ＮＡＮＤコントローラ２３、ＣＰＵ２４、およびＥＣＣ回路２５の一部は、メモリコントローラ２の外部に配設されてもよい。
【００３８】
ＲＡＭ２２は、ホスト装置２００とＮＡＮＤメモリ１との間のデータ転送のためのバッファとして機能する。また、ＲＡＭ２２は、ＣＰＵ２４にワークエリアを提供する。また、ＲＡＭ２２は、各種管理情報が格納される。第１の実施形態においては、ＲＡＭ２２には、管理情報として、電圧情報２２１、判定情報２２２、およびコードレート情報２２３が格納される。これらの情報の詳細は後述する。
【００３９】
なお、ＲＡＭ２２の種類は特定の種類に限定されない。ＲＡＭ２２の種類として、例えば、ＤＲＡＭ（Dynamic  Random  Access  Memory）またはＳＲＡＭ（Static  Random  Access  Memory）が採用可能である。
【００４０】
ホストＩ／Ｆコントローラ２１は、ＣＰＵ２４による制御の下で、ホスト装置２００とメモリシステム１００との間の通信インタフェースの制御およびホスト装置２００とＲＡＭ２２との間のデータ転送の制御を実行する。
【００４１】
ＮＡＮＤコントローラ２３は、各チャネル（ch.0、ch.1）を制御する。ＮＡＮＤコントローラ２３は、ＣＰＵ２４による制御の下で、ＮＡＮＤメモリ１とＲＡＭ２２との間のデータ転送の制御を実行する。
【００４２】
ＥＣＣ回路２５は、ＮＡＮＤメモリ１へのプログラム対象のデータに対してエラー訂正のための符号化を行ったり、ＮＡＮＤメモリ１からリードされたデータに対してエラー訂正を実行したりする。
【００４３】
ＥＣＣ回路２５は、コードレート可変方式に従った符号化を行う。コードレート可変方式は、必要とされる訂正能力に応じてコードレートを変更できる方式である。コードレートとは、フレームのサイズ、に対する、符号化前のデータのサイズ、の割合である。フレームとは、エラー訂正が実行される単位をいう。コードレートが小さいほど、訂正能力が高い。訂正能力とは、所定サイズのデータ（例えば１ＫＢ）あたりの訂正が可能なエラービットの数である。採用される符号の種類は特定の種類に限定されない。例えば、ＢＣＨ符号またはＬＤＰＣ（low-density  parity-check  code）が採用可能である。
【００４４】
ＣＰＵ２４は、ファームウェアに基づき、第１処理部２４１および第２処理部２４２として機能する。ファームウェアは、例えばＮＡＮＤメモリ１に予め不揮発に格納され、メモリシステム１００の起動時にＲＡＭ２２内のワークエリアにロードされる。ＣＰＵ２４は、ワークエリアにロードされたファームウェアを実行する。
【００４５】
第１処理部２４１は、コードレートの制御を実行する。なお、ここでは一例として、第１処理部２４１は、ブロック毎にコードレートを制御することとする。コードレートの制御は、ブロック以外の任意の単位で実行され得る。例えば、複数のブロック毎にコードレートが制御されてもよいし、ブロックよりも小さい記憶領域（例えばページ）毎にコードレートが制御されてもよい。また、同一ブロック内の複数のワードラインからなるグループ単位でコードレートが制御されてもよい。また、複数のロアーページからなるグループ単位、または、複数のアッパーページからなるグループ単位でコードレートが制御されてもよい。
【００４６】
一般に、メモリセルの疲弊に応じてデータの値が変化しやすくなる。一方、コードレートの減少に応じて訂正能力が高くなる。したがって、メモリセルの疲弊に応じてコードレートを減少させることによって、メモリセルに対するＰ／Ｅサイクルの上限数を増やすことができる。しかしながら、コードレートを減少させると、正味のデータを保持できる容量が少なくなるため、余裕率（over-provisioned  percentage）が低下する。そこで、第１処理部２４１は、必要以上にコードレートを減少させないために、リード電圧の最適値に応じた、必要となる訂正能力を考慮する。
【００４７】
リード電圧の最適値とは、ＲＢＥＲ（Raw  Bit  Error  Rate）が最小となるリード電圧である。ＲＢＥＲは、ＮＡＮＤメモリ１からリードされたデータにおけるエラービットの発生率である。
【００４８】
具体的には、第１処理部２４１は、リード電圧の最適値の推定のために、リード電圧の設定値を変更しながら複数回のシフトリードを実行する。そして、第１処理部２４１は、複数回のシフトリードの結果に応じてコードレートを減少させる。
【００４９】
なお、第１処理部２４１は、リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣのうちの任意のリード電圧について、最適値を推定してもよい。例えば、コードレートの変更の判定に用いられるデータがアッパーページにプログラムされたデータである場合には、第１処理部２４１は、リード電圧Ｖ＿ＥＡ、Ｖ＿ＢＣのそれぞれの最適値を推定する。コードレートの変更の判定に用いられるデータがロアーページにプログラムされたデータである場合には、第１処理部２４１は、リード電圧Ｖ＿ＡＢの最適値を推定する。即ち、第１処理部２４１は、リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣのうちの一部または全部の最適値を推定し得る。
【００５０】
また、リード電圧の最適値の推定値は、リード電圧の真の最適値と必ずしも一致していなくてもよい。第１の実施形態では、リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣの電圧値のセットが複数、予め用意され、第１処理部２４１は、複数のセットから最もＲＢＥＲが小さいセットに含まれる電圧値を、リード電圧の最適値の推定値とする。以降、リード電圧の最適値の推定値を、最適電圧値と表記する。
【００５１】
リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣの電圧値の各セットは、電圧情報２２１に予め記録されている。図６は、電圧情報２２１の一例を示す図である。図６に示すように、電圧情報２２１は、テーブル形式のデータ構造を有する。電圧情報２２１の各レコードには、リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣの電圧値のセットが記録されている。第１処理部２４１は、電圧情報２２１から一つのレコードを選択し、選択したレコードに記録された各電圧値をリード電圧としてＮＡＮＤメモリ１に設定してシフトリードを実行する。第１処理部２４１は、レコード毎にシフトリードを実行し、シフトリード毎にＥＣＣ回路２５にエラー訂正を実行させる。第１処理部２４１は、シフトリード毎にリードされたデータに含まれるエラービットに基づいてＲＢＥＲを計測し、ＲＢＥＲが最小であった電圧値を、最適電圧値と見なす。
【００５２】
なお、ＲＢＥＲの代わりに、ＲＢＥＲと相関する値であれば、任意の値が最適電圧値の選択に使用可能である。ここでは、第１処理部２４１は、各シフトリードにおいて、単位サイズのデータ（例えば１フレーム）をリードし、リードされた単位サイズのデータに含まれるエラービットの数を取得する。一例では、訂正されたエラービットの数がＥＣＣ回路２５から出力され、ＥＣＣ回路２５から出力されたエラービットの数を第１処理部２４１が取得する。別の例では、第１処理部２４１は、訂正前後のデータ間でＸＯＲを演算し演算結果に含まれる「１」の数をカウントすることによって、エラービットの数を取得する。第１処理部２４１は、取得されたエラービットの数を、最適電圧値の選択に使用する。即ち、第１処理部２４１は、エラービットの数が最も少なくなるセットに含まれる電圧値を最適電圧値と見なす。
【００５３】
また、リード電圧の設定方法は特定の方法に限定されない。一例では、第１処理部２４１は、リード電圧の設定値をＮＡＮＤコントローラ２３に通知し、ＮＡＮＤコントローラ２３は、通知された設定値を付加したリードコマンドをＮＡＮＤメモリ１に送信する。ＮＡＮＤメモリ１においては、周辺回路は、リードコマンドに付加された設定値をリード電圧として使用してメモリセルアレイ１１８に対してリードを行い、リードしたデータをメモリコントローラ２に出力する。リード電圧の設定値は、基準値からの差分を示す値によって指定されてもよいし、電圧値によって指定されてもよい。
【００５４】
第１処理部２４１は、最適電圧値の候補となる値をＮＡＮＤメモリ１に順次設定してシフトリードを行う。第１処理部２４１は、コードレートを変更するか否かを判定するために、最適電圧値の候補を用いたシフトリードによって得られたデータを解析する。
【００５５】
解析の一例として、第１の実施形態においては、第１処理部２４１は、最適電圧値の候補を用いたシフトリードによって得られたデータに含まれていたエラービットの数を取得する。前述のように、エラービットの数は、ＲＢＥＲに対応するため、第１処理部２４１は、ＲＢＥＲを測定してもよい。第１処理部２４１は、エラービットの数と判定しきい値との比較結果に基づいて、コードレートを変更するか否かを判定する。即ち、第１処理部２４１は、エラービットの数が判定しきい値を超えた場合には、コードレートを減少させる。
【００５６】
解析においては、第１処理部２４１は、ＮＡＮＤメモリ１の疲弊の進行に応じてコードレートを段階的に減少させるために、現在のコードレートが小さいほど、判定しきい値を大きくする。さらに、第１処理部２４１は、エラーの数の増加量が大きいほどコードレートの減少量を大きくするために、それぞれ異なる判定しきい値を複数設定する。第１処理部２４１は、エラービットの数が超えた判定しきい値が大きいほど、コードレートの減少量を大きくする。
【００５７】
現在のコードレートと次のコードレートと判定しきい値との関係は、判定情報２２２に予め記録されている。図７は、判定情報２２２の一例を示す図である。この例では、判定情報２２２は、テーブル形式のデータ構造を有する。この例において、判定情報２２２の行は、現在のコードレートを示しており、判定情報２２２の列は、次のコードレートを示している。次のコードレートとは、変更によって次に設定されるコードレートである。判定情報２２２のいくつかのセルには、判定しきい値が記録されている。
【００５８】
例えば、現在のコードレートが“０．８”である場合、判定情報２２２の検索によって、判定しきい値“２０”および判定しきい値“４０”の２つが取得される。エラービットの数が、２つの判定しきい値のうちの大きい方の判定しきい値“４０”より大きい場合、判定しきい値“４０”が記録されたセルが属する列の参照によって、次のコードレートとして“０．６”が取得される。即ち、コードレートが“０．８”から“０．６”に減少せしめられる。エラービットの数が、２つの判定しきい値のうちの大きい方の判定しきい値“４０”より小さく、かつ、２つの判定しきい値のうちの小さい方の判定しきい値“２０”より大きい場合、“２０”が記録されたセルが属する列の参照によって、“０．７”が次のコードレートに決定される。即ち、コードレートが“０．８”から“０．７”に減少せしめられる。エラービットの数が、２つの判定しきい値のうちの小さい方の判定しきい値“２０”より小さい場合、コードレートは変更されない。
【００５９】
現在のコードレートに対し、３以上の判定しきい値が取得可能に、判定情報２２２が構成されてもよい。エラービットの数が３以上の判定しきい値のうちの少なくとも最小の判定しきい値より大きい場合、コードレートを減少させると判定される。エラービットの数が３以上の判定しきい値のうちの最小の判定しきい値より小さい場合、コードレートを変更しないと判定される。
【００６０】
現在のコードレートに対し、一つの判定しきい値が取得可能に判定情報２２２が構成されてもよい。エラービットの数が判定しきい値より大きい場合、コードレートを減少させると判定される。エラービットの数が判定しきい値より小さい場合、コードレートを変更しないと判定される。
【００６１】
なお、図７の例に示されるように、現在のコードレートが所定レート以下の状態でエラービットの数が所定数以上である場合、第１処理部２４１は、該当のブロックの利用停止の決定を行ってもよい。利用停止の決定がなされたブロックは、バッドブロックとして見なされる。
【００６２】
また、判定しきい値（現在のコードレートに対して複数の判定しきい値が設定される場合には、複数の判定しきい値のうちの最小の判定しきい値）は、一例では、現在のコードレートによって得られる訂正能力にマージンを加算した値である。マージンは、例えば、データリテンションによって増加する量である。マージンは、例えば、シミュレーションまたは実験などにより、予め求められる。なお、判定しきい値の決定方法はこれに限定されない。
【００６３】
コードレートの設定値は、コードレート情報２２３に記録される。図８は、コードレート情報２２３の一例を示す図である。この例では、コードレート情報２２３は、テーブル形式のデータ構造を有する。コードレート情報２２３には、コードレートの設定値がブロック毎に記録されている。なお、コードレート情報２２３には、同一ブロック内の複数のワードラインからなるグループ単位でコードレートが記録されていてもよい。また、複数のロアーページからなるグループ単位、または、複数のアッパーページからなるグループ単位でコードレートが記録されていてもよい。各レコードは、チップ番号とブロック番号とによって特定される。ブロック番号は、例えばロウアドレスに含まれる。第１処理部２４１は、コードレート情報２２３を参照することによって、ブロック毎に、現在のコードレートを取得することができる。
【００６４】
第２処理部２４２は、ＮＡＮＤメモリ１へのアクセスを実行する。第２処理部２４２によるＮＡＮＤメモリ１へのアクセスは、ホスト装置２００からのアクセス要求に応じたアクセス、ガベージコレクションのためのアクセス、ウェアレベリングのためのアクセス、およびリフレッシュのためのアクセス、を含む。アクセスは、リード、プログラム、及びイレース、を含む。
【００６５】
第２処理部２４２は、ＮＡＮＤメモリ１にデータを送る際、コードレート情報２２３に設定されているコードレートに従ってデータを符号化する。具体的には、第２処理部２４２は、コードレート情報２２３を参照することによって、アクセスするチップ及びブロックのコードレートの設定値を取得する。第２処理部２４２は、取得した設定値をＥＣＣ回路２５に通知する。ＥＣＣ回路２５は、通知されたコードレートでデータの符号化を実行する。ＮＡＮＤコントローラ２３は、ライトコマンドと符号化されたデータとをＮＡＮＤメモリ１に送信する。
【００６６】
なお、ガベージコレクションとは、１つのブロックから少なくとも有効なデータを他のブロックの空き領域に転送し、その後、転送元のブロックに格納されている全てのデータを無効なデータとしてみなす、処理をいう。転送元のブロックは、ガベージコレクションの後、フリーブロックとして見なされる。各フリーブロックは、イレースが実行されることによって、何もデータを記憶していなく、かつ新たなデータをプログラム可能な状態になる。
【００６７】
リフレッシュとは、NANDメモリ１に格納されているデータを、いったんリードしてリードされたデータにエラー訂正を実行し、エラー訂正後のデータを再びNANDメモリ１にプログラムする処理である。リフレッシュにおいて、エラー訂正後のデータは、リードしたブロックとは異なるブロックにプログラムされ得る。
【００６８】
ウェアレベリングとは、ブロック毎のＰ／Ｅサイクルの数を複数のブロック間で平滑化する処理である。ウェアレベリングの１つとして、ブロック間で有効なデータを移動する処理がある。
【００６９】
なお、データが有効とは、そのデータが最新の状態であることをいう。ホスト装置２００から同一の論理アドレスの指定とともに送られてきた複数のデータがNANDメモリ１に格納される場合において、最新の状態とは、その複数のデータのうちのホスト装置２００が最後に送ったデータの状態をいう。ホスト装置２００が最後に送ったデータがガベージコレクションによって複製された場合には、複製によって最後に生成されたデータの状態が最新の状態である。無効なデータとは、前記複数のデータのうちの、ホスト装置２００によって最後に送られかつ最後にNANDメモリ１にプログラムされたデータを除く、データをいう。
【００７０】
なお、コードレートの変更は、任意のタイミングで実行され得る。一例では、ある使用中のブロックについてコードレートの変更が決定された場合、当該ブロックに対してガベージコレクションがなされた後で、かつ、当該ブロックが次に使用されるまでの間に、当該ブロックにかかるコードレートが変更される。コードレートの変更が決定された使用中のブロックは、空のページがなくなるまで、変更前のコードレートで符号化されたデータがプログラムされる。
【００７１】
図９は、第１の実施形態のメモリシステム１００の動作を説明するフローチャートである。まず、第１処理部２４１は、一つのブロックを選択する（Ｓ１０１）。選択の基準は特定の基準に限定されない。また、選択のタイミングは、特定のタイミングに限定されない。一例では、第１処理部２４１は、ＮＡＮＤメモリ１に具備される各ブロックを順番に選択してもよい。また、第１処理部２４１は、所定の時間間隔でブロックを選択してもよい。Ｓ１０１の処理で選択されたブロックを、図９の説明において、対象ブロックと表記する。
【００７２】
続いて、第１処理部２４１は、コードレート情報２２３から、対象ブロックの現在のコードレートを取得する（Ｓ１０２）。取得された現在のコードレートは、ＥＣＣ回路２５に送られる。
【００７３】
続いて、第１処理部２４１は、電圧情報２２１の先頭のレコードを取得する（Ｓ１０３）。なお、ここでは、電圧情報２２１の先頭から順番にレコードが取得されることとしているが、取得の順番はこれに限定されない。
【００７４】
第１処理部２４１は、対象ブロックに対し、取得したレコードに記録されている電圧値をリード電圧として設定してシフトリードを実行する（Ｓ１０４）。Ｓ１０４の処理において、リードの位置は、特定の位置に限定されない。例えば第１処理部２４１は、予め決められたページからデータをリードする。第１処理部２４１は、アッパーページからデータをリードしてもよいし、ロアーページからデータをリードしてもよいし、アッパーページとロアーページとの両方からデータをリードしてもよい。第１処理部２４１は、対象ブロックに格納されている全データをリードしてもよい。第１処理部２４１は、リードの位置を所定の基準に基づいて決定してもよい。
【００７５】
ＥＣＣ回路２５は、現在のコードレートを適用して、Ｓ１０４によってＮＡＮＤメモリ１からメモリコントローラ２に出力されたデータに対してエラー訂正を実行する（Ｓ１０５）。第１処理部２４１は、エラービットの数を取得する（Ｓ１０６）。エラービットの数を出力できる符号化方式（例えばＢＣＨ符号）が採用される場合には、第１処理部２４１は、エラービットの数をＥＣＣ回路２５から取得し得る。別の例では、第１処理部２４１は、エラー訂正の前のデータとエラー訂正の後のデータとを比較することによって、エラービットの数を取得し得る。第１処理部２４１は、エラービットの数を、リード電圧として使用された値と対応付けて、例えばＲＡＭ２２などに記憶する。
【００７６】
続いて、第１処理部２４１は、未取得のレコードが残っているか否かを判定する（Ｓ１０７）。未取得のレコードが残っている場合（Ｓ１０７、Ｙｅｓ）、第１処理部２４１は、電圧情報２２１の後続のレコードを取得し（Ｓ１０８）、Ｓ１０４の処理を実行する。未取得のレコードが残っていない場合（Ｓ１０７、Ｎｏ）、第１処理部２４１は、シフトリード毎に記憶されたエラービットの数のうちから、エラービットの数の最小値を演算する（Ｓ１０９）。Ｓ１０９の処理によって取得された、エラービットの数の最小値は、最適電圧値を用いてシフトリードされた場合のエラービットの数に該当する。
【００７７】
続いて、第１処理部２４１は、対象ブロックのコードレートの現在値と、エラービットの数の最小値と、判定情報２２２とに基づいて、対象ブロックにかかる次のコードレートを決定する（Ｓ１１０）。
【００７８】
続いて、第１処理部２４１は、現在のコードレートと次のコードレートとが異なっているか否かを判定する（Ｓ１１１）。現在のコードレートと次のコードレートとが異なっている場合（Ｓ１１１、Ｙｅｓ）、第１処理部２４１は、対象ブロックのコードレートを次のコードレートに変更することを決定し（Ｓ１１２）、動作が終了する。現在のコードレートと次のコードレートとが等しい場合（Ｓ１１１、Ｎｏ）、第１処理部２４１は、対象ブロックのコードレートを変更しないことを決定し（Ｓ１１３）、動作が終了する。コードレートの変更は、第２処理部２４２が、対象ブロックに対してガベージコレクションを実行した後、かつ対象ブロックに使用される前に、実行される。コードレートの変更は、例えば第１処理部２４１がコードレート情報２２３の対象ブロックにかかるレコードを更新することによって、実行される。
【００７９】
このように、第１の実施形態によれば、メモリコントローラ２は、コードレートが可変の方式でデータを符号化し、符号化されたデータをＮＡＮＤメモリ１のブロックに格納する。そして、メモリコントローラ２は、それぞれ異なる電圧値を順次、リード電圧として設定し、シフトリードを実行する（Ｓ１０３〜Ｓ１０８）。そして、メモリコントローラ２は、シフトリードの結果に応じてコードレートを減少させる（Ｓ１０９〜Ｓ１１３）。この構成により、メモリコントローラ２は、最適電圧値をリード電圧として用いた場合のエラーの発生状況を考慮してコードレートを制御することができるので、コードレートを必要以上に減少させることを抑制することが可能となる。即ち、メモリシステム１００は、コードレートを効率的に制御することができる。
【００８０】
また、メモリコントローラ２は、それぞれ異なる電圧値を設定してシフトリードする毎に、リードされたデータに含まれるエラービットの数を取得し（Ｓ１０５、Ｓ１０６）、取得されたエラービットの数の最小値を選択し（Ｓ１０９）、コードレートを減少させるか否かをエラービットの数の最小値に基づいて判定する（Ｓ１１０〜Ｓ１１３）。この構成により、メモリコントローラ２は、最適電圧値をリード電圧として用いた場合のエラーの発生状況を考慮してコードレートを制御することができる。
【００８１】
（第２の実施形態）
リード電圧の最適値は、メモリセルの分布が極小となるしきい値電圧の付近に存在すると考えられる。第２の実施形態では、第１処理部２４１は、メモリセルの分布が極小となるしきい値電圧を測定し、測定された電圧値を最適電圧値とみなす。メモリセルの分布が極小となるしきい値電圧を測定する手法として、第２の実施形態では、Ｖｔｈトラッキングと呼ばれる手法が採用される。Ｖｔｈトラッキングによれば、メモリセルの分布が測定される。なお、メモリセルの分布が極小となるしきい値電圧の測定の手法は、Ｖｔｈトラッキングだけに限定されない。
【００８２】
図１０は、Ｖｔｈトラッキングを説明するための図である。図１０の上段のグラフは、メモリセルの分布の一例を示している。Ｖｔｈトラッキングによれば、対応するデータ値が異なる分布間で裾野が重なる場合、複数の分布が重なる範囲のリード電圧においては、重なっている複数の分布に属するメモリセルの数の合計が得られる。即ち、図１０の上段のグラフの例では、隣接する分布間で裾野が重なっている範囲のリード電圧においては、一点鎖線によって示される形状が測定によって得られる。
【００８３】
Ｖｔｈトラッキングにおいては、リード電圧の設定値を変化させながら２値モードでシフトリードが実行され、各シフトリードによって得られたデータに含まれる“１”または“０”の数がカウントされる。２値モードとは、しきい値電圧がリード電圧よりも小さいメモリセルは、第１のデータ値を記憶していると判定し、しきい値電圧がリード電圧よりも大きいメモリセルは、第１のデータ値と異なる第２のデータ値を記憶していると判定するモードである。ここでは一例として、“１”を第１のデータ値とし、“０”を第２のデータ値とし、“１”の数がカウントされることとする。カウントされた“１”の数をリード電圧に対してプロットすると、図１０の下段に示される曲線が得られる。
【００８４】
続いて、“１”の数の変化率が演算される。“１”の数の変化率とは、リード電圧を所定単位量だけ変化させた場合の“１”の数の変化量である。リード電圧に対して変化率をプロットすると、しきい値電圧に対するメモリセルの分布（即ち図１０の上段に示される曲線）の近似が得られる。
【００８５】
第２の実施形態では、一例として、第１処理部２４１は、Ｖｔｈトラッキングにおいて、リード電圧の設定値をＶｓｔｅｐずつ増加させながらシフトリードを実行する。そして、第１処理部２４１は、変化率として、リード電圧をＶｓｔｅｐだけ増加させた際の“１”の数の変化量を演算する。そして、第１処理部２４１は、変化量が極小となるリード電圧を、最適電圧値として決定する。図１０の例では、Ｖ１、Ｖ２、およびＶ３が最適電圧値に該当する。
【００８６】
なお、第１処理部２４１は、Ｖｔｈトラッキングにおいて、リード電圧の設定値をＶｓｔｅｐずつ増加させながら複数回のシフトリードを実行する。リード電圧の変更範囲は、メモリセルのしきい値電圧がとりうる全範囲をカバーしていてもよいし、特定の電圧値の付近の範囲だけをカバーしていてもよい。
【００８７】
また、第１処理部２４１は、“１”の数の代わりに“０”の数をカウントするようにしてもよい。その場合には、第１処理部２４１は、“０”の数の変化量の絶対値を演算することによって、しきい値電圧に対するメモリセルの分布の近似を得ることができる。
【００８８】
図１１は、第２の実施形態のメモリシステム１００の動作の一例を説明するフローチャートである。ここでは説明を簡単にするために、第１処理部２４１は、ロアーページに格納されているデータに基づいてコードレートの制御を実行することとする。即ち、第１処理部２４１は、コードレートの制御の一環として、リード電圧Ｖ＿ＡＢに関する最適電圧値Ｖ＿ＡＢ＿ＯＰＴを演算する。
【００８９】
まず、第１処理部２４１は、一つのブロックを選択する（Ｓ２０１）。第１の実施形態と同様に、選択の基準は特定の基準に限定されない。また、選択のタイミングは、特定のタイミングに限定されない。Ｓ２０１の処理で選択されたブロックを、図１１の説明においては、対象ブロックと表記する。
【００９０】
続いて、第１処理部２４１は、Ｖｔｈトラッキングを開始する。具体的には、第１処理部２４１は、まず、対象ブロックに対し、リード電圧としてＶｔｈトラッキングにおける電圧値の変更範囲のうちの最小値を用いて、２値モードでのシフトリードを実行する（Ｓ２０２）。対象ブロック内のリード位置は、特定の位置に限定されない。電圧値の変更範囲は、例えば、リード電圧Ｖ＿ＡＢの付近をカバーする範囲である。
【００９１】
Ｓ２０２の処理の後、第１処理部２４１は、ＮＡＮＤメモリ１からメモリコントローラ２に出力されたデータに含まれる“１”の数をカウントする（Ｓ２０３）。第１処理部２４１は、カウント値を例えばＲＡＭ２２などに記憶しておく。
【００９２】
続いて、第１処理部２４１は、リード電圧の設定値をＶｓｔｅｐだけ増加させて、２値モードでのシフトリードを実行する（Ｓ２０４）。第１処理部２４１は、ＮＡＮＤメモリ１からメモリコントローラ２に出力されたデータに含まれる“１”の数をカウントする（Ｓ２０５）。そして、第１処理部２４１は、今回のシフトリードの際に得られた“１”の数から前回のシフトリードの際に得られた“１”の数を減算することによって、“１”の数の変化量を演算する（Ｓ２０６）。第１処理部２４１は、演算した変化量を、今回のシフトリードにおいてリード電圧として使用した設定値と対応づけて例えばＲＡＭ２２などに記憶しておく。なお、第１処理部２４１は、演算した変化量を前回のシフトリードにおいてリード電圧として使用した電圧値と対応づけてもよい。
【００９３】
続いて、第１処理部２４１は、リード電圧の設定値が変更範囲の上限に至ったか否かを判定する（Ｓ２０７）。リード電圧の設定値が変更範囲の上限に至っていない場合（Ｓ２０７、Ｎｏ）、第１処理部２４１は、ステップＳ２０４の処理を実行する。
【００９４】
リード電圧の設定値が変更範囲の上限に至った場合（Ｓ２０７、Ｙｅｓ）、第１処理部２４１は、記憶している複数の変化量に基づいて、最適電圧値を決定する（Ｓ２０８）。一例では、第１処理部２４１は、記憶している複数の変化量のうちから極小値を選択し、選択した極小値に対応づけられている電圧値を、最適電圧値として決定する。
【００９５】
続いて、第１処理部２４１は、コードレート情報２２３から、対象ブロックの現在のコードレートを取得する（Ｓ２０９）。取得された現在のコードレートは、ＥＣＣ回路２５に送られる。そして、第１処理部２４１は、最適電圧値Ｖ＿ＡＢ＿ＯＰＴを用いてロアーページのリードを実行する（Ｓ２１０）。ＥＣＣ回路２５は、現在のコードレートを適用して、ＮＡＮＤメモリ１からメモリコントローラ２に出力されたデータに対してエラー訂正を実行する（Ｓ２１１）。第１処理部２４１は、エラービットの数を取得する（Ｓ２１２）。
【００９６】
続いて、第１処理部２４１は、対象ブロックの現在のコードレートと、エラービットの数と、判定情報２２２とに基づいて、対象ブロックにかかる次のコードレートを決定する（Ｓ２１３）。
【００９７】
続いて、第１処理部２４１は、現在のコードレートと次のコードレートとが異なっているか否かを判定する（Ｓ２１４）。現在のコードレートと次のコードレートとが異なっている場合（Ｓ２１４、Ｙｅｓ）、第１処理部２４１は、対象ブロックのコードレートを次のコードレートに変更することを決定し（Ｓ２１５）、動作が終了する。現在のコードレートと次のコードレートとが等しい場合（Ｓ２１４、Ｎｏ）、第１処理部２４１は、対象ブロックのコードレートを変更しないことを決定し（Ｓ２１６）、動作が終了する。
【００９８】
なお、以上では、第１処理部２４１は、ロアーページに格納されているデータに基づいてコードレートの制御を実行する例について説明した。第１処理部２４１は、任意のページに格納されているデータに基づいてコードレートの制御を実行し得る。
【００９９】
例えば、第１処理部２４１は、アッパーページに格納されているデータに基づいてコードレートの制御を実行する。その場合には、第１処理部２４１は、Ｓ２０２〜Ｓ２０８の処理を、リード電圧Ｖ＿ＥＡおよびリード電圧Ｖ＿ＢＣのそれぞれについて実行することによって、リード電圧Ｖ＿ＥＡに関する最適電圧値Ｖ＿ＥＡ＿ＯＰＴとリード電圧Ｖ＿ＢＣに関する最適電圧値Ｖ＿ＢＣ＿ＯＰＴとを演算する。そして、第１処理部２４１は、Ｓ２１０において、最適電圧値Ｖ＿ＥＡ＿ＯＰＴおよび最適電圧値Ｖ＿ＢＣ＿ＯＰＴを用いてアッパーページのリードを実行する。
【０１００】
別の例では、第１処理部２４１は、アッパーページに格納されているデータとロアーページに格納されているデータの両方に基づいてコードレートの制御を実行する。その場合には、第１処理部２４１は、Ｓ２０２〜Ｓ２０８の処理を、リード電圧Ｖ＿ＥＡ、リード電圧Ｖ＿ＡＢおよびリード電圧Ｖ＿ＢＣのそれぞれについて実行することによって、最適電圧値Ｖ＿ＥＡ＿ＯＰＴ、最適電圧値Ｖ＿ＡＢ＿ＯＰＴおよび最適電圧値Ｖ＿ＢＣ＿ＯＰＴを演算する。
【０１０１】
このように、第２の実施形態によれば、メモリコントローラ２は、それぞれ異なる電圧値を順次、リード電圧として設定し、リード電圧を変更する毎にシフトリードを実行して電圧値毎にデータを取得する（Ｓ２０４）。そして、メモリコントローラ２は、取得されたデータに基づいて最適電圧値を推定する（Ｓ２０３、Ｓ２０５、Ｓ２０６、Ｓ２０８）。ここで、メモリセルの分布が谷を形成する電圧値が、最適電圧値に該当する。メモリコントローラ２は、最適電圧値をリード電圧として設定してリードを実行し（Ｓ２１０）、リードされたデータに含まれるエラービットの数を取得する（Ｓ２１１、Ｓ２１２）。そして、メモリコントローラ２は、コードレートを減少させるか否かを、取得されたエラービットの数に基づいて判定する（Ｓ２１３〜Ｓ２１６）。この構成により、メモリコントローラ２は、最適電圧値をリード電圧として用いた場合のエラーの発生状況を考慮してコードレートを制御することができる。
【０１０２】
なお、第２の実施形態においても、第１の実施形態と同様に、現在のコードレートに対し、３以上の判定しきい値が取得可能に判定情報２２２が構成されてもよい。また、現在のコードレートに対し、一つの判定しきい値が取得可能に判定情報２２２が構成されてもよい。また、各判定しきい値は、現在のコードレートによって得られる訂正能力にマージンを加算した値であってもよい。
【０１０３】
（第３の実施形態）
メモリセルの分布が極小となるリード電圧を使用する場合においては、分布の極小値が小さいほど、エラービットの数が少ない。また、極小値付近の分布の勾配がなだらかであるほど、分布の経時変化（ズレ）に対するエラービットの数の変化が小さい。即ち、分布に関し、極小値が小さく、かつ極小値の付近の勾配がなだらかであれば、エラービットの数およびエラービットの数の経時変化量を抑制できると考えられる。
【０１０４】
第３の実施形態では、第１処理部２４１は、極小値と極小値の付近の勾配との両方に対応する量として、メモリセルの分布が極小となるリード電圧の電圧値（最適電圧値）を含む所定の範囲にしきい値電圧が含まれるメモリセルの数をカウントする。
【０１０５】
図１２は、カウント対象のメモリセルの数の分布を説明するための図である。本図は、一例として、分布Ａと分布Ｂとを示している。また、本図の例では、分布Ａと分布Ｂとの合計の量が極小となる電圧値（リード電圧Ｖ＿ＡＢに関する最適電圧値Ｖ＿ＡＢ＿ＯＰＴ）を中心とする２×ｄＶの範囲にしきい値電圧があるメモリセルの数（本図の斜線部４００の面積に相当）が、カウント対象とされる。Ｖ＿ＡＢ＿ＯＰＴを中心とする２×ｄＶの範囲にしきい値電圧があるメモリセルの数は、Ｖ＿ＡＢ＿ＯＰＴ＋ｄＶおよびＶ＿ＡＢ＿ＯＰＴ−ｄＶをそれぞれリード電圧として２値モードでのシフトリードを行った場合にリードされる２つのデータに含まれる“０”または“１”の数の差を演算することによって得られる。なお、範囲の設定方法は、上記の方法だけに限定されない。以降、カウント対象のメモリセルを、対象メモリセルと表記する。
【０１０６】
第１処理部２４１は、対象メモリセルの数と判定しきい値とを比較する。対象メモリセルの数が判定しきい値より大きい場合に、第１処理部２４１は、コードレートを減少させることを決定する。また、第１処理部２４１は、対象メモリセルの数が判定しきい値より小さい場合には、コードレートを変更しないことを決定する。対象メモリセルの数が判定しきい値と等しい場合はいずれかに決定する。
【０１０７】
なお、第３の実施形態においても、第１および第２の実施形態と同様に、現在のコードレートに対して複数の判定しきい値が設定される。また、各判定しきい値は、現在のコードレートが減少するに応じて大きくなる。ここでは、判定情報２２２が使用されることとする。ただし、判定情報２２２のセルに記録される判定しきい値は、対象メモリセルの数にかかるしきい値である。
【０１０８】
なお、第３の実施形態においても、第１および第２の実施形態と同様に、現在のコードレートに対し、３以上の判定しきい値が取得可能に判定情報２２２が構成されてもよい。また、現在のコードレートに対し、一つの判定しきい値が取得可能に判定情報２２２が構成されてもよい。また、各判定しきい値は、現在のコードレートによって得られる訂正能力にマージンを加算した値であってもよい。
【０１０９】
また、第１処理部２４１は、リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣのうちの一部または全部について、対象メモリセルの数をカウントし得る。第１処理部２４１は、リード電圧Ｖ＿ＥＡ〜Ｖ＿ＢＣのうちの複数について対象メモリセルの数をカウントし、コードレートを減少させることを、得られた各カウント値に基づく値（例えば平均値、最大値、または合計値）と判定しきい値とに基づいて決定してもよい。ここでは一例として、第１処理部２４１は、リード電圧Ｖ＿ＡＢについて対象メモリセルの数をカウントし、コードレートを減少させることを、カウント値に基づいて決定することとする。
【０１１０】
また、第３の実施形態では、第１処理部２４１は、第２の実施形態と同様の手法（即ちＶｔｈトラッキング）によってメモリセルの分布が極小となる電圧値（即ち最適電圧値）を推定する。最適電圧値の演算方法はこれに限定されない。
【０１１１】
また、第３の実施形態では、第１の実施形態と同様に、第１処理部２４１は判定情報２２２に基づいて次のコードレートを決定する、として説明する。ただし、判定情報２２２には、エラービットの数にかかる判定しきい値に代えて、対象メモリセルの数にかかる判定しきい値が予め記録される。
【０１１２】
また、コードレートは、第１の実施形態と同様に、任意のタイミングで変更され得る。
【０１１３】
図１３は、第３の実施形態のメモリシステム１００の動作を説明するフローチャートである。第１処理部２４１は、Ｓ３０１〜Ｓ３０８において、図１１のＳ２０１〜Ｓ２０８と同様の処理を実行することによって、最適電圧値Ｖ＿ＡＢ＿ＯＰＴを推定する。
【０１１４】
続いて、第１処理部２４１は、（Ｖ＿ＡＢ＿ＯＰＴ＋ｄＶ）をリード電圧として用いて２値モードでのシフトリードを実行する（Ｓ３０９）。なお、（Ｖ＿ＡＢ＿ＯＰＴ＋ｄＶ）は、範囲の上限値に該当する。第１処理部２４１は、ＮＡＮＤメモリ１からメモリコントローラ２に出力されたデータに含まれる“１”の数をカウントし、この値をＡとする（Ｓ３１０）。第１処理部２４１は、カウント値を例えばＲＡＭ２２などに記憶しておく。
【０１１５】
続いて、第１処理部２４１は、（Ｖ＿ＡＢ＿ＯＰＴ−ｄＶ）をリード電圧として用いて２値モードでのシフトリードを実行する（Ｓ３１１）。なお、（Ｖ＿ＡＢ＿ＯＰＴ−ｄＶ）は、範囲の下限値に該当する。第１処理部２４１は、ＮＡＮＤメモリ１からメモリコントローラ２に出力されたデータに含まれる“１”の数をカウントし、この値をＢとする（Ｓ３１２）。そして、第１処理部２４１は、カウント値Ａとカウント値Ｂとの差分｜Ａ−Ｂ｜を演算する（Ｓ３１３）。Ｓ３１３の処理によって得られる値は、対象メモリセルの数に該当する。
【０１１６】
続いて、第１処理部２４１は、コードレート情報２２３から、対象ブロックの現在のコードレートを取得する（Ｓ３１４）。そして、第１処理部２４１は、対象ブロックの現在のコードレートと、対象メモリセルの数と、判定情報２２２とに基づいて、対象ブロックにかかる次のコードレートを決定する（Ｓ３１５）。
【０１１７】
続いて、第１処理部２４１は、現在のコードレートと次のコードレートとが異なっているか否かを判定する（Ｓ３１６）。現在のコードレートと次のコードレートとが異なっている場合（Ｓ３１６、Ｙｅｓ）、第１処理部２４１は、対象ブロックのコードレートを次のコードレートに変更することを決定し（Ｓ３１７）、動作が終了する。現在のコードレートと次のコードレートとが等しい場合（Ｓ３１６、Ｎｏ）、第１処理部２４１は、対象ブロックのコードレートを変更しないことを決定し（Ｓ３１８）、動作が終了する。
【０１１８】
以上では、第１処理部２４１は、リード電圧Ｖ＿ＡＢをコードレートの制御に使用する例を説明した。第１処理部２４１は、任意のリード電圧をコードレートの制御に使用してもよい。
【０１１９】
また、リード電圧毎に異なる判定情報２２２が用意され、第１処理部２４１は、コードレートの制御に使用するリード電圧に対応する判定情報２２２を使用してもよい。ロアーページの場合、しきい値電圧がリード電圧Ｖ＿ＡＢをまたいで変化したビットがエラーとして検出される。これに対して、アッパーページの場合、しきい値電圧がリード電圧Ｖ＿ＥＡをまたいで変化したビットと、しきい値電圧がリード電圧Ｖ＿ＢＣをまたいで変化したビットとの両方が、エラーとして検出される。したがって、しきい値電圧の変化がＲＢＥＲに与える影響は、ロアーページよりもアッパーページのほうが大きいかもしれない。このことを考慮して、例えば、リード電圧Ｖ＿ＥＡ、リード電圧Ｖ＿ＢＣに対応する判定情報２２２には、リード電圧Ｖ＿ＡＢに対応する判定情報２２２に比べて、厳しい基準に基づいて判定しきい値が設定される。即ち、リード電圧Ｖ＿ＥＡ、リード電圧Ｖ＿ＢＣに対応する判定情報２２２に記録されている各判定しきい値は、リード電圧Ｖ＿ＡＢに対応する判定情報２２２よりも小さい。なお、リード電圧毎の判定しきい値の大小関係はこれに限定されない。
【０１２０】
このように、第３の実施形態によれば、メモリコントローラ２は、最適電圧値を含む範囲にしきい値電圧があるメモリセルの数をカウントし（Ｓ３０９〜Ｓ３１３）、コードレートを減少させるか否かをカウント値に基づいて判定する（Ｓ３１５〜Ｓ３１８）。この構成により、最適電圧値をリード電圧として用いた場合のエラービットの数と、分布の経時変化に応じたエラービットの増加量と、の両方を考慮してコードレートを制御することができるので、コードレートを必要以上に減少させることを抑制することが可能となる。
【０１２１】
なお、メモリコントローラ２は、範囲の上限値をリード電圧に設定してシフトリードを実行し（Ｓ３０９）、範囲の下限値をリード電圧に設定してシフトリードを実行する（Ｓ３１１）。そして、メモリコントローラ２は、各シフトリードによって得られたデータに基づいて、範囲にしきい値電圧があるメモリセルの数をカウントする（Ｓ３１０、Ｓ３１２、Ｓ３１３）。対象メモリセルの数の取得方法は、これに限定されない。例えば、範囲の下限値を先に、範囲の上限値を後に、設定してもよい。
【０１２２】
（第４の実施形態）
第１〜第３の実施形態においては、コードレートの変更の判定は、任意のタイミングで実行可能であるとして説明した。第４の実施形態では、コードレートの変更の判定の実行タイミングに条件を設定する例を説明する。前述したように、データがプログラムされてからの経過時間に応じてデータの値が変化する。ここでは、データがプログラムされてからの経過時間に関して条件が設定される。データがプログラムされてからの経過時間に関して条件を設けることによって、メモリセルの疲弊に応じたコードレートの変更をより正確に実行することが可能となる。
【０１２３】
具体的には、第１処理部２４１は、データがプログラムされてから設定時間が経過した後、コードレートの変更の判定を行う。第１処理部２４１は、ホスト装置２００から送られてきたデータがプログラムされた後、当該データを用いてコードレートの変更の判定を実行してもよい。ここでは、応答性能への支障を低減するために、第１処理部２４１は、フリーブロックから判定の対象のブロック（第４の実施形態の説明において、対象ブロック）を選択する。そして、第１処理部２４１は、対象ブロックに対し、イレースとデータのプログラミングとを実行し、その後、当該データを用いてコードレートの変更の判定を実行する。第１処理部２４１は、対象ブロックの選択からコードレートの変更の判定までの処理を、任意のタイミングで実行することができる。第１処理部２４１は、例えば、ホスト装置２００からのアクセス要求を処理していない間に、対象ブロックの選択からコードレートの変更の判定までの処理を実行することができる。
【０１２４】
また、第１処理部２４１は、対象ブロックを、Ｐ／Ｅサイクルの実行回数に応じて選択する。Ｐ／Ｅサイクルの実行回数は、例えばブロック毎に、イレースの回数として記録されている。第１処理部２４１は、イレースの回数が所定数に達したフリーブロックを、対象ブロックとして選択する。なお、例えば複数のブロック毎に一括してイレースが実行される場合など、イレースの単位がブロックではない場合、コードレートの変更の単位はブロックに限定されない。一括にイレースが実行される複数のブロックが、一括して対象ブロックとして選択されてもよい。第４の実施形態においては、第１処理部２４１は、それぞれのブロックを、イレース回数が１０００回に達する毎に対象ブロックとして選択することとする。
【０１２５】
図１４は、第４の実施形態のメモリシステム１００の動作を説明するフローチャートである。まず、第２処理部２４２は、ガベージコレクションを実行する（Ｓ４０１）。ガベージコレクションの実行のタイミングは、特定のタイミングに限定されない。ガベージコレクションによってデータ（少なくとも有効なデータ）の移動が実行される。第２処理部２４２は、データの移動元のブロックを、フリーブロックとして管理する。例えば、第２処理部２４２は、データの移動元のブロックを、フリーブロックプールに登録する。
【０１２６】
続いて、第１処理部２４１は、ガベージコレクションによってフリーブロックとなったブロック（対象ブロック）を選択する（Ｓ４０２）。そして、第１処理部２４１は、対象ブロックに対するイレースの回数が１０００の倍数であるか否かを判定する（Ｓ４０３）。対象ブロックに対するイレースの回数が１０００の倍数ではない場合（Ｓ４０３、Ｎｏ）、動作が終了する。
【０１２７】
対象ブロックに対するイレースの回数が１０００の倍数である場合（Ｓ４０３、Ｙｅｓ）、第１処理部２４１は、対象ブロックに対してイレースを実行し（Ｓ４０４）、対象ブロックにデータをプログラムする（Ｓ４０５）。Ｓ４０５の処理においてプログラムされるデータは、特定のデータに限定されない。任意のデータがプログラム可能である。データは、ＥＣＣ回路２５によって符号化された後にプログラムされる。Ｓ４０４は、対象ブロックが既にイレースされていればスキップされる。
【０１２８】
Ｓ４０５の処理の後、第１処理部２４１は、設定時間の経過を待ち（Ｓ４０６）、Ｓ４０５の処理によってデータがプログラムされたブロックについて、次のコードレートを演算する（Ｓ４０７）。次のコードレートの演算方法は、特定の方法に限定されない。次のコードレートの演算方法としては、例えば第１〜第３の実施形態のいずれかの方法が採用可能である。例えば、第１の実施形態が適用される場合には、第１処理部２４１は、図９のＳ１０２〜Ｓ１１０の処理を実行することによって、次のコードレートを演算する。
【０１２９】
続いて、第１処理部２４１は、現在のコードレートと次のコードレートとが異なっているか否かを判定する（Ｓ４０８）。現在のコードレートと次のコードレートとが異なっている場合（Ｓ４０８、Ｙｅｓ）、第１処理部２４１は、対象ブロックのコードレートを次のコードレートに変更することを決定し（Ｓ４０９）、動作が終了する。現在のコードレートと次のコードレートとが等しい場合（Ｓ４０８、Ｎｏ）、第１処理部２４１は、対象ブロックのコードレートを変更しないことを決定し（Ｓ４１０）、動作が終了する。
【０１３０】
このように、第４の実施形態によれば、メモリコントローラ２は、データをプログラム（格納）してからの経過時間が設定時間に達するに応じて、コードレートの変更の判定を開始する。これにより、データがプログラムされてからの経過時間に関して条件が設定されない場合に比べて、メモリセルの疲弊に応じたコードレートの変更をより正確に実行することが可能となる。なお、メモリコントローラ２は、データをプログラムしてからすぐ、コードレートの変更の判定を開始してもよく、その場合であっても、データがプログラムされてからの経過時間に関して条件が設定されない場合に比べて、メモリセルの疲弊に応じたコードレートの変更をより正確に実行することが可能となる。
【０１３１】
また、メモリコントローラ２は、イレースの回数が設定回数に達した場合、コードレートの変更の判定用にデータをプログラムし、コードレートの変更の判定を開始する。これにより、コードレートの変更の判定のためにデータをプログラムする回数を低減することができるので、コードレートの変更の判定のためにＰ／Ｅサイクルが増加することを抑制することができる。
【０１３２】
（第５の実施形態）
第１および第２の実施形態によれば、最適電圧値が推定され、推定された最適電圧値を用いてリードされたデータに含まれるエラービットの数が所定条件を満たした場合に、コードレートが減少せしめられる。第３の実施形態によれば、最適電圧値が推定され、しきい値電圧が最適電圧値を含む範囲にあるメモリセルの数が所定条件を満たした場合に、コードレートが減少せしめられる。コードレートの変更の判断の基準は、これらだけに限定されない。
【０１３３】
例えば、第１処理部２４１は、電圧情報２２１の各レコードに記録されている値を順次リード電圧として適用しながら、複数のシフトリードを行う。そして、第１処理部２４１は、電圧情報２２１の特定のレコードに記録されている値をリード電圧として適用した場合にしかエラー訂正に成功しない場合、コードレートを減少させることを決定する。
【０１３４】
別の例では、電圧情報２２１の各レコードは、各リード電圧をそれぞれ異なる座標成分とする座標空間にできるだけ均一に分散するように、各リード電圧の値が記録される。図１５は、各レコードに記録された値を、Ｖ＿ＥＡとＶ＿ＢＣとを座標成分とする平面座標にプロットしたグラフである。ここでは説明を簡単にするために、Ｖ＿ＡＢを省略する。図１５の例によれば、各ポイントが渦巻き（spiral）状に分布するように、Ｖ＿ＥＡの電圧値とＶ＿ＢＣの電圧値とが設定される。エラー訂正が成功するポイントは、一塊の領域内に分布する。領域５００は、エラー訂正が成功するポイントを含み、かつ、エラー訂正が失敗するポイントを含まない領域である。領域５００は、メモリセルの疲弊が進行するにしたがって小さくなる。このように、ポイントが略均一に分散する場合、領域５００の面積は、エラー訂正が成功するレコードの数と正の相関関係を有する。即ち、メモリセルの疲弊が進行するに従って、エラー訂正が成功するポイントの数が減少する。第１処理部２４１は、電圧情報２２１の各レコードに記録されている値を順次リード電圧として適用しながら、シフトリードを行う。そして、第１処理部２４１は、エラー訂正が成功したレコードの数が、判定しきい値を下回った場合に、コードレートを減少させることを決定する。第１〜第３の実施形態と同様に、コードレート毎に複数の判定しきい値が設定されてもよい。また、判定しきい値は、コードレートの減少に応じて変更されてもよいし、固定されてもよい。
【０１３５】
さらなる別の例では、第１処理部２４１は、レコードの数の代わりに、領域５００の略中心から端までの距離を、図１５の領域５００の大きさに対応する量として使用する。第１処理部２４１は、第１の実施形態の場合と同様に、レコード毎にシフトリードを実行することで、エラービットの数が最小となるレコードを演算する。エラービットの数が最小となるレコードに記録された値は、領域５００の略中心のポイントに対応する。そして、第１処理部２４１は、領域５００の端に位置するポイントと、領域５００の略中心のポイントと、の間の、座標空間上の距離を演算する。第１処理部２４１は、距離が判定しきい値を下回った場合に、コードレートを減少させることを決定する。第１〜第３の実施形態と同様に、コードレート毎に複数の判定しきい値が設定されてもよい。また、判定しきい値は、コードレートの減少に応じて変更されてもよいし、固定されてもよい。
【０１３６】
領域５００の端に位置するポイントは、任意の方法で特定可能である。例えば第１処理部２４１は、ポイントＰ０が示す各値をリード電圧の初期値とし、点線で接続されたポイントの順番でリード電圧を設定する。つまり、ポイントＰ０、ポイントＰ１、ポイントＰ２の順番で、リード電圧の各値が電圧情報２２１に記録されている。図１５の例では、ポイントＰ０〜ポイントＰ４まではエラー訂正が失敗し、ポイントＰ５で初めてエラー訂正が成功する。第１処理部２４１は、初めてエラー訂正が成功するポイントＰ５を、領域５００の端に位置するポイントとして特定することができる。
【０１３７】
さらなる別の例では、第１処理部２４１は、基準値をリード電圧に適用して複数回（例えば２回）、シフトリードを実行する。基準値は、前述のように、例えばメモリチップ１１に予め記録されている。または、第１処理部２４１は、必要が生じるたびに、基準値をメモリチップ１１に送信してもよい。基準値を用いた複数回のシフトリードのうちの一度もエラー訂正に成功しない場合、第１処理部２４１は、コードレートを減少させることを決定する。
【０１３８】
さらなる別の例では、第１処理部２４１は、基準値と、基準値以外のある値（例えば電圧情報２２１に記録されている複数の値のうちの何れかの値）と、をそれぞれリード電圧に適用して複数回、シフトリードを実行する。そして、複数回のシフトリードのうちの一度もエラー訂正に成功しない場合、第１処理部２４１は、コードレートを減少させることを決定する。
【０１３９】
さらなる別の例では、第１処理部２４１は、電圧情報２２１に記録されている値を、先頭のレコードから順番に適用しながらシフトリードを実行する。例えば図１５のポイントＰ０を初期値としてＰ１、Ｐ２、Ｐ３の順番で各値をリード電圧に適用する。所定段目のレコードまで適用してもエラー訂正に成功しない場合、第１処理部２４１は、コードレートを減少させることを決定する。
【０１４０】
このように、コードレートの変更の判断の基準として、種々の基準が適用可能である。
【０１４１】
（第６の実施形態）
図１６は、メモリシステム１００の実装例を示す図である。メモリシステム１００は、例えばサーバシステム１０００に実装される。サーバシステム１０００は、ディスクアレイ２０００とラックマウントサーバ３０００とが通信インタフェース４０００によって接続されている。通信インタフェース４０００の規格としては任意の規格が採用可能である。ラックマウントサーバ３０００は、ラックを備えており、ラックには１以上のホスト装置２００がマウントされている。各ホスト装置２００は、通信インタフェース４０００を介してディスクアレイ２０００にアクセスすることができる。
【０１４２】
また、ディスクアレイ２０００は、ラックを備えており、ラックに１以上のメモリシステム１００がマウントされている。ディスクアレイ２０００は、メモリシステム１００の他に、１以上のハードディスクユニットがマウントされてもよい。各メモリシステム１００は、各ホスト装置２００からのアクセス要求を処理することができる。各メモリシステム１００は、第１〜第５の実施形態の構成が採用され得る。
【０１４３】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１４４】
１  ＮＡＮＤメモリ、２  メモリコントローラ、１１  メモリチップ、２１  ホストＩ／Ｆコントローラ、２２  ＲＡＭ、２３  ＮＡＮＤコントローラ、２４  ＣＰＵ、２５  ＥＣＣ回路、１００  メモリシステム、１１０  Ｉ／Ｏ信号処理回路、１１１  制御信号処理回路、１１２  チップ制御回路、１１３  コマンドレジスタ、１１４  アドレスレジスタ、１１５  カラムデコーダ、１１６  データレジスタ、１１７  センスアンプ、１１８  メモリセルアレイ、１１９  ロウデコーダ、１２０  ＲＹ／ＢＹ生成回路、２００  ホスト装置、２２１  電圧情報、２２２  判定情報、２２３  コードレート情報、２４１  第１処理部、２４２  第２処理部、３００  領域、３０１  領域、４００  斜線部、５００  領域、１０００  サーバシステム、２０００  ディスクアレイ、３０００  ラックマウントサーバ、４０００  通信インタフェース。
【図１】
2018045744.tif 000003
【図２】
2018045744.tif 000004
【図３】
2018045744.tif 000005
【図４】
2018045744.tif 000006
【図５】
2018045744.tif 000007
【図６】
2018045744.tif 000008
【図７】
2018045744.tif 000009
【図８】
2018045744.tif 000010
【図９】
2018045744.tif 000011
【図１０】
2018045744.tif 000012
【図１１】
2018045744.tif 000013
【図１２】
2018045744.tif 000014
【図１３】
2018045744.tif 000015
【図１４】
2018045744.tif 000016
【図１５】
2018045744.tif 000017
【図１６】
2018045744.tif 000018