"n個nは2以上の自然数の閾値電圧の1つが設定されることによりデータを記憶する複数のメモリセルを有するメモリと、前記メモリからデータを読み出す制御部と、を具備し、前記制御部は、前記複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、前記複数のメモリセルから閾値電圧毎にデータを読み出し、前記閾値電圧毎に読み出されたデータの差分データを求め、前記差分データより前記閾値電圧の分布の最小値を求め、前記最小値に基づき、前記最小値より小さな値の閾値電圧の範囲を求め、前記求めた閾値電圧の範囲の中央の電圧を読み出し電圧に設定することを特徴とする半導体記憶装置。前記制御部は、前記差分データを加重平均し、加重平均されたデータより前記閾値電圧の分布の最小値を求めることを特徴とする請求項1記載の半導体記憶装置。前記制御部は、前記最小値に基づき、前記最小値より小さな値の閾値電圧の範囲を求めるとき、前記最小値にマージンを加算して閾値を設定し、この閾値より小さな値の閾値電圧の範囲を求めることを特徴とする請求項2記載の半導体記憶装置。n個nは2以上の自然数の閾値電圧の1つが設定されることによりデータを記憶する複数のメモリセルを有するメモリと、前記メモリからデータを読み出す制御部と、を具備し、前記制御部は、前記複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、前記複数のメモリセルから閾値電圧毎にデータを読み出し、前記閾値電圧毎に読み出されたデータの差分データを求め、前記差分データより前記閾値電圧の分布の最大値を求め、前記最大値に基づき、前記最大値より大きな値の閾値電圧の範囲を求め、前記求めた閾値電圧の範囲の中央の電圧を読み出し電圧に設定することを特徴とする半導体記憶装置。前記制御部は、前記差分データを加重平均し、加重平均されたデータより前記閾値電圧の分布の最大値を求めることを特徴とする請求項4記載の半導体記憶装置。n個nは2以上の自然数の閾値電圧の1つが設定されることによりデータを記憶する複数のメモリセルを有するメモリと、前記メモリからデータを読み出す制御部と、を具備し、前記制御部は、前記複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、前記複数のメモリセルから閾値電圧毎にデータを読み出し、前記閾値電圧毎に読み出されたデータの差分データを求め、前記差分データに基づき、第1の閾値より大きな最大値に対応する閾値電圧を検出し、第2の閾値より小さく前記最大値の両側に位置する第1、第2の最小値に対応する閾値電圧を検出する第1の探索動作を行い、前記第1の探索動作により検出された第1、第2の最小値に対応する閾値電圧に基づき、前記第1、第2の最小値を含む第1、第2の底部領域を設定して第2の探索動作を行い、前記第1、第2の底部領域の中央の位置から第1、第2の閾値電圧の最小値に対応する閾値電圧を検出することを特徴とする半導体記憶装置。前記第1、第2の底部領域は、前記第1、第2の最小値にマージンを付加して設定されることを特徴とする請求項6記載の半導体記憶装置。前記第1の最小値に対応する閾値電圧は、前記頂部に対応する閾値電圧と前記頂部に対して閾値電圧が低い位置に隣接する頂部の閾値電圧との差分を、前記頂部に対応する閾値電圧から減算して求め、前記第2の最小値に対応する閾値電圧は、前記頂部に対応する閾値電圧と前記頂部に対して閾値電圧が高い位置に隣接する頂部の閾値電圧との差分を、前記頂部に対応する閾値電圧に加算して求めることを特徴とする請求項7記載の半導体記憶装置。前記制御部は、分布の1つの底部の閾値電圧を探索する場合、探索範囲の差分データの両端から、差分データが0となる点に向かって交差するように2つの直線を引き、前記2つの直線の交点を分布の底部と予測することを特徴とする請求項6記載の半導体記憶装置。前記第1、第2の底部領域は、前記第1の探索により得られた第1、第2の最小値にそれぞれマージンを付加して設定されることを特徴とする請求項6記載の半導体記憶装置。前記分布の頂部の値に対応して閾値が設定された第1のテーブルを有し、前記制御部は、前記第1の探索により得られた最大値に基づき、前記第1のテーブルの閾値を選択し、前記第1、第2の底部領域を設定することを特徴とする請求項6記載の半導体記憶装置。前記頂部の位置に対応して、前記底部の位置の補正値が設定された第2のテーブルを有し、前記制御部は、前記頂部の位置に基づき、前記第2のテーブルの底部の位置の補正値を選択し、前記底部の位置を予測することを特徴とする請求項6記載の半導体記憶装置。本実施形態は、メモリセルの閾値電圧の分布を正確に探索することが可能な半導体記憶装置を提供しようとするものである。本実施形態の半導体記憶装置は、n個nは2以上の自然数の閾値電圧の1つが設定されることによりデータを記憶する複数のメモリセルを有するメモリと、前記メモリからデータを読み出す制御部と、を具備し、前記制御部は、前記複数のメモリセルの閾値電圧の分布を調べる読み出し動作により、前記複数のメモリセルから閾値電圧毎にデータを読み出し、前記閾値電圧毎に読み出されたデータの差分データを求め、前記差分データより前記閾値電圧の分布の最小値を求め、前記最小値に基づき、前記最小値より小さな値の閾値電圧の範囲を求め、前記求めた閾値電圧の範囲の中央の電圧を読み出し電圧に設定することを特徴とする。以下、図面を参照して本実施形態について説明する。装置構成図1は、本実施形態に係る半導体記憶装置を概略的に示している。半導体記憶装置11は、例えばSDカードにより構成される。半導体記憶装置11は、図示せぬホスト装置に接続されたときに電源供給を受けて動作し、ホスト装置からのアクセスに応じた処理を行う。この半導体記憶装置11は、コントローラ11aを有している。コントローラ11aは、例えばホストインタフェースI/F12、CPU13、ROMReadonlyMemory14、RAMRandomAccessMemory15、バッファ16、メモリインターフェースI/F17、エラー訂正回路ECC回路18、カウンタ19により構成されている。これらは、バスにより接続されている。メモリインターフェース17には、例えばNANDフラッシュメモリ20が接続されている。ホストインタフェース12は、コントローラ11aとホスト装置との間のインターフェース処理を行う。メモリインターフェース17は、コントローラ11aとNANDフラッシュメモリ20との間のインターフェース処理を行う。CPU13は、メモリデバイス11全体の動作を司るものである。このCPU13は、例えばホスト20からライト書き込みコマンド、リード読み出しコマンド、イレース消去コマンドを受けてNANDフラッシュメモリ20上の領域をアクセスしたり、バッファ16を介してデータ転送処理を制御したりする。ROM14は、CPU13により使用される制御プログラムなどのファームウェアを格納する。RAM15は、CPU13の作業エリアとして使用され、制御プログラムや各種のテーブルなどを記憶する。バッファ16は、ホスト20から送られてくるデータを、例えばNANDフラッシュメモリ20へ書き込む際、一定量のデータ例えば1ページ分を一時的に記憶したり、NANDフラッシュメモリ20から読み出されたデータをホスト装置へ送り出す際、一定量のデータを一時的に記憶したりする。ECC回路18は、NANDフラッシュメモリ20から読み出されたデータ中のエラーを訂正する。カウンタ19は、後述するディストリビューションリードを実行する際、閾値電圧分布のヒストグラムを求めるため、NANDフラッシュメモリ20から読み出されたデータ中に含まれるデータ1の個数を計数するために使用される。NANDフラッシュメモリ20は、例えば積層ゲート構造のメモリセル、又はMONOS構造のメモリセルにより構成され、多値、例えば8値8レベルとも言うのデータを記憶可能とされている。図2は、NANDフラッシュメモリ20の概略構成を示している。メモリセルアレイ21は、複数のビット線と複数のワード線と共通ソース線を含み、例えばEEPROMセルからなる電気的にデータを書き換え可能なメモリセルがマトリクス状に配置されている。このメモリセルアレイ21には、ビット線を制御するためのビット制御回路22とワード線制御回路26が接続されている。ビット線制御回路22は、ビット線を介してメモリセルアレイ21中のメモリセルのデータを読み出したり、ビット線を介してメモリセルアレイ21中のメモリセルの状態を検出したり、ビット線を介してメモリセルアレイ21中のメモリセルに書き込み制御電圧を印加してメモリセルに書き込みを行なう。ビット線制御回路22には、カラムデコーダ23、データ入出力バッファ24が接続されている。ビット線制御回路22内のデータ記憶回路はカラムデコーダ23によって選択される。データ記憶回路に読み出されたメモリセルのデータは、前記データ入出力バッファ4を介してデータ入出力端子25から外部へ出力される。外部から供給されたNAND型フラッシュメモリの動作を制御する各種コマンドCMD、アドレスADD、及びデータDTは、データ入出力端子25に入力される。データ入出力端子25に入力された書き込みデータは、データ入出力バッファ4を介して、カラムデコーダ23によって選択されたデータ記憶回路に供給され、コマンド及びアドレスは制御信号及び制御電圧発生回路27に供給される。ワード線制御回路26は、メモリセルアレイ21に接続されている。このワード線制御回路26は、メモリセルアレイ21中のワード線を選択し、選択されたワード線に読み出し、書き込みあるいは消去に必要な電圧を印加する。メモリセルアレイ21、ビット線制御回路22、カラムデコーダ23、データ入出力バッファ24、及びワード線制御回路26は、制御信号及び制御電圧発生回路27に接続され、この制御信号及び制御電圧発生回路27によって制御される。制御信号及び制御電圧発生回路27は、制御信号入力端子8に接続され、外部から制御信号入力端子8を介して入力される制御信号ALEアドレスラッチイネーブル、CLEコマンドラッチイネーブル、WEライトイネーブル、RWリードイネーブルによって制御される。前記ビット線制御回路22、カラムデコーダ23、ワード線制御回路26、制御信号及び制御電圧発生回路27は書き込み回路、及び読み出し回路を構成している。制御信号及び制御電圧発生回路27は、図示せぬデジタルアナログ変換器を有し、このデジタルアナログ変換器は、予め定められた数値データに基づき、読み出し動作時における読み出し電圧や、書き込み動作時におけるプログラム電圧を発生する。例えばメモリセルに8値のデータが小さい順に、消去レベル、Aレベル、Bレベル、Cレベル、Dレベル、Eレベル、Fレベル、Gレベルのデータが記憶されている場合、Aレベル、Bレベル、Cレベル、Dレベル、Eレベル、Fレベル、Gレベルのデータを読み出すために必要な数値データが予め設定されている。このデジタルアナログ変換器に入力される数値データを、以下nDACnは数値と記す。Aレベル~Gレベルを読み出すための数値データは、例えば25DAC、90DAC、140DAC、220DAC、300DAC、370DAC、420DACに設定されている。これら数値データは例えばメモリセルアレイ21のコントローラ用のデータ領域に記憶されている。この数値データは、パワーオン時にメモリセルアレイ21から読み出され、図示せぬレジスタに転送される。制御信号及び制御電圧発生回路27は、読み出し動作時、レジスタに保持された数値データに基づき、所要の読み出し電圧を生成する。以下、消去レベル、Aレベル、Bレベル、Cレベル、Dレベル、Eレベル、Fレベル、Gレベルを総称してReadレベルと呼ぶ。前述したように、NANDフラッシュメモリにストレスが印加された場合や、データを書き込んでから長期間経過した場合、個々のメモリセルの閾値電圧以下、Vthレベルとも言うが変化する。このため、メモリセルからデータを読み出すとき、上記予め設定された数値データに基づき生成された読み出し電圧により、メモリセルから正確にデータを読み出すことができなくなる。この結果、読み出されたデータに含まれるエラービット数の割合であるビットエラー率が増加する。Vthレベルがシフトすることにより、発生するエラーはエラー訂正コードECCの付加によってもある程度救済することができる。しかし、メモリセルからデータを読み出すときの読み出し電圧を最適化することにより、ECCで訂正する前のデータのビットエラー率を大幅に下げることができる。これにより、ECC回路でのエラー訂正時間を短縮したり、ECC回路の消費電力を抑えたりすることができる。メモリセルの読み出し電圧を最適化する場合、メモリセルのVthレベルの分布を探索する必要がある。このため、コントローラ11aは、メモリセルの閾値電圧分布を探索するため、後述するディストリビューションリードdistributionread機能を備えている。図3、図4、図5は、8値のNANDフラッシュメモリにデータを書き込んだ直後のVthレベルを、ディストリビューションリードを用いて読み出した例を示している。図3は、ディストリビューションリードで読み出したデータ中の1の計数値を示すものであり、縦軸に計数値を示し、横軸にVthレベルをデジタルアナログ変換器に入力される数値データにより示している。図3において、消去レベルのVth分布はVth=0以下にあるため、グラフとして表れていない。図4は、図3に示す縦軸の1の個数の差分を、横軸の4DAC単位でとったものであり、それぞれのVthレベルのデータの分布の中心から左右非対称に、異なった分散をもった正規分布を仮定してグラフ化している。図4においても、消去レベルのVth分布はVth=0以下にあるため、グラフとして表れていない。図3のグラフの値が変化しない部分は、図4に0となって現れ、図3のグラフの傾きの大きなところは、図4において、大きな値となっている。図5は、図4のBレベル、Cレベル、Dレベルを拡大して示している。図3、図4、図5に示す破線は、Dレベルの初期の読み出し電圧Vth=228DACを示している。図4、図5に示すように、書き込み直後において、各レベルのデータはReadレベルの中間付近に集中している。例えばDレベルの読み出し時、読み出し電圧として228DACを設定し、メモリセルのVthレベルが、読み出しレベルより低くければ、そのメモリセルのデータは0、高かければそのメモリセルのデータは1として読み出される。図5に示す場合、メモリセルからデータ1が読み出される。一方、図6、図7、図8は、図4、図5に示すように書き込んだデータの各レベルの中心が6~8DAC程度マイナス側に移動し、分散が大きくなった例を示している。図6は、図4と同様に8レベルのデータの分布全体を示しており、図7は、図6のBレベル、Cレベル、Dレベルを拡大した分布を示している。図8は、図7に示すDレベルに書き込まれたデータの分布だけを示している。図6、図7、図8に示すように、Dレベルに書き込んだデータがストレスを受け、図4、図5に示す分布よりマイナス側に移動していることが分かる。図8に示すVthレベル=228DACの左側と正規分布曲線の下で囲まれた面積で示される領域がDレベルからCレベルに移動したデータである。Dレベルの初期値Vthレベル=228DACで読み出した場合、図8の縦の破線の左側と正規分布曲線の下で囲まれた面積に相当する部分がDレベルではなくCレベルとして読み出される。このため、本来1として読み出されるべきデータが0として誤って読み出される。図8に示す破線の左側と正規分布曲線の下で囲まれた面積を図8の正規分布曲線の下側の面積全体で割ったものがDレベルに書き込まれたデータが、Cレベルのデータとして読みだされるエラー率より正確にはDレベルよりも下のレベルである消去レベル、Aレベル、Bレベル、Cレベルとして読み出されるエラー率である。上記のように、メモリセルのVthレベルがシフトした場合、予め設定された読み出し電圧とは異なるレベルで読み出すことにより、エラーを低減する技術としてECCとシフトリードがあり、メモリコントローラ11aは、両者を併用して正しいデータを出力している。ECCは誤りを含む状態で読み出されたデータを訂正することで正しいデータを得る。一方、シフトリードは読み出し電圧を変えることで、読み出すデータそのもののエラー率を低減する。すなわち、図8に示す例の場合、Dレベルの中心がが-8DAC移動しているため、Dレベルが-8DAC移動しているということが分かれば、Dレベルの読み出しレベルを-8DAC程度移動することにより、Dレベルで書き込んだデータがCレベルで読み出される誤りと、Cレベルで書き込んだデータがDレベルで読み出される誤りの全体を最小にすることができ、全体としてのエラー率を下げることができる。図9、図10、図11は、図6、図7と同じ例で読み出しレベルの初期値を228DACから-8DACシフトした220DACに設定した場合を示している。図10に示すように、Dレベルに着目すると読み出しレベルを228DACから220DACに移動することにより、読み出しレベル220DACの左側と正規分布曲線で囲まれる面積が減少する。これはエラー数が減少することに対応している。Dレベルだけをみると読み出しレベルをさらに下げることでエラーを減らすことができる。しかし、図11に示すCレベルに着目すると、逆にDレベルの読み出しレベルを228DACから220DACに移動することにより、読み出しレベル220DACの左側と正規分布曲線で囲まれる面積が増加するので、Cレベルはエラーが増加している。すなわち、読み出しレベルをマイナス側に移動させると、DレベルからCレベルに移動するエラーは減らすことができるが、CレベルからDレベルに移動するエラーは増加する。正規分布の特性から、中心から離れるほど分布の数は減少するため、読み出しレベルを移動させ、DレベルをCレベルに誤るエラーを減らす数と、CレベルをDレベルに誤るエラーが増える数が一致する最適値が存在する。本実施形態は、読み出し電圧をシフトさせたシフトリードによって読み出すデータのエラー率をできるだけ小さくする。すなわち、読み出し電圧の最適値を探索するものである。実際のNANDフラッシュメモリのリード動作では、特殊な場合を除き、本来Dレベルであったメモリセル図10に対応、本来Cレベルであったメモリセル図11に対応は区別できないため、図10と図11を合計してできる曲線、すなわち図9に示す曲線から読み出しレベルの最適値を探索しなくてはならない。読み出しレベルの最適値を探索するための一連の動作を以下、Vthトラッキングと呼ぶ。Vthトラッキングでは、Vthの最適値を探索するため、コマンドとしてNANDフラッシュメモリに実装されているディストリビューションリードを実行する。ディストリビューションリードは、読み出しレベルを一定量ずつ変化させて2値モードSLCモードで一定量のデータを読み出す。コントローラ11aは、プログラムに使用するメモリ量を節約するなどの目的からNANDフラッシュメモリの各Vthレベルを中心にした探索領域を設け、Vthレベル毎にディストリビューションリードを実行することが多い。図12、図13、図14は、Dレベル、Cレベルに対する探索領域の例を長方形で図示している。この例ではDレベルの読み出しレベルの初期値は228DACに設定されている。図12、図13、図14において、実効的な探索領域は、200DAC以上248DAC以下に設定されている。ディストリビューションリード図15は、ある一つのReadレベルに対するディストリビューションリード動作を示している。コントローラ11aにおいて、ディストリビューションリードの開始レベル、すなわち、nDAC初期読み出しレベルVth、Vthの増分、ステップ回数NNは、現在注目しているReadレベルに対してディストリビューションリードを実行するVthレベルの総数、バースト長BLが設定されるS11。さらに、ステップカウントがj=0に初期設定されS12、バーストカウントがk=0、1の計数値totalが0に初期化されるS13。この状態において、ディストリビューションリードが開始されるS14。すなわち、NANDフラッシュメモリ20は、予め定められたデータ量、例えば1kバイト又は16kバイトのデータを読み出し、メモリインターフェース17を介してコントローラ11aに例えば1バイト単位にデータを転送する。コントローラ11aは、1バイトのデータに含まれる1の数をバースト長だけ計数するS15、S16、S17、S18、S19。この計数は、図1に示すカウンタ19により実行される。しかし、カウンタ19に限らず、ソフトウェアによりカウントすることも可能である。1の数がバースト長だけ計数されると、Vthレベルとともにtotalの1の計数値がCountjに記憶されるS20。この後、ステップカウントjが更新されてVthレベルがステップアップされS21、全てのVthレベルの読み出しが終了したかどうかが判別されるS22。この判別の結果、終了していない場合、バーストカウント、及び1の総数totalがリセットされS23、Vthレベルが更新されてディストリビューションリードが開始されるS24。この後、上記動作が繰り返され、NANDフラッシュメモリ20から出力されるデータに含まれる1の数がバースト長だけ計数されるとS15、S16、S17、S18、S19、Vthレベルとともに1の計数値totalの値がCount[j]ni記憶されるS20。このように,Vthレベルをステップアップして、ディストリビューションリード、及びデータに含まれる1数の計数が、ステップカウントjの値がNとなるまで繰り返されるS21、S22。尚、Vthレベルの2ステップ目以降のnDACは、NANDフラッシュメモリ20によっては、前のステップのDACとの差分を指定できる。前のステップのDACとの差分を指定できない場合は、2ステップ目以降も読み出しレベルに対応するnDACがNANDフラッシュメモリ20に送られる。上記ステップS22において、ステップカウントjの値がNに達したと判別された場合、制御が図16に移行される。尚、ディストリビューションリードの結果に基づき、横軸にVthレベルをプロットし、縦軸に1の計数値をプロットすると、図17に示すグラフが得られる。ヒストグラム生成図16は、図17に示すVthレベル毎に計数された1の計数値に基づき、ヒストグラムを生成するための動作を示している。コントローラ11aは、隣接するVthレベルの1の計数値とCountの差分を演算する。このため、図16に示すように、ステップ数がN-1に設定されS31、ステップカウントがj=0に初期設定されるS32。この後、式1で示す演算が、ステップカウントjを更新しながら、ステップカウントがN-1となるまで繰り返されるS33、S34、S35。Deltaj=Countj1-Countj...1このようにして、1の計数値の差分が求められる。横軸にVthレベルをプロットし、縦軸に1の計数値の差分をプロットすると、図18に示すヒストグラムが得られる。上記動作から分かるように、読み出しレベルの最適値を探索するためには、各Vthレベルに存在する1の個数がほぼ等しくなるのが望ましい。一般に、メモリコントローラ11aには、NANDフラッシュメモリ20に書き込んだデータの信頼性を向上させるため、データをランダマイズして書き込む手法が採用されている。このため、本実施形態においても、NANDフラッシュメモリ20のデータがランダマイズされて、各Readレベルに存在する1の個数がほぼ等しくなっていることが望ましいが、データがランダマイズされていない場合においても、本実施形態を適用することが可能である。NANDフラッシュメモリでは、設定したVthレベルに対して実際に設定されるVthの揺らぎ、Vth分布を調べる行為そのもので受けるメモリセルのストレスなどにより、同じVthレベルを指定しても得られるヒストグラムは必ずしも一致しないこと、すなわちヒストグラム自体に揺らぎが発生することが知られている。図17、図18、図19は、実際の8値NANDフラッシュメモリに対してVthトラッキングを実行して得られたヒストグラムを示している。図17は、NANDフラッシュメモリから読み出したデータ中の1の数を、ディストリビューションリードで設定した各Vthに対応するDAC値を横軸としてグラフ化したものである。図18は、図17の横軸を4DAC単位のステップに分割して、ステップ毎の差分をとった値Deltaを縦軸にプロットし、各Vthに対応するDAC値を横軸としてグラフ化したものである。図19は、図18に示すグラフの値に対して、後述するように、加重平均を実行してスムージングしたグラフである。実際のNANDフラッシュメモリに対してディストリビューションリードを行うと、図18に示すように、滑らかでないグラフが得られることがある。この揺らぎの影響を軽減するため、Vthレベルがjに対応するヒストグラム値Deltaに対して、前後数ステップのVthレベルのヒストグラムの値を加重平均することでヒストグラムの揺らぎの影響を小さくする手法をとることがある。例えば1ステップ離れる毎に影響を半分とするように、前後2ステップの加重平均をとると、加重平均後のヒストグラムの各Vth=jでの値Smoothingは、式2のようになる。SmoothingjDeltaj24Deltaj12DeltajDeltaj12Deltaj24...2加重平均図20は、加重平均を計算するためのフローチャートを示している。図20において、先ず、ステップ数がN-3に設定されS41、ステップカウントがj=2に初期化されS42、式2が実行されるS43。この後、ステップカウントjが更新されS44、ステップ数に達するまで、ステップS43の演算が繰り返されるS45。図21は、図18のDレベル近傍を拡大したグラフを示しており、この揺らぎを有するヒストグラムに対して、上記加重平均の計算を実行することにより、図22に示すように、スムージングされたヒストグラムを得ることができる。一般的な最小値探索一般な最小値探索は、図22に示すような加重平均後のヒストグラムSmoothingjが最小値をとる点を、各Vthレベルの底部凹部として求め、Vthレベルの底部とVthレベルの初期値との差分を、そのVthレベルでのシフト値として、式3により求めている。VthShiftVthshifted-Vthinit...3図23は、ディストリビューションリードの開始VthレベルのDAC値をDistStartVthとしたときの最小値VthShiftedを探索するフローチャートの一例を示している。図23において、先ず、ステップ数N-3が設定され、ステップカウントがj=2に初期化されるS52。この後、加重平均後のヒストグラムのVth=jの値Smoothingが最小値Minとして設定され、ステップカウントjの値がMinVthに設定されるS53。次いで、ステップカウントjを更新して、Smoothingと最小値Minとが比較されるS54。この比較の結果、Smoothingが最小値Minより小さい場合、Smoothingが最小値Minとして設定されるS56。この動作が、ステップカウントjを更新して、ステップカウントjがステップ数N-3まで繰り返されるS57~S54。ステップS57において、ステップカウントjがステップ数N-3に達したものと判別されると、ディストリビューションリードの開始VthのDAC値DistStartVthとMinVthが加算され、ディストリビューションリードの開始VthのDAC値をDistStartVthとしたときの最小値VthShiftedが求められるS58。図23は、差分データDeltavalueが最小値となるVthが一点である場合において、差分データが最小値となるVthを検出する方法を示している。しかし、差分データが最小値となるVthが幅を持っている場合、図24に示すような動作により、最小値となるVthの中心値平均値を求めることができる。図24において、図23と同一部分には同一符号を付し、異なる部分についてのみ説明する。この例の場合、差分データが最小値となるVthが検出された場合に設定されるフラグminfoundを有し、初期設定において、このフラグminfoundがリセットされるS52-1。この後、最小値の探索が実行されS53~S55、最小値が検出された場合S56-1、S56-2、フラグminfoundがセットされているかどうかが判別されS56-3、セットされていない場合、フラグminfoundがセットされるとともに、差分データが最小値となるVthの値jがMinvthlに保持されるS56-4。さらに、Vthの値jがMinvthuに保持されるS56-5。この後、ステップカウントjの値が更新されて上記動作がステップ数N-3に達するまで繰り返されるS57~S54。ステップカウントjの値がステップ数N-3に達すると、式4に基づき、最小値の平均値Minvthが算出されるS57-1。Minvth=/2...4さらに、式5により、ディストリビューションリードの開始VthのDAC値をDistStartVthとしたときの最小値VthShiftedが求められる。VthShiftDistStartVthMinvth...5加重平均後のヒストグラムの分布の広がりが少ない場合にはこの方法で問題ないが、ヒストグラムの分布が広がっている場合には、分布の底部付近で加重平均したヒストグラムの値の最小値に近い値をもつ領域が広がっていることがある。このため、加重平均したヒストグラムの揺らぎによってVthShiftの値も変動し、このシフト値を使ってデータを読み出した場合のビットエラー率も安定しない、という問題がある。実際のNANDフラッシュメモリに対してVthトラッキングを行いヒストグラムの底部が広がっている例を図25乃至図28に示す。図25は、Dレベルの差分のデータを示しており、図26は、図25に示すデータにおいて、Vth=226DACのデータに含まれる1の数が、15個少なかった場合のグラフである。図25に示すヒストグラムは、212DACで最小値を示しているが、図26に示すヒストグラムは、224DACで最小値を示している。図27は、図25に示すヒストグラムの5点加重平均をとったヒストグラムを示し、図28は、図26に示すヒストグラムの5点加重平均をとったヒストグラムを示している。図27は、212DACでヒストグラムが最小になっているが、図28は、224DACでヒストグラムが最小になっている。すなわち、Vth=226DACのデータの中の1の個数が15個変動することによって、Vthトラッキングで得られる分布の底部のVthの位置が、212DACから224へと12DAC変化している。Vth=212~224近傍ではディストリビューションリードのステップ4DAC毎に1の個数が50個程度変化しているため、Vthの最適値の値が12DAC変化すると、それぞれのVthで読み出した場合に読み出したデータは約50bit3=約150bit変化することになる。Vth=212DACに設定した場合とVth=224DACに設定した場合のエラービット数の違いは、図26に示す220DAC近傍の破線で囲まれたグラフの下側の面積に相当する。このように、分布の底部が広がっている場合、分布の底部付近のデータに含まれる1の個数が15個程度変化すると、Vthの底部の最適値の位置は大きく変化し、結果的としてエラービット数が大きく変動する。この結果、分布が広がっている場合、このような手法ではVthトラッキングによるVthの最適値が変動して1kBあたり100bit程度の訂正能力を持つ強力なECCを使用してもエラー訂正できない可能性が高くなるという問題がある。第1の実施形態そこで、第1の実施形態では、加重平均をとったデータをVthのDAC単位に並べたヒストグラムから最小値を見つけるための探索を2回実行する。すなわち、1回目の探索では上述の例と同様にヒストグラムの最小値を求めるが、最小値をとるDAC値は求めない。2回目の探索では1回目の探索で見つけた最小値に予め定められたマージンを加えて探索のための閾値を作成し、ヒストグラムの中で閾値より小さくなるDAC値の最小値と最大値を探索する。第2回目の探索で検出されたDAC値の最大値と最小値の平均値をヒストグラムの底部をとるDAC値として求め、この値からVthの最適値を求める。図29は、第1の実施形態に係るVthトラッキングを示している。図29を参照して第1の実施形態に係るVthトラッキングについて説明する。先ず、Vthレベルの数がM、例えばMaxReadlevel-1に設定されS61、Readレベルiが0に初期設定されるS62。この状態において、NANDフラッシュメモリ20に対して、Readレベル毎にディストリビューションリードが実行されるS63。このディストリビューションリードの動作は、図15に示す通りであり、Vthレベル毎に1の個数が計数される。この後、図16に示す動作が実行され、隣接するVthレベルの1の個数の差分が演算され、差分データと、Vthとにより、ヒストグラムが生成されるS64。次に、図20に示す動作が実行されて差分データの加重平均が演算され、加重平均したヒストグラムが作成されるS65。次いで、加重平均された値のヒストグラムの局所、例えば最小値を探索する第1の探索動作が実行されるS66。第1の探索動作図30は、第1の探索動作を示しており、図23と同一部分には同一符合を付している。第1の探索は、図23と同様の動作により、ヒストグラムの最小値が1つだけ検出される。但し、この最小値探索の段階では差分データが最小値となるVthに対応するDAC値を記憶する必要は無い。すなわち、図30において、図23と異なるのは、図23に示すステップS58がない点である。次に、第1の探索動作の結果求められた最小値に、予め決められたマージン、例えば15が加算されて分布の底部の閾値が生成され、加重平均したヒストグラムが分布の底部の閾値より小さな値をとる範囲、すなわち、分布の底部の領域を探索する第2の探索動作が実行されるS67。この第2の探索動作では、分布の底部の領域のVthの最大値と最小値が1個ずつ検出される。さにら、第2の探索動作において、分布の底部の領域のVthの最大値と最小値の平均値が求められる。第2の探索動作図31は、第2の探索動作の一例を示している。先ず、VthレベルiがVthレベルに設定されS67-1、ステップ数がN-3に設定されS67-2、ステップカウントjが2に設定されS67-3、分布の底部の領域を検出するためのフラグbottomfoundが0に設定されるS67-4。さらに、前述したように、第1の探索の結果求められた最小値Minに、予め決められたマージンMargin、例えば15が加算されて、分布の底部の閾値Bottomlimitが生成される67-5。この状態において、スムージングされたヒストグラムの値SmoothingjがBottomlimitより小さいかどうか判別されるS67-6。この結果、差分データの値SmoothingiがBottomlimitより小さい場合、ステップカウントjの値が、分布の底部の領域のVthの最小値としてBottomRightに設定されるS67-7。次いで、フラグbottomfoundが0か、どうかが判別されS67-8、フラグbottomfoundが0である場合、フラグbottomfoundが1に設定されるとともに、ステップカウントjの値が、分布の底部の領域のVthの最大値としてBottomLeftに設定されるS67-9。この後、ステップカウントjの値が更新されて上記動作が繰り返されS67-10、S67-11~S67-6、ステップカウントjの値がN-3となった場合、式6により、BottomLeftとBottomRightの平均値Bottomiが求められる。Bottomi=/2...6上記第2の探索の後、図29に示すように、シフト値が演算されるS68。図32は、シフト値の演算動作の一例を示している。この演算は、先ず、ReadレベルiがReadLevelに設定されるS68-1。この後、ディストリビューションリードの開始DAC値DistStartVthi、平均値Bottomi、及びVthInitiに基づき、式7によりシフト値Shiftiが演算されるS68-2。Shifti=DistStartVthiBottomi-VthIniti...7このように、分布の底部のVthからVthの初期値を引くことにより、差分を求めることができる。尚、補正が不要であれば、差分がシフト値となる。また、必要であれば、差分に補正を加えてシフト値を求めてもよい。最も単純な補正方法としては、式8に示すように、図32で求めたシフト値に、レベル毎に予め決められている補正値Compが加算される。Shifti=DistStartVthiBottomi-VthinitiCompi...8上記のようにして、シフト値が求められる。この後、Readレベルiが更新されてReadレベルの最高値Mまで上記動作が繰り返され、各Readレベルのシフト値が求められるS69-S63。ここで、実際のNANDフラッシュメモリから読み出したデータと、ディストリビューションリードの揺らぎがあった場合について、一般的な手法と、第1の実施形態を使ってVthの最適値を算出してみる。図33、図34、図35は、実際のNANDフラッシュメモリから読み出したデータから一般的な手法を用いて、DレベルのVthの最適値を算出した例を示している。一般的な手法の場合、図33に示すように、ディストリビューションリードによって得られた1の個数の差分データを5点加重平均したヒストグラムの最小値を探索し、差分データが最小値となるVthを求めている。図33に示す例の場合、Vth=212DACの時、差分データが最小値155となっている。このため、一般的な手法で求められるVthの最適値は、図34に示すように、212DACであり、DレベルのVthの初期値228DACに対するVth境界のシフト値は16DACである。一方、図28に示した場合と同じように、ディストリビューションリードの揺らぎによってVth=224DACのデータに含まれる1の数が15減った例を、図35に示している。図35に示す例の場合、Vth=224DACの時に差分データが最小値151をとる。よって、一般的な手法で求められるVthの最適値は224DACであり、DレベルのVthの初期値228DACに対するVth境界のシフト値は、-4DACである。図36、図37、図38は、図33、図34と同じ例に対して、第1の実施形態の手法を適用した場合を示している。図36に示すように、第1の実施形態の場合、ディストリビューションリードによって得られた1の個数の差分データを5点加重平均したヒストグラムの差分データの最小値を探索するが、最小値をとるVthは求めない。この例の場合、Vth=212DACの時、差分データは、最小値155をとる。次に、図36に示すように、求めた最小値155に、予め定められたマージン15を加算して、分布の底部を探すための閾値が求められる。閾値=最小値マージン=15515=170DAC次に、加重平均をとったヒストグラムが閾値より小さい値をとるVthの両端が求められる。この例の場合、212DAC、216DAC、220DAC、224DACのとき、ヒストグラムは閾値より小さな値をとる。すなわち、ヒストグラムが閾値より小さな値をとる領域の左端は212DACであり、右端は224DACである。Vthの最適値は、式9に示すように、領域の左端のDAC値と右端のDAC値の平均値を求めることにより得られる。最適値=領域の左端の値領域の右端の値/2=212224/2=218DAC...9よって、図38に示すように、第1の実施形態により求められるVthの最適値は、218DACであり、DレベルのVthの初期値228DACに対するVth境界のシフト値は-10DACである。図39、図40、図41は、図35と同じ例に対して、第1の実施形態の手法を適用した場合を示している。図39に示すように、第1の実施形態は、ディストリビューションリードによって得られた1の個数の差分データを5点加重平均したヒストグラムの最小値を探索するが、最小値をとるVthは求めない。この例の場合、Vth=224DACの時、差分データは、最小値151をとる。次に、図40に示すように、探索された最小値151に、予め定められたマージン15を加算して、分布の底部を探すための閾値が次のように求められる。閾値=最小値マージン=15115=166DAC次に、図41に示すように、加重平均をとったヒストグラムが閾値より小さい値をとるVthの両端が求められる。この例の場合、212DAC、216DAC、220DAC、224DACのときにヒストグラムは閾値166より小さな値をとる。このため、ヒストグラムが閾値より小さな値をとる領域の左端は212DAC、右端は224DACである。Vthの最適値は領域の左端のDAC値と右端のDAC値の平均値より下記のように求められる。最適値=領域の左端の値領域の右端の値/2=212224/2=218DACよって、第1の実施形態で求められるVthの最適値は、218DACであり、DレベルのVthの初期値228DACに対するVth境界のシフト値は-10DACである。図37から図41に示すように、第1の実施形態により求めた場合、ディストリビューションリードの値が揺らいだとしても、殆どの場合でVthの最適値に与える影響は、一般的な手法に比べて小さく抑えることができる。上記第1の実施形態によれば、ディストリビューションリードにより、NANDフラッシュメモリから読み出したデータ1の数の差分データを求め、この差分データを加重平均してスムージングし、このスムージングされたヒストグラムの最小値を求め、この最小値にマージンを加算して分布の底部を探すための閾値を求め、ヒストグラムが閾値より小さな値をとるVthの範囲を求め、このVthの範囲の両端のVthの値を求め、この両端のVthの値の平均値を求めることにより、Vthの最適値を求めている。このため、ディストリビューションリードの各ステップで読み出されるデータのわずかなばらつきがVthの最適値の予測値に与える影響を小さく抑えることができる。したがって、Vthのシフト値を正確に求めることが可能であるため、NANDフラッシュメモリから正確にデータを読み出すことが可能であり、読み出しエラーを低減することが可能である。尚、第1の実施形態は、加重平均をヒストグラムのそれぞれのステップに対して5点のデータを使って作成しているが、これに限らず、例えば3点のデータを使うなど、使うデータ数を変えることも可能である。第2の実施形態図42は、第2の実施形態に係るVthトラッキングを示している。図42において、図29と同一部分には同一符号を付し、異なる部分についてのみ説明する。上記第1の実施形態は、ディストリビューションリードにより読み出したデータ1の差分データの加重平均を求め、これよりヒストグラムの最小値を求めた図29、S61~S65、S66。これに対して、第2の実施形態は、図42に示すように、データ1の差分データの加重平均を求めず、差分データそのものヒストグラムに対して2回の探索が実行されるS61~S64、S66、S67。第2の実施形態は、第1の実施形態と同様に、最小値探索において、最小値をとるVthに対応するDAC値を記憶する必要は無い。第2の実施形態において、第1回目の探索S66の結果求められた最小値に、予め定められたマージン、例えば15を加算し、分布の底部の閾値が生成される。この後、第2回目の探索S67が実行され、差分データのヒストグラムが分布の底部の閾値より小さな値をとる範囲、すなわち、分布の底部の領域が探索される。第2回目の探索では分布の底部の領域のVthの最大値と最小値が1個ずつ記憶される。第2回目の探索の後、分布の底部の領域のVthの最大値と最小値の平均値が求められ、ディストリビューションリードの開始DAC値を加えることによって分布の底部のVthの値が求められ、シフト値が求められるS68。さらに、上記動作がReadレベルの最大値Mまで繰り返されるS69、S70~S63。図43は、第1回目の探索、すなわち、最小値の探索動作S66を具体的に示している。図43と図30との相違点は、図30において、探索対象が差分データをスムージングしたヒストグラムであるのに対して、図43において、検索対象は、差分データそのものである。すなわち、図43において、ステップ数がN-1に初期設定されS66-1、ステップカウントiが0に初期化されS66-2、最小値MinがDeltaに初期設定されるS66-3。この状態において、ステップカウントiを更新して差分データの最小値が探索されるS66-4~S66-7。最小値の探索動作は図30の場合と同様であるため、詳細な説明は省略する。図44は、図42に示す第2回目の探索S67、すなわち、第1回目の探索で求められた最小値Minにマージンを加算して分布の底部の閾値を生成し、この閾値より小さな値をとるVthの範囲が探索する動作の例を示している。図44において、図31と異なるのは、ステップ数の設定S67-2-1、ステップカウントの初期設定S67-3-1、及び差分データに基づき最小値を判別する工程S67-6-1であり、その他の部分は、図31と同様である。このため、図31と同一部分には同一符号を付し、具体的な説明は省略する。図44の動作により、差分データから最小値に基づき設定された閾値より小さな値をつるVthの範囲が求められる。この後、式10、図32に示すように、分布の底部のVthからVthの初期値を減算して差分が求められ、この差分がシフト値となる。Shifti=DistStartVthiBottomi-VthIniti...10また、補正が必要であれば、式8に示すように、予め設定された補正値Compが加算されてシフト値が求められる。第2の実施形態によれば、第1の実施形態と同様にディストリビューションリードの各ステップで読み出されたデータの僅かなばらつきがVthの最適値の予測値に与える影響を抑えることが可能である。また、第2の実施形態は、第1の実施形態と異なり、差分データに対して加重平均を求めていないため、第1の実施形態と同じステップ数のディストリビューションリードを実行したときに、得られるヒストグラムのステップ数が第1の実施形態よりも多くなる。例えばDレベルのVthの最適値を求めるためにディストリビューションリードを25回実行する場合、第2の実施形態では、ヒストグラム作成のための差分データを得る動作によって、ヒストグラムは24点の有効データを有する。これに対して、第1の実施形態の場合、差分データを得る動作の後、5点加重平均を求める動作により、有効データが4点減する。このため、ヒストグラムは20点の有効データを持つこととなる。このように、第2の実施形態の場合、差分データに対して加重平均を求めていないため、処理時間を第1の実施形態より短縮することが可能であるが、ヒストグラムの揺らぎの影響を第1の実施形態より受け易くなる。第3の実施形態図45は、第3の実施形態に係るVthトラッキングを示している。第1、第2の実施形態は、Vth分布の底部を検索した。これに対して、第3の実施形態は、Vth分布の頂部突部を検索する。すなわち、第1回目の探索において、Vth分布の局所最小値ではなく局所最大値が求められる。この求めたVth分布の最大値に基づき閾値が決定され、第2回目の探索でVth分布の底部ではなく、閾値より大きな値をとるVth分布の頂部が探索される。図45は、図29に示す第1の実施形態と同様であり、第1回目の探索動作S71、第2の探索動作S72、及びシフト値の演算動作S73が第1の実施形態と異なっている。このため、第1回目の探索動作S71、第2回目の探索動作S72、及びシフト値の演算動作S73についてのみ説明する。図46は、第1回目の探索動作S71を示している。第1回目の探索動作は、先ず、ステップ数がN-3に設定されS71-1、ステップカウントがi=2に初期設定されるS71-2。この状態において、スムージングされたが最大値Maxとして設定されるS71-3。この後、ステップカウントiがインクリメントされてS71-4、スムージングされたヒストグラムの値が最大値Maxより大きいかどうかが判別されるS71-5。この判別の結果、スムージングされたヒストグラムの値が最大値Maxより大きい場合、最大値Maxが更新されるS71-6。このような動作が、ステップカウントiがステップ数N-3となるまで繰り返されるS71-7~S71-4。このように、第1回目の探索では、1つの最大値が探索される。第1の実施形態と同様に、第1回目の探索最大値をとるVthに対応するDAC値を記憶する必要は無い。図47は、第2回目の探索動作S72を示している。第2回目の探索動作では、分布の頂部の領域としてVthの最大値と最小値が1個ずつ検出される。すなわち、第2回目の探索動作は、上記第1回目の探索動作S71により得られた最大値からマージンを減算して、分布の頂部の閾値を生成し、この閾値より大きな値をとるVthの範囲が探索される。すなわち、図47において、先ず、Readレベルがi=Readレベルに初期設定されS72-1、ステップ数がN-3に設定されるS72-2。さらに、ステップカウントがi=2に初期設定されS72-3、頂部領域を検出したことを示すフラグTopfoundが0に初期設定されるS72-4。この後、第1の探索動作S71により得られた最大値からマージンが減算されて閾値Toplimitが設定されるS72-5。この状態において、スムージングされたヒストグラムの値が閾値Toplimitより大きいかどうかが判別されるS72-6。この判別の結果、ヒストグラムの値が閾値Toplimitより大きい場合、TopRightがiに設定されるS72-7。この後、フラグTopfoundが0かどうかが判別されるS72-8。この場合、フラグTopfoundが0であるため、フラグTopfoundが1に設定されるとともに、TopLeftがiに設定されるS72-9。すなわち、分布の頂部の領域のVthの最小値がTopLeftに設定される。この後、ステップカウントiがインクリメントされ、ステップカウントiがN-3となるまで、上記動作が繰り返されるS72-10、S72-11~S72-6。このようにして、分布の頂部の領域のVthの最大値がTopRightに設定される。ステップS72-11において、ステップカウントiがN-3となったことが判別された場合、分布の頂部の領域のVthの最大値と最小値の平均値が、式11により演算されるS72-12。Topi=/2...11図48は、シフト値の演算動作S73を示している。シフト値は、分布の頂部のVthから、頂部の両端のVthの初期値の平均値を引いて求められる。すなわち、Vthレベルがi=VthLevelに設定されS73-1、式12に基づき、シフト値が演算されるS73-2。Shifti=DistStartVthiTopi-2...12尚、必要であれば、式12で求めたシフト値に、レベル毎に予め決められている補正値Compを加算してもよい。上記第3の実施形態によれば、ヒストグラムの最大値のシフト値を求めることができる。この最大値のシフト値に補正値を加算、又は減算することにより最小値のシフト値を推定することが可能である。このシフト値に基づきNANDフラッシュメモリ20の読み出し電圧を制御することにより、第3の実施形態によっても、NANDフラッシュメモリ20から読み出されるデータの誤り率を低下することが可能である。尚、第3の実施形態は、上記動作に限らず、第2の実施形態のように、差分データの加重平均を求めず、差分データのヒストグラムに基づき、最大値を探索することも可能である。第4の実施形態上記第1乃至第3の実施形態は、分布の底部、又は頂部を探索した。これに対して、第4の実施形態は、分布の底部を探索する際、第1回目の探索動作において、探索範囲内に分布の頂部があるかどうかも探索する。探索範囲内に分布の頂部がある場合、分布の頂部の前後で最小値を探索し、第2回目の探索動作において、分布の底部の閾値を複数個設定する。すなわち、第4の実施形態は、第3の実施形態と同様に、分布の頂部の左側分布の頂部よりVthレベルが小さい側の最小値Minimumlower以下minlと記すと、分布の頂部の右側分布の頂部よりVthレベルが大きい側の最小値Minimumupper以下minuと記すを決めるための第1回目の探索動作と、分布の底部の左側の閾値bottomllimitと、分布の底部の右側の閾値bottomulimitを決めるための第2回目の探索動作を行う。図49は、第4の実施形態に係るVthトラッキングの概略的な動作を示している。図49を参照して、第4の実施形態の動作を概略的に説明する。尚、図49において、ステップS61~S65のスムージングまでの動作は、第3の実施形態と同様であるため、説明は省略する。ステップ81は、第1回目の探索動作の前半であり、分布の頂部の左側の最小値minlが探索される。この探索の途中において、頂部が検出された場合、後述するフラグtopfoundが1に設定される。第1回目の探索動作の前半が終了した後、フラグtopfoundが1であるかどうかが判別されS82、フラグtopfoundが1であり、頂部が検出されている場合、第1回目の探索動作の後半が実行され、分布の頂部の右側の最小値minuが探索されるS83。上記のようにして、分布の頂部の左側の最小値minlと頂部の右側の最小値minuが検出された後、第2回目の探索動作の前半が実行されるS84。第2回目の探索動作の前半は、第1の実施形態と同様の動作により、分布の頂部の左側の最小値minlにマージンを加算して分布の底部の閾値bottomllimitが設定され、この閾値bottomllimitにより定められた分布の底部の領域のVthの最小値と最大値が探索される。この後、フラグtopfoundが1であるかどうかが判別されS85、フラグtopfoundが1である場合、第2回目の探索動作の後半が実行されるS86。第2回目の探索動作の後半は、前半と同様の動作により、分布の頂部の右側の最小値minuにマージンを加算して分布の底部の閾値bottomulimitが設定され、この閾値bottomulimitにより定められた分布の底部の領域のVthの最小値と最大値が探索される。このようにして得られた分布の頂部の左側の底部の領域のVthの最小値と最大値の中央の値と、分布の頂部の右側の底部の領域のVthの最小値と最大値の中央の値が演算され、Vthの低い方の底部のVthレベルと、Vthの高い方の底部のVthレベルが求められるS87。このような動作が、Readレベルiを更新してS88、ReadレベルMax_Read_Level-1まで繰り返されるS89~S63。上記動作を実行するため、第4の実施形態は、分布の頂部を探索するために、2つの閾値と3つ又は4つのフラグを用いる。1第1の閾値tophighlimitは、ヒストグラムの値がこの値より大きくなると、分布の頂部の領域とみなす。例えばスムージング処理を行わないヒストグラムにおいて、tophighlimitは、例えば150DACであり、スムージング処理したヒストグラムにおいて、tophighlimitは、例えば300DACであるとする。2第2の閾値toplowlimitは、ヒストグラムの値がこの値より小さくなると、分布の底部の領域とみなす。例えばスムージング処理を行わないヒストグラムにおいて、toplowlimitは、例えば100DACであり、スムージング処理したヒストグラムにおいて、toplowlimitは、例えば200DACであるとする。3フラグbottomlfoundは、初期値を0とした後に、Vthの小さい方からヒストグラムを探索し、分布の底部が最初に探索されたとき、1にセットされる。すなわち、Vthの小さい方からヒストグラムの値がチェックされ、ヒストグラムの値が、toplowlimitより小さくなったとき、bottomlfoundが1にセットされる。4フラグtopfoundは、初期値が0に設定された後、Vthの小さい方からヒストグラムを探索し、フラグbottomlfoundが1の状態において、分布の頂部が探索されたとき1に設定される。すなわち、Vthの小さい方からヒストグラムの値が探索され、フラグbottomlfoundが1の状態で、ヒストグラムの値がtophighlimitより大きくなったとき、フラグtopfoundが1に設定される。5フラグbottomufoundは、初期値が0に設定された後、Vthの小さい方からヒストグラムを探索し、topfoundが1の状態において、分布の底部が探索されたとき1に設定される。すなわち、Vthの小さい方からヒストグラムの値が探索され、topfoundが1の状態で、ヒストグラムの値がtoplowlimitより小さくなったとき、フラグbottomufoundが1に設定される。6フラグsearchendは、初期値が0に設定された後、Vthの小さい方からヒストグラムを探索し、bottomlfoundが1の状態において、分布の頂部が探索されたとき1に設定される。すなわち、Vthの小さい方からヒストグラムの値が探索され、bottomlfoundが1の状態で、ヒストグラムの値がtophighlimitより大きくなったとき、フラグsearchendが1に設定される。尚、フラグsearchendは、オプションであり、使わなくてもよい。次に、図50乃至図53を用いて、上記第1、第2の探索動作を具体的に説明する。第1回目の探索動作の前半図50は、第1回目の探索頂部探索動作の前半のフローチャートを示している。第1回目の探索の概略動作は、フラグtopfoundが1になるまで、分布の頂部の左側の最小値minlが更新され、フラグtopfound0である区間の最小値minlが求められる。また、フラグtopfoundが1になると、最小値minlが確定される。すなわち、第1回目の探索動作の前半において、先ず、ステップ数がN-3に設定されS81-1、フラグbottomlfound、bottomufound、topfound、searchendが0にリセットされるS81-2。さらに、ステップカウントがj=2に設定されS81-3、Vthの低い方からヒストグラムの探索が実行される。すなわち、スムージングされたヒストグラムの値Smoothingjが上述した第2の閾値toplowlimitより小さいかどうかが判別されるS81-4。この結果、ヒストグラムの値Smoothingjが第2の閾値toplowlimitより小さい場合、フラグbottomlfoundが1に設定されるS81-5。すなわち、底部が検出されたため、ヒストグラムの値Smoothingjが最小値minlに設定されS81-6、ステップカウントjがインクリメントされてS81-7、ヒストグラムの値Smoothingjが上述した第1の閾値tophighlimitより大きいかどうかが判別されるS81-8。この結果、ヒストグラムの値Smoothingjが、第1の閾値tophighlimitより小さい場合、ヒストグラムの値Smoothingjが、最小値minlより小さいかどうかが判別されるS81-9。この判別の結果、ヒストグラムの値Smoothingjが、最小値minlより小さい場合、最小値Minが更新されるS81-10。この後、ステップカウントjがステップ数N-3に達したかどうかが判別されS81-11、達していない場合、ステップカウントjがインクリメントされてS81-7、上記動作が繰り返される。上記動作により、ステップS81-8において、ヒストグラムの値Smoothingjが、第1の閾値tophighlimitより大きいと判別された場合、フラグtopfoundが1に設定されS81-12、頂部領域の左側の最小値toplowerにステップカウントjが設定されるS81-13。フラグtopfoundが1に設定された状態において、分布の頂部の左側の最小値minlが確定される。尚、ステップS81-4の判別の結果、ヒストグラムの値Smoothingjが第2の閾値toplowlimitより大きい場合、ステップカウントjがインクリメントされS81-14、ステップS81-4の判別が繰り返される。ステップカウントjがステップ2からステップ数N-3に達するまでtoplowlimit以下になることがない場合S81-15、探索結果は得られない。第1回目の探索動作の後半図51は、第1回目の探索動作の後半を示している。上述したように、フラグtopfoundが1に設定された場合、頂部の左側の最小値minlは更新しない。このため、フラグtopfoundが1にセットされた段階で、頂部の左側の最小値minlは確定する。この状態において、ヒストグラムの値が第2の閾値toplowlimitより小さくなるまで、頂部の左側の最小値minlと、頂部の右側の最小値minuは両方とも更新されない。フラグtopfound1の状態で、ステップカウントjが更新されてS83-0、jがN-3より小さければS83-1さらに探索が進められる。ヒストグラムの値Smoothingjが、第1の閾値tophinglimitより大きい場合S83-2、topupperがjに設定されるS83-13。ヒストグラムの値Smoothingjが第2の閾値toplowlimitより小さくなるとS83-3、フラグbottomufoundが1に設定されるS83-4。さらに、ヒストグラムの値が頂部の右側の最小値minuにセットされるS83-5。この状態において、ステップカウントjが更新されS83-6、探索範囲の最後まで、頂部の右側の最小値minuを更新しながらステップカウントjがN-3に達するまで頂部の右側の最小値minuの探索が続けられるS83-7,S83-8,S83-9,S83-10。ここで、フラグtopfoundが1にセットされているため、頂部の左側の最小値minlは更新されない。ステップカウントjがN-3に達した場合、分布の頂部の領域のVthの最大値と最小値の平均値が、式13により演算されるS83-12。Topj=/2...13さらに、フラグsearchendを用いる場合、フラグbottomufoundが1の状態で、ステップS83-7において、ヒストグラムの値が、第1の閾値tophighlimitより大きくなった場合、フラグsearchendが1にセットされS83-11、式13により、分布の頂部の領域のVthの最大値と最小値の平均値が演算されるS83-12。尚、ステップS83-2において、ヒストグラムの値が、第1の閾値tophighlimitより小さく、フラグbottomufoundが0の状態で探索動作が終わった場合S83-1、探索範囲に分布の頂部全体が含まれなかったことになる。この場合、分布の底部は1つしか含まれなかったこととなるため、頂部の左側の最小値minlを、第3の実施形態の最小値minのように扱い、第2回目の探索を行い、1つの分布の底部の位置が求められる。さらに、オプションのフラグsearchendを用いる場合において、フラグsearchendが1の状態で探索動作が終わった場合、探索範囲に分布の頂部全体が含まれ、その両脇に2個の分布の底部が見つかり、かつ、分布の頂部の右側の分布の底部全体が含まれることが分かる。第2回目の探索動作の前半図52は、第2回目の探索動作の前半を示している。第1回目の探索動作において、探索がフラグbottomufoundが1の状態で終わった場合、探索範囲に分布の頂部全体が含まれるとともに、分布の底部の候補が2つ存在することになる。この場合、次のようにして第2回目の探索動作を行い、2つの分布の底部が検出される。先ず、第1の実施形態と同様に、予め定められたマージン、例えば15DACが最小値minlに加算され、式14に示すように、閾値bottomllimitが求められるS84-1。bottomllimit=minl15...14さらに、ステップ数がN-3に設定されS84-2、フラグbottomlfound、bottomufound、topfound、searchendが0にリセットされS84-3、ステップカウントがj=2に設定されるS84-4。この状態において、探索領域のVthの最小値から順にヒストグラムの値が閾値bottomllimitと比較され、ヒストグラムの値が閾値bottomllimitより小さいかどうか判別されるS84-5。この結果、ヒストグラムの値が閾値bottomllimitより小さい場合、フラグbottomlfoundが1に設定されS84-6、bottomllower、及びbottomlupperにステップカウントjの値、すなわち、Vthの値が設定されるS84-7。この後、bottomllowerは更新されない。フラグtopfoundが0で、フラグbottomlfoundが1の状態において、ステップカウントjが更新されS84-8、ヒストグラムの値が閾値tophighlimit、及びbottomllimitと比較されるS84-9、S84-10。この結果、ヒストグラムの値が閾値tophighlimitより小さくS84-9、閾値bottomllimitより小さい場合S84-10、そのときのステップカウントjの値、すなわち、Vthの値がbottomlupperにセットされるS84-11。この後、ステップカウントjがN-3に達するか、フラグsearchendを用いる場合において、ヒストグラムの値が閾値tophighlimitを超えるまで、ヒストグラムの値が閾値bottomllimitより小さい場合、bottomlupperの値が更新されるS84-12、S84-8。ステップS84-9において、ヒストグラムの値が閾値tophighlimitを越えたとき、フラグtopfoundが1にセットされるS84-13。このとき、一つ目の底部全体が検出されたことが確定する。この後、ステップS132において、ステップカウントjがN-3に達した場合と同様に、式15により、bottomllower、及びbottomlupperの平均値Bottomjが演算されるS84-14。Bottomlj=/2...15尚、フラグtopfoundが0の状態で、ヒストグラムの値が閾値bottomllimitより大きいまま探索が終了した場合S84-5、S85-15、S84-16、一つ目の底部の全体は検出されなかった可能性がある。第2回目の探索動作の後半図53は、第2回目の探索動作の後半を示している。第2回目の探索動作の前半と同様に、予め定められたマージン、例えば15DACが最小値minuに加算され、式16に示すように、閾値bottomllimitが求められるS86-1。bottomulimit=minu15...16この後、ステップカウントがj=2に設定されるS86-2。この状態において、探索領域のVthの最小値から順にヒストグラムの値が閾値bottomulimitとされ、ヒストグラムの値が閾値bottomulimitより小さいかどうか判別されるS86-3。この結果、ヒストグラムの値が閾値bottomulimitより小さい場合、フラグbottomufoundが1に設定されS86-4、bottomulower、bottomuupperにステップカウントjの値、すなわち、Vthの値が設定されるS86-5。この後、bottomllowerは更新されない。次いで、ステップカウントjが更新されS86-6、ヒストグラムの値と閾値tophighlimit、及び閾値bottomulimitが順次比較されるS86-7、S86-8。この結果、ヒストグラムの値が閾値tophighlimitより小さくS86-7、閾値bottomulimitより小さい場合S86-8、そのときのステップカウントjの値、すなわち、Vthの値がbottomuupperにセットされるS86-9。この後、ステップカウントjがN-3に達するか、フラグsearchendを持いる場合において、ヒストグラムの値が閾値tophighlimitを超えるまで、ヒストグラムの値が閾値bottomulimitより小さい場合、bottomuupperの値が更新されるS86-10、S86-6。ステップS86-7において、ヒストグラムの値が閾値tophighlimitを越えた場合、フラグSearchendが1にセットされるS86-11。オプションのフラグsearchendを持いる場合、フラグsearchendに1がセットされた以後、最小値bottomllower、bottomlupper、bottomulower、bottomuupperは更新されない。ステップS86-10において、ステップカウントjがN-3に達した場合、又はフラグSearchendが1にセットされた場合、上記のようにして得られた最小値bottomllower、bottomlupper、bottomulower、bottomuupperから2つの底部の位置、すなわち、Vthの低い方の底部のVthレベルBottomljと、Vthの高い方の底部のVthレベルBottomujが式17より演算されるS86-12。Bottomlj=/2Bottomuj=/2...17底部の位置は、探索が終了した時、フラグbottomlfoundが1で、フラグbottomufoundが1であれば有効である。この後、図54に示すように、2つの底部の位置Bottomlj、Bottomujから2つの底部の初期のVthレベルVthInitからのシフト値が式18に基づき演算されるS87-1、S87-2。Shiftlj=Bottomlj-VthInitjShiftuj=Bottomuj-VthInitj...18尚、第4の実施形態は、分布の探索範囲内に底部が複数個存在することを前提として探索したが、これに限らず、分布の探索範囲内に頂部が複数個存在することを前提として探索することも可能である。上記第4の実施形態によれば、分布の底部を探索する際に、探索範囲内の頂部も探索している。このため、探索範囲内に分布の底部又は頂部が1つしかないことを前提として探索する場合、分布の底部を探索しているとき、分布の頂部が検出されたり、分布の頂部を探索しているとき、分布の底部が検出されたりした場合、分布の底部の位置に頂部があると判定したり、分布の頂部の位置に底部があると誤動作が生じる可能せいがあるが、本実施形態の場合、このような誤動作を防止することが可能である。また、第4の実施形態によれば、分布の探索範囲内に、底部が複数個存在することを前提として探索しているため、分布のシフト量が予想よりも大きい場合にも、正しい分布の底部が含まれる可能性が高くなり、シフト量の予測の信頼性を向上することが可能である。第5の実施形態第5の実施形態は、第4の実施形態において、分布の底部を求める際、探索範囲に分布の頂部があるかどうかも求める。すなわち、第5の実施形態において、探索範囲内で分布の頂部が検出された場合、分布の頂部の位置と、もとのVth分布から求めたVthレベルの差分情報を用いる。例えば、Fレベルの探索中に分布の頂部を見つけた場合、FレベルよりVthレベルが低い位置に頂部があった場合、頂部よりVthレベルが小さい方向、すなわち、-の位置に底部があると予測し、及び/又は、頂部よりVthが大きい方向、すなわち、の位置に底部があると予測する。具体的には、図50に示す第1回目の探索動作の前半のステップS81-3、及び図51に示す第1回目の探索動作の後半のステップS83-9のときのVthをそれぞれ最小値toplower、topupperに記録し、次式に示すように、これらの平均値から頂部の位置を求めることも可能である。頂部の位置=/2頂部の位置は、探索動作が終了した時、フラグbottomufoundが1であれば有効である。第5の実施形態の動作は、頂部の位置を使って底部の位置を予測する以外、第4の実施形態と同様であり、第4の実施形態のフローチャートに頂部の位置の求め方を示しているため、第5の実施形態のフローチャートは省略する。尚、上記第3の実施形態において、分布の頂部の位置を求めるために、分布の最大値maxから頂部を探すための閾値を求めた。しかし、これに限定されるものではなく、例えば第4及び第5の実施形態のようにヒストグラムの値が300以上であれば頂部であるとみなし、ヒストグラムが300以上のVthレベル範囲の中央の値を分布の頂部の位置と定めたり、頂部領域の範囲を予め規定された割合で分割した位置において、頂部の位置を推定するようにしたりする、簡略化した手法をとることも可能である。上記第5の実施形態によれば、分布の底部を探索するときに分布の頂部を検出した場合で、検出すべき分布の底部が探索範囲内に含まれない場合、分布の頂部の形状の上方を組み合わせて分布の底部の位置を推定している。このため、Vthのシフト量が想定よりも大きい場合において、再度、ディストリビューションリードを実行することなく、分布の底部の位置を検出することが可能となる。第6の実施形態図55ab乃至図62abは、第6の実施形態を示すものであり、加重平均された値のヒストグラムに対して、一次関数、又は一次関数と等価な作図手法を用いることにより、分布の底部のVthを予測する例を示している。図55ab乃至図62abにおいて、各図のaは、図27に対応する実際のNANDフラッシュメモリを読み出したデータから作成したヒストグラム、各図のbは、図28に対応する実際のNANDフラッシュメモリから読み出したデータにディストリビューションリードの誤差15をVth=226DACに意図的に付加したデータから作成したヒストグラムに対応している。ディストリビューションリードの誤差が第6の実施形態で得られる結果に対して与える影響が小さいことを示す目的で両方を示している。図55abは、分布の1つの底部のVthを予測する場合において、分布の頂部の頂点が探索範囲に含まれていないことが分かっている場合を示している。この場合、探索範囲例えば200DAC~248DAC内において、加重平均された値のヒストグラムの両端から、それぞれの差分データが0となる点に向かって交差するように2つの直線を引き、これら2つの直線の交点を分布の底部と予測している。この手法によれば、第1の実施形態とほぼ同じVthに底部があると予測することができる。図56abは、分布の1つの底部のVthを予測する場合において、分布の頂部の頂点を探索範囲に含まないことが分かっている場合を示している。この場合、探索範囲内において、加重平均をとったヒストグラムの両端でそれぞれ3ステップ分の平均を求め、両端の3ステップの中心のVthから、それぞれの差分データが0となる点に向かって交差するように2つの直線を引き、これら2つの直線の交点を分布の底部と予測している。この手法によれば、第1の実施形態とほぼ同じVthに底部があると予測することができる。図57abは、第1の実施形態により検出された分布の底部の両端のヒストグラムの位置から、それぞれの差分データが0となる点に向かって交差するように2つの直線を引き、これら2つの直線の交点を分布の底部と予測している。この手法によっても、第1の実施形態とほぼ同じVthに底部があると予測することができる。図58abは、第1の実施形態により検出された分布の底部の両端からそれぞれ1ステップ4DAC分外側232DACのヒストグラムの位置から、それぞれの差分データが0となる点に向かって交差するように2つの直線を引き、これら2つの直線の交点を分布の底部と予測している。この手法によっても、第1の実施形態とほぼ同じVthに底部があると予測することができる。図59abは、第1の実施形態により検出された分布の底部の両端からそれぞれ2ステップ分外側236DACのヒストグラムの位置から、それぞれの差分データが0となる点に向かって交差するように2つの直線を引き、これら2つの直線の交点を分布の底部と予測している。この手法によっても、第1の実施形態とほぼ同じVthに底部があると予測することができる。図60abは、第1の実施形態により検出された分布の底部の両端からそれぞれ3ステップ分外側240DACのヒストグラムの位置から、それぞれの差分データが0となる点に向かって交差するように2つの直線を引き、2つの直線の交点を分布の底部と予測している。この手法によっても、第1の実施形態とほぼ同じVthに底部があると予測することができる。図61abは、図60abの探索範囲をさらに1ステップ4DAC外側、すなわち第1の実施形態により検出された分布の底部の両端からそれぞれ4ステップ分外側のヒストグラムの位置から直線をひこうとしたところ、分布の底部のマイナス側がVthトラッキングの探索の下限に達してしまったため、図60abに対して、上限を1ステップ4DAC分外側244DACのヒストグラムの位置から、それぞれの差分データが0となる点に向かって2つの直線が交差するように直線を引き、2つの直線の交点を分布の底部と予測している。この手法によっても、第1の実施形態とほぼ同じVthに底部があると予測することができる。図62abは、図60abの探索範囲をさらに2ステップ8DAC外側、すなわち第1の実施形態により検出された分布の底部の両端からそれぞれ5ステップ分外側のヒストグラムの位置から直線をひこうとしたところ、分布の底部のマイナス側がVthトラッキングの探索の下限に達してしまったので、図60abに対して上限を2ステップ8DAC分外側248DACのヒストグラムの位置から、それぞれの差分データが0となる点に向かって2つの直線が交差するように直線を引き、2つの直線の交点を分布の底部と予測している。この手法によっても、第1の実施形態とほぼ同じVthに底部があると予測することができる。尚、図示しないが、図57aにおいて、分布の底部の両側から数ステップの平均をとり、その平均値をとったVthの中心のVthから図56aのように、2つの直線が交差するように直線を引いても、同様の結果を得ることができる。また、同様に図示しないが、図55ab~図62abの手法を、加重平均をとったヒストグラムではなく、加重平均を取る前の差分データによるヒストグラムに対して適用しても同様の効果が得られる。また、図55ab~図62abは、実際のNANDフラッシュメモのリードデータ、若しくはそれに準じるデータを用いた。これに対して、図63ab、図64abは、正規分布を仮定して計算で求めた分布に対して同じ手法を用いた場合を示している。図63aにおいて、Vthが200DACの点と、240DACの点をとり、CレベルとDレベルのデータの分布のSUMのヒストグラムが200DACと240DACを通る垂線と交差する点からVthが200DACの点と、240DACの点に向かって2つの直線が交差するように直線を引き、2つの直線の交点を分布の底部と予測している。このようにして予測した分布の底部は、SUMのヒストグラムの最小値、及びCレベルとDレベルのデータの分布の交点に近いVthを予測している。これは分布の底部を予測するための作図で引いた直線でCレベルの分布とDレベルの分布を近似し、且つ、Vthが200DACと240DACの位置のSUMのヒストグラムを結んだ直線図63に示す補助線ALでSUMを近似して、Cレベルの分布曲線とDレベルの分布曲線の交点を予測する一次近似に相当している。このため、一次近似が実際の分布に近い場合、すなわちCレベルの分布曲線とDレベルの分布曲線の交点付近では良い近似になる。すなわち、第1の実施形態に示す方法で求めた分布の底部の近傍で、この手法を用いると、第1の実施形態の手法よりも高い精度で2つのレベルの分布曲線の交点を求めることができる。図57ab~図59abに示す手法が、一次近似の分布に近いと予想される例である。図60ab~図62abに示す手法は、手法1で求めた中心値が実際の中心値からずれている場合に相当する。図60ab~図62abに示す手法は、第1の実施形態の手法の予測が、ディストリビューションリードの揺らぎの影響などでずれたとしても、図60ab~図62abに示すような処理を行うことで、2つのレベルの交点に近い位置に分布の底部を補正できることを示している。この手法は、分布を一次近似できる範囲では有効であるが、一次近似とはみなせない場合、例えば分布の頂部を越えてしまった場合、誤差が大きくなる。図63bは、分布の頂部を越えた場合に本手法を適用した例を示している。図63bは、分布の頂部を越えてしまっているため、直線がCレベル、Dレベルの分布の交点付近の分布とは異なった傾きとなり、図63aに示す予測値よりも誤差が大幅に大きくなっていることが分かる。図64abは、分布の底部近傍で、この手法を適用した例であり、実際のCレベルの分布とDレベルの分布の交点を非常によく近似している。図65abは、図64abのVthの組み合わせを入れ替えた場合を示すものであり、ディストリビューションリードのステップの都合で、分布の交点が中央に設定できない場合の例を示している。図65abは、図64abよりも誤差は大きくなっているが、交差した2つの直線のVthの中央値、すなわち図65aでは220DAC、図65bでは215DACよりもCレベルの分布とDレベルの分布の交点に近い位置にVthの底部の位置を補正している。なお、図66abは、ヒストグラムの値を入れ替えて、2つの直線を交差させた例を示している。NANDフラッシュメモリのデータ分布が正規分布に近い場合、図55ab~図62abの手法の方がよい近似を与えるが、NANDフラッシュメモリのデータ分布が異なるパターンの場合、図66abに示すような手法が合う可能性がある。図67abを用いて、図66abの近似について説明する。図67aで、図66aの予測の例を示している。図67bに示す矢印が、この近似方法で予測する分布である。交差した2つの直線と、230DAC付近に記載された矢印の交点から引いた鉛直線で囲まれる2個の三角形がエラー分布である。この近似では傾きの急な直線と鉛直線とX軸で作る三角形の底部辺が、傾きの緩い直線と鉛直線とX軸で作る三角形の底部辺よりも長いため、DレベルからCレベルに移動したデータの割合が非常におおきくなり、良い近似が得られていないことが分かる。図68は、図55aから図65bに示す交点の横軸の値を示す近似式の算出方法を示している。交差する2つの直線を引く横軸の範囲Vthと、交差する2つの直線の縦軸の値1の個数を用いて、横軸の範囲Wを表すと、式19のようになる。WWW...19ここで、aは、交差する2つの直線の左側の縦軸の値1の数であり、bは、交差する2つの直線の右側の縦軸の値1の数である。従って、交差する2つの直線の左側のX軸の値をVtha、交差する2つの直線の右側のX軸の値をVthbとすると、横軸の範囲Wは、式20で示される。WVthb-Vtha...20このため、交点Vthbottomは、式21で示される。VthbottomVthaWVthaVthabVthba...21一方、図66aから図67bまでの交点は、式19のaとbを入れ替えたものであるから、交点Vthbottom’は、式22のようになる。Vthbottom’VthaWVthaaVthbb...22今回の例では、式21が交点の位置の予測に有効であるが、条件によっては、式22が有効である場合もあり得る。第7の実施形態図69は、第7の実施形態を示している。上記第1、第2、第4の実施形態において、分布の底部を求めるための閾値は、ヒストグラムの最小値とマージンから演算により求めた。しかし、これに限定されるものではなく、ヒストグラムの最大値に基づき、図69に示すようなテーブルT1を用意し、このテーブルT1を用いて閾値を設定することも可能である。図69に示すテーブルT1は、頂部の高さに対して閾値が設定されている。すなわち、正規分布を仮定した場合、例えば図6、図7に示すように、各レベルの値を合計したヒストグラムにおいて、高い分布に隣接する底部の位置は、隣接する頂部の高さが高いほど低くなる。このため、図69に示すように、分布の高さが高くなるほど小さな閾値を設定されている。図69に示すテーブルT1は、例えばNANDフラッシュメモリ20内に記憶されている。このテーブルT1の内容は、ディストリビューションリードを実行する際に、コントローラ11aにより読み出され、例えばRAM15に記憶されている。コントローラ11aは、第2の探索動作の際、第1の探索動作において、検出された頂部の最大値に基づきテーブルT1を参照して閾値を選択し、第2の探索動作を実行する。尚、図69の閾値は、分布の底部の閾値として使うことに限定されるものではなく、例えば最小値に加えるマージンとして使うこともできる。第7の実施形態によれば、予め分布の高さと閾値の関係を示すテーブルを用いることにより、閾値を求めるための演算が必要ないため、処理速度を高速化することが可能である。第8の実施形態図70は、第8の実施形態を示している。上記第3、第4、第5の実施形態において、分布の頂部を用いて分布の底部の位置を予測する場合、演算処理により求めた。これに対して、第8の実施形態は、図70に示すように、頂部の位置Vthの初期値からのシフト値に対応して、底部の位置の補正値が予め設定されたテーブルT2が設けられている。このテーブルT2は、第7の実施形態と同様に、ディストリビューションリードを実行する際に、コントローラ11aにより読み出され、例えばRAM15に記憶されている。コントローラ11aは、Vthの初期値に基づきテーブルT2を参照し、分布の底部の位置の補正値を求め、分布の底部の位置を予測する。上記第8の実施形態によれば、頂部の位置と、底部の位置の補正値の関係を示すテーブルを用いることにより、分布の底部の位置を予測するための演算を不要とすることができる。このため、処理速度を高速化することが可能である。その他、本発明は上記各実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記各実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。"