(57)【要約】 【課題】メモリセルの閾値電圧の分布を正確に探索することが可能な半導体記憶装置を提供する。【解決手段】制御部１１ａは、複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、複数のメモリセルから閾値電圧毎にデータを読み出し、閾値電圧毎に読み出されたデータの差分データを求め、差分データより閾値電圧の分布の最小値を求め、最小値に基づき、最小値より小さな値の閾値電圧の範囲を求め、求めた閾値電圧の範囲の中央の電圧を読み出し電圧に設定する。【選択図】図１
2013122804.tif 000002
【特許請求の範囲】
【請求項１】
ｎ個（ｎは２以上の自然数）の閾値電圧の１つが設定されることによりデータを記憶する複数のメモリセルを有するメモリと、
前記メモリからデータを読み出す制御部と、
を具備し、
前記制御部は、前記複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、前記複数のメモリセルから閾値電圧毎にデータを読み出し、
前記閾値電圧毎に読み出されたデータの差分データを求め、
前記差分データより前記閾値電圧の分布の最小値を求め、
前記最小値に基づき、前記最小値より小さな値の閾値電圧の範囲を求め、
前記求めた閾値電圧の範囲の中央の電圧を読み出し電圧に設定することを特徴とする半導体記憶装置。
【請求項２】
前記制御部は、前記差分データを加重平均し、加重平均されたデータより前記閾値電圧の分布の最小値を求めることを特徴とする請求項１記載の半導体記憶装置。
【請求項３】
前記制御部は、前記最小値に基づき、前記最小値より小さな値の閾値電圧の範囲を求めるとき、前記最小値にマージンを加算して閾値を設定し、この閾値より小さな値の閾値電圧の範囲を求めることを特徴とする請求項２記載の半導体記憶装置。
【請求項４】
ｎ個（ｎは２以上の自然数）の閾値電圧の１つが設定されることによりデータを記憶する複数のメモリセルを有するメモリと、
前記メモリからデータを読み出す制御部と、
を具備し、
前記制御部は、前記複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、前記複数のメモリセルから閾値電圧毎にデータを読み出し、
前記閾値電圧毎に読み出されたデータの差分データを求め、
前記差分データより前記閾値電圧の分布の最大値を求め、
前記最大値に基づき、前記最大値より大きな値の閾値電圧の範囲を求め、
前記求めた閾値電圧の範囲の中央の電圧を読み出し電圧に設定することを特徴とする半導体記憶装置。
【請求項５】
前記制御部は、前記差分データを加重平均し、加重平均されたデータより前記閾値電圧の分布の最大値を求めることを特徴とする請求項４記載の半導体記憶装置。
【請求項６】
ｎ個（ｎは２以上の自然数）の閾値電圧の１つが設定されることによりデータを記憶する複数のメモリセルを有するメモリと、
前記メモリからデータを読み出す制御部と、
を具備し、
前記制御部は、前記複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、前記複数のメモリセルから閾値電圧毎にデータを読み出し、
前記閾値電圧毎に読み出されたデータの差分データを求め、
前記差分データに基づき、第１の閾値より大きな最大値に対応する閾値電圧を検出し、第２の閾値より小さく前記最大値の両側に位置する第１、第２の最小値に対応する閾値電圧を検出する第１の探索動作を行い、
前記第１の探索動作により検出された第１、第２の最小値に対応する閾値電圧に基づき、前記第１、第２の最小値を含む第１、第２の底部領域を設定して第２の探索動作を行い、
前記第１、第２の底部領域の中央の位置から第１、第２の閾値電圧の最小値に対応する閾値電圧を検出することを特徴とする半導体記憶装置。
【請求項７】
前記第１、第２の底部領域は、前記第１、第２の最小値にマージンを付加して設定されることを特徴とする請求項６記載の半導体記憶装置。
【請求項８】
前記第１の最小値に対応する閾値電圧は、前記頂部に対応する閾値電圧と前記頂部に対して閾値電圧が低い位置に隣接する頂部の閾値電圧との差分を、前記頂部に対応する閾値電圧から減算して求め、
前記第２の最小値に対応する閾値電圧は、前記頂部に対応する閾値電圧と前記頂部に対して閾値電圧が高い位置に隣接する頂部の閾値電圧との差分を、前記頂部に対応する閾値電圧に加算して求めることを特徴とする請求項７記載の半導体記憶装置。
【請求項９】
前記制御部は、分布の１つの底部の閾値電圧を探索する場合、探索範囲の差分データの両端から、差分データが“０”となる点に向かって交差するように２つの直線を引き、前記２つの直線の交点を分布の底部と予測することを特徴とする請求項６記載の半導体記憶装置。
【請求項１０】
前記第１、第２の底部領域は、前記第１の探索により得られた第１、第２の最小値にそれぞれマージンを付加して設定されることを特徴とする請求項６記載の半導体記憶装置。
【請求項１１】
前記分布の頂部の値に対応して閾値が設定された第１のテーブルを有し、
前記制御部は、前記第１の探索により得られた最大値に基づき、前記第１のテーブルの閾値を選択し、前記第１、第２の底部領域を設定することを特徴とする請求項６記載の半導体記憶装置。
【請求項１２】
前記頂部の位置に対応して、前記底部の位置の補正値が設定された第２のテーブルを有し、
前記制御部は、前記頂部の位置に基づき、前記第２のテーブルの底部の位置の補正値を選択し、前記底部の位置を予測することを特徴とする請求項６記載の半導体記憶装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、半導体記憶装置、例えば多値データを記憶するＮＡＮＤフラッシュメモリに関する。
【背景技術】
【０００２】
ＮＡＮＤフラッシュメモリ、特に、１つのセルに複数ビットのデータを記憶することが可能な多値ＮＡＮＤフラッシュメモリにストレスが印加された場合や、データを書き込んでから長期間経過した場合、個々のメモリセルの電荷が増減して閾値電圧が変化する。このため、メモリセルからデータを読み出すときの閾値電圧が予め設定された最適値からずれてしまい、正確にメモリセルに記憶されたデータを読み出すことができなくなる。この結果、読み出されたデータに含まれるエラービット数の割合である「ビットエラー率」が増加してしまう。
【０００３】
閾値電圧が変動することによって発生するエラーは、エラー訂正コード(ＥＣＣ)を付加することによりある程度救済することができる。しかし、ビットエラー率が大きい場合、ＥＣＣを使用しても訂正が困難となる。
【０００４】
ビットエラー率を低下させるためには、メモリセルの読み出し電圧を最適化する必要がある。しかし、そのためにはメモリセルの閾値電圧の分布を正確に探索する必要がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−１５８０６１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本実施形態は、メモリセルの閾値電圧の分布を正確に探索することが可能な半導体記憶装置を提供しようとするものである。
【課題を解決するための手段】
【０００７】
本実施形態の半導体記憶装置は、ｎ個（ｎは２以上の自然数）の閾値電圧の１つが設定されることによりデータを記憶する複数のメモリセルを有するメモリと、
前記メモリからデータを読み出す制御部と、を具備し、前記制御部は、前記複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、前記複数のメモリセルから閾値電圧毎にデータを読み出し、前記閾値電圧毎に読み出されたデータの差分データを求め、前記差分データより前記閾値電圧の分布の最小値を求め、前記最小値に基づき、前記最小値より小さな値の閾値電圧の範囲を求め、前記求めた閾値電圧の範囲の中央の電圧を読み出し電圧に設定することを特徴とする。
【図面の簡単な説明】
【０００８】
【図１】本実施形態に係る半導体記憶装置を概略的に示す構成図。
【図２】図１に示すＮＡＮＤフラッシュメモリ概略的に示す構成図。
【図３】ＮＡＮＤフラッシュメモリからディストリビューション・リードにより読み出したデータ中の“１”の計数値を示す図。
【図４】図３に示す“１”の個数の差分データを示す図。
【図５】図４のＢレベル、Ｃレベル、Ｄレベルを拡大して示す図。
【図６】８レベルのデータの分布を示す図。
【図７】図６のＢレベル、Ｃレベル、Ｄレベルを拡大した分布を示す図。
【図８】図７に示すＤレベルの分布を示す図。
【図９】図７と同じ例で読み出しレベルの初期値を変えた例を示す図。
【図１０】Ｄレベルの読み出しレベルの初期値を変えた例を示す図。
【図１１】Ｃレベルの読み出しレベルの初期値を変えた例を示す図。
【図１２】Ｄレベルに対する探索領域の例を示す図。
【図１３】Ｄレベルに対する探索領域の例を示す図。
【図１４】Ｃレベルに対する探索領域の例を示す図。
【図１５】ディストリビューション・リード動作を示すフローチャート。
【図１６】ディストリビューション・リードにより読み出された“１”の計数値に基づくヒストグラムの生成動作を示すフローチャート。
【図１７】ディストリビューション・リードにより読み出された“１”の計数値を示す図。
【図１８】ディストリビューション・リードにより読み出された“１”の個数の差分データを示す図。
【図１９】図１８の差分データを加重平均して示す図。
【図２０】加重平均の動作を示すフローチャート。
【図２１】図１８のＤレベル近傍を拡大して示す図。
【図２２】図２１のグラフを加重平均して示す図。
【図２３】最小値の探索動作を示すフローチャート。
【図２４】最小値の探索動作の他の例を示すフローチャート。
【図２５】Ｖｔｈトラッキングを行いヒストグラムの底部が広がっている例を示す図。
【図２６】Ｖｔｈトラッキングを行いヒストグラムの底部が広がっている別の例を示す図。
【図２７】図２５に示すヒストグラムの加重平均をとった例を示す図。
【図２８】図２６に示すヒストグラムの加重平均をとった例を示す図。
【図２９】第１の実施形態に係るＶｔｈトラッキングを示すフローチャート。
【図３０】図２９に示す第１の探索動作の一例を示すフローチャート。
【図３１】第２の探索動作の一例を示すフローチャート。
【図３２】シフト値の演算動作の一例を示すフローチャート。
【図３３】一般的な手法によりＤレベルのＶｔｈの最適値を算出した例を示す図。
【図３４】一般的な手法で求められたＶｔｈの最適値を示す図。
【図３５】ディストリビューション・リードの揺らぎによってＶｔｈのデータに含まれる“１”の数が変化した例を示す図。
【図３６】第１の実施形態によりＤレベルのＶｔｈの最適値を算出した例を示す図。
【図３７】第１の実施形態により求められたＶｔｈの最適値を示す図。
【図３８】第１の実施形態において、ディストリビューション・リードの揺らぎによってＶｔｈのデータに含まれる“１”の数が変化した例を示す図。
【図３９】図３５の例に対して第１の実施形態を適用した場合を示すものであり、最小値を示す図。
【図４０】最小値に基づき分布の底部を探索するための閾値を設定した場合を示す図。
【図４１】第１の実施形態により得られたシフト値を示す図。
【図４２】第２の実施形態に係るＶｔｈトラッキングを示すフローチャート。
【図４３】図４２に示す第１回目の探索動作を具体的に示すフローチャート。
【図４４】図４２に示す第２回目の探索動作を具体的に示すフローチャート。
【図４５】第３の実施形態に係るＶｔｈトラッキングを示すフローチャート。
【図４６】図４３に示す第１回目の探索動作を具体的に示すフローチャート。
【図４７】図４３に示す第２回目の探索動作を具体的に示すフローチャート。
【図４８】図４３に示すシフト値の演算動作を示すフローチャート。
【図４９】第４の実施形態に係るＶｔｈトラッキングの概略的な動作を示すフローチャート。
【図５０】図４９に示す第１回目の探索動作の前半を示すフローチャート。
【図５１】図４９に示す第１回目の探索動作の後半を示すフローチャート。
【図５２】図４９に示す第２回目の探索動作の前半を示すフローチャート。
【図５３】図４９に示す第２回目の探索動作の後半を示すフローチャート。
【図５４】図４９に示すシフト値の演算動作を示すフローチャート。
【図５５】図５５（ａ）（ｂ）は、第６の実施形態に係り、分布の底部のＶｔｈを予測する例を示す図。
【図５６】図５６（ａ）（ｂ）は、第６の実施形態に係り、分布の底部のＶｔｈを予測する他の例を示す図。
【図５７】図５７（ａ）（ｂ）は、第６の実施形態に係り、分布の底部のＶｔｈを予測する他の例を示す図。
【図５８】図５８（ａ）（ｂ）は、第６の実施形態に係り、分布の底部のＶｔｈを予測する他の例を示す図。
【図５９】図５９（ａ）（ｂ）は、第６の実施形態に係り、分布の底部のＶｔｈを予測する他の例を示す図。
【図６０】図６０（ａ）（ｂ）は、第６の実施形態に係り、分布の底部のＶｔｈを予測する他の例を示す図。
【図６１】図６１（ａ）（ｂ）は、第６の実施形態に係り、分布の底部のＶｔｈを予測する他の例を示す図。
【図６２】図６２（ａ）（ｂ）は、第６の実施形態に係り、分布の底部のＶｔｈを予測する他の例を示す図。
【図６３】図６３（ａ）（ｂ）は、正規分布を仮定して計算で、分布の底部のＶｔｈを予測する例を示す図。
【図６４】図６４（ａ）（ｂ）は、分布の底部近傍で、分布の底部のＶｔｈを予測する例を示す図。
【図６５】図６５（ａ）（ｂ）は、図６４（ａ）（ｂ）のＶｔｈの組み合わせを入れ替えた場合を示す図。
【図６６】図６６（ａ）（ｂ）は、ヒストグラムの値を入れ替えて、２つの直線を交差させた例を示す図。
【図６７】図６７（ａ）（ｂ）は、図６６（ａ）（ｂ）の近似を説明するために示す図。
【図６８】図５５（ａ）（ｂ）乃至図６５（ａ）（ｂ）に示す交点の横軸の値の近似式を算出する方法を示す図。
【図６９】第７の実施形態に係るテーブルを示す図。
【図７０】第８の実施形態に係るテーブルを示す図。
【発明を実施するための形態】
【０００９】
以下、図面を参照して本実施形態について説明する。
【００１０】
（装置構成）
図１は、本実施形態に係る半導体記憶装置を概略的に示している。
【００１１】
半導体記憶装置１１は、例えばＳＤカードにより構成される。半導体記憶装置１１は、図示せぬホスト装置に接続されたときに電源供給を受けて動作し、ホスト装置からのアクセスに応じた処理を行う。この半導体記憶装置１１は、コントローラ１１ａを有している。
【００１２】
コントローラ１１ａは、例えばホストインタフェース（Ｉ／Ｆ）１２、ＣＰＵ１３、ＲＯＭ（Read only Memory）１４、ＲＡＭ（Random Access Memory）１５、バッファ１６、メモリインターフェース（Ｉ／Ｆ）１７、エラー訂正回路（ＥＣＣ回路）１８、カウンタ１９により構成されている。これらは、バスにより接続されている。メモリインターフェース１７には、例えばＮＡＮＤフラッシュメモリ２０が接続されている。
【００１３】
ホストインタフェース１２は、コントローラ１１ａとホスト装置との間のインターフェース処理を行う。
【００１４】
メモリインターフェース１７は、コントローラ１１ａとＮＡＮＤフラッシュメモリ２０との間のインターフェース処理を行う。
【００１５】
ＣＰＵ１３は、メモリデバイス１１全体の動作を司るものである。このＣＰＵ１３は、例えばホスト２０からライト（書き込み）コマンド、リード（読み出し）コマンド、イレース（消去）コマンドを受けてＮＡＮＤフラッシュメモリ２０上の領域をアクセスしたり、バッファ１６を介してデータ転送処理を制御したりする。
【００１６】
ＲＯＭ１４は、ＣＰＵ１３により使用される制御プログラムなどのファームウェアを格納する。ＲＡＭ１５は、ＣＰＵ１３の作業エリアとして使用され、制御プログラムや各種のテーブルなどを記憶する。
【００１７】
バッファ１６は、ホスト２０から送られてくるデータを、例えばＮＡＮＤフラッシュメモリ２０へ書き込む際、一定量のデータ（例えば１ページ分）を一時的に記憶したり、ＮＡＮＤフラッシュメモリ２０から読み出されたデータをホスト装置へ送り出す際、一定量のデータを一時的に記憶したりする。
【００１８】
ＥＣＣ回路１８は、ＮＡＮＤフラッシュメモリ２０から読み出されたデータ中のエラーを訂正する。
【００１９】
カウンタ１９は、後述するディストリビューション・リードを実行する際、閾値電圧分布のヒストグラムを求めるため、ＮＡＮＤフラッシュメモリ２０から読み出されたデータ中に含まれるデータ“１”の個数を計数するために使用される。
【００２０】
ＮＡＮＤフラッシュメモリ２０は、例えば積層ゲート構造のメモリセル、又はＭＯＮＯＳ構造のメモリセルにより構成され、多値、例えば８値（８レベルとも言う）のデータを記憶可能とされている。
【００２１】
図２は、ＮＡＮＤフラッシュメモリ２０の概略構成を示している。
【００２２】
メモリセルアレイ２１は、複数のビット線と複数のワード線と共通ソース線を含み、例えばＥＥＰＲＯＭセルからなる電気的にデータを書き換え可能なメモリセルがマトリクス状に配置されている。このメモリセルアレイ２１には、ビット線を制御するためのビット制御回路２２とワード線制御回路２６が接続されている。
【００２３】
ビット線制御回路２２は、ビット線を介してメモリセルアレイ２１中のメモリセルのデータを読み出したり、ビット線を介してメモリセルアレイ２１中のメモリセルの状態を検出したり、ビット線を介してメモリセルアレイ２１中のメモリセルに書き込み制御電圧を印加してメモリセルに書き込みを行なう。ビット線制御回路２２には、カラムデコーダ２３、データ入出力バッファ２４が接続されている。ビット線制御回路２２内のデータ記憶回路はカラムデコーダ２３によって選択される。データ記憶回路に読み出されたメモリセルのデータは、前記データ入出力バッファ４を介してデータ入出力端子２５から外部へ出力される。外部から供給されたＮＡＮＤ型フラッシュメモリの動作を制御する各種コマンドＣＭＤ、アドレスＡＤＤ、及びデータＤＴは、データ入出力端子２５に入力される。データ入出力端子２５に入力された書き込みデータは、データ入出力バッファ４を介して、カラムデコーダ２３によって選択されたデータ記憶回路に供給され、コマンド及びアドレスは制御信号及び制御電圧発生回路２７に供給される。
【００２４】
ワード線制御回路２６は、メモリセルアレイ２１に接続されている。このワード線制御回路２６は、メモリセルアレイ２１中のワード線を選択し、選択されたワード線に読み出し、書き込みあるいは消去に必要な電圧を印加する。
【００２５】
メモリセルアレイ２１、ビット線制御回路２２、カラムデコーダ２３、データ入出力バッファ２４、及びワード線制御回路２６は、制御信号及び制御電圧発生回路２７に接続され、この制御信号及び制御電圧発生回路２７によって制御される。制御信号及び制御電圧発生回路２７は、制御信号入力端子８に接続され、外部から制御信号入力端子８を介して入力される制御信号ＡＬＥ（アドレス・ラッチ・イネーブル）、ＣＬＥ（コマンド・ラッチ・イネーブル）、ＷＥ（ライト・イネーブル）、ＲＷ（リード・イネーブル）によって制御される。
【００２６】
前記ビット線制御回路２２、カラムデコーダ２３、ワード線制御回路２６、制御信号及び制御電圧発生回路２７は書き込み回路、及び読み出し回路を構成している。
【００２７】
制御信号及び制御電圧発生回路２７は、図示せぬデジタルアナログ変換器を有し、このデジタルアナログ変換器は、予め定められた数値データに基づき、読み出し動作時における読み出し電圧や、書き込み動作時におけるプログラム電圧を発生する。例えばメモリセルに８値のデータが小さい順に、消去レベル、Ａレベル、Ｂレベル、Ｃレベル、Ｄレベル、Ｅレベル、Ｆレベル、Ｇレベルのデータが記憶されている場合、Ａレベル、Ｂレベル、Ｃレベル、Ｄレベル、Ｅレベル、Ｆレベル、Ｇレベルのデータを読み出すために必要な数値データが予め設定されている。このデジタルアナログ変換器に入力される数値データを、以下ｎＤＡＣ（ｎは数値）と記す。Ａレベル〜Ｇレベルを読み出すための数値データは、例えば２５ＤＡＣ、９０ＤＡＣ、１４０ＤＡＣ、２２０ＤＡＣ、３００ＤＡＣ、３７０ＤＡＣ、４２０ＤＡＣに設定されている。これら数値データは例えばメモリセルアレイ２１のコントローラ用のデータ領域に記憶されている。この数値データは、パワーオン時にメモリセルアレイ２１から読み出され、図示せぬレジスタに転送される。制御信号及び制御電圧発生回路２７は、読み出し動作時、レジスタに保持された数値データに基づき、所要の読み出し電圧を生成する。以下、消去レベル、Ａレベル、Ｂレベル、Ｃレベル、Ｄレベル、Ｅレベル、Ｆレベル、Ｇレベルを総称してＲｅａｄレベルと呼ぶ。
【００２８】
前述したように、ＮＡＮＤフラッシュメモリにストレスが印加された場合や、データを書き込んでから長期間経過した場合、個々のメモリセルの閾値電圧（以下、Ｖｔｈレベルとも言う）が変化する。このため、メモリセルからデータを読み出すとき、上記予め設定された数値データに基づき生成された読み出し電圧により、メモリセルから正確にデータを読み出すことができなくなる。この結果、読み出されたデータに含まれるエラービット数の割合である「ビットエラー率」が増加する。Ｖｔｈレベルがシフトすることにより、発生するエラーはエラー訂正コード（ＥＣＣ）の付加によってもある程度救済することができる。しかし、メモリセルからデータを読み出すときの読み出し電圧を最適化することにより、ＥＣＣで訂正する前のデータのビットエラー率を大幅に下げることができる。これにより、ＥＣＣ回路でのエラー訂正時間を短縮したり、ＥＣＣ回路の消費電力を抑えたりすることができる。
【００２９】
メモリセルの読み出し電圧を最適化する場合、メモリセルのＶｔｈレベルの分布を探索する必要がある。このため、コントローラ１１ａは、メモリセルの閾値電圧分布を探索するため、後述するディストリビューション・リード（distribution read）機能を備えている。
【００３０】
図３、図４、図５は、８値のＮＡＮＤフラッシュメモリにデータを書き込んだ直後のＶｔｈレベルを、ディストリビューション・リードを用いて読み出した例を示している。
【００３１】
図３は、ディストリビューション・リードで読み出したデータ中の“１”の計数値を示すものであり、縦軸に計数値を示し、横軸にＶｔｈレベルをデジタルアナログ変換器に入力される数値データにより示している。図３において、消去レベルのＶｔｈ分布はＶｔｈ＝“０”以下にあるため、グラフとして表れていない。
【００３２】
図４は、図３に示す縦軸の“１”の個数の差分を、横軸の４ＤＡＣ単位でとったものであり、それぞれのＶｔｈレベルのデータの分布の中心から左右非対称に、異なった分散をもった正規分布を仮定してグラフ化している。図４においても、消去レベルのＶｔｈ分布はＶｔｈ＝“０”以下にあるため、グラフとして表れていない。図３のグラフの値が変化しない部分は、図４に“０”となって現れ、図３のグラフの傾きの大きなところは、図４において、大きな値となっている。
【００３３】
図５は、図４のＢレベル、Ｃレベル、Ｄレベルを拡大して示している。
【００３４】
図３、図４、図５に示す破線は、Ｄレベルの初期の読み出し電圧（Ｖｔｈ＝２２８ＤＡＣ）を示している。
【００３５】
図４、図５に示すように、書き込み直後において、各レベルのデータはＲｅａｄレベルの中間付近に集中している。例えばＤレベルの読み出し時、読み出し電圧として２２８ＤＡＣを設定し、メモリセルのＶｔｈレベルが、読み出しレベルより低くければ、そのメモリセルのデータは“０”、高かければそのメモリセルのデータは“１”として読み出される。図５に示す場合、メモリセルからデータ“１”が読み出される。
【００３６】
一方、図６、図７、図８は、図４、図５に示すように書き込んだデータの各レベルの中心が６〜８ＤＡＣ程度マイナス側に移動し、分散が大きくなった例を示している。
【００３７】
図６は、図４と同様に８レベルのデータの分布全体を示しており、図７は、図６のＢレベル、Ｃレベル、Ｄレベルを拡大した分布を示している。図８は、図７に示すＤレベルに書き込まれたデータの分布だけを示している。
【００３８】
図６、図７、図８に示すように、Ｄレベルに書き込んだデータがストレスを受け、図４、図５に示す分布よりマイナス側に移動していることが分かる。図８に示すＶｔｈレベル＝２２８ＤＡＣの左側と正規分布曲線の下で囲まれた面積で示される領域がＤレベルからＣレベルに移動したデータである。Ｄレベルの初期値Ｖｔｈレベル＝２２８ＤＡＣで読み出した場合、図８の縦の破線の左側と正規分布曲線の下で囲まれた面積に相当する部分がＤレベルではなくＣレベルとして読み出される。このため、本来“１”として読み出されるべきデータが“０”として誤って読み出される。
【００３９】
図８に示す破線の左側と正規分布曲線の下で囲まれた面積を図８の正規分布曲線の下側の面積全体で割ったものがＤレベルに書き込まれたデータが、Ｃレベルのデータとして読みだされるエラー率（より正確にはＤレベルよりも下のレベルである消去レベル、Ａレベル、Ｂレベル、Ｃレベルとして読み出されるエラー率）である。
【００４０】
上記のように、メモリセルのＶｔｈレベルがシフトした場合、予め設定された読み出し電圧とは異なるレベルで読み出すことにより、エラーを低減する技術としてＥＣＣとシフトリードがあり、メモリコントローラ１１ａは、両者を併用して正しいデータを出力している。ＥＣＣは誤りを含む状態で読み出されたデータを訂正することで正しいデータを得る。
【００４１】
一方、シフトリードは読み出し電圧を変えることで、読み出すデータそのもののエラー率を低減する。すなわち、図８に示す例の場合、Ｄレベルの中心がが−８ＤＡＣ移動しているため、Ｄレベルが−８ＤＡＣ移動しているということが分かれば、Ｄレベルの読み出しレベルを−８ＤＡＣ程度移動することにより、Ｄレベルで書き込んだデータがＣレベルで読み出される誤りと、Ｃレベルで書き込んだデータがＤレベルで読み出される誤りの全体を最小にすることができ、全体としてのエラー率を下げることができる。
【００４２】
図９、図１０、図１１は、図６、図７と同じ例で読み出しレベルの初期値を２２８ＤＡＣから−８ＤＡＣシフトした２２０ＤＡＣに設定した場合を示している。
【００４３】
図１０に示すように、Ｄレベルに着目すると読み出しレベルを２２８ＤＡＣから２２０ＤＡＣに移動することにより、読み出しレベル２２０ＤＡＣの左側と正規分布曲線で囲まれる面積が減少する。これはエラー数が減少することに対応している。Ｄレベルだけをみると読み出しレベルをさらに下げることでエラーを減らすことができる。しかし、図１１に示すＣレベルに着目すると、逆にＤレベルの読み出しレベルを２２８ＤＡＣから２２０ＤＡＣに移動することにより、読み出しレベル２２０ＤＡＣの左側と正規分布曲線で囲まれる面積が増加するので、Ｃレベルはエラーが増加している。すなわち、読み出しレベルをマイナス側に移動させると、ＤレベルからＣレベルに移動するエラーは減らすことができるが、ＣレベルからＤレベルに移動するエラーは増加する。正規分布の特性から、中心から離れるほど分布の数は減少するため、読み出しレベルを移動させ、ＤレベルをＣレベルに誤るエラーを減らす数と、ＣレベルをＤレベルに誤るエラーが増える数が一致する「最適値」が存在する。
【００４４】
本実施形態は、読み出し電圧をシフトさせたシフトリードによって読み出すデータのエラー率をできるだけ小さくする。すなわち、読み出し電圧の最適値を探索するものである。実際のＮＡＮＤフラッシュメモリのリード動作では、特殊な場合を除き、本来Ｄレベルであったメモリセル（図１０に対応）、本来Ｃレベルであったメモリセル（図１１に対応）は区別できないため、図１０と図１１を合計してできる曲線、すなわち図９に示す曲線から読み出しレベルの最適値を探索しなくてはならない。
【００４５】
読み出しレベルの最適値を探索するための一連の動作を以下、Ｖｔｈトラッキングと呼ぶ。Ｖｔｈトラッキングでは、Ｖｔｈの最適値を探索するため、コマンドとしてＮＡＮＤフラッシュメモリに実装されているディストリビューション・リードを実行する。
【００４６】
ディストリビューション・リードは、読み出しレベルを一定量ずつ変化させて２値モード（ＳＬＣモード）で一定量のデータを読み出す。コントローラ１１ａは、プログラムに使用するメモリ量を節約するなどの目的からＮＡＮＤフラッシュメモリの各Ｖｔｈレベルを中心にした探索領域を設け、Ｖｔｈレベル毎にディストリビューション・リードを実行することが多い。
【００４７】
図１２、図１３、図１４は、Ｄレベル、Ｃレベルに対する探索領域の例を長方形で図示している。この例ではＤレベルの読み出しレベルの初期値は２２８ＤＡＣに設定されている。図１２、図１３、図１４において、実効的な探索領域は、２００ＤＡＣ以上２４８ＤＡＣ以下に設定されている。
【００４８】
（ディストリビューション・リード）
図１５は、ある一つのＲｅａｄレベルに対するディストリビューション・リード動作を示している。
【００４９】
コントローラ１１ａにおいて、ディストリビューション・リードの開始レベル、すなわち、ｎＤＡＣ（初期読み出しレベル（Ｖｔｈ））、Ｖｔｈの増分、ステップ回数Ｎ（Ｎは、現在注目しているＲｅａｄレベルに対してディストリビューション・リードを実行するＶｔｈレベルの総数）、バースト長ＢＬが設定される（Ｓ１１）。さらに、ステップカウントが“ｊ＝０”に初期設定され（Ｓ１２）、バーストカウントが“ｋ＝０”、“１”の計数値“total”が“０”に初期化される（Ｓ１３）。この状態において、ディストリビューション・リードが開始される（Ｓ１４）。すなわち、ＮＡＮＤフラッシュメモリ２０は、予め定められたデータ量、例えば１ｋバイト又は１６ｋバイトのデータを読み出し、メモリインターフェース１７を介してコントローラ１１ａに例えば１バイト単位にデータを転送する。
【００５０】
コントローラ１１ａは、１バイトのデータに含まれる“１”の数をバースト長だけ計数する（Ｓ１５、Ｓ１６、Ｓ１７、Ｓ１８、Ｓ１９）。この計数は、図１に示すカウンタ１９により実行される。しかし、カウンタ１９に限らず、ソフトウェアによりカウントすることも可能である。
【００５１】
“１”の数がバースト長だけ計数されると、Ｖｔｈレベルとともに“total”の“１”の計数値が（Ｃｏｕｎｔ[ｊ]）に記憶される（Ｓ２０）。
【００５２】
この後、ステップカウント“ｊ”が更新されてＶｔｈレベルがステップアップされ（Ｓ２１）、全てのＶｔｈレベルの読み出しが終了したかどうかが判別される（Ｓ２２）。この判別の結果、終了していない場合、バーストカウント、及び“１”の総数“total”がリセットされ（Ｓ２３）、Ｖｔｈレベルが更新されてディストリビューション・リードが開始される（Ｓ２４）。
【００５３】
この後、上記動作が繰り返され、ＮＡＮＤフラッシュメモリ２０から出力されるデータに含まれる“１”の数がバースト長だけ計数されると（Ｓ１５、Ｓ１６、Ｓ１７、Ｓ１８、Ｓ１９）、Ｖｔｈレベルとともに“１”の計数値“total”の値が（Ｃｏｕｎｔ［ｊ］）ｎｉ記憶される（Ｓ２０）。
【００５４】
このように，Ｖｔｈレベルをステップアップして、ディストリビューション・リード、及びデータに含まれる“１”数の計数が、ステップカウント“ｊ”の値が“Ｎ”となるまで繰り返される（Ｓ２１、Ｓ２２）。
【００５５】
尚、Ｖｔｈレベルの２ステップ目以降のｎＤＡＣは、ＮＡＮＤフラッシュメモリ２０によっては、前のステップのＤＡＣとの差分を指定できる。前のステップのＤＡＣとの差分を指定できない場合は、２ステップ目以降も読み出しレベルに対応するｎＤＡＣがＮＡＮＤフラッシュメモリ２０に送られる。
【００５６】
上記ステップ（Ｓ２２）において、ステップカウント“ｊ”の値が“Ｎ”に達したと判別された場合、制御が図１６に移行される。
【００５７】
尚、ディストリビューション・リードの結果に基づき、横軸にＶｔｈレベルをプロットし、縦軸に“１”の計数値をプロットすると、図１７に示すグラフが得られる。
【００５８】
（ヒストグラム生成）
図１６は、図１７に示すＶｔｈレベル毎に計数された“１”の計数値に基づき、ヒストグラムを生成するための動作を示している。
【００５９】
コントローラ１１ａは、隣接するＶｔｈレベルの“１”の計数値(Count(j+1))と（Count(j))の差分を演算する。このため、図１６に示すように、ステップ数が“Ｎ−１”に設定され（Ｓ３１）、ステップカウントが“ｊ＝０”に初期設定される（Ｓ３２）。この後、式（１）で示す演算が、ステップカウント“ｊ”を更新しながら、ステップカウントが“Ｎ−１”となるまで繰り返される（Ｓ３３、Ｓ３４、Ｓ３５）。
【００６０】
Delta[j]＝Count[j+1]−Count[j]      …（１）
このようにして、“１”の計数値の差分(Delta(j))が求められる。横軸にＶｔｈレベルをプロットし、縦軸に“１”の計数値の差分(Delta(j))をプロットすると、図１８に示すヒストグラムが得られる。
【００６１】
上記動作から分かるように、読み出しレベルの最適値を探索するためには、各Ｖｔｈレベルに存在する“１”の個数がほぼ等しくなるのが望ましい。一般に、メモリコントローラ１１ａには、ＮＡＮＤフラッシュメモリ２０に書き込んだデータの信頼性を向上させるため、データをランダマイズして書き込む手法が採用されている。このため、本実施形態においても、ＮＡＮＤフラッシュメモリ２０のデータがランダマイズされて、各Ｒｅａｄレベルに存在する“１の個数”がほぼ等しくなっていることが望ましいが、データがランダマイズされていない場合においても、本実施形態を適用することが可能である。
【００６２】
ＮＡＮＤフラッシュメモリでは、設定したＶｔｈレベルに対して実際に設定されるＶｔｈの揺らぎ、Ｖｔｈ分布を調べる行為そのもので受けるメモリセルのストレスなどにより、同じＶｔｈレベルを指定しても得られるヒストグラムは必ずしも一致しないこと、すなわちヒストグラム自体に揺らぎが発生することが知られている。
【００６３】
図１７、図１８、図１９は、実際の８値ＮＡＮＤフラッシュメモリに対してＶｔｈトラッキングを実行して得られたヒストグラムを示している。
【００６４】
図１７は、ＮＡＮＤフラッシュメモリから読み出したデータ中の“１”の数を、ディストリビューション・リードで設定した各Ｖｔｈに対応するＤＡＣ値を横軸としてグラフ化したものである。
【００６５】
図１８は、図１７の横軸を４ＤＡＣ単位のステップに分割して、ステップ毎の差分をとった値（Delta）を縦軸にプロットし、各Ｖｔｈに対応するＤＡＣ値を横軸としてグラフ化したものである。
【００６６】
図１９は、図１８に示すグラフの値に対して、後述するように、加重平均を実行してスムージングしたグラフである。
【００６７】
実際のＮＡＮＤフラッシュメモリに対してディストリビューション・リードを行うと、図１８に示すように、滑らかでないグラフが得られることがある。この揺らぎの影響を軽減するため、Ｖｔｈレベルがjに対応するヒストグラム値（Delta(j)）に対して、前後数ステップのＶｔｈレベルのヒストグラムの値を加重平均することでヒストグラムの揺らぎの影響を小さくする手法をとることがある。例えば１ステップ離れる毎に影響を半分とするように、前後２ステップの加重平均をとると、加重平均後のヒストグラムの各Ｖｔｈ＝jでの値（Smoothing(j)）は、式（２）のようになる。
【００６８】
Smoothing[j] = Delta[j-2] / 4  + Delta[j-1] / 2 + Delta[j] 
+ Delta[j+1] / 2 + Delta[j+2] / 4      …（２）
（加重平均）
図２０は、加重平均を計算するためのフローチャートを示している。図２０において、先ず、ステップ数が“Ｎ−３”に設定され（Ｓ４１）、ステップカウントが“ｊ＝２”に初期化され（Ｓ４２）、式（２）が実行される（Ｓ４３）。この後、ステップカウントｊが更新され（Ｓ４４）、ステップ数に達するまで、ステップＳ４３の演算が繰り返される（Ｓ４５）。
【００６９】
図２１は、図１８のＤレベル近傍を拡大したグラフを示しており、この揺らぎを有するヒストグラムに対して、上記加重平均の計算を実行することにより、図２２に示すように、スムージングされたヒストグラムを得ることができる。
【００７０】
（一般的な最小値探索）
一般な最小値探索は、図２２に示すような加重平均後のヒストグラム（Smoothing（j））が最小値をとる点(Vth_shifted(Level))を、各Ｖｔｈレベルの底部（凹部）として求め、Ｖｔｈレベルの底部(Vth_shifted(Level))とＶｔｈレベルの初期値(Vth_init(Level))との差分を、そのＶｔｈレベル(Level) でのシフト値(VthShift(Level))として、式（３）により求めている。
【００７１】
VthShift(Level) = Vth_shifted(Level) − Vth_init(Level)        …（３）
図２３は、ディストリビューション・リードの開始ＶｔｈレベルのＤＡＣ値を DistStart_Vth(Level)としたときの最小値Vth_Shifted(Level)を探索するフローチャートの一例を示している。
【００７２】
図２３において、先ず、ステップ数“Ｎ−３”が設定され(Ｓ５１)、ステップカウントが“ｊ＝２”に初期化される（Ｓ５２）。この後、加重平均後のヒストグラムのＶｔｈ＝ｊの値（Smoothing(j)）が最小値Ｍｉｎとして設定され、ステップカウントｊの値がMin_Vthに設定される（Ｓ５３）。
【００７３】
次いで、ステップカウント“ｊ”を更新して、（Smoothing(j))と最小値Ｍｉｎとが比較される（Ｓ５４）。この比較の結果、（Smoothing(j))が最小値Ｍｉｎより小さい場合、（Smoothing(j)）が最小値Ｍｉｎとして設定される（Ｓ５６）。この動作が、ステップカウント“ｊ”を更新して、ステップカウント“ｊ”がステップ数“Ｎ−３”まで繰り返される（Ｓ５７〜Ｓ５４）。
【００７４】
ステップＳ５７において、ステップカウント“ｊ”がステップ数“Ｎ−３”に達したものと判別されると、ディストリビューション・リードの開始ＶｔｈのＤＡＣ値DistStart_Vth(Level)とMin_Vthが加算され、ディストリビューション・リードの開始ＶｔｈのＤＡＣ値をDistStart_Vth(Level)としたときの最小値Vth_Shifted(Level)が求められる（Ｓ５８）。
【００７５】
図２３は、差分データ（Delta value）が最小値となるＶｔｈが一点である場合において、差分データ が最小値となるＶｔｈを検出する方法を示している。しかし、差分データが最小値となるＶｔｈが幅を持っている場合、図２４に示すような動作により、最小値となるＶｔｈの中心値（平均値）を求めることができる。
【００７６】
図２４において、図２３と同一部分には同一符号を付し、異なる部分についてのみ説明する。この例の場合、差分データ が最小値となるＶｔｈが検出された場合に設定されるフラグmin_found を有し、初期設定において、このフラグmin_found がリセットされる（Ｓ５２−１）。この後、最小値の探索が実行され（Ｓ５３〜Ｓ５５）、最小値が検出された場合（Ｓ５６−１、Ｓ５６−２）、フラグmin_found がセットされているかどうかが判別され（Ｓ５６−３）、セットされていない場合、フラグmin_found がセットされるとともに、差分データ が最小値となるＶｔｈの値ｊがMin_vth_lに保持される（Ｓ５６−４）。さらに、Ｖｔｈの値ｊがMin_vth_uに保持される（Ｓ５６−５）。
【００７７】
この後、ステップカウント“ｊ”の値が更新されて上記動作がステップ数“Ｎ−３”に達するまで繰り返される（Ｓ５７〜Ｓ５４）。
【００７８】
ステップカウント“ｊ”の値がステップ数“Ｎ−３”に達すると、式（４）に基づき、最小値の平均値Min_vthが算出される（Ｓ５７−１）。
【００７９】
Min_vth ＝ (Min_vth_l − Min_vth_u)／2                        …（４）
さらに、式（５）により、ディストリビューション・リードの開始ＶｔｈのＤＡＣ値を DistStart_Vth(Level)としたときの最小値Vth_Shifted(Level)が求められる。
【００８０】
VthShift(Level) = DistStart_Vth(Level) ＋ Min_vth             …（５）
加重平均後のヒストグラムの分布の広がりが少ない場合にはこの方法で問題ないが、ヒストグラムの分布が広がっている場合には、「分布の底部」付近で加重平均したヒストグラムの値(Vth_shifted(x))の最小値に近い値をもつ領域が広がっていることがある。このため、加重平均したヒストグラムの揺らぎによってVthShift(Level)の値も変動し、このシフト値を使ってデータを読み出した場合のビットエラー率も安定しない、という問題がある。
【００８１】
実際のＮＡＮＤフラッシュメモリに対してＶｔｈトラッキングを行いヒストグラムの底部が広がっている例を図２５乃至図２８に示す。
【００８２】
図２５は、Ｄレベルの差分のデータを示しており、図２６は、図２５に示すデータにおいて、Ｖｔｈ＝２２６ＤＡＣのデータに含まれる“１”の数が、１５個少なかった場合のグラフである。図２５に示すヒストグラムは、２１２ＤＡＣで最小値を示しているが、図２６に示すヒストグラムは、２２４ＤＡＣで最小値を示している。
【００８３】
図２７は、図２５に示すヒストグラムの５点加重平均をとったヒストグラムを示し、図２８は、図２６に示すヒストグラムの５点加重平均をとったヒストグラムを示している。
【００８４】
図２７は、２１２ＤＡＣでヒストグラムが最小になっているが、図２８は、２２４ＤＡＣでヒストグラムが最小になっている。すなわち、Ｖｔｈ＝２２６ＤＡＣのデータの中の１の個数が１５個変動することによって、Ｖｔｈトラッキングで得られる分布の底部のＶｔｈの位置が、２１２ＤＡＣから２２４へと１２ＤＡＣ変化している。Ｖｔｈ＝２１２〜２２４近傍ではディストリビューション・リードのステップ（４ＤＡＣ）毎に１の個数が５０個程度変化しているため、Ｖｔｈの最適値の値が１２ＤＡＣ変化すると、それぞれのＶｔｈで読み出した場合に読み出したデータは約５０ｂｉｔ＊３＝約１５０ｂｉｔ変化することになる。Ｖｔｈ＝２１２ＤＡＣに設定した場合とＶｔｈ＝２２４ＤＡＣに設定した場合のエラービット数の違いは、図２６に示す２２０ＤＡＣ近傍の破線で囲まれたグラフの下側の面積に相当する。
【００８５】
このように、分布の底部が広がっている場合、分布の底部付近のデータに含まれる“１”の個数が１５個程度変化すると、Ｖｔｈの底部の最適値の位置は大きく変化し、結果的としてエラービット数が大きく変動する。この結果、分布が広がっている場合、このような手法ではＶｔｈトラッキングによるＶｔｈの最適値が変動して１ｋＢあたり１００ｂｉｔ程度の訂正能力を持つ強力なＥＣＣを使用してもエラー訂正できない可能性が高くなるという問題がある。
【００８６】
（第１の実施形態）
そこで、第１の実施形態では、加重平均をとったデータをＶｔｈのＤＡＣ単位に並べたヒストグラムから最小値を見つけるための探索を２回実行する。すなわち、１回目の探索では上述の例と同様にヒストグラムの最小値を求めるが、最小値をとるＤＡＣ値は求めない。２回目の探索では１回目の探索で見つけた最小値に予め定められたマージンを加えて探索のための閾値を作成し、ヒストグラムの中で閾値より小さくなるＤＡＣ値の最小値と最大値を探索する。第２回目の探索で検出されたＤＡＣ値の最大値と最小値の平均値をヒストグラムの底部をとるＤＡＣ値として求め、この値からＶｔｈの最適値を求める。
【００８７】
図２９は、第１の実施形態に係るＶｔｈトラッキングを示している。図２９を参照して第１の実施形態に係るＶｔｈトラッキングについて説明する。
【００８８】
先ず、Ｖｔｈレベルの数が“Ｍ”、例えば“Max_Read_level −１”に設定され（Ｓ６１）、Ｒｅａｄレベル“ｉ”が“０”に初期設定される（Ｓ６２）。この状態において、ＮＡＮＤフラッシュメモリ２０に対して、Ｒｅａｄレベル毎にディストリビューション・リードが実行される（Ｓ６３）。このディストリビューション・リードの動作は、図１５に示す通りであり、Ｖｔｈレベル毎に“１”の個数が計数される。
【００８９】
この後、図１６に示す動作が実行され、隣接するＶｔｈレベルの“１”の個数の差分が演算され、差分データ(Delta value)と、Ｖｔｈとにより、ヒストグラムが生成される（Ｓ６４）。
【００９０】
次に、図２０に示す動作が実行されて差分データの加重平均が演算され、加重平均したヒストグラムが作成される（Ｓ６５）。
【００９１】
次いで、加重平均された値のヒストグラムの局所、例えば「最小値」を探索する第１の探索動作が実行される（Ｓ６６）。
【００９２】
（第１の探索動作）
図３０は、第１の探索動作を示しており、図２３と同一部分には同一符合を付している。第１の探索は、図２３と同様の動作により、ヒストグラムの「最小値」が１つだけ検出される。但し、この最小値探索の段階では差分データが最小値となるＶｔｈに対応するＤＡＣ値を記憶する必要は無い。すなわち、図３０において、図２３と異なるのは、図２３に示すステップＳ５８がない点である。
【００９３】
次に、第１の探索動作の結果求められた「最小値」に、予め決められた「マージン」、例えば１５が加算されて「分布の底部の閾値」が生成され、加重平均したヒストグラムが分布の底部の閾値より小さな値をとる範囲、すなわち、分布の底部の領域を探索する第２の探索動作が実行される（Ｓ６７）。この第２の探索動作では、分布の底部の領域のＶｔｈの最大値と最小値が１個ずつ検出される。さにら、第２の探索動作において、分布の底部の領域のＶｔｈの最大値と最小値の平均値が求められる。
【００９４】
（第２の探索動作）
図３１は、第２の探索動作の一例を示している。先ず、Ｖｔｈレベル“ｉ”がＶｔｈレベルに設定され（Ｓ６７−１）、ステップ数が“Ｎ−３”に設定され（Ｓ６７−２）、ステップカウント“ｊ”が“２”に設定され（Ｓ６７−３）、分布の底部の領域を検出するためのフラグbottom_foundが“０”に設定される（Ｓ６７−４）。さらに、前述したように、第１の探索の結果求められた最小値Minに、予め決められたマージンMargin、例えば１５が加算されて、分布の底部の閾値Bottom_limit が生成される（６７−５）。
【００９５】
この状態において、スムージングされたヒストグラムの値Smoothing[j]がBottom_limit より小さいかどうか判別される（Ｓ６７−６）。この結果、差分データの値Smoothing[i]がBottom_limit より小さい場合、ステップカウント“ｊ”の値が、分布の底部の領域のＶｔｈの最小値としてBottom_Rightに設定される（Ｓ６７−７）。
【００９６】
次いで、フラグbottom_foundが“０”か、どうかが判別され（Ｓ６７−８）、フラグbottom_foundが“０”である場合、フラグbottom_foundが“１”に設定されるとともに、ステップカウント“ｊ”の値が、分布の底部の領域のＶｔｈの最大値としてBottom_Leftに設定される（Ｓ６７−９）。
【００９７】
この後、ステップカウント“ｊ”の値が更新されて上記動作が繰り返され（Ｓ６７−１０、Ｓ６７−１１〜Ｓ６７−６）、ステップカウント“ｊ”の値が“Ｎ−３”となった場合、式（６）により、Bottom_LeftとBottom_Rightの平均値Bottom[i]が求められる。
【００９８】
Bottom[i] ＝ (Bottom_Left ＋ Bottom_Right)／２                …（６）
上記「第２の探索」の後、図２９に示すように、シフト値が演算される（Ｓ６８）。
【００９９】
図３２は、シフト値の演算動作の一例を示している。この演算は、先ず、Ｒｅａｄレベル“ｉ”がRead_Levelに設定される（Ｓ６８−１）。この後、ディストリビューション・リードの開始ＤＡＣ値DistStart_Vth[i]、平均値Bottom[i]、及びVthInit[i] に基づき、式（７）によりシフト値Shift[i]が演算される（Ｓ６８−２）。
【０１００】
Shift[i] ＝ DistStart_Vth[i] ＋ Bottom[i] − VthInit[i]        …（７）
このように、「分布の底部のＶｔｈ」から「Ｖｔｈの初期値」を引くことにより、「差分」を求めることができる。尚、補正が不要であれば、「差分」が「シフト値」となる。
【０１０１】
また、必要であれば、「差分」に補正を加えて「シフト値」を求めてもよい。最も単純な補正方法としては、式（８）に示すように、図３２で求めたシフト値に、レベル毎に予め決められている補正値 Comp(Level)が加算される。
【０１０２】
Shift[i] ＝ DistStart_Vth[i] ＋ Bottom[i] 
− Vth_init[i] + Comp[i]  …（８）
上記のようにして、シフト値が求められる。この後、Ｒｅａｄレベル“ｉ”が更新されてＲｅａｄレベルの最高値“Ｍ”まで上記動作が繰り返され、各Ｒｅａｄレベルのシフト値が求められる（Ｓ６９−Ｓ６３）。
【０１０３】
ここで、実際のＮＡＮＤフラッシュメモリから読み出したデータと、ディストリビューション・リードの揺らぎがあった場合について、一般的な手法と、第１の実施形態を使ってＶｔｈの最適値を算出してみる。
【０１０４】
図３３、図３４、図３５は、実際のＮＡＮＤフラッシュメモリから読み出したデータから一般的な手法を用いて、ＤレベルのＶｔｈの最適値を算出した例を示している。
【０１０５】
一般的な手法の場合、図３３に示すように、ディストリビューション・リードによって得られた“１”の個数の差分データを５点加重平均したヒストグラムの最小値を探索し、差分データ が最小値となるＶｔｈを求めている。図３３に示す例の場合、Ｖｔｈ＝２１２ＤＡＣの時、差分データが最小値“１５５”となっている。このため、一般的な手法で求められるＶｔｈの最適値は、図３４に示すように、２１２ＤＡＣであり、ＤレベルのＶｔｈの初期値２２８ＤＡＣに対するＶｔｈ境界のシフト値は１６ＤＡＣである。
【０１０６】
一方、図２８に示した場合と同じように、ディストリビューション・リードの揺らぎによってＶｔｈ＝２２４ＤＡＣのデータに含まれる“１”の数が“１５”減った例を、図３５に示している。
【０１０７】
図３５に示す例の場合、Ｖｔｈ＝２２４ＤＡＣの時に差分データが最小値１５１をとる。よって、一般的な手法で求められるＶｔｈの最適値は２２４ＤＡＣであり、ＤレベルのＶｔｈの初期値２２８ＤＡＣに対するＶｔｈ境界のシフト値は、−４ＤＡＣである。
【０１０８】
図３６、図３７、図３８は、図３３、図３４と同じ例に対して、第１の実施形態の手法を適用した場合を示している。
【０１０９】
図３６に示すように、第１の実施形態の場合、ディストリビューション・リードによって得られた“１”の個数の差分データを５点加重平均したヒストグラムの差分データの最小値を探索するが、最小値をとるＶｔｈは求めない。この例の場合、Ｖｔｈ＝２１２ＤＡＣの時、差分データは、最小値１５５をとる。
【０１１０】
次に、図３６に示すように、求めた最小値１５５に、予め定められたマージン１５を加算して、「分布の底部」を探すための閾値が求められる。
【０１１１】
閾値 ＝ 最小値 ＋ マージン ＝ １５５ ＋ １５ ＝ １７０ＤＡＣ
次に、加重平均をとったヒストグラムが閾値より小さい値をとるＶｔｈの両端が求められる。この例の場合、２１２ＤＡＣ、２１６ＤＡＣ、２２０ＤＡＣ、２２４ＤＡＣのとき、ヒストグラムは閾値より小さな値をとる。すなわち、ヒストグラムが閾値より小さな値をとる領域の左端は２１２ＤＡＣであり、右端は２２４ＤＡＣである。Ｖｔｈの最適値は、式（９）に示すように、領域の左端のＤＡＣ値と右端のＤＡＣ値の平均値を求めることにより得られる。
【０１１２】
最適値 ＝ （領域の左端の値 ＋ 領域の右端の値）／２ 
＝ （２１２＋２２４）／２ ＝ ２１８ＤＡＣ              …（９）
よって、図３８に示すように、第１の実施形態により求められるＶｔｈの最適値は、２１８ＤＡＣであり、ＤレベルのＶｔｈの初期値２２８ＤＡＣに対するＶｔｈ境界のシフト値は−１０ＤＡＣである。
【０１１３】
図３９、図４０、図４１は、図３５と同じ例に対して、第１の実施形態の手法を適用した場合を示している。
【０１１４】
図３９に示すように、第１の実施形態は、ディストリビューション・リードによって得られた“１”の個数の差分データを５点加重平均したヒストグラムの最小値を探索するが、最小値をとるＶｔｈは求めない。この例の場合、Ｖｔｈ＝２２４ＤＡＣの時、差分データは、最小値１５１をとる。
【０１１５】
次に、図４０に示すように、探索された最小値１５１に、予め定められたマージン“１５”を加算して、「分布の底部」を探すための閾値が次のように求められる。
【０１１６】
閾値 ＝ 最小値 ＋ マージン
＝１５１ ＋ １５ ＝ １６６ＤＡＣ
次に、図４１に示すように、加重平均をとったヒストグラムが閾値より小さい値をとるＶｔｈの両端が求められる。この例の場合、２１２ＤＡＣ、２１６ＤＡＣ、２２０ＤＡＣ、２２４ＤＡＣのときにヒストグラムは閾値“１６６”より小さな値をとる。このため、ヒストグラムが閾値より小さな値をとる領域の左端は２１２ＤＡＣ、右端は２２４ＤＡＣである。Ｖｔｈの最適値は領域の左端のＤＡＣ値と右端のＤＡＣ値の平均値より下記のように求められる。
【０１１７】
最適値 ＝ （領域の左端の値 ＋ 領域の右端の値）／２
＝（２１２＋２２４）／２＝２１８ＤＡＣ
よって、第１の実施形態で求められるＶｔｈの最適値は、２１８ＤＡＣであり、ＤレベルのＶｔｈの初期値２２８ＤＡＣに対するＶｔｈ境界のシフト値は−１０ＤＡＣである。
【０１１８】
図３７から図４１に示すように、第１の実施形態により求めた場合、ディストリビューション・リードの値が揺らいだとしても、殆どの場合でＶｔｈの最適値に与える影響は、一般的な手法に比べて小さく抑えることができる。
【０１１９】
上記第１の実施形態によれば、ディストリビューション・リードにより、ＮＡＮＤフラッシュメモリから読み出したデータ“１”の数の差分データを求め、この差分データを加重平均してスムージングし、このスムージングされたヒストグラムの最小値を求め、この最小値にマージンを加算して「分布の底部」を探すための閾値を求め、ヒストグラムが閾値より小さな値をとるＶｔｈの範囲を求め、このＶｔｈの範囲の両端のＶｔｈの値を求め、この両端のＶｔｈの値の平均値を求めることにより、Ｖｔｈの最適値を求めている。このため、ディストリビューション・リードの各ステップで読み出されるデータのわずかなばらつきがＶｔｈの最適値の予測値に与える影響を小さく抑えることができる。したがって、Ｖｔｈのシフト値を正確に求めることが可能であるため、ＮＡＮＤフラッシュメモリから正確にデータを読み出すことが可能であり、読み出しエラーを低減することが可能である。
【０１２０】
尚、第１の実施形態は、加重平均をヒストグラムのそれぞれのステップに対して５点のデータを使って作成しているが、これに限らず、例えば３点のデータを使うなど、使うデータ数を変えることも可能である。
【０１２１】
（第２の実施形態）
図４２は、第２の実施形態に係るＶｔｈトラッキングを示している。図４２において、図２９と同一部分には同一符号を付し、異なる部分についてのみ説明する。
【０１２２】
上記第１の実施形態は、ディストリビューション・リードにより読み出したデータ“１”の差分データの加重平均を求め、これよりヒストグラムの最小値を求めた（図２９、Ｓ６１〜Ｓ６５、Ｓ６６）。
【０１２３】
これに対して、第２の実施形態は、図４２に示すように、データ“１”の差分データの加重平均を求めず、差分データそのものヒストグラムに対して２回の探索が実行される（Ｓ６１〜Ｓ６４、Ｓ６６、Ｓ６７）。第２の実施形態は、第１の実施形態と同様に、最小値探索において、最小値をとるＶｔｈに対応するＤＡＣ値を記憶する必要は無い。
【０１２４】
第２の実施形態において、第１回目の探索（Ｓ６６）の結果求められた最小値に、予め定められたマージン、例えば“１５”を加算し、分布の底部の閾値が生成される。この後、第２回目の探索（Ｓ６７）が実行され、差分データのヒストグラムが分布の底部の閾値より小さな値をとる範囲、すなわち、分布の底部の領域が探索される。第２回目の探索では分布の底部の領域のＶｔｈの最大値と最小値が１個ずつ記憶される。
【０１２５】
第２回目の探索の後、分布の底部の領域のＶｔｈの最大値と最小値の平均値が求められ、ディストリビューション・リードの開始ＤＡＣ値を加えることによって分布の底部のＶｔｈの値が求められ、シフト値が求められる（Ｓ６８）。
【０１２６】
さらに、上記動作がＲｅａｄレベルの最大値Ｍまで繰り返される（Ｓ６９、Ｓ７０〜Ｓ６３）。
【０１２７】
図４３は、第１回目の探索、すなわち、最小値の探索動作（Ｓ６６）を具体的に示している。図４３と図３０との相違点は、図３０において、探索対象が差分データをスムージングしたヒストグラムであるのに対して、図４３において、検索対象は、差分データそのものである。
【０１２８】
すなわち、図４３において、ステップ数が“Ｎ−１”に初期設定され（Ｓ６６−１）、ステップカウント“ｉ”が“０”に初期化され（Ｓ６６−２）、最小値ＭｉｎがDelta(i)に初期設定される（Ｓ６６−３）。この状態において、ステップカウント“ｉ”を更新して差分データ の最小値が探索される（Ｓ６６−４〜Ｓ６６−７）。最小値の探索動作は図３０の場合と同様であるため、詳細な説明は省略する。
【０１２９】
図４４は、図４２に示す第２回目の探索（Ｓ６７）、すなわち、第１回目の探索で求められた最小値Minにマージンを加算して分布の底部の閾値を生成し、この閾値より小さな値をとるＶｔｈの範囲が探索する動作の例を示している。
【０１３０】
図４４において、図３１と異なるのは、ステップ数の設定（Ｓ６７−２−１）、ステップカウントの初期設定（Ｓ６７−３−１）、及び差分データに基づき最小値を判別する工程（Ｓ６７−６−１）であり、その他の部分は、図３１と同様である。このため、図３１と同一部分には同一符号を付し、具体的な説明は省略する。
【０１３１】
図４４の動作により、差分データから最小値に基づき設定された閾値より小さな値をつるＶｔｈの範囲が求められる。
【０１３２】
この後、式（１０）、図３２に示すように、分布の底部のＶｔｈからＶｔｈの初期値を減算して差分が求められ、この差分がシフト値となる。
【０１３３】
Shift[i] ＝ DistStart_Vth[i] ＋ Bottom[i] − VthInit[i]  …（１０）
また、補正が必要であれば、式（８）に示すように、予め設定された補正値Comp(Level)が加算されてシフト値が求められる。
【０１３４】
第２の実施形態によれば、第１の実施形態と同様にディストリビューション・リードの各ステップで読み出されたデータの僅かなばらつきがＶｔｈの最適値の予測値に与える影響を抑えることが可能である。
【０１３５】
また、第２の実施形態は、第１の実施形態と異なり、差分データに対して加重平均を求めていないため、第１の実施形態と同じステップ数のディストリビューション・リードを実行したときに、得られるヒストグラムのステップ数が第１の実施形態よりも多くなる。
【０１３６】
例えばＤレベルのＶｔｈの最適値を求めるためにディストリビューション・リードを２５回実行する場合、第２の実施形態では、ヒストグラム作成のための差分データを得る動作によって、ヒストグラムは２４点の有効データを有する。これに対して、第１の実施形態の場合、差分データを得る動作の後、５点加重平均を求める動作により、有効データが４点減する。このため、ヒストグラムは２０点の有効データを持つこととなる。
【０１３７】
このように、第２の実施形態の場合、差分データに対して加重平均を求めていないため、処理時間を第１の実施形態より短縮することが可能であるが、ヒストグラムの揺らぎの影響を第１の実施形態より受け易くなる。
【０１３８】
（第３の実施形態）
図４５は、第３の実施形態に係るＶｔｈトラッキングを示している。第１、第２の実施形態は、Ｖｔｈ分布の底部を検索した。これに対して、第３の実施形態は、Ｖｔｈ分布の頂部（突部）を検索する。すなわち、第１回目の探索において、Ｖｔｈ分布の局所最小値ではなく局所最大値が求められる。この求めたＶｔｈ分布の最大値に基づき「閾値」が決定され、第２回目の探索でＶｔｈ分布の底部ではなく、「閾値」より大きな値をとるＶｔｈ分布の頂部が探索される。
【０１３９】
図４５は、図２９に示す第１の実施形態と同様であり、第１回目の探索動作（Ｓ７１）、第２の探索動作（Ｓ７２）、及びシフト値の演算動作（Ｓ７３）が第１の実施形態と異なっている。このため、第１回目の探索動作（Ｓ７１）、第２回目の探索動作（Ｓ７２）、及びシフト値の演算動作（Ｓ７３）についてのみ説明する。
【０１４０】
図４６は、第１回目の探索動作（Ｓ７１）を示している。第１回目の探索動作は、先ず、ステップ数が“Ｎ−３”に設定され（Ｓ７１−１）、ステップカウントが“ｉ＝２”に初期設定される（Ｓ７１−２）。この状態において、スムージングされたが最大値Maxとして設定される（Ｓ７１−３）。この後、ステップカウント“ｉ”がインクリメントされて（Ｓ７１−４）、スムージングされたヒストグラムの値が最大値Max より大きいかどうかが判別される（Ｓ７１−５）。この判別の結果、スムージングされたヒストグラムの値が最大値Max より大きい場合、最大値Maxが更新される（Ｓ７１−６）。このような動作が、ステップカウント“ｉ”がステップ数“Ｎ−３”となるまで繰り返される（Ｓ７１−７〜Ｓ７１−４）。
【０１４１】
このように、第１回目の探索では、１つの最大値が探索される。第１の実施形態と同様に、第１回目の探索最大値をとるＶｔｈに対応するＤＡＣ値を記憶する必要は無い。
【０１４２】
図４７は、第２回目の探索動作（Ｓ７２）を示している。第２回目の探索動作では、分布の頂部の領域としてＶｔｈの最大値と最小値が１個ずつ検出される。すなわち、第２回目の探索動作は、上記第１回目の探索動作（Ｓ７１）により得られた最大値からマージンを減算して、分布の頂部の閾値を生成し、この閾値より大きな値をとるＶｔｈの範囲が探索される。
【０１４３】
すなわち、図４７において、先ず、Ｒｅａｄレベルが“ｉ＝Ｒｅａｄレベル”に初期設定され（Ｓ７２−１）、ステップ数が“Ｎ−３”に設定される（Ｓ７２−２）。さらに、ステップカウントが“ｉ＝２”に初期設定され（Ｓ７２−３）、頂部領域を検出したことを示すフラグTop_found が“０”に初期設定される（Ｓ７２−４）。この後、第１の探索動作（Ｓ７１）により得られた最大値からマージンが減算されて閾値Top_limitが設定される（Ｓ７２−５）。
【０１４４】
この状態において、スムージングされたヒストグラムの値が閾値Top_limitより大きいかどうかが判別される（Ｓ７２−６）。この判別の結果、ヒストグラムの値が閾値Top_limitより大きい場合、Top_Rightが“ｉ”に設定される（Ｓ７２−７）。この後、フラグTop_found が“０”かどうかが判別される（Ｓ７２−８）。この場合、フラグTop_found が“０”であるため、フラグTop_found が“１”に設定されるとともに、Top_Leftが“ｉ”に設定される（Ｓ７２−９）。すなわち、分布の頂部の領域のＶｔｈの最小値がTop_Leftに設定される。
【０１４５】
この後、ステップカウント“ｉ”がインクリメントされ、ステップカウント“ｉ”が“Ｎ−３”となるまで、上記動作が繰り返される（Ｓ７２−１０、Ｓ７２−１１〜Ｓ７２−６）。このようにして、分布の頂部の領域のＶｔｈの最大値がTop_Rightに設定される。
【０１４６】
ステップＳ７２−１１において、ステップカウント“ｉ”が“Ｎ−３”となったことが判別された場合、分布の頂部の領域のＶｔｈの最大値と最小値の平均値が、式（１１）により演算される（Ｓ７２−１２）。
【０１４７】
Top[i] ＝ (Top_Left ＋ Top_Right)／2                        …（１１）
図４８は、シフト値の演算動作（Ｓ７３）を示している。シフト値は、分布の頂部のＶｔｈから、頂部の両端のＶｔｈの初期値の平均値を引いて求められる。すなわち、Ｖｔｈレベルが“ｉ＝Vth_Level”に設定され（Ｓ７３−１）、式（１２）に基づき、シフト値が演算される（Ｓ７３−２）。
【０１４８】
Shift[i] ＝ DistStart_Vth[i] ＋ Top[i] − ( Vth_init[i-1] 
＋ Vth_init[i]) /2…（１２）
尚、必要であれば、式（１２）で求めたシフト値に、レベル毎に予め決められている補正値Comp(Level)を加算してもよい。
【０１４９】
上記第３の実施形態によれば、ヒストグラムの最大値のシフト値を求めることができる。この最大値のシフト値に補正値を加算、又は減算することにより最小値のシフト値を推定することが可能である。このシフト値に基づきＮＡＮＤフラッシュメモリ２０の読み出し電圧を制御することにより、第３の実施形態によっても、ＮＡＮＤフラッシュメモリ２０から読み出されるデータの誤り率を低下することが可能である。
【０１５０】
尚、第３の実施形態は、上記動作に限らず、第２の実施形態のように、差分データの加重平均を求めず、差分データのヒストグラムに基づき、最大値を探索することも可能である。
【０１５１】
（第４の実施形態）
上記第１乃至第３の実施形態は、分布の底部、又は頂部を探索した。これに対して、第４の実施形態は、分布の底部を探索する際、第１回目の探索動作において、探索範囲内に分布の頂部があるかどうかも探索する。探索範囲内に分布の頂部がある場合、分布の頂部の前後で最小値を探索し、第２回目の探索動作において、分布の底部の閾値を複数個設定する。すなわち、第４の実施形態は、第３の実施形態と同様に、分布の頂部の左側（分布の頂部よりＶｔｈレベルが小さい側）の最小値Minimum_lower（以下min_lと記す）と、分布の頂部の右側（分布の頂部よりＶｔｈレベルが大きい側）の最小値Minimum_upper（以下min_uと記す）を決めるための第１回目の探索動作と、分布の底部の左側の閾値 bottom_l_limitと、分布の底部の右側の閾値 bottom_u_limitを決めるための第２回目の探索動作を行う。
【０１５２】
図４９は、第４の実施形態に係るＶｔｈトラッキングの概略的な動作を示している。
【０１５３】
図４９を参照して、第４の実施形態の動作を概略的に説明する。尚、図４９において、ステップＳ６１〜Ｓ６５のスムージングまでの動作は、第３の実施形態と同様であるため、説明は省略する。
【０１５４】
ステップ８１は、第１回目の探索動作の前半であり、分布の頂部の左側の最小値min_lが探索される。この探索の途中において、頂部が検出された場合、後述するフラグtop_foundが“１”に設定される。第１回目の探索動作の前半が終了した後、フラグtop_foundが“１”であるかどうかが判別され（Ｓ８２）、フラグtop_foundが“１”であり、頂部が検出されている場合、第１回目の探索動作の後半が実行され、分布の頂部の右側の最小値min_uが探索される（Ｓ８３）。
【０１５５】
上記のようにして、分布の頂部の左側の最小値min_lと頂部の右側の最小値min_uが検出された後、第２回目の探索動作の前半が実行される（Ｓ８４）。第２回目の探索動作の前半は、第１の実施形態と同様の動作により、分布の頂部の左側の最小値min_lにマージンを加算して分布の底部の閾値bottom_l_limitが設定され、この閾値bottom_l_limitにより定められた分布の底部の領域のＶｔｈの最小値と最大値が探索される。
【０１５６】
この後、フラグtop_foundが“１”であるかどうかが判別され（Ｓ８５）、フラグtop_foundが“１”である場合、第２回目の探索動作の後半が実行される（Ｓ８６）。第２回目の探索動作の後半は、前半と同様の動作により、分布の頂部の右側の最小値min_uにマージンを加算して分布の底部の閾値bottom_u_limitが設定され、この閾値bottom_u_limitにより定められた分布の底部の領域のＶｔｈの最小値と最大値が探索される。
【０１５７】
このようにして得られた分布の頂部の左側の底部の領域のＶｔｈの最小値と最大値の中央の値と、分布の頂部の右側の底部の領域のＶｔｈの最小値と最大値の中央の値が演算され、Ｖｔｈの低い方の底部のＶｔｈレベルと、Ｖｔｈの高い方の底部のＶｔｈレベルが求められる（Ｓ８７）。
【０１５８】
このような動作が、Ｒｅａｄレベル“i”を更新して（Ｓ８８）、Ｒｅａｄレベル“Ｍａｘ＿Ｒｅａｄ＿Ｌｅｖｅｌ − １”まで繰り返される（Ｓ８９〜Ｓ６３）。
【０１５９】
上記動作を実行するため、第４の実施形態は、分布の頂部を探索するために、２つの閾値と３つ又は４つのフラグを用いる。
【０１６０】
（１）第１の閾値top_high_limit は、ヒストグラムの値がこの値より大きくなると、分布の頂部の領域とみなす。例えばスムージング処理を行わないヒストグラムにおいて、top_high_limitは、例えば１５０ＤＡＣであり、スムージング処理したヒストグラムにおいて、top_high_limitは、例えば３００ＤＡＣであるとする。
【０１６１】
（２）第２の閾値top_low_limit は、ヒストグラムの値がこの値より小さくなると、分布の底部の領域とみなす。例えばスムージング処理を行わないヒストグラムにおいて、top_low_limitは、例えば１００ＤＡＣであり、スムージング処理したヒストグラムにおいて、top_low_limitは、例えば２００ＤＡＣであるとする。
【０１６２】
（３）フラグbottom_l_foundは、初期値を“０”とした後に、Ｖｔｈの小さい方からヒストグラムを探索し、分布の底部が最初に探索されたとき、“１”にセットされる。すなわち、Ｖｔｈの小さい方からヒストグラムの値がチェックされ、ヒストグラムの値が、top_low_limit より小さくなったとき、bottom_l_foundが“１”にセットされる。
【０１６３】
（４）フラグtop_foundは、初期値が“０”に設定された後、Ｖｔｈの小さい方からヒストグラムを探索し、フラグbottom_l_foundが“１”の状態において、分布の頂部が探索されたとき“１”に設定される。すなわち、Ｖｔｈの小さい方からヒストグラムの値が探索され、フラグbottom_l_foundが“１”の状態で、ヒストグラムの値がtop_high_limitより大きくなったとき、フラグtop_foundが“１”に設定される。
（５）フラグbottom_u_foundは、初期値が“０”に設定された後、Ｖｔｈの小さい方からヒストグラムを探索し、top_foundが“１”の状態において、分布の底部が探索されたとき“１”に設定される。すなわち、Ｖｔｈの小さい方からヒストグラムの値が探索され、top_foundが“１”の状態で、ヒストグラムの値がtop_low_limitより小さくなったとき、フラグbottom_u_found が“１”に設定される。
【０１６４】
（６）フラグsearch_endは、初期値が“０”に設定された後、Ｖｔｈの小さい方からヒストグラムを探索し、bottom_l_foundが“１”の状態において、分布の頂部が探索されたとき“１”に設定される。すなわち、Ｖｔｈの小さい方からヒストグラムの値が探索され、bottom_l_foundが“１”の状態で、ヒストグラムの値がtop_high_limitより大きくなったとき、フラグsearch_endが“１”に設定される。
【０１６５】
尚、フラグsearch_endは、オプションであり、使わなくてもよい。
【０１６６】
次に、図５０乃至図５３を用いて、上記第１、第２の探索動作を具体的に説明する。
【０１６７】
（第１回目の探索動作の前半）
図５０は、第１回目の探索（頂部探索）動作の前半のフローチャートを示している。第１回目の探索の概略動作は、フラグtop_found が“１”になるまで、分布の頂部の左側の最小値 min_lが更新され、フラグtop_found “０”である区間の最小値min_lが求められる。また、フラグtop_found が“１”になると、最小値min_lが確定される。
【０１６８】
すなわち、第１回目の探索動作の前半において、先ず、ステップ数が“Ｎ−３”に設定され（Ｓ８１−１）、フラグbottom_l_found、bottom_u_found、top_found、search_endが“０”にリセットされる（Ｓ８１−２）。さらに、ステップカウントが“ｊ＝２”に設定され（Ｓ８１−３）、Ｖｔｈの低い方からヒストグラムの探索が実行される。すなわち、スムージングされたヒストグラムの値Smoothing[j]が上述した第２の閾値top_low_limitより小さいかどうかが判別される（Ｓ８１−４）。この結果、ヒストグラムの値Smoothing[j]が第２の閾値top_low_limitより小さい場合、フラグbottom_l_foundが“１”に設定される（Ｓ８１−５）。
【０１６９】
すなわち、底部が検出されたため、ヒストグラムの値Smoothing[j]が最小値min_lに設定され（Ｓ８１−６）、ステップカウント“ｊ”がインクリメントされて（Ｓ８１−７）、ヒストグラムの値Smoothing[j]が上述した第１の閾値top_high_limitより大きいかどうかが判別される（Ｓ８１−８）。この結果、ヒストグラムの値Smoothing[j]が、第１の閾値top_high_limitより小さい場合、ヒストグラムの値Smoothing[j]が、最小値min_lより小さいかどうかが判別される（Ｓ８１−９）。この判別の結果、ヒストグラムの値Smoothing[j]が、最小値min_lより小さい場合、最小値Minが更新される（Ｓ８１−１０）。この後、ステップカウント“ｊ”がステップ数“Ｎ−３”に達したかどうかが判別され（Ｓ８１−１１）、達していない場合、ステップカウント“ｊ”がインクリメントされて（Ｓ８１−７）、上記動作が繰り返される。
【０１７０】
上記動作により、ステップ（Ｓ８１−８）において、ヒストグラムの値Smoothing[j]が、第１の閾値top_high_limitより大きいと判別された場合、フラグtop_foundが“１”に設定され（Ｓ８１−１２）、頂部領域の左側の最小値top_lowerにステップカウント“ｊ”が設定される（Ｓ８１−１３）。フラグtop_found が“１”に設定された状態において、分布の頂部の左側の最小値min_lが確定される。
【０１７１】
尚、ステップ（Ｓ８１−４）の判別の結果、ヒストグラムの値Smoothing[j]が第２の閾値top_low_limitより大きい場合、ステップカウント“ｊ”がインクリメントされ（Ｓ８１−１４）、ステップ（Ｓ８１−４）の判別が繰り返される。ステップカウント“ｊ”がステップ２からステップ数“Ｎ−３”に達するまで top_low_limit 以下になることがない場合（Ｓ８１−１５）、探索結果は得られない。
【０１７２】
（第１回目の探索動作の後半）
図５１は、第１回目の探索動作の後半を示している。
【０１７３】
上述したように、フラグtop_found が“１”に設定された場合、頂部の左側の最小値min_lは更新しない。このため、フラグtop_found が“１”にセットされた段階で、頂部の左側の最小値min_lは確定する。この状態において、ヒストグラムの値が第２の閾値top_low_limitより小さくなるまで、頂部の左側の最小値min_lと、頂部の右側の最小値min_uは両方とも更新されない。
フラグtop_found“１”の状態で、ステップカウント“ｊ”が更新されて（Ｓ８３−０）、ｊが Ｎ−３ より小さければ（Ｓ８３−１）さらに探索が進められる。ヒストグラムの値 Smoothing[j] が、第１の閾値 top_hing_limit より大きい場合（Ｓ８３−２）、top_upper が j に設定される（Ｓ８３−１３）。ヒストグラムの値Smoothing[j]が第２の閾値top_low_limitより小さくなると（Ｓ８３−３）、フラグbottom_u_foundが“１”に設定される（Ｓ８３−４）。さらに、ヒストグラムの値が頂部の右側の最小値min_uにセットされる（Ｓ８３−５）。
この状態において、ステップカウント“ｊ”が更新され（Ｓ８３−６）、探索範囲の最後まで、頂部の右側の最小値min_uを更新しながらステップカウント“ｊ”が“Ｎ−３”に達するまで頂部の右側の最小値min_uの探索が続けられる（Ｓ８３−７，Ｓ８３−８，Ｓ８３−９，Ｓ８３−１０）。
ここで、フラグtop_foundが“１”にセットされているため、頂部の左側の最小値min_lは更新されない。
ステップカウント“ｊ”が“Ｎ−３”に達した場合、分布の頂部の領域のＶｔｈの最大値と最小値の平均値が、式（１３）により演算される（Ｓ８３−１２）。
【０１７４】
Top[j] ＝ (top_lower ＋ top_upper)／2                        …（１３）
さらに、フラグsearch_endを用いる場合、フラグbottom_u_foundが“１”の状態で、ステップ（Ｓ８３−７）において、ヒストグラムの値が、第１の閾値top_high_limitより大きくなった場合、フラグsearch_endが“１”にセットされ（Ｓ８３−１１）、式（１３）により、分布の頂部の領域のＶｔｈの最大値と最小値の平均値が演算される（Ｓ８３−１２）。
【０１７５】
尚、ステップ（Ｓ８３−２）において、ヒストグラムの値が、第１の閾値top_high_limitより小さく、フラグbottom_u_foundが“０”の状態で探索動作が終わった場合（Ｓ８３−１）、探索範囲に分布の頂部全体が含まれなかったことになる。この場合、分布の底部は１つしか含まれなかったこととなるため、頂部の左側の最小値min_lを、第３の実施形態の最小値minのように扱い、第２回目の探索を行い、１つの分布の底部の位置が求められる。
さらに、オプションのフラグsearch_endを用いる場合において、フラグsearch_endが“１”の状態で探索動作が終わった場合、探索範囲に分布の頂部全体が含まれ、その両脇に２個の分布の底部が見つかり、かつ、分布の頂部の右側(分布の頂部よりＶｔｈが高い領域)の分布の底部全体が含まれることが分かる。
（第２回目の探索動作の前半）
図５２は、第２回目の探索動作の前半を示している。
第１回目の探索動作において、探索がフラグbottom_u_foundが“１”の状態で終わった場合、探索範囲に「分布の頂部」全体が含まれるとともに、「分布の底部」の候補が２つ存在することになる。この場合、次のようにして第２回目の探索動作を行い、２つの分布の底部が検出される。
先ず、第１の実施形態と同様に、予め定められたマージン、例えば１５ＤＡＣが最小値min_lに加算され、式（１４）に示すように、閾値bottom_l_limitが求められる（Ｓ８４−１）。
bottom_l_limit ＝ min_l ＋ 15                            …（１４）
さらに、ステップ数が“Ｎ−３”に設定され（Ｓ８４−２）、フラグbottom_l_found、bottom_u_found、top_found、search_endが“０”にリセットされ（Ｓ８４−３）、ステップカウントが“ｊ＝２”に設定される（Ｓ８４−４）。
【０１７６】
この状態において、探索領域のＶｔｈの最小値から順にヒストグラムの値が閾値bottom_l_limitと比較され、ヒストグラムの値が閾値bottom_l_limitより小さいかどうか判別される（Ｓ８４−５）。この結果、ヒストグラムの値が閾値bottom_l_limitより小さい場合、フラグbottom_l_foundが“１”に設定され（Ｓ８４−６）、bottom_l_lower、及びbottom_l_upperにステップカウント“ｊ”の値、すなわち、Ｖｔｈの値が設定される（Ｓ８４−７）。この後、bottom_l_lowerは更新されない。
【０１７７】
フラグtop_foundが“０”で、フラグbottom_l_foundが“１”の状態において、ステップカウント“ｊ”が更新され（Ｓ８４−８）、ヒストグラムの値が閾値top_high_limit、及びbottom_l_limitと比較される（Ｓ８４−９、Ｓ８４−１０）。この結果、ヒストグラムの値が閾値top_high_limitより小さく（Ｓ８４−９）、閾値bottom_l_limitより小さい場合（Ｓ８４−１０）、そのときのステップカウント“ｊ”の値、すなわち、Ｖｔｈの値がbottom_l_upperにセットされる（Ｓ８４−１１）。
【０１７８】
この後、ステップカウント“ｊ”が“Ｎ−３”に達するか、フラグsearch_endを用いる場合において、ヒストグラムの値が閾値top_high_limitを超えるまで、ヒストグラムの値が閾値bottom_l_limitより小さい場合、bottom_l_upperの値が更新される（Ｓ８４−１２、Ｓ８４−８）。
ステップ（Ｓ８４−９）において、ヒストグラムの値が閾値top_high_limitを越えたとき、フラグtop_foundが“１”にセットされる（Ｓ８４−１３）。このとき、一つ目の底部全体が検出されたことが確定する。この後、ステップ（Ｓ１３２）において、ステップカウント“ｊ”が“Ｎ−３”に達した場合と同様に、式（１５）により、bottom_l_lower、及びbottom_l_upperの平均値Bottom[j]が演算される（Ｓ８４−１４）。
【０１７９】
Bottom_l[j] ＝ (bottom_l_lower ＋ bottom_l_upper)／2          …（１５）
尚、フラグtop_foundが“０”の状態で、ヒストグラムの値が閾値bottom_l_limitより大きいまま探索が終了した場合（Ｓ８４−５、Ｓ８５−１５、Ｓ８４−１６）、一つ目の底部の全体は検出されなかった可能性がある。
【０１８０】
（第２回目の探索動作の後半）
図５３は、第２回目の探索動作の後半を示している。
第２回目の探索動作の前半と同様に、予め定められたマージン、例えば１５ＤＡＣが最小値min_uに加算され、式（１６）に示すように、閾値bottom_l_limitが求められる（Ｓ８６−１）。
bottom_u_limit ＝ min_u ＋ 15                            …（１６）
この後、ステップカウントが“ｊ＝２”に設定される（Ｓ８６−２）。
【０１８１】
この状態において、探索領域のＶｔｈの最小値から順にヒストグラムの値が閾値bottom_u_limitとされ、ヒストグラムの値が閾値bottom_u_limitより小さいかどうか判別される（Ｓ８６−３）。この結果、ヒストグラムの値が閾値bottom_u_limitより小さい場合、フラグbottom_u_foundが“１”に設定され（Ｓ８６−４）、bottom_u_lower、bottom_u_upperにステップカウント“ｊ”の値、すなわち、Ｖｔｈの値が設定される（Ｓ８６−５）。この後、bottom_l_lowerは更新されない。
【０１８２】
次いで、ステップカウント“ｊ”が更新され（Ｓ８６−６）、ヒストグラムの値と閾値top_high_limit、及び閾値bottom_u_limitが順次比較される（Ｓ８６−７、Ｓ８６−８）。この結果、ヒストグラムの値が閾値top_high_limitより小さく（Ｓ８６−７）、閾値bottom_u_limitより小さい場合（Ｓ８６−８）、そのときのステップカウント“ｊ”の値、すなわち、Ｖｔｈの値がbottom_u_upperにセットされる（Ｓ８６−９）。
【０１８３】
この後、ステップカウント“ｊ”が“Ｎ−３”に達するか、フラグsearch_endを持いる場合において、ヒストグラムの値が閾値top_high_limitを超えるまで、ヒストグラムの値が閾値bottom_u_limitより小さい場合、bottom_u_upperの値が更新される（Ｓ８６−１０、Ｓ８６−６）。
ステップ（Ｓ８６−７）において、ヒストグラムの値が閾値top_high_limitを越えた場合、フラグSearch_endが“１”にセットされる（Ｓ８６−１１）。オプションのフラグsearch_endを持いる場合、フラグsearch_endに“１”がセットされた以後、最小値bottom_l_lower、bottom_l_upper、bottom_u_lower、bottom_u_upperは更新されない。
ステップ（Ｓ８６−１０）において、ステップカウント“ｊ”が“Ｎ−３”に達した場合、又はフラグSearch_endが“１”にセットされた場合、上記のようにして得られた最小値bottom_l_lower、bottom_l_upper、bottom_u_lower、bottom_u_upperから２つの底部の位置、すなわち、Ｖｔｈの低い方の底部のＶｔｈレベルBottom_l[j]と、Ｖｔｈの高い方の底部のＶｔｈレベルBottom_u[j]が式（１７）より演算される（Ｓ８６−１２）。
【０１８４】
Bottom_l[j] ＝ (bottom_l_lower ＋ bottom_l_upper)／２
Bottom_u[j] ＝ (bottom_u_lower ＋ bottom_u_upper)／２          …（１７）
底部の位置は、探索が終了した時、フラグbottom_l_foundが“１”で、フラグbottom_u_foundが“１”であれば有効である。
この後、図５４に示すように、２つの底部の位置Bottom_l[j]、Bottom_u[j]から２つの底部の初期のＶｔｈレベル（VthInit）からのシフト値が式（１８）に基づき演算される（Ｓ８７−１、Ｓ８７−２）。
【０１８５】
Shift_l[j] ＝ Bottom_l[j] − VthInit[j]
Shift_u[j] ＝ Bottom_u[j] − VthInit[j]                       …（１８）
尚、第４の実施形態は、分布の探索範囲内に底部が複数個存在することを前提として探索したが、これに限らず、分布の探索範囲内に頂部が複数個存在することを前提として探索することも可能である。
【０１８６】
上記第４の実施形態によれば、分布の底部を探索する際に、探索範囲内の頂部も探索している。このため、探索範囲内に分布の底部又は頂部が１つしかないことを前提として探索する場合、分布の底部を探索しているとき、分布の頂部が検出されたり、分布の頂部を探索しているとき、分布の底部が検出されたりした場合、分布の底部の位置に頂部があると判定したり、分布の頂部の位置に底部があると誤動作が生じる可能せいがあるが、本実施形態の場合、このような誤動作を防止することが可能である。
【０１８７】
また、第４の実施形態によれば、分布の探索範囲内に、底部が複数個存在することを前提として探索しているため、分布のシフト量が予想よりも大きい場合にも、正しい分布の底部が含まれる可能性が高くなり、シフト量の予測の信頼性を向上することが可能である。
【０１８８】
（第５の実施形態）
第５の実施形態は、第４の実施形態において、分布の底部を求める際、探索範囲に分布の頂部があるかどうかも求める。
すなわち、第５の実施形態において、探索範囲内で分布の頂部が検出された場合、分布の頂部の位置と、もとのＶｔｈ分布から求めたＶｔｈレベルの差分情報を用いる。例えば、Ｆレベルの探索中に分布の頂部を見つけた場合、ＦレベルよりＶｔｈレベルが低い位置に頂部があった場合、頂部よりＶｔｈレベルが小さい方向、すなわち、
(頂部の位置)−(もとのＶｔｈのＦレベルとＥレベルの差分)
の位置に底部があると予測し、及び／又は、頂部よりＶｔｈが大きい方向、すなわち、
(頂部の位置)＋(もとのＶｔｈのＧレベルとＦレベルの差分)
の位置に底部があると予測する。
具体的には、図５０に示す第１回目の探索動作の前半のステップ（Ｓ８１−３）、及び図５１に示す第１回目の探索動作の後半のステップ（Ｓ８３−９）のときのＶｔｈをそれぞれ最小値top_lower、top_upperに記録し、次式に示すように、これらの平均値から頂部の位置を求めることも可能である。
【０１８９】
頂部の位置＝(top_lower + top_upper)／２
頂部の位置は、探索動作が終了した時、フラグbottom_u_foundが“１”であれば有効である。
第５の実施形態の動作は、頂部の位置を使って底部の位置を予測する以外、第４の実施形態と同様であり、第４の実施形態のフローチャートに頂部の位置の求め方を示しているため、第５の実施形態のフローチャートは省略する。
【０１９０】
尚、上記第３の実施形態において、分布の頂部の位置を求めるために、分布の最大値（max）から頂部を探すための閾値を求めた。しかし、これに限定されるものではなく、例えば第４及び第５の実施形態のようにヒストグラムの値が３００以上であれば頂部であるとみなし、ヒストグラムが３００以上のＶｔｈレベル範囲の中央の値を分布の頂部の位置と定めたり、頂部領域の範囲を予め規定された割合で分割した位置において、頂部の位置を推定するようにしたりする、簡略化した手法をとることも可能である。
【０１９１】
上記第５の実施形態によれば、分布の底部を探索するときに分布の頂部を検出した場合で、検出すべき分布の底部が探索範囲内に含まれない場合、分布の頂部の形状の上方を組み合わせて分布の底部の位置を推定している。このため、Ｖｔｈのシフト量が想定よりも大きい場合において、再度、ディストリビューション・リードを実行することなく、分布の底部の位置を検出することが可能となる。
【０１９２】
（第６の実施形態）
図５５（ａ）（ｂ）乃至図６２（ａ）（ｂ）は、第６の実施形態を示すものであり、加重平均された値のヒストグラムに対して、一次関数、又は一次関数と等価な作図手法を用いることにより、分布の底部のＶｔｈを予測する例を示している。
【０１９３】
図５５（ａ）（ｂ）乃至図６２（ａ）（ｂ）において、各図の（ａ）は、図２７に対応する実際のＮＡＮＤフラッシュメモリを読み出したデータから作成したヒストグラム、各図の（ｂ）は、図２８に対応する実際のＮＡＮＤフラッシュメモリから読み出したデータにディストリビューション・リードの誤差１５をＶｔｈ＝２２６ＤＡＣに意図的に付加したデータから作成したヒストグラムに対応している。ディストリビューション・リードの誤差が第６の実施形態で得られる結果に対して与える影響が小さいことを示す目的で両方を示している。
【０１９４】
図５５（ａ）（ｂ）は、分布の１つの底部のＶｔｈを予測する場合において、分布の頂部の頂点が探索範囲に含まれていないことが分かっている場合を示している。この場合、探索範囲（例えば２００ＤＡＣ〜２４８ＤＡＣ）内において、加重平均された値のヒストグラムの両端から、それぞれの差分データが“０”となる点に向かって交差するように２つの直線を引き、これら２つの直線の交点を分布の底部と予測している。
【０１９５】
この手法によれば、第１の実施形態とほぼ同じＶｔｈに底部があると予測することができる。
【０１９６】
図５６（ａ）（ｂ）は、分布の１つの底部のＶｔｈを予測する場合において、分布の頂部の頂点を探索範囲に含まないことが分かっている場合を示している。この場合、探索範囲内において、加重平均をとったヒストグラムの両端でそれぞれ３ステップ分の平均を求め、両端の３ステップの中心のＶｔｈから、それぞれの差分データが“０”となる点に向かって交差するように２つの直線を引き、これら２つの直線の交点を分布の底部と予測している。
【０１９７】
この手法によれば、第１の実施形態とほぼ同じＶｔｈに底部があると予測することができる。
【０１９８】
図５７（ａ）（ｂ）は、第１の実施形態により検出された分布の底部の両端のヒストグラムの位置から、それぞれの差分データが“０”となる点に向かって交差するように２つの直線を引き、これら２つの直線の交点を分布の底部と予測している。
【０１９９】
この手法によっても、第１の実施形態とほぼ同じＶｔｈに底部があると予測することができる。
【０２００】
図５８（ａ）（ｂ）は、第１の実施形態により検出された分布の底部の両端からそれぞれ１ステップ（４ＤＡＣ）分外側（２３２ＤＡＣ）のヒストグラムの位置から、それぞれの差分データが“０”となる点に向かって交差するように２つの直線を引き、これら２つの直線の交点を分布の底部と予測している。
【０２０１】
この手法によっても、第１の実施形態とほぼ同じＶｔｈに底部があると予測することができる。
【０２０２】
図５９（ａ）（ｂ）は、第１の実施形態により検出された分布の底部の両端からそれぞれ２ステップ分外側（２３６ＤＡＣ）のヒストグラムの位置から、それぞれの差分データが“０”となる点に向かって交差するように２つの直線を引き、これら２つの直線の交点を分布の底部と予測している。
【０２０３】
この手法によっても、第１の実施形態とほぼ同じＶｔｈに底部があると予測することができる。
【０２０４】
図６０（ａ）（ｂ）は、第１の実施形態により検出された分布の底部の両端からそれぞれ３ステップ分外側（２４０ＤＡＣ）のヒストグラムの位置から、それぞれの差分データが“０”となる点に向かって交差するように２つの直線を引き、２つの直線の交点を分布の底部と予測している。
【０２０５】
この手法によっても、第１の実施形態とほぼ同じＶｔｈに底部があると予測することができる。
【０２０６】
図６１（ａ）（ｂ）は、図６０（ａ）（ｂ）の探索範囲をさらに1ステップ（４ＤＡＣ）外側、すなわち第１の実施形態により検出された分布の底部の両端からそれぞれ４ステップ分外側のヒストグラムの位置から直線をひこうとしたところ、分布の底部のマイナス側がＶｔｈトラッキングの探索の下限に達してしまったため、図６０（ａ）（ｂ）に対して、上限を１ステップ（４ＤＡＣ）分外側（２４４ＤＡＣ）のヒストグラムの位置から、それぞれの差分データが“０”となる点に向かって２つの直線が交差するように直線を引き、２つの直線の交点を分布の底部と予測している。
【０２０７】
この手法によっても、第１の実施形態とほぼ同じＶｔｈに底部があると予測することができる。
【０２０８】
図６２（ａ）（ｂ）は、図６０（ａ）（ｂ）の探索範囲をさらに２ステップ（８ＤＡＣ）外側、すなわち第１の実施形態により検出された分布の底部の両端からそれぞれ５ステップ分外側のヒストグラムの位置から直線をひこうとしたところ、分布の底部のマイナス側がＶｔｈトラッキングの探索の下限に達してしまったので、図６０（ａ）（ｂ）に対して上限を２ステップ（８ＤＡＣ）分外側（２４８ＤＡＣ）のヒストグラムの位置から、それぞれの差分データが“０”となる点に向かって２つの直線が交差するように直線を引き、２つの直線の交点を分布の底部と予測している。
【０２０９】
この手法によっても、第１の実施形態とほぼ同じＶｔｈに底部があると予測することができる。
【０２１０】
尚、図示しないが、図５７（ａ）において、分布の底部の両側から数ステップの平均をとり、その平均値をとったＶｔｈの中心のＶｔｈから図５６（ａ）のように、２つの直線が交差するように直線を引いても、同様の結果を得ることができる。
【０２１１】
また、同様に図示しないが、図５５（ａ）（ｂ）〜図６２（ａ）（ｂ）の手法を、加重平均をとったヒストグラムではなく、加重平均を取る前の差分データによるヒストグラムに対して適用しても同様の効果が得られる。
【０２１２】
また、図５５（ａ）（ｂ）〜図６２（ａ）（ｂ）は、実際のＮＡＮＤフラッシュメモのリードデータ、若しくはそれに準じるデータを用いた。
【０２１３】
これに対して、図６３（ａ）（ｂ）、図６４（ａ）（ｂ）は、正規分布を仮定して計算で求めた分布に対して同じ手法を用いた場合を示している。
【０２１４】
図６３（ａ）において、Ｖｔｈが２００ＤＡＣの点と、２４０ＤＡＣの点をとり、ＣレベルとＤレベルのデータの分布のＳＵＭのヒストグラムが２００ＤＡＣと２４０ＤＡＣを通る垂線と交差する点からＶｔｈが２００ＤＡＣの点と、２４０ＤＡＣの点に向かって２つの直線が交差するように直線を引き、２つの直線の交点を分布の底部と予測している。
【０２１５】
このようにして予測した分布の底部は、ＳＵＭのヒストグラムの最小値、及びＣレベルとＤレベルのデータの分布の交点に近いＶｔｈを予測している。これは分布の底部を予測するための作図で引いた直線でＣレベルの分布とＤレベルの分布を近似し、且つ、Ｖｔｈが２００ＤＡＣと２４０ＤＡＣの位置のＳＵＭのヒストグラムを結んだ直線（図６３に示す補助線ＡＬ）でＳＵＭを近似して、Ｃレベルの分布曲線とＤレベルの分布曲線の交点を予測する一次近似に相当している。
【０２１６】
このため、一次近似が実際の分布に近い場合、すなわちＣレベルの分布曲線とＤレベルの分布曲線の交点付近では良い近似になる。すなわち、第１の実施形態に示す方法で求めた分布の底部の近傍で、この手法を用いると、第１の実施形態の手法よりも高い精度で２つのレベルの分布曲線の交点を求めることができる。
【０２１７】
図５７（ａ）（ｂ）〜図５９（ａ）（ｂ）に示す手法が、一次近似の分布に近いと予想される例である。
【０２１８】
図６０（ａ）（ｂ）〜図６２（ａ）（ｂ）に示す手法は、手法１で求めた中心値が実際の中心値からずれている場合に相当する。図６０（ａ）（ｂ）〜図６２（ａ）（ｂ）に示す手法は、第１の実施形態の手法の予測が、ディストリビューション・リードの揺らぎの影響などでずれたとしても、図６０（ａ）（ｂ）〜図６２（ａ）（ｂ）に示すような処理を行うことで、２つのレベルの交点に近い位置に分布の底部を補正できることを示している。
【０２１９】
この手法は、分布を一次近似できる範囲では有効であるが、一次近似とはみなせない場合、例えば分布の頂部を越えてしまった場合、誤差が大きくなる。
【０２２０】
図６３（ｂ）は、分布の頂部を越えた場合に本手法を適用した例を示している。図６３（ｂ）は、分布の頂部を越えてしまっているため、直線がＣレベル、Ｄレベルの分布の交点付近の分布とは異なった傾きとなり、図６３（ａ）に示す予測値よりも誤差が大幅に大きくなっていることが分かる。
【０２２１】
図６４（ａ）（ｂ）は、分布の底部近傍で、この手法を適用した例であり、実際のＣレベルの分布とＤレベルの分布の交点を非常によく近似している。
【０２２２】
図６５（ａ）（ｂ）は、図６４（ａ）（ｂ）のＶｔｈの組み合わせを入れ替えた場合を示すものであり、ディストリビューション・リードのステップの都合で、分布の交点が中央に設定できない場合の例を示している。図６５（ａ）（ｂ）は、図６４（ａ）（ｂ）よりも誤差は大きくなっているが、交差した２つの直線のＶｔｈの中央値、すなわち図６５（ａ）では２２０ＤＡＣ、図６５（ｂ）では２１５ＤＡＣよりもＣレベルの分布とＤレベルの分布の交点に近い位置にＶｔｈの底部の位置を補正している。
【０２２３】
なお、図６６（ａ）（ｂ）は、ヒストグラムの値を入れ替えて、２つの直線を交差させた例を示している。ＮＡＮＤフラッシュメモリのデータ分布が正規分布に近い場合、図５５（ａ）（ｂ）〜図６２（ａ）（ｂ）の手法の方がよい近似を与えるが、ＮＡＮＤフラッシュメモリのデータ分布が異なるパターンの場合、図６６（ａ）（ｂ）に示すような手法が合う可能性がある。
【０２２４】
図６７（ａ）（ｂ）を用いて、図６６（ａ）（ｂ）の近似について説明する。図６７（ａ）で、図６６（ａ）の予測の例を示している。図６７（ｂ）に示す矢印が、この近似方法で予測する分布である。交差した２つの直線と、２３０ＤＡＣ付近に記載された矢印の交点から引いた鉛直線で囲まれる２個の三角形がエラー分布である。この近似では傾きの急な直線と鉛直線とＸ軸で作る三角形の底部辺が、傾きの緩い直線と鉛直線とＸ軸で作る三角形の底部辺よりも長いため、ＤレベルからＣレベルに移動したデータの割合が非常におおきくなり、良い近似が得られていないことが分かる。
【０２２５】
図６８は、図５５（ａ）から図６５（ｂ）に示す交点の横軸の値を示す近似式の算出方法を示している。
【０２２６】
交差する２つの直線を引く横軸の範囲（Ｖｔｈ）と、交差する２つの直線の縦軸の値（“１”の個数）を用いて、横軸の範囲Ｗを表すと、式（１９）のようになる。
【０２２７】
W=W*(a/(a+b))+W*(b/(a+b))                                        …（１９）
ここで、
“ａ”は、交差する２つの直線の左側の縦軸の値（“１”の数）であり、
“ｂ”は、交差する２つの直線の右側の縦軸の値（“１”の数）である。
【０２２８】
従って、
交差する２つの直線の左側のＸ軸の値を（Vth_a）、
交差する２つの直線の右側のＸ軸の値を（Vth_b）
とすると、横軸の範囲Ｗは、式（２０）で示される。
【０２２９】
W = Vth_b − Vth_a                                                …（２０）
このため、交点Vth_bottomは、式（２１）で示される。
【０２３０】
Vth_bottom = Vth_a + W * (a / (a + b))
= Vth_a + (Vth_b - Vth_a) * (a / (a + b))
= Vth_a * b / (a + b) + Vth_b * a / (a + b)          …（２１）
一方、図６６（ａ）から図６７（ｂ）までの交点は、式（１９）の“ａ”と“ｂ”を入れ替えたものであるから、交点Vth_bottom’は、式（２２）のようになる。
【０２３１】
Vth_bottom’ = Vth_a + W * (b / a+b))
=V th_a * a / (a+b) + Vth_b * b / (a+b)                …（２２）
今回の例では、式（２１）が交点の位置の予測に有効であるが、条件によっては、式（２２）が有効である場合もあり得る。
【０２３２】
（第７の実施形態）
図６９は、第７の実施形態を示している。
【０２３３】
上記第１、第２、第４の実施形態において、分布の底部を求めるための閾値は、ヒストグラムの最小値とマージンから演算により求めた。しかし、これに限定されるものではなく、ヒストグラムの最大値に基づき、図６９に示すようなテーブルＴ１を用意し、このテーブルＴ１を用いて閾値を設定することも可能である。
【０２３４】
図６９に示すテーブルＴ１は、頂部の高さに対して閾値が設定されている。すなわち、正規分布を仮定した場合、例えば図６、図７に示すように、各レベルの値を合計したヒストグラムにおいて、高い分布に隣接する底部の位置は、隣接する頂部の高さが高いほど低くなる。このため、図６９に示すように、分布の高さが高くなるほど小さな閾値を設定されている。
【０２３５】
図６９に示すテーブルＴ１は、例えばＮＡＮＤフラッシュメモリ２０内に記憶されている。このテーブルＴ１の内容は、ディストリビューション・リードを実行する際に、コントローラ１１ａにより読み出され、例えばＲＡＭ１５に記憶されている。コントローラ１１ａは、第２の探索動作の際、第１の探索動作において、検出された頂部の最大値に基づきテーブルＴ１を参照して閾値を選択し、第２の探索動作を実行する。
【０２３６】
尚、図６９の閾値は、分布の底部の閾値として使うことに限定されるものではなく、例えば最小値に加えるマージンとして使うこともできる。
【０２３７】
第７の実施形態によれば、予め分布の高さと閾値の関係を示すテーブルを用いることにより、閾値を求めるための演算が必要ないため、処理速度を高速化することが可能である。
【０２３８】
（第８の実施形態）
図７０は、第８の実施形態を示している。
【０２３９】
上記第３、第４、第５の実施形態において、分布の頂部を用いて分布の底部の位置を予測する場合、演算処理により求めた。
【０２４０】
これに対して、第８の実施形態は、図７０に示すように、頂部の位置（Ｖｔｈの初期値からのシフト値）に対応して、底部の位置の補正値が予め設定されたテーブルＴ２が設けられている。このテーブルＴ２は、第７の実施形態と同様に、ディストリビューション・リードを実行する際に、コントローラ１１ａにより読み出され、例えばＲＡＭ１５に記憶されている。コントローラ１１ａは、Ｖｔｈの初期値に基づきテーブルＴ２を参照し、分布の底部の位置の補正値を求め、分布の底部の位置を予測する。
【０２４１】
上記第８の実施形態によれば、頂部の位置と、底部の位置の補正値の関係を示すテーブルを用いることにより、分布の底部の位置を予測するための演算を不要とすることができる。このため、処理速度を高速化することが可能である。
【０２４２】
その他、本発明は上記各実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記各実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【符号の説明】
【０２４３】
１１…メモリデバイス、１１ａ…コントローラ、１８…ＥＣＣ回路、１９…カウンタ、２０…ＮＡＮＤフラッシュメモリ、２７…制御信号及び制御電圧発生回路。
【図１】
2013122804.tif 000003
【図２】
2013122804.tif 000004
【図３】
2013122804.tif 000005
【図４】
2013122804.tif 000006
【図５】
2013122804.tif 000007
【図６】
2013122804.tif 000008
【図７】
2013122804.tif 000009
【図８】
2013122804.tif 000010
【図９】
2013122804.tif 000011
【図１０】
2013122804.tif 000012
【図１１】
2013122804.tif 000013
【図１２】
2013122804.tif 000014
【図１３】
2013122804.tif 000015
【図１４】
2013122804.tif 000016
【図１５】
2013122804.tif 000017
【図１６】
2013122804.tif 000018
【図１７】
2013122804.tif 000019
【図１８】
2013122804.tif 000020
【図１９】
2013122804.tif 000021
【図２０】
2013122804.tif 000022
【図２１】
2013122804.tif 000023
【図２２】
2013122804.tif 000024
【図２３】
2013122804.tif 000025
【図２４】
2013122804.tif 000026
【図２５】
2013122804.tif 000027
【図２６】
2013122804.tif 000028
【図２７】
2013122804.tif 000029
【図２８】
2013122804.tif 000030
【図２９】
2013122804.tif 000031
【図３０】
2013122804.tif 000032
【図３１】
2013122804.tif 000033
【図３２】
2013122804.tif 000034
【図３３】
2013122804.tif 000035
【図３４】
2013122804.tif 000036
【図３５】
2013122804.tif 000037
【図３６】
2013122804.tif 000038
【図３７】
2013122804.tif 000039
【図３８】
2013122804.tif 000040
【図３９】
2013122804.tif 000041
【図４０】
2013122804.tif 000042
【図４１】
2013122804.tif 000043
【図４２】
2013122804.tif 000044
【図４３】
2013122804.tif 000045
【図４４】
2013122804.tif 000046
【図４５】
2013122804.tif 000047
【図４６】
2013122804.tif 000048
【図４７】
2013122804.tif 000049
【図４８】
2013122804.tif 000050
【図４９】
2013122804.tif 000051
【図５０】
2013122804.tif 000052
【図５１】
2013122804.tif 000053
【図５２】
2013122804.tif 000054
【図５３】
2013122804.tif 000055
【図５４】
2013122804.tif 000056
【図５５】
2013122804.tif 000057
【図５６】
2013122804.tif 000058
【図５７】
2013122804.tif 000059
【図５８】
2013122804.tif 000060
【図５９】
2013122804.tif 000061
【図６０】
2013122804.tif 000062
【図６１】
2013122804.tif 000063
【図６２】
2013122804.tif 000064
【図６３】
2013122804.tif 000065
【図６４】
2013122804.tif 000066
【図６５】
2013122804.tif 000067
【図６６】
2013122804.tif 000068
【図６７】
2013122804.tif 000069
【図６８】
2013122804.tif 000070
【図６９】
2013122804.tif 000071
【図７０】
2013122804.tif 000072