(57)【要約】【課題】不揮発性メモリにおいて生じたデータ化けを、迅速に修正する技術を提供する。【解決手段】データを所定の多重度で複数のデータに多重化して予め記憶した記憶装置と、該記憶装置にアクセスする演算装置とに接続され、該データに生じたビット化けを補正する補正回路は、前記演算装置が前記データを読み出すための命令を実行している間に、前記記憶装置から前記複数のデータを、前記多重度と等しい数の複数のビットごとに読み出す読出手段と、前記読出手段により読み出された前記複数のビットのうち、いずれかのビットの値が予め想定されたビット化け前の値である場合、該ビット化け前の値のビットを前記演算装置に出力し、該複数のビットの全ての値がビット化け後の値である場合、該ビット化け後の値のビットを該演算装置に出力する補正手段と、を有する。【選択図】図１
2010055527.tif 000002
【特許請求の範囲】
【請求項１】
データを複数のデータに多重化して予め記憶した記憶装置と、該記憶装置にアクセスする演算装置とに接続され、該複数のデータに生じたビット化けを補正する補正回路であって、
前記演算装置が前記データを読み出すための命令を実行している間に、前記記憶装置から前記複数のデータを読み出す読出手段と、
前記読出手段により読み出された前記複数のデータにおいて、それぞれのデータの対応するビットのいずれかの値が予め想定されたビット化け前の値である場合、該ビット化け前の値のビットを前記演算装置に出力し、該対応するビットの全ての値がビット化け後の値である場合、該ビット化け後の値のビットを該演算装置に出力する補正手段と、
を有する補正回路。
【請求項２】
前記読出手段は、前記複数のデータを１ビット単位で順に読み出し、
前記補正手段は、前記ビット化け後の値を初期の保持値として保持し、前記読出手段により読み出されたビットの値又は該保持値が前記ビット化け前の値である場合、該ビット化け前の値を該保持値として保持し、該読出手段により読み出されたビットの値及び該保持値が前記ビット化け後の値である場合、該ビット化け後の値を該保持値として保持し、該保持値のビットを前記演算装置に出力する、請求項１に記載の補正回路。
【請求項３】
前記読出手段は、前記複数のデータを１ビット単位で順に読み出し、
前記補正手段は、前記ビット化け後の値を初期の保持値として保持し、前記読出手段により読み出されたビットの値が前記ビット前の値であれば、該保持値を該ビット前の値に更新する、請求項１に記載の補正回路。
【請求項４】
前記記憶装置のアクセス時間以上の所定の周期でクロック信号を生成するクロック信号生成手段を更に有し、
前記読出手段は、前記クロック信号生成手段により生成された前記クロック信号の立ち上がりエッジに同期して前記記憶装置から読み出すビットのアドレスを切り替え、
前記補正手段は、前記クロック信号生成手段により生成された前記クロック信号の立ち下がりエッジに同期して前記ビットを前記演算装置に出力する、請求項１乃至３のいずれか１項に記載の補正回路。
【請求項５】
前記演算装置によるシステムのブートを検知する検知手段を更に有し、
前記読出手段は、前記検知手段により前記ブートが検知されている間、前記複数のデータを読み出し、
前記補正手段は、前記検知手段により前記ブートが検知されている間、前記ビットを出力する、請求項１乃至４のいずれか１項に記載の補正回路。
【請求項６】
前記ビット化け前の値が０であり、前記ビット化け後の値が１である、請求項１乃至５のいずれか１項に記載の補正回路。
【請求項７】
前記記憶装置はフラッシュメモリである、請求項１乃至６のいずれか１項に記載の補正回路。
【請求項８】
データを複数のデータに多重化して予め記憶した記憶装置と、該記憶装置にアクセスする演算装置とに接続された補正回路で、該複数のデータに生じたビット化けを補正する補正方法であって、
前記演算装置が前記データを読み出すための命令を実行している間に、前記記憶装置から前記複数のデータを読み出し
前記複数のデータにおいて、それぞれのデータの対応するビットのいずれかの値が予め想定されたビット化け前の値である場合、該ビット化け前の値のビットを前記演算装置に出力し、
該対応するビットの全ての値がビット化け後の値である場合、該ビット化け後の値のビットを該演算装置に出力する、補正方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、不揮発性メモリにおいて、熱ストレス等により反転したビットを補正する技術に関する。
【背景技術】
【０００２】
携帯端末装置や情報端末装置では、システムのブートに用いられるプログラムは、一般に不揮発メモリに格納される。このプログラムは、ROM（Read Only Memory）ライタ装置により、装置組み立ての前に予め不揮発性メモリに書き込まれる。そして、ブート用のプログラムが書き込まれた不揮発メモリが搭載された装置に電源が投入されると、ＣＰＵ（Central Processing Unit）が不揮発メモリから、そのプログラムを所定のアドレスから順次読み出し、システムがブートする仕組みになっている。
【０００３】
ところが、メモリのプロセスが微細化すると、部品搭載時の熱ストレスにより、不揮発メモリにおいてデータ化けが生じることがある。例えば、フラッシュメモリの場合、プロセス微細化が進むと、メモリセルの面積が小さくなり、データを保持ために用いるフローティングゲートの電荷量は少なくなりデータの保持が悪化する傾向がある。このため、部品搭載時の熱ストレスによりメモリセルの電荷がリークし、データ化けが生じるリスクが高まってしまう。また、近年、注目されている相変化メモリなど、データ保持のために、発熱体を用いてメモリセルの結晶状態を変化させる方式のメモリでは、メモリセルの物理的特性から、熱ストレスに弱く、データ化けが生じやすい。
【０００４】
熱ストレスによりデータ化けが生じると、ブート用プログラムにエラーが発生し、ブートに支障を生じてしまう結果となることが多い。
【０００５】
システムのブートの信頼性を向上させるため、特許文献１に記載のシステムは、ブートに失敗した場合、バックアップのために多重化してあるブートコードを読み出して実行する。
【０００６】
特許文献２に記載のシステムは、ＥＣＣ（Error Check Code）を使用して誤り訂正を行うことで、ファームウェアのビットエラーを修正している。
【特許文献１】特開２００７−９４７６６号公報
【特許文献２】特開２００７−５１８１６６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかし、特許文献１に記載のシステムは、データ化けによるビットエラーの修正は行わず、ビットエラーが生じたときはバックアップしたプログラムを使用して起動し直すので、システムの正常な起動に時間がかかる。
【０００８】
また、特許文献２に記載のシステムは、ブートプログラムの実行時に、誤り訂正用のアルゴリズムを実行しなくてはならないので、起動に時間がかかる。
【０００９】
このため、不揮発性メモリにおいて生じたデータ化けを迅速に修正することが困難であるという問題があった。
【００１０】
本発明の目的は、不揮発性メモリにおいて生じたデータ化けを迅速に修正する技術を提供することである。
【課題を解決するための手段】
【００１１】
上記目的を達成するために、本発明の補正回路は、データを複数のデータに多重化して予め記憶した記憶装置と、該記憶装置にアクセスする演算装置とに接続され、該複数のデータに生じたビット化けを補正する補正回路であって、前記演算装置が前記データを読み出すための命令を実行している間に、前記記憶装置から前記複数のデータを読み出す読出手段と、前記読出手段により読み出された前記複数のデータにおいて、それぞれのデータの対応するビットのいずれかの値が予め想定されたビット化け前の値である場合、該ビット化け前の値のビットを前記演算装置に出力し、該対応するビットの全ての値がビット化け後の値である場合、該ビット化け後の値のビットを該演算装置に出力する補正手段と、を有する。
【００１２】
また、本発明の補正方法は、データを複数のデータに多重化して予め記憶した記憶装置と、該記憶装置にアクセスする演算装置とに接続された補正回路で、該複数のデータに生じたビット化けを補正する補正方法であって、前記演算装置が前記データを読み出すための命令を実行している間に、前記記憶装置から前記複数のデータを読み出し前記複数のデータにおいて、それぞれのデータの対応するビットのいずれかの値が予め想定されたビット化け前の値である場合、該ビット化け前の値のビットを前記演算装置に出力し、該対応するビットの全ての値がビット化け後の値である場合、該ビット化け後の値のビットを該演算装置に出力する、方法である。
【発明の効果】
【００１３】
本発明によれば、補正回路は、データを読み出すための命令が実行されている間に、多重化された複数のデータを読みだし、いずれかのビットの値がデータ化け前の値のビットの場合、データ化け前の値のビットを、全てがデータ化け後の値のビットの場合、データ化け後の値のビットを出力するので、読み出し命令の処理時間内に、データ化けしたビットを逐次修正できる結果、迅速にデータ化けを修正できる。
【発明を実施するための最良の形態】
【００１４】
本発明を実施するための形態について図面を参照して詳細に説明する。
【００１５】
図１は、本実施形態の補正回路１００の構成を示すブロック図である。補正回路１００は、システムの起動時にデータ化けを補正する回路である。同図を参照すると、補正回路１００は、オシレータ１０１、カウンタ１０２、およびレジスタ１０３を有する。
【００１６】
補正回路１００は、ＣＰＵ（Central Processing Unit）２００、マルチセレクタＭＳ１、マルチセレクタＭＳ２、論理ゲートＬＧ、および不揮発性メモリ３００に接続される。
【００１７】
ＣＰＵ２００は、情報処理装置全体を制御する演算装置であり、リセット信号（＃ＲＥＳＥＴ）およびＷＲＩＴＥ信号（＃ＷＥ）を不揮発性メモリ３００に出力し、チップイネーブル信号（＃ＣＥ）および出力イネーブル信号（＃ＯＥ）を論理ゲートＬＧおよび不揮発性メモリ３００に出力する。また、ＣＰＵ２００は、下位アドレス（例えば、[２０：０]）を示す情報（Ａ[２０：００]）を不揮発性メモリ３００に出力し、上位アドレスを示す情報（Ａ[２２：２１]）をマルチセレクタＭＳ１に出力する。そして、ＣＰＵ２００は、ブートモード信号（BootMode）を論理ゲートＬＧと、マルチセレクタＭＳ１およびＭＳ２とに出力する。
【００１８】
リセット信号（＃ＲＥＳＥＴ）は、不揮発性メモリ３００を初期化するための信号であり、ＣＰＵ２００は、例えば、初期化を開始する場合はローレベル、そうでない場合はハイレベルのリセット信号を出力する。
【００１９】
本実施形態では、ＣＰＵ２００は、ハイレベルの信号を「１」の値のビット、ローレベルの信号を「０」の値のビットとして扱う。
【００２０】
ＷＲＩＴＥ信号（＃ＷＥ）は、不揮発性メモリ３００へのデータの書き込みを制御するための信号である。
【００２１】
チップイネーブル信号（＃ＣＥ）は、不揮発性メモリ３００を制御対象のメモリとして選択するための信号である。ＣＰＵ２００は、例えば、不揮発性メモリ３００を制御対象とする場合、「０」の値（ステータス）、制御対象としない場合、「１」の値のチップイネーブル信号を出力する。
【００２２】
出力イネーブル信号（＃ＯＥ）は、不揮発性メモリ３００からのデータの読み出し動作を制御するための信号である。ＣＰＵ２００は、例えば、読み出しを制御する場合、「０」の値、読み出しを制御しない場合、「１」の値の出力イネーブル信号を出力する。
【００２３】
ＣＰＵ２００は、チップイネーブル信号（＃ＣＥ）および出力イネーブル信号（＃ＯＥ）を「０」にしてから、所定の時間が経過したとき、チップイネーブル信号および出力イネーブル信号を「１」にする。そしてブートプログラムが全て読み出されていないのであれば、次の読み出しアドレスを指定して、チップイネーブル信号および出力イネーブル信号を「０」にする。ＣＰＵ２００は、ブートプログラムが全て読み出されるまで、この動作を繰り返す。
【００２４】
ここで、チップイネーブル信号および出力イネーブル信号をオンオフする間隔は、多重度の数（４）のビットがレジスタ１０３により補正される時間以上に設定する。例えば、クロック信号の周波数が２００ナノ秒であるときは、チップイネーブル信号および出力イネーブル信号を、４×２００ナノ秒以上の間隔で切り替える。
【００２５】
ブートモード信号（BootMode）は、システムがブート中であるか否かを示す信号である。ＣＰＵ２００は、例えば、ブート中である場合、「１」の値、ブート中でない場合、「０」の値のブートモード信号を出力する。
【００２６】
また、ＣＰＵ２００には、マルチセレクタＭＳ２から出力されたデータ信号が入力される。データ信号の内容については後述する。
【００２７】
論理ゲートＬＧは、補正回路１００の動作を開始させるトリガ信号（ＴＲＩＧ）を生成する回路または部品である。本実施形態では、論理ゲートＬＧは、チップイネーブル信号（＃ＣＥ）のＮＯＴ信号、出力イネーブル信号（＃ＯＥ）のＮＯＴ信号、およびブートモード信号（BootMode）を入力とし、これらの入力の論理積をトリガ信号（ＴＲＩＧ）としてマルチセレクタＭＳ１およびＭＳ２と、オシレータ１０１とに出力する。
【００２８】
つまり、論理ゲートＬＧは、チップイネーブル信号（＃ＣＥ）および出力イネーブル信号（＃ＯＥ）が「０」であり、且つブートモード信号（BootMode）が「１」である場合、すなわちブート時に補正回路１００の動作を開始させる場合は「１」の値、それ以外の場合は「０」の値のトリガ信号（ＴＲＩＧ）を出力する。
【００２９】
オシレータ１０１は、所定周期のトグル信号を生成する回路または部品である。本実施形態では、オシレータ１０１は、トリガ信号（ＴＲＩＧ）の入力に応じて、所定の周期のクロック信号（ＯＳＣ＿ＣＫ）を、カウンタ１０２およびレジスタ１０３に出力する。
【００３０】
図２は、オシレータ１０１の動作をまとめた表である。同図を参照すると、オシレータ１０１は、トリガ信号（ＴＲＩＧ）が「１」の場合、クロック信号を出力し、トリガ信号（ＴＲＩＧ）が「０」の場合、クロック信号を出力しない。クロック信号のトグル周期は、不揮発性メモリ３００のメモリアクセス時間以上の時間である。例えば、メモリアクセス時間が１００ナノ秒であるとき、クロック信号の出力周期は２００ナノ秒とする。
【００３１】
図３は、カウンタ１０２の動作をまとめた表である。カウンタ１０２は、オシレータ１０１からのトグル信号に応じて、カウントアップし、カウントした値を出力する回路または部品である。同図を参照すると、カウンタ１０２は、トリガ信号（ＴＲＩＧ）が「１」である場合、クロック信号（ＯＳＣ＿ＣＫ）の立ち上がりエッジに応じて、０〜３まで順にカウントアップし、カウント値をマルチセレクタＭＳ１に出力する。トリガ信号（ＴＲＩＧ）が「０」である場合、カウント値を最大値（３）に設定する。
【００３２】
図４は、マルチセレクタＭＳ１の動作をまとめた表である。マルチセレクタＭＳ１は、所定の信号に応じて不揮発性メモリ２００への入力元の信号を切り替える、２入力１出力のセレクタである。同図を参照すると、ブート信号（BootMode）が「０」の場合、マルチセレクタＭＳ１は、ＣＰＵ２００により入力された上位アドレスを示す情報（ＡＡ[２２：２１]）を、不揮発性メモリ３００に出力する。ブート信号（BootMode）が「１」の場合、マルチセレクタＭＳ１は、カウンタ１０２より入力されたカウント値を示す情報（ＡＣ[２２：２１]）を、不揮発性メモリ３００に出力する。
【００３３】
不揮発性メモリ３００は、フラッシュメモリ等の不揮発性のメモリである。図５は、不揮発性メモリに格納されたデータの構成を示す図である。同図を参照すると、不揮発性メモリ３００には、ブート用プログラム３０１が格納されている。ブートプログラム３０１は、ブート時に実行されるプログラムを所定の多重度で多重化したプログラムである。多重化前のプログラムのデータの各ビットは、多重度の数だけコピーされて格納される。このプログラムの多重度と、カウンタの最低値（０）から最大値（３）までのカウント回数（４）とは等しい値にする。ＣＰＵ２００は、ブート時に、クロック信号の周期で、ブート用プログラム３０１の多重化された各データにおいて、対応するビットを、多重度の単位で１ビットずつ順に読み出す。対応するビットとは、各データの先頭のビットから数えて同じビット数の位置におけるビットである。
【００３４】
例えば、多重度およびカウント回数が「４」であり、「０１」のデータが多重化された場合、ＣＰＵ２００は、「００００」、「１１１１」の順でデータを読み出す。図５における直線の矢印は、データを読み出す方向である。
【００３５】
図１に戻り、不揮発性メモリ３００には、ＣＰＵ２００により、リセット信号（＃ＲＥＳＥＴ）、ＷＲＩＴＥ信号（＃ＷＥ）、チップイネーブル信号（＃ＣＥ）、出力イネーブル信号（＃ＯＥ）、および下位アドレスを示す情報（Ａ[２０：０]）が入力される。また、不揮発性メモリ３００には、マルチセレクタＭＳ１により、上位アドレスを示す情報（ＡＡ[２２：２１]）またはカウント値を示す情報（ＡＣ[２２：２１]）が入力される。
【００３６】
不揮発性メモリ３００は、リセット信号（＃ＲＥＳＥＴ）が「１」で、且つチップイネーブル信号（＃ＣＥ）、および出力イネーブル信号（＃ＯＥ）が「０」である場合、すなわち、ＣＰＵ２００により不揮発性メモリ２００が選択されて読み出し動作が指示された場合、上位アドレス（カウント値）に、下位アドレスを加えたアドレスに記憶されたデータを読み出し、読み出したデータ（ＤＤ[１５：００]）をマルチセレクタＭＳ２およびレジスタ１０３に出力する。
【００３７】
図６は、レジスタ１０３の真理値表である。レジスタ１０３は、入力信号において所定の方向（例えば、０から１への方向）に反転（データ化け）したと想定されるビットを補正する部品または回路である。同図を参照すると、レジスタ１０３は、１ビットの値（保持値）を保持することができ、トリガ信号（ＴＲＩＧ）が「０」である場合、初期の保持値を「１」にする。
【００３８】
レジスタ１０３は、トリガ信号（ＴＲＩＧ）が「１」である場合、前回の出力ビットの値を保持しておき、クロック信号（ＯＳＣ＿ＣＫ）の立ち下がりエッジが入力されたとき、前回の出力ビットおよび入力ビットの値に応じて保持値を変化させ、保持値のビットを出力する。
【００３９】
具体的には、レジスタ１０３は、立ち下がりエッジが入力されたとき、トリガ信号（ＴＲＩＧ）が「１」であり、且つ、入力ビット（ＤＤ[ｎ]）の値および前回の出力ビット（Ｄ[ｎ]＿１）の値（保持値）が「１」である場合、保持値を「１」とする。また、レジスタ１０３は、立ち下がりエッジが入力されたとき、トリガ信号（ＴＲＩＧ）が「１」であり、且つ、入力ビット（ＤＤ[ｎ]）の値または前回の出力ビット（Ｄ[ｎ]＿１）の値（保持値）が「０」である場合、保持値を「０」とする。
【００４０】
つまり、入力ビットが０から１に反転すると想定する場合、立ち下がりエッジが入力されたとき、レジスタ１０３は、入力ビットまたは前回の出力ビット（保持値）が反転（データ化け）前のビット（「０」）であれば、反転（データ化け）前の保持値のビット（「０」）を出力する。
【００４１】
図７はマルチセレクタＭＳ２の動作を示すフローチャートである。マルチセレクタＭＳ２は、所定の信号に応じてＣＰＵ２００への信号の入力元を切り替える、２入力１出力のセレクタである。同図を参照すると、ブート信号（BootMode）が「０」の場合、マルチセレクタＭＳ２は、不揮発性メモリ３００により入力された下位アドレスを示す情報（Ｄ[１５：００]）を、ＣＰＵ２００に出力する。ブート信号（BootMode）が「１」の場合、マルチセレクタＭＳ１は、レジスタ１０３により入力された信号（ＤＣ[１５：００]）を、ＣＰＵ２００に出力する。
【００４２】
ＣＰＵ２００は、補正回路１００により補正されたブートプログラムを実行する。
【００４３】
図９は、ＣＰＵ２００および補正回路１００が実行するブート処理を示すフローチャートである。ブート処理は、ＣＰＵ２００が所定のシステムを起動するときに開始する。同図を参照すると、ＣＰＵ２００は、「１」の値のブートモード信号、「０」の値のチップイネーブル信号（＃ＣＥ）、および「０」の値の出力イネーブル信号（＃ＯＥ）を出力することにより、論理ゲートＬＧに「１」の値のトリガ信号（ＴＲＩＧ）を出力させる（ステップＳ１）。
【００４４】
補正回路１００は、補正処理を実行する（ステップＳ３）。ＣＰＵ２００は、不揮発性メモリ３００からデータを読み出す命令を実行してから所定の時間が経過したか否かを判断する（ステップＳ５）。所定時間が経過していなければ（ステップＳ５：ＮＯ）、ＣＰＵ２００は、ステップＳ３に戻る。
【００４５】
所定時間が経過したならば（ステップＳ５：ＹＥＳ）、ＣＰＵ２００はブート用プログラム３０１が全て読み出されたか否かを判断する（ステップＳ７）。ブート用プログラム３０１が全て読み出されていなければ（ステップＳ７：ＮＯ）、ＣＰＵ２００は、「１」の値のチップイネーブル信号及び出力イネーブル信号を出力することにより、論理ゲートＬＧに所定時間だけ「０」の値のトリガ信号を出力させる（ステップＳ９）。ステップＳ９の後、ＣＰＵ２００は、ステップＳ１に戻る。
【００４６】
ブート用プログラム３０１が全て読み出されたのであれば（ステップＳ７：ＹＥＳ）、ＣＰＵ２００はブート処理を終了する。
【００４７】
図９は、補正処理を示すフローチャートである。同図を参照すると、オシレータ１０１は、所定の周期でクロック信号（ＯＳＣ＿ＣＫ）を出力する（ステップＳ３１）。カウンタ１０２は、クロック信号の立ち上がりエッジの入力に応じて、０〜３へ順にカウントアップする（ステップＳ３３）。補正回路１００は、不揮発性メモリ３００における、上位アドレス（カウント値）に下位アドレスを足したアドレスからデータを読み出す（ステップＳ３５）。
【００４８】
レジスタ１０３は、前回の出力ビットの値または入力ビットの値が、「０」であるか否かを判断する（ステップＳ３７）。
【００４９】
前回の出力ビットの値または入力ビットの値が「０」である場合（ステップＳ３７：ＹＥＳ）、レジスタ１０３は、クロック信号の立ち下がりエッジに応じて、「０」の値のビットを出力する（ステップＳ３９）。前回の出力ビットの値（保持値）および入力ビットの値が、「１」である場合（ステップＳ３７：ＮＯ）、レジスタ１０３は、クロック信号の立ち下がりエッジに応じて、「１」の値のビットを出力する（ステップＳ４１）。
【００５０】
ステップＳ３９またはステップＳ４１の後、レジスタ１０３は、今回の出力ビットの値を保持する（ステップＳ４３）。ステップＳ４３の後、補正回路１００は補正処理を終了する。
【００５１】
次に、図１０および図１１を参照して、補正回路１００の動作結果の一例について説明する。図１０は、システムがブートするときの補正回路１００の動作を示すタイミングチャートである。同図を参照すると、ＣＰＵ２００は、不揮発性メモリ３００に「１」の値のリセット信号を、所定のパルス幅で出力する。
【００５２】
ＣＰＵ２００は、「１」値のブートモード信号、「０」の値のチップイネーブル信号（＃ＣＥ）、および「０」の値の出力イネーブル信号（＃ＯＥ）を出力することにより、論理ゲートＬＧに「１」の値のトリガ信号（ＴＲＩＧ）を出力させる（ステップＳ１）。
【００５３】
オシレータ１０１は、所定の周期でクロック信号（ＯＳＣ＿ＣＫ）を出力する（ステップＳ３１）。カウンタ１０２は、クロック信号の立ち上がりエッジの入力に応じて、０から３へと順にカウントアップする（ステップＳ３３）。補正回路１００は、不揮発性メモリ３００における、上位アドレス（カウント値）に下位アドレスを足したアドレスからデータを読み出す（ステップＳ３５）。
【００５４】
前回の出力ビットの値または入力ビットの値が、「０」である場合（ステップＳ３７：ＹＥＳ）、レジスタ１０３は、クロック信号の立ち下がりエッジに応じて、「０」の値のビットを出力する（ステップＳ３９）。前回の出力ビットの値および入力ビットの値が、「１」である場合（ステップＳ３７：ＮＯ）、レジスタ１０３は、クロック信号の立ち下がりエッジに応じて、「１」の値のビットを出力する（ステップＳ４１）。
【００５５】
例えば、多重度が「４」であり、「０１００」の４ビットのデータが順に読み出された場合について考える。多重化前に「０」であった１ビットのデータは、「００００」の４ビットのデータに多重化されているはずであるから、読み出されたデータの２ビット目の「１」は、熱ストレス等により反転（データ化け）したビットである。
【００５６】
「０１００」のデータを読み出した場合、レジスタ１０３の出力ビットの初期値は「１」で、最初の入力ビットの値が「０」なので、レジスタ１０３の最初の出力ビットの値は「０」となる。
【００５７】
最初の（前回の）出力ビットが「０」で、２番目の入力ビットが「１」なので、レジスタ１０３の２番目の出力ビットの値は「０」となる。同様に、レジスタ１０３の３番目および４番目の出力ビットは、「０」となる。
【００５８】
このように、読み出したデータに反転（データ化け）したと想定されるビット（「１」）が含まれていても、レジスタ１０３は、反転（データ化け）前のビット（「０」）に補正して出力する。
【００５９】
読み出し命令を処理するための時間が経過したならば（ステップＳ５：ＹＥＳ）、ＣＰＵ２００はブート用プログラム３０１が全て読み出されたか否かを判断する（ステップＳ７）。ブート用プログラム３０１が全て読み出されていなければ（ステップＳ７：ＮＯ）、ＣＰＵ２００は、「１」の値のチップイネーブル信号及び出力イネーブル信号を出力することにより、論理ゲートＬＧに所定時間だけ「０」の値のトリガ信号を出力させ、次の読み出しアドレスを指定する（ステップＳ９）。
【００６０】
図１１は、システムがブートした後のＣＰＵ２００の動作を示すタイミングチャートである。同図を参照すると、ＣＰＵ２００は、ブート用プログラム３０１を全て読み出し、システムを起動した後、ブートモード信号（BootMode）の値を「０」にすることで、マルチセレクタＭＳ１およびＭＳ２に入力先を切り替えさせる。マルチセレクタＭＳ１およびＭＳ２が切り替わると、ＣＰＵ２００は、補正回路１００を介さずに、所定のアドレスを指定して、不揮発性メモリ３００から直接データを読み出す。
【００６１】
なお、オシレータ１０１、カウンタ１０２、およびレジスタ１０３のうち、２つ以上を、まとめて１つの部品または回路に置き換えてもよいのは勿論である。
【００６２】
以上説明したように、本実施形態によれば、補正回路１００は、データ（ブート用プログラム）を読み出すための命令が実行されている間に、多重化された複数のデータ（ブート用プログラム３０１）を読み出し、いずれかのビットの値がデータ化け（反転）前の値（０）のビットの場合、データ化け前の値（０）のビットを、全てがデータ化け後の値（１）のビットの場合、データ化け後の値（１）のビットを出力するので、読み出し命令の処理時間内に、データ化けしたビットを逐次修正できる結果、迅速にデータ化けを修正できる。
【００６３】
また、補正回路１００は、オシレータ１０１、カウンタ１０２、レジスタ１０３、および不揮発性メモリ３００からなる小規模な回路により補正を行うので、誤り訂正用の回路を別途設ける構成よりもハードウェア規模が小さくて済み、低コストで、データ化けを修正できる。
【００６４】
例えば、特開２００７−３３４５１４号公報に記載の発明では、CPUのブートコードのReadを、専用ハードウェアで不揮発メモリのデータを読み込み、CPUは専用ハードウェアに格納されたデータをReadする方法を特徴としている。この方式の場合、揮発メモリ上で一括してデータの補正を行った後に、CPUにReadさせることも可能であるが、専用ハードウェア内で大きな揮発メモリを持たなければならないという欠点がある。これに対し、本実施形態の補正回路１００は、レジスタ１０３によって逐次データ補正を行いCPUにデータを出力する方式であるため、ハードウェア規模を小さくすることができる。一例をあげると、64kByte x16bitのブートコードの補正回路を設計したとすると、特開２００７−３３４５１４号公報に記載の方式では64kByteの揮発メモリ(RAM)が必要なのに対し、本発明は2Byteのレジスタで済むため、ハードウェア規模は小さい。
【００６５】
カウンタ１０２は、クロック信号の立ち上がりエッジに応じてカウントアップし、レジスタ１０３（補正手段）は、クロック信号の立ち下がりエッジに応じて、補正後のビットを出力するので、カウンタ１０２のカウントアップ前に、レジスタ１０３がビット出力して補正回路１００の動作に支障をきたすことを防ぐことができる。
【００６６】
補正回路は、下位アドレスにカウント値を足したアドレスのビットを前記記憶手段から読み出すので、連続したビットを順に読み出すことができる。
【００６７】
フラッシュメモリは、熱ストレス等により１方向にのみビット反転（データ化け）が生じやすいので、補正回路１００は、特にフラッシュメモリにおけるデータ化けの補正に適している。
【００６８】
前記データを使用するコンピュータの起動の開始を検知したとき、補正回路１００を動作させることにより、ブートプログラムの実行時にデータ化けの修正を行うことができる。
【００６９】
（第２の実施形態）
本発明の第２の実施形態について説明する。本実施形態の補正回路１００の構成は、データ化けが生じる方向を１から０への方向と想定する以外は、第１の実施形態の構成と同様である。
【００７０】
図１２は、本実施形態のレジスタ１０３の真理値表である。同図を参照すると、本実施形態のレジスタ１０３は、前回の出力ビットの値（保持値）または入力ビットの値が、「１」である場合、クロック信号の立ち下がりエッジに応じて、「１」の値のビットを出力する。
【００７１】
本実施形態によれば、１から０への方向のデータ化けを修正することができる。
【００７２】
なお、第１の実施形態および第２の実施形態では、図６および１２に示した動作表のように動作するレジスタを使用したが、この構成のレジスタに限らず、多重度の数に等しいビットのうち、いずれかのビットの値がデータ化け前の値であれば、データ化け前の値のビットを出力するのであれば、他の構成のレジスタを使用してもよい。
【００７３】
例えば、補正回路１００は、データ化け後の値（「０」または「１」）を初期値として保持し、読み出したビットの値がデータ化け前の値（「１」または「０」）であれば、保持している値を更新するレジスタを使用することもできる。
【図面の簡単な説明】
【００７４】
【図１】第１の実施形態の補正回路の構成を示すブロック図である。
【図２】第１の実施形態のオシレータの動作をまとめた表である。
【図３】第１の実施形態のカウンタの動作をまとめた表である。
【図４】第１の実施形態のマルチセレクタの動作をまとめた表である。
【図５】第１の実施形態の不揮発性メモリの構成を示す図である。
【図６】第１の実施形態のレジスタの真理値表である。
【図７】第１の実施形態のマルチセレクタの動作をまとめた表である。
【図８】第１の実施形態のブート処理を示すフローチャートである。
【図９】第１の実施形態の補正処理を示すフローチャートである。
【図１０】第１の実施形態のブート時のタイミングチャートである。
【図１１】第１の実施形態のブート後のタイミングチャートである。
【図１２】第２の実施形態のレジスタの真理値表である。
【符号の説明】
【００７５】
１００    補正回路
１０１    オシレータ
１０２    カウンタ
１０３    レジスタ
３００    不揮発性メモリ
３０１    ブート用プログラム
２００    ＣＰＵ
ＭＳ１、ＭＳ２    マルチセレクタ
ＬＧ    論理ゲート
Ｓ１〜Ｓ９、Ｓ３１〜Ｓ４３    ステップ
【図１】
2010055527.tif 000003
【図２】
2010055527.tif 000004
【図３】
2010055527.tif 000005
【図４】
2010055527.tif 000006
【図５】
2010055527.tif 000007
【図６】
2010055527.tif 000008
【図７】
2010055527.tif 000009
【図８】
2010055527.tif 000010
【図９】
2010055527.tif 000011
【図１０】
2010055527.tif 000012
【図１１】
2010055527.tif 000013
【図１２】
2010055527.tif 000014