図1はMTJ素子の構造を説明する図である。
MTJ素子11は記憶層11aと参照層11cがトンネルバリア層11bを挟んだ構造をもつ。記憶層11aと参照層11cは強磁性層であり、参照層11cはMTJ素子11に書き込み電流が流れても磁化の向きは不変であるが、記憶層11aはMTJ素子11に書き込み電流の流れる向きに応じて磁化の向きが変化する。
たとえば図1(A)のように、参照層11cの磁化は右方向に固定されている場合に、書き込みパルスの電流を記憶層11aから参照層11cに向かって流すと、電子は参照層11cからトンネルバリア層11bを経て記憶層11aに向かって流れ、その結果、記録層11aの磁化の向きは参照層11cと同じ方向(図1(A)では右方向)に変化する。このように記憶層11aと参照層11cの磁化の向きが同じ方向を向いている状態では、MTJ素子11の抵抗値は低くなる。
一方、図1(B)のように、書き込みパルスの電流を参照層11cから記憶層11aに向かって流すと、電子は記憶層11aからトンネルバリア層11bを経て参照層11cに向かって流れ、その結果、記憶層11aの磁化の向きは参照層11cと反対の方向(図1(B)では左方向)に変化する。このように記憶層11aと参照層11cの磁化の向きが反対の方向を向いている状態では、MTJ素子11の抵抗値は高くなる。
このように、記憶層11aの磁化の方向が参照層11cと同じか反対かの2つの状態を、論理値の0と1に対応させることによって、MTJ素子11をメモリとして用いるのがMRAMである。ここでは磁化の向きが同じ低抵抗状態を論理値0、磁化の向きが反対の高抵抗状態を論理値1とするが、逆に、低抵抗状態を論理値1、高抵抗状態を論理値0としても構わない。本発明の第1の論理値は、論理値1または0のうち一方であり、第2の論理値は論理値1または0のうち第1の論理値と異なる他方である。MTJ素子11は、第1の論理値に対応する高抵抗状態になり、前記第1の論理値と異なる第2の論理値に対応する低抵抗状態にもなる。
MTJ素子11の状態は、読み出し電流を流して抵抗値を検出することで読み出すことができる。この読み出し電流の値は、書き込みパルスよりも小さくし、これにより読み出しの際に、MTJ素子11の記憶層11aの磁化の向きが変化しないようにする。
図2(A)は、低抵抗状態のMTJ素子に流す書き込みパルスの電流値を横軸に、低抵抗状態から高抵抗状態への反転確率を縦軸にとって、電流値と反転確率の関係を示している。また、図2(B)は、高抵抗状態のMTJ素子に流す書き込みパルスの電流値を横軸に、高抵抗状態から低抵抗状態への反転確率を縦軸にとって、電流値と反転確率の関係を示している。MTJ素子を高抵抗状態に反転させるときと低抵抗状態に反転させるときでは電流を流す方向が逆であるので、図2(A)は原点から右に行くほど流す電流の絶対値が大きくなり、図2(B)は原点から左に行くほど流す電流の絶対値が大きくなることを示している。
MTJ素子を記憶セルとして用いるMRAMでは、MTJ素子に論理値1を書き込む場合には、図2(A)のIW1のように高抵抗状態への反転確率が限りなく1.0に近い電流値の書き込みパルスをMTJ素子に流す。逆にMTJ素子に論理値0を書き込む場合には、図2(B)のIW0のように低抵抗状態への反転確率が限りなく1.0に近い電流値の書き込みパルスをMTJ素子に流す。MTJ素子から値を読み出す場合には、図2(B)のIR0や図2(A)のIR1のような、反転確率が限りなく0.0に近い電流をMTJ素子に流して抵抗値を検出し、高抵抗値ならば1、低抵抗値ならば0と判断する。
図2(A)および図2(B)に示すように、MTJ素子の状態の反転確率は、ある閾値において急激に変化するのではなく、ある電流値の範囲においてなだらかに変化する。そのため、低抵抗状態のMTJ素子に対して、図2(A)のIG1のような反転確率が0.5程度になる電流値の乱数発生パルスを流すと、MTJ素子の状態は50%程度の確率で高抵抗状態になる。逆に、高抵抗状態のMTJ素子に対して、図2(B)のIG0のような反転確率が0.5程度になる電流値の乱数発生パルスを流すと、MTJ素子の状態は50%程度の確率で低抵抗状態になる。
そこで、低抵抗状態か高抵抗状態のいずれか一方の状態へ初期化したMTJ素子に対し、その状態から他方の状態への反転確率が0.5程度の電流値の乱数発生パルスを流すことで、MTJ素子の状態を低抵抗状態または高抵抗状態へそれぞれ約50%の確率でランダムに設定することができ、MTJ素子は乱数発生器として利用できる。
実際にMTJ素子を乱数発生器として利用するLSIチップを製造する場合、チップ上に形成するMTJ素子の特性にばらつきが生じうる。たとえば、図3(A)のように、低抵抗状態から高抵抗状態への反転確率が0.5になる電流値IG1の乱数発生パルスをMTJ素子に流すように設計したとしても、製造段階でチップ上に形成されるMTJ素子の面積のばらつきなどの要因によってMTJ素子の特性もばらつき、同じ電流値IG1の乱数発生パルスに対しても、図3(B)のように反転確率が0.5よりも大きくなったり、図3(C)のように反転確率が0.5よりも小さくなったりする。その結果、従来のようにMTJ素子を論理値0にリセットした後、電流値IG1の乱数発生パルスを流すことで乱数を発生させると、結果として得られる乱数の論理値0と1の発生頻度に偏りが生じることになる。
高抵抗値から低抵抗値への反転確率に関しても同様のことが言え、たとえば、図3(D)のように、高抵抗状態から低抵抗状態への反転確率が0.5になる電流値IG0の乱数発生パルスをMTJ素子に流すように設計したとしても、ばらつきによって、同じ電流値IG0の乱数発生パルスに対しても、図3(E)のように反転確率が0.5よりも大きくなったり、図3(F)のように反転確率が0.5よりも小さくなったりする。
ここで、MTJ素子の特性のばらつきの要因のうち、形状的な要因が支配的であれば、低抵抗状態から高抵抗状態への反転確率と、高抵抗状態から低抵抗状態への反転確率には、相関関係がある。すなわち、図3(A)に示すように標準的なMTJ素子に対して低抵抗状態から高抵抗状態への反転確率が0.5になるように乱数発生パルスの電流値IG1を決め、また、図3(D)に示すように標準的なMTJ素子に対して高抵抗状態から低抵抗状態への反転確率が0.5になるように乱数発生パルスの電流値IG0を決めたとする。このとき、電流値IG1の乱数発生パルスに対する低抵抗状態から高抵抗状態への反転確率が0.5よりも高い図3(B)のような特性のMTJ素子は、電流値IG0の乱数発生パルスに対する高抵抗状態から低抵抗状態への反転確率も図3(E)のように0.5よりも高くなる。また、電流値IG1の乱数発生パルスに対する低抵抗状態から高抵抗状態への反転確率が0.5よりも低い図3(C)のような特性のMTJ素子は、電流値IG0の乱数発生パルスに対する高抵抗状態から低抵抗状態への反転確率も図3(F)のように0.5よりも低くなる。
本発明の乱数発生方式では、このような、低抵抗状態から高抵抗状態への反転確率と、高抵抗状態から低抵抗状態への反転確率の間にある相関関係を利用することで、発生した乱数の0と1の偏りをより小さくするものである。具体的には、MTJ素子の現在の値が高抵抗状態(論理値1とする)であれば、高抵抗状態から低抵抗状態へ確率的に反転させる電流値IG0(第1の電流)の乱数発生パルスを流し、逆にMTJ素子の現在の値が低抵抗状態(論理値0とする)であれば、低抵抗状態から高抵抗状態へ確率的に反転させる電流値IG1(第2の電流)の乱数発生パルスを流すことで、MTJ素子の状態をランダムに変化させ、その状態を乱数値として利用する。
従来の乱数発生方式では、たとえばあらかじめMTJ素子を低抵抗状態(論理値0)にリセットした後、低抵抗状態から高抵抗状態(論理値1)へ確率的に反転させる乱数発生パルスを流すことで、MTJ素子の状態をランダムに変化させる。このとき、乱数発生パルスの電流値に対する反転確率が0.5よりも大きい場合には、発生する乱数の値が1である確率もそれに比例して大きくなる。
一方、本発明の方式では、乱数発生時にMTJ素子を特定の状態にリセットせず、現在の状態から他方の状態への確率的な反転を発生させる。そのため、たとえ低抵抗状態から高抵抗状態へ反転させる乱数発生パルスの電流値に対する反転確率が0.5よりも大きい場合でも、それに相関して高抵抗状態から低抵抗状態へ反転させる乱数発生パルスの電流値に対する反転確率も0.5より大きければ、低抵抗状態と高抵抗状態の間の反転頻度が大きくなることになるが、発生する乱数における0と1の出現確率の偏りをより小さくすることができる。逆に、低抵抗状態から高抵抗状態へ反転させる乱数発生パルスの電流値に対する反転確率が0.5より小さい場合でも、それに相関して高抵抗状態から低抵抗状態へ反転させる乱数発生パルスの電流値に対する反転確率も0.5より小さければ、低抵抗状態と高抵抗状態の間の反転頻度が小さくなることになるが、発生する乱数における0と1の出現確率の偏りをより小さくすることができる。
製造工程に起因するばらつきには、MTJ素子を備えるLSIチップを複数製造した場合にLSIチップ毎にMTJ素子の特性が異なるばらつきもあれば、ひとつのLSIチップ内に複数のMTJ素子を備える場合にそれらのMTJ素子間の特性のばらつきもある。本発明の方式は、いずれのばらつきに対しても、その影響を小さくする効果がある。
図4に本発明のひとつの実施例(第1の実施例)を示す。
図4の乱数発生回路は、乱数発生に用いるMTJ素子11と、制御回路12から構成される。MTJ素子11は記憶層11a側の一端子と、参照層11c側の他端子とを有し、制御回路12は、MTJ素子11の一端子に接続される第1の端子と、MTJ素子11の他端子に接続される第2の端子とを含む。制御回路12は、この乱数発生回路につながっていて発生した乱数を使用する回路(外部装置)から、乱数発生信号と読み出し信号との2種類の信号を受信して動作する。
制御回路12が読み出し信号を受信すると、制御回路12はMTJ素子11に読み出し電流を流して抵抗値を調べ、低抵抗状態なら論理値0、高抵抗状態なら論理値1を、乱数データとして出力する。上述したように、本発明の第1の論理値は、論理値1または0のうち一方であり、第2の論理値は論理値1または0のうち第1の論理値と異なる他方である。
制御回路12が乱数発生信号を受信した場合の動作を図6に示す。また、従来の方式の動作を図5に示す。
図5に示すように、従来の方式では、外部装置から乱数発生信号を受信した制御回路は、まずMTJ素子に高抵抗状態から低抵抗状態に反転させる書き込みパルスを流し、論理値0を示す低抵抗状態にMTJ素子をリセットする(S11)。次に、低抵抗状態(論理値0)から高抵抗状態(論理値1)へ確率的に反転させる乱数発生パルスをMTJ素子に流し、MTJ素子の状態をランダムに変化させる(S12)。
一方、本発明の方式では、図6に示すように、外部装置から乱数発生信号を受信した制御回路12は、まずMTJ素子11に読み出し電流を流して抵抗値を調べ、現在の値が0か1かを知る(S21、S22)。次に読み出した値が0であれば、MTJ素子を低抵抗状態(論理値0)から高抵抗状態(論理値1)へ確率的に反転させる乱数発生パルス(第2の電流)を流し(S23)、逆に、読み出した値が1であれば、MTJ素子を高抵抗状態(論理値1)から低抵抗状態(論理値0)へ確率的に反転させる乱数発生パルス(第1の電流)を流す(S24)。これにより、MTJ素子の状態をランダムに変化させる。
制御回路12は、MTJ素子をメモリとして用いる場合と同様の回路で実現できる。すなわち、書き込みパルスの電流値を変更して磁化反転確率を乱数発生に適した値まで下げたものが乱数発生パルスであるので、MTJ素子11に流れる電流値が書き込みパルスと異なるように設計すれば良い。
図4の実施例では、乱数発生回路がMTJ素子をひとつ持つ例を示しているが、乱数発生回路内に複数のMTJ素子を持ち、複数ビットの乱数を発生できるようにすることもできる。この場合は、乱数発生回路の制御回路12は、読み出し信号を受信すると、内部にある複数のMTJ素子の値を複数本の信号線で並列に出力するように実施してもよいし、少ない信号線を使って直列に出力するように実施しても良い。あるいは、複数のMTJ素子の中からどのMTJ素子から値を読み出すかを指定するアドレス信号を入力して、その信号線で指定されたMTJ素子から値を読み出すように実施することもできる。乱数発生信号を受信して乱数発生をする場合も、複数あるMTJ素子に並列に乱数発生パルスを流すように実施しても良いし、MTJ素子に順次乱数発生パルスを流すように実施しても良いし、アドレス信号で指定したMTJ素子に乱数発生パルスを流すように実施しても良い。
図7に、図4の実施例を変形した、別の実施例(第2の実施例)を示す。
図4に示した実施例では、乱数発生時に制御回路12がまずMTJ素子11の状態を読み出した後、その状態に応じて、高抵抗状態へ確率的に反転させる乱数発生パルスを流すか、低抵抗状態へ確率的に反転させる乱数発生パルスを流すかを、制御回路12内で判断した。図7は、この判断を乱数発生回路を利用する外部回路(外部装置)側で行う方法である。
図7の制御回路13は、図6の制御回路12に対して乱数発生の方法を示すデータ(乱数発生方法データ)を入力する信号線が追加されている。乱数データの読み出し時の動作は、図6の乱数発生回路12と図7の乱数発生回路12とで同じである。
一方、新しい乱数を発生させる時の制御回路12、13の動作は、図6の乱数発生回路と図7の乱数発生回路では異なる。図7の乱数発生回路の制御回路13は、乱数発生信号を受信すると、図8に示す手順で乱数発生を行う。すなわち、乱数発生信号の受信と同時に乱数発生方法データを受信し(S31)、乱数発生方法データの値が0であれば、MTJ素子を高抵抗状態(論理値1)から低抵抗状態(論理値0)に確率的に反転させる電流値の乱数発生パルスをMTJ素子11に流し(S32)、逆に、その値が1であれば、MTJ素子11を低抵抗状態(論理値0)から高抵抗状態(論理値1)に確率的に反転させる電流値の乱数発生パルスをMTJ素子に流す(S33)。
図7の乱数発生回路を利用する外部回路は、図9に示す手順で図7の乱数発生回路を利用する。まず、乱数発生回路に読み出し信号を送って、現在の値を読み出し(S41)、その値を調べる(S42)。次に、読み出した値の論理否定値を含む乱数発生方法データを生成し、生成した乱数発生方法データを乱数発生信号とともに送る。すなわち、読み出した値が0であれば乱数発生方法データを1に指定し(S43)、読み出した値が1であれば乱数発生方法データを0に指定し(S44)、1または0に指定した乱数発生方法データを乱数発生信号とともに乱数発生回路に送る。これにより、乱数発生回路のMTJ素子11の状態をランダムに変化させる。この後、外部回路は、読み出し信号を乱数発生回路に送ることで、新しく発生させた乱数の値を読み出すことができる。
このように実施することで、制御回路13の構成を図4の実施例の場合よりも簡単にすることができる。すなわち、図4の実施例の制御回路12では、乱数発生信号を受信して乱数発生を行う場合に、MTJ素子11の現在の状態の読み出しを行うステップと、MTJ素子11に乱数発生パルスを流してランダムに状態を変化させるステップの2ステップの処理が必要であり、さらに、最初のステップで読み出した状態を記憶しておいて次のステップで使うための記憶素子(フリップフロップあるいはレジスタ)が必要になる。それに対して図7の実施例の制御回路13は、乱数発生信号を受信したときの処理は、MTJ素子11に乱数発生パルスを流してランダムに状態を変化させる処理だけであり、現在のMTJ素子11の状態を読み出して記憶しておく必要がないため、制御回路13は簡単になる。つまり、図7の実施例では、現在の状態を読み出してそれに応じた乱数発生を指示するための処理は、乱数発生回路から省いて、乱数発生回路を利用する外部回路側に任せている。外部回路は、乱数発生回路から乱数を読み出したらその値を記憶しておき、次に新しい乱数を発生させるときに、記憶しておいた値を用いて乱数発生方法データを指定するようにすれば、効率良く動作させることができる。
乱数発生回路内に複数のMTJ素子を持つ場合は、図4の実施例の変形例と同様の変形を行って実施できる。さらに、図7の乱数発生回路が複数のMTJ素子を持つ場合に、乱数発生方法データの信号線は内部のMTJ素子の数に合わせて複数本用意し、それぞれのMTJ素子の乱数発生に用いるように実施できる。また、乱数発生方法データの信号線の数をMTJ素子の数よりも少なくしておき、MTJ素子と同じビット数の乱数発生方法データを直列に入力するように実施することもできる。さらに、乱数発生させたいMTJ素子を指定するアドレス信号の入力を制御回路13に持たせ、制御回路13はアドレス信号で指定したMTJ素子に対して、乱数発生方法データを適用した乱数発生を行うように実施することもできる。
なお、この実施例(第2の実施例)では、乱数発生方法データの値が0であればMTJ素子を高抵抗状態(論理値1)から低抵抗状態(論理値0)に、1であればMTJ素子を低抵抗状態(論理値0)から高抵抗状態(論理値1)に確率的に反転させる電流値の乱数発生パルスをMTJ素子に流すようにしているが、逆に、乱数発生方法データの値が0であればMTJ素子を低抵抗状態(論理値0)から高抵抗状態(論理値1)に、1であればMTJ素子を高抵抗状態(論理値1)から低抵抗状態(論理値0)に確率的に反転させる電流値の乱数発生パルスをMTJ素子に流すように変形して実施することもできる。このように変形して実施した場合は、読み出した乱数値から乱数発生方法データを作る際に各ビットを反転する必要がなくなる。つまり、読み出した乱数値をそのまま乱数発生方法データとして用いることができる。
次に、通常のメモリのように複数のMTJ素子を集積した乱数発生回路の実施例を説明するが、その前に、まずMTJ素子をメモリセルとして用いるスピン注入型MRAMの代表的な構成について説明する。
図10は、MTJ素子をメモリセルとして用いるスピン注入型MRAMの代表的な構成を示す。図10の構成のMRAMは、データを読み書きするメモリのアドレスを指定するアドレス線(図10ではA)、読み書きするデータの転送に用いるデータ線(図10ではD)、アドレス線(A)で指定したメモリの内容を読み出してデータ線(D)に出力することを指示する読み出し信号(図10では〜OE)、データ線(D)に指定したデータをアドレス線(A)で指定したメモリに書き込むことを指示する書き込み信号(図10では〜W)の4種類の信号線で外部の回路と接続される。アドレス線(A)はMRAM内の複数のMTJ素子11が選択できるように、MTJ素子11の数に合わせた複数ビットの信号線である。データ線(D)も、同時に読み書きできるデータが1ビットのMRAMであれば1本の信号線であるが、同時に複数ビットのデータを読み書きできるMRAMの場合には複数ビットの信号線である。ここで、〜記号で始まる名前の信号線はアクティブロー(Active Low)、すなわち、論理値が0になることで指示を伝えることを示している。ただし、必ずアクティブローである必要はなく、アクティブハイで実現されることもある。
MRAM内部には、セルアレイ31、アドレスデコーダ32、センスアンプ33、ライトドライバ34、トライステートバッファ35が備えられる。セルアレイ31は、メモリセルとして用いる複数のMTJ素子11を、複数本のワード線と複数本のビット線の交点上に配置した、アレイ構造を持つ。アドレスデコーダ32はアドレス線(A)に接続され、セルアレイ31のMTJ素子11の中からアドレス線(A)で指定されたMTJ素子11が読み書き対象になるように、セルアレイ31のワード線と、必要に応じてビット線を制御する。ライトドライバ34は、書き込み信号(〜W)を受信すると、その時データ線(D)に流れているデータを、アドレス線(A)で選択されたMTJ素子11に書き込む。センスアンプ33は、アドレス線(A)で選択されたMTJ素子11に記録されている値を読み出す。トライステートバッファ35は、読み出し信号(〜OE)を受信するとセンスアンプ33から送られてくるデータをデータ線(D)に送り出す。
図11は図10のMRAMからデータを読み出す時の各信号線のタイミングチャートである。MRAMに接続した外部回路(例えばマイクロプロセッサなど)がMRAMからデータを読み出す場合は、まず、書き込み信号(〜W)を1に固定し、アドレス線(A)に読み出したいアドレスを指定し、読み出し信号(〜OE)を1から0にしてMRAMに読み出しを指示する。その結果、MRAMのセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して読み出し電流を流してセンスアンプ33で0/1の論理信号に変換し、読み出し信号(〜OE)で信号が伝搬するように設定されたトライステートバッファ35を介して、データ線(D)に読み出したデータを出力する。その後、読み出し信号(〜OE)が0から1に戻ると、トライステートバッファ35による信号の伝搬が止まって出力がハイインピーダンス状態になるため、データ線(D)へのデータ出力も止まる。
図12は図10のMRAMにデータを書き込む時の各信号線のタイミングチャートである。MRAMに接続した外部回路がMRAMにデータを書き込む場合、まず、読み出し信号(〜OE)を1に固定し、アドレス線(A)に書き込みたいアドレスを指定し、データ線(D)に書き込みたいデータを指定し、書き込み信号(〜W)を1から0にしてMRAMに書き込みを指示する。その結果、MRAMのセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して、ライトドライバ34がデータ線(D)で指定されたデータを書き込む。ライトドライバ34によるMTJ素子へのデータの書き込みは、データ線で書き込むべき論理値が0と指定されたMTJ素子に対しては、MTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に反転させる方向の書き込み電流のパルスを流し、逆に、データ線で書き込むべき論理値が1と指定されたMTJ素子に対しては、MTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に反転させる方向の書き込み電流のパルスを流すことで行う。書き込み信号(〜W)を0から1に戻すことで書き込み処理を終了する。
図13に、図10のMRAMを変形して乱数発生器を実現する実施例(第3の実施例)を示す。MTJ素子をMRAMに使う場合と乱数発生器に使う場合では、書き込みパルスの電流値が異なるだけであるので、図10に示したスピン注入型MRAMと同様の回路構成で乱数発生器も実現できる。このようにMRAMを変形した構成にすることにより、乱数発生器をマイクロプロセッサ等と接続しやすくなる。また、多数のMTJ素子を集積することにより、大量の乱数を発生させることが必要な用途や、高速に乱数を発生させることが必要な用途、多くの自然乱数源を組み合わせてより良い特性の乱数を発生させることが必要な用途などにも利用できる。
図13の乱数発生器は、乱数の発生に用いるMTJ素子のアドレスを指定するアドレス線(図13ではA)、乱数の値の読み出しに用いるデータ線(図13ではD)、アドレス線(A)で指定したMTJ素子の状態を読み出してデータ線(D)に出力することを指示する読み出し信号(図13では〜OE)、アドレス線(A)で指定したMTJ素子に新しい乱数値を生成することを指示する乱数発生信号(図13では〜W)の4種類の信号線で外部の回路と接続される。アドレス線(A)は乱数発生器内の複数のMTJ素子が選択できるように、MTJ素子の数に合わせた複数ビットの信号線である。データ線(D)も、同時に読み出すことができる乱数値が1ビットの乱数発生器であれば1本の信号線であるが、同時に複数ビットの乱数値を読み出すことができる乱数発生器の場合には複数ビットの信号線である。データ線(D)が複数ビットの信号線である場合には、センスアンプやライトドライバも複数個用いて、複数ビットの信号を並列して扱う。
乱数発生器内部には、セルアレイ31、アドレスデコーダ32、センスアンプ41、ライトドライバ42、トライステートバッファ43、レジスタ44を備える。セルアレイ31は、乱数発生に用いる複数のMTJ素子11を、複数本のワード線と複数本のビット線の交点上に配置した、アレイ構造を持つ。アドレスデコーダ32はアドレス線(A)に接続され、セルアレイ31のMTJ素子11の中からアドレス線(A)で指定されたMTJ素子が乱数値の読み出しあるいは乱数発生の対象になるように、セルアレイ31のワード線と、必要に応じてビット線を制御する。センスアンプ41は、アドレス線(A)で選択されたMTJ素子に記録されている乱数値を読み出す。トライステートバッファ43は、読み出し信号(〜OE)を受信するとセンスアンプ41から送られてくる乱数値をデータ線(D)に送り出す。トライステートバッファ43は読み出し信号(〜OE)を受信する、本発明の第2の受信手段と、センスアンプ41により読み出した乱数値(論理値)を出力する出力手段とを含む。レジスタ44は、乱数発生信号(〜W)を受信するとセンスアンプ41から送られてくる乱数値を記憶する。ライトドライバ42は、乱数発生信号(〜W)を受信すると、レジスタ44に記憶しているMTJ素子の現在の乱数値を確率的に反転させる乱数発生パルスをアドレス線(A)で選択されたMTJ素子に流すことで、MTJ素子の状態をランダムに変化させて新しい乱数を発生させる。レジスタ44およびライトドライバ42は乱数発生信号(〜W)を受信する本発明の第1の受信手段を含む。
図14は図13の乱数発生器から乱数値を読み出す時の各信号線のタイミングチャートである。乱数発生器に接続した外部回路(例えばマイクロプロセッサなど)が乱数発生器からデータを読み出す場合は、まず、乱数発生信号(〜W)を1に固定し、アドレス線(A)に読み出したいMTJ素子のアドレスを指定し、読み出し信号(〜OE)を1から0にして乱数発生器に読み出しを指示する。その結果、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対してアドレスデコーダ32が読み出し電流を流してセンスアンプ31で0/1の論理信号に変換し、読み出し信号(〜OE)で信号が伝搬するように設定されたトライステートバッファ43を介して、データ線(D)に読み出したデータを出力する。その後、読み出し信号(〜OE)が0から1に戻ると、トライステートバッファ43による信号の伝搬が止まって出力がハイインピーダンス状態になるため、データ線(D)へのデータ出力も止まる。この読み出し手順はMRAMのデータの読み出しと同様である。
図15は図13の乱数発生器に新しい乱数を発生させる時の各信号線のタイミングチャートである。乱数発生器に接続した外部回路が乱数発生器に乱数発生を指示する場合、まず、読み出し信号(〜OE)を1に固定し、アドレス線(A)に乱数を発生させたいMTJ素子のアドレスを指定し、乱数発生信号(〜W)を1から0にして乱数発生器に乱数発生を指示する。その結果、まず、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対してアドレスデコーダ32が読み出し電流を流してセンスアンプ41で0/1の論理値の信号に変換し、その値をレジスタ44に記憶する。次に、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して、ライトドライバ42がレジスタの値に基づいて乱数を発生させる。ライトドライバ42によるMTJ素子への乱数発生は、レジスタ44に記憶している現在の乱数値が0であるMTJ素子に対しては、MTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に確率的に反転させる方向の乱数発生電流のパルスを流し、逆に、レジスタ44に記憶している現在の乱数値が1であるMTJ素子に対しては、MTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に反転させる方向の乱数発生電流のパルスを流すことで行う。乱数発生信号(〜W)を0から1に戻すことで乱数発生処理を終了する。
図16にさらに別の乱数発生器の実施例(第4の実施例)を示す。
図16の乱数発生器は、乱数の発生に用いるMTJ素子のアドレスを指定するアドレス線(図16ではA)、乱数の値の読み出しに用いるデータ線(図16ではD)、アドレス線(A)で指定したMTJ素子の状態を読み出してデータ線(D)に出力することを指示する読み出し信号(図16では〜OE)、アドレス線(A)で指定したMTJ素子に新しい乱数値を生成することを指示する乱数発生信号(図16では〜W)の4種類の信号線で外部の回路と接続される。アドレス線(A)は乱数発生器内の複数のMTJ素子が選択できるように、MTJ素子の数に合わせた複数ビットの信号線である。データ線(D)も、同時に読み出すことができる乱数値が1ビットの乱数発生器であれば1本の信号線であるが、同時に複数ビットの乱数値を読み出すことができる乱数発生器の場合には複数ビットの信号線である。データ線(D)が複数ビットの信号線である場合には、センスアンプやライトドライバも複数個用いて、複数ビットの信号を並列して扱う。
乱数発生器内部には、セルアレイ31、アドレスデコーダ32、センスアンプ51、ライトドライバ52、トライステートバッファ53、レジスタ54が備えられる。セルアレイ31は、乱数発生に用いる複数のMTJ素子11を、複数本のワード線と複数本のビット線の交点上に配置した、アレイ構造を持つ。アドレスデコーダ32はアドレス線(A)に接続され、セルアレイのMTJ素子の中からアドレス線(A)で指定されたMTJ素子が乱数値の読み出しあるいは乱数発生の対象になるように、セルアレイ31のワード線と、必要に応じてビット線を制御する。センスアンプ51は、アドレス線(A)で選択されたMTJ素子に記録されている乱数値を読み出す。トライステートバッファ53は、読み出し信号(〜OE)を受信するとセンスアンプ51から送られてくる乱数値をデータ線(D)に送り出す。レジスタ54は、読み出し信号(〜OE)を受信するとセンスアンプ51から送られてくる乱数値を記憶する。レジスタ54およびトライステートバッファ53は読み出し信号(〜OE)を受信する、本発明の第2の受信手段を含み、トライステートバッファ53は、センスアンプ51により読み出した乱数値(論理値)を出力する出力手段を含む。ライトドライバ52は、乱数発生信号(〜W)を受信すると、レジスタ54に記憶しているMTJ素子の現在の乱数値を確率的に反転させる乱数発生パルスをアドレス線(A)で選択されたMTJ素子に流すことで、MTJ素子の状態をランダムに変化させて新しい乱数を発生させる。ライトドライバ52は乱数発生信号(〜W)を受信する本発明の第1の受信手段を含む。
図16の乱数発生器で新しい乱数を発生させる時は、図13の乱数発生器と異なり、乱数発生に先立って現在の乱数値の読み出しを行う。すなわち、図13の乱数発生器では乱数発生の指示を乱数発生信号によって受信すると、指定されたMTJ素子の現在の値をレジスタに読み出してから、MTJ素子に対する新しい乱数の発生を行う。それに対して図16の乱数発生器では、乱数値の読み出し時にレジスタに値が記憶されるため、新しい乱数を発生させるには、まず乱数を発生したいMTJのアドレスを指定して値の読み出しをした後、同じMTJのアドレスを指定して乱数発生を指示する。たとえば図19のように、乱数発生器61(ここでは図16の乱数発生器であるとする)がバス62を介してマイクロプロセッサ63およびメモリ64につながっている場合、乱数発生器61に新しい乱数を発生させたいマイクロプロセッサ63は、図20に示す手順で乱数生成を指示する。すなわち、まずアドレスを指定して乱数発生器61に読み出しを指示し(S51)、続いて同じアドレスを指定して乱数発生器61に乱数生成を指示する(S52)。
図17は図16の乱数発生器から乱数値を読み出す時の各信号線のタイミングチャートである。乱数発生器に接続した外部回路(例えばマイクロプロセッサなど)が乱数発生器からデータを読み出す場合は、まず、乱数発生信号(〜W)を1に固定し、アドレス線(A)に読み出したいMTJ素子のアドレスを指定し、読み出し信号(〜OE)を1から0にして乱数発生器に読み出しを指示する。その結果、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対してアドレスデコーダ32が読み出し電流を流してセンスアンプ51で0/1の論理信号に変換し、読み出し信号(〜OE)で信号が伝搬するように設定されたトライステートバッファ53を介してデータ線(D)に読み出したデータを出力するとともに、その値をレジスタ54に記憶する。その後、読み出し信号(〜OE)が0から1に戻ると、トライステートバッファ53による信号の伝搬が止まって出力がハイインピーダンス状態になるため、データ線(D)へのデータ出力も止まる。
図18は図16の乱数発生器に新しい乱数を発生させる時の各信号線のタイミングチャートである。ここで、図18の動作の直前に、図17の動作によって、乱数を発生させたいMTJ素子のアドレスを指定した読み出しがあらかじめ実行されているものとする。乱数発生器に接続したマイクロプロセッサなどの外部回路が乱数発生器に乱数発生を指示する場合、まず、読み出し信号(〜OE)を1に固定し、アドレス線(A)に乱数を発生させたいMTJ素子のアドレスを指定し、乱数発生信号(〜W)を1から0にして乱数発生器に乱数発生を指示する。その結果、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して、ライトドライバ52がレジスタ54の値に基づいて乱数を発生させる。ライトドライバ52によるMTJ素子への乱数発生は、レジスタ54に記憶している現在の乱数値が0であるMTJ素子に対しては、MTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に確率的に反転させる方向の乱数発生電流のパルスを流し、逆に、レジスタ54に記憶している現在の乱数値が1であるMTJ素子に対しては、MTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に反転させる方向の乱数発生電流のパルスを流すことで行う。乱数発生信号(〜W)を0から1に戻すことで乱数発生処理を終了する。
図16の乱数発生器は、図13の乱数発生器の乱数発生手順から、読み出し処理で代用できる手順を省き、読み出し手順と乱数発生手順を組み合わせることで新しい乱数の発生を実現している。この方式は、乱数発生手順の中で読み出しを行う必要がないため、乱数発生処理の時間が短縮できる。また、MRAMの書き込みと同等の回路で実現できるので回路構成が簡単になる。
図21には、さらに別の乱数発生器の実施例(第5の実施例)を示す。
図21の乱数発生器は、乱数の発生に用いるMTJ素子のアドレスを指定するアドレス線(図21ではA)、読み出した乱数値および乱数発生に必要なデータの転送に用いるデータ線(図21ではD)、アドレス線(A)で指定したMTJ素子の状態を読み出してデータ線(D)に出力することを指示する読み出し信号(図21では〜OE)、アドレス線(A)で指定したMTJ素子にデータ線(D)に指定したデータ(乱数発生方法を示すデータ)に基づいて新しい乱数値を生成することを指示する乱数発生信号(図21では〜W)の4種類の信号線で外部の回路と接続される。アドレス線(A)は乱数発生器内の複数のMTJ素子が選択できるように、MTJ素子の数に合わせた複数ビットの信号線である。データ線(D)も、同時に読み出しあるいは発生することができる乱数値が1ビットの乱数発生器であれば1本の信号線であるが、同時に複数ビットの乱数値を読み出しあるいは発生させることができる乱数発生器の場合には複数ビットの信号線である。データ線(D)が複数ビットの信号線である場合には、センスアンプやライトドライバも複数個用いて、複数ビットの信号を並列して扱う。
乱数発生器内部には、セルアレイ31、アドレスデコーダ32、センスアンプ71、ライトドライバ72、トライステートバッファ73を備える。セルアレイ31は、乱数発生に用いる複数のMTJ素子11を、複数本のワード線と複数本のビット線の交点上に配置した、アレイ構造を持つ。アドレスデコーダ32はアドレス線(A)に接続され、セルアレイのMTJ素子の中からアドレス線(A)で指定されたMTJ素子が乱数値の読み出しあるいは乱数発生の対象になるように、セルアレイ31のワード線と、必要に応じてビット線を制御する。センスアンプ71は、アドレス線(A)で選択されたMTJ素子に記録されている乱数値を読み出す。トライステートバッファ73は、読み出し信号(〜OE)を受信するとセンスアンプ71から送られてくる乱数値をデータ線(D)に送り出す。ライトドライバ72は、乱数発生信号(〜W)を受信すると、データ線(D)に指定された乱数発生方法を示すデータに基づいて、アドレス線(A)で選択されたMTJ素子に対して、その状態を確率的に反転させる乱数発生パルスを流すことで、MTJ素子の状態をランダムに変化させて新しい乱数を発生させる。ライトドライバ72は乱数発生信号を受信する本発明の第1の受信手段と、乱数発生方法データを受信する本発明の第5の受信手段を含む。トライステートバッファ73は読み出し信号を受信する本発明の第2の受信手段を含む。
図21の乱数発生器は、図19のように、マイクロプロセッサ63等の外部回路と組み合わせて利用する。図21の乱数発生器を使って新しい乱数を発生させたいマイクロプロセッサ63等の外部回路は、図24に示す手順で乱数発生器に乱数生成を指示する。すなわち、まず、アドレスを指定して乱数発生器に読み出しを指示して乱数値Rを取得し(S61)、次に、取得した乱数値Rの各ビットの否定をとることで乱数発生方法を示すデータ〜Rを作成し(S62)、最後に、続いて同じアドレスを指定するとともに乱数発生方法を示すデータ〜Rを指定して乱数発生器に乱数生成を指示する(S63)。つまり、図16の乱数発生器の持っていたレジスタを省略し、代わりに、読み出した乱数値をマイクロプロセッサ63等の外部回路側で記憶しておき、その記憶した値を、乱数発生を指示するときに乱数発生器に渡すようになっている。プロセッサ63による図21の乱数発生器からの乱数値の読み出しの指示は、プロセッサ63がバス62によって接続された乱数発生器からデータを読み出すことによって実現され、プロセッサ63による図21の乱数発生器への乱数発生の指示は、プロセッサ63がバス62によって接続された乱数発生器に対して乱数発生方法を示すデータを書き込むことによって実現されるようになっている。
なお、図24の手順では、乱数発生器から読み出した現在の乱数値の否定をとることにより乱数発生方法データを生成し、それを乱数発生時にデータ線(D)に指定している。これは、乱数発生器に乱数発生を指示するときに、乱数発生方法データとして論理値0がデータ線(D)に指定された場合には高抵抗状態(論理値1)から低抵抗状態(論理値0)に確率的に状態が反転する乱数発生電流のパルスを流し、乱数発生方法データとして論理値1がデータ線(D)に指定された場合には低抵抗状態(論理値0)から高抵抗状態(論理値1)に確率的に状態が反転する乱数発生電流のパルスを流すように実施されているためである。データ線(D)に指定されるデータの解釈を逆にし、乱数発生方法データとして論理値1がデータ線(D)に指定された場合には高抵抗状態(論理値1)から低抵抗状態(論理値0)に確率的に状態が反転する乱数発生電流のパルスを流し、乱数発生方法データとして論理値0がデータ線(D)に指定された場合には低抵抗状態(論理値0)から高抵抗状態(論理値1)に確率的に状態が反転する乱数発生電流のパルスを流すように実施すれば、図24において読み出したデータの値の否定をとるステップS62は不要になるため、読み出した乱数値Rをそのまま乱数発生方法データとして指定すればよい。
図22は図21の乱数発生器から乱数値を読み出す時の各信号線のタイミングチャートである。乱数発生器に接続した外部回路(例えばマイクロプロセッサなど)が乱数発生器からデータを読み出す場合は、まず、乱数発生信号(〜W)を1に固定し、アドレス線(A)に読み出したいMTJ素子のアドレスを指定し、読み出し信号(〜OE)を1から0にして乱数発生器に読み出しを指示する。その結果、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して読み出し電流を流してセンスアンプ71で0/1の論理信号に変換し、読み出し信号(〜OE)で信号が伝搬するように設定されたトライステートバッファ73を介してデータ線(D)に読み出したデータを出力する。その後、読み出し信号(〜OE)が0から1に戻ると、トライステートバッファ73による信号の伝搬が止まって出力がハイインピーダンス状態になるため、データ線(D)へのデータ出力も止まる。
図23は図21の乱数発生器に新しい乱数を発生させる時の各信号線のタイミングチャートである。ここで、図23の動作の直前に、図21の動作によって、乱数を発生させたいMTJ素子のアドレスを指定した読み出しがあらかじめ実行されているものとする。乱数発生器に接続したマイクロプロセッサなどの外部回路が乱数発生器に乱数発生を指示する場合、まず、読み出し信号(〜OE)を1に固定し、アドレス線(A)に乱数を発生させたいMTJ素子のアドレスを指定し、先に読み出しておいた現在の乱数値の各ビットの否定をとった値である乱数発生方法データをデータ線(D)に指定し、乱数発生信号(〜W)を1から0にすることにより乱数発生を指示する。その結果、ライトドライバ72は、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して、データ線(D)に指定された値に基づいて乱数を発生させる。ライトドライバ72によるMTJ素子への乱数発生は、データ線(D)に指定された値が0であるMTJ素子に対しては、MTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に確率的に反転させる方向の乱数発生電流のパルスを流し、逆に、データ線(D)に指定された値が1であるMTJ素子に対しては、MTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に反転させる方向の乱数発生電流のパルスを流すことで行う。乱数発生信号(〜W)を0から1に戻すことで乱数発生処理を終了する。
図21の乱数発生器は、図16の乱数発生器からレジスタを省略することで、回路を簡単にすることができる。この方式は、MRAMと同等の回路を用い、MRAMの書き込みパルスの電流値を、MTJ素子を確率的に反転させる乱数生成パルスの電流値に変更するだけで実現できる。
図25は、図21の乱数発生器を変形した実施例(第6の実施例)であり、MTJ素子を通常のMRAMのメモリ素子としても乱数発生用にも利用できるようになっている。
図21の乱数発生器の乱数発生信号(〜W)は、図25の乱数発生器では書き込み信号(〜W)になっている。図25の乱数発生器では、書き込み信号(〜W)は、メモリとしての書き込みの指示と乱数発生の指示の両方を兼ねる。図25の乱数発生器は、図21の乱数発生器に対して、乱数モード信号(〜RN)が加わっている。乱数モード信号(〜RN)はライトドライバ82につながっている。ライトドライバ82は書き込み信号(〜W)が1から0に変化した時に、乱数モード信号(〜RN)が1であれば通常のメモリへの書き込み処理を行う。つまり、ライトドライバ82は、データ線(D)に指定されたデータ(書き込みデータ)に基づいて、アドレス線(A)で選択されたMTJ素子に対して書き込みパルスを流すことで、MTJ素子の状態を変化させて指定されたデータを記憶する。すなわち指定されたデータが0のときはMTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に反転させる方向の書き込みパルス(第3の電流)を流し、逆に、指定されたデータが1のときはMTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に確実に反転させる方向の書き込みパルス(第4の電流)を流す。一方、ライトドライバ82は書き込み信号(〜W)が1から0に変化した時に、乱数モード信号(〜RN)が0であれば乱数発生処理を行う。つまり、ライトドライバ82は、データ線(D)に指定されたデータ(乱数発生方法データ)に基づいて、アドレス線(A)で選択されたMTJ素子に対して、その状態を確率的に反転させる乱数発生パルスを流すことで、MTJ素子の状態をランダムに変化させて新しい乱数を発生させる。ライトドライバ82は書き込みデータを受信する本発明の第4の受信手段を含む。
図25の乱数発生器は、図19のように、マイクロプロセッサ63等の外部回路と組み合わせて利用する。図25の乱数発生器を使って新しい乱数を発生させたいマイクロプロセッサ63等の外部回路は、図24に示す手順で乱数発生を指示する。すなわち、まずアドレスを指定して乱数発生器に読み出しを指示し(S61)、読み出した乱数値の各ビットの否定をとった値であるデータを取得し(S62)、同じアドレスを指定するとともに乱数発生器に乱数生成指示と当該データとを送る(S63)。
図26は図25の乱数発生器から乱数値あるいはメモリとして記憶させた値を読み出す時の各信号線のタイミングチャートである。乱数発生器に接続した外部回路(例えばマイクロプロセッサなど)が乱数発生器からデータを読み出す場合は、まず、書き込み信号(〜W)を1に固定し、アドレス線(A)に読み出したいMTJ素子のアドレスを指定し、読み出し信号(〜OE)を1から0にして乱数発生器に読み出しを指示する。その結果、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して読み出し電流を流してセンスアンプ81で0/1の論理信号に変換し、読み出し信号(〜OE)で信号が伝搬するように設定されたトライステートバッファ83を介してデータ線(D)に読み出したデータを出力する。その後、読み出し信号(〜OE)が0から1に戻ると、トライステートバッファ83による信号の伝搬が止まって出力がハイインピーダンス状態になるため、データ線(D)へのデータ出力も止まる。
図27は図25の乱数発生器をMRAMとして用いてデータの書き込む時の各信号線のタイミングチャートである。乱数発生器に接続したマイクロプロセッサなどの外部回路がデータの書き込みを指示する場合、まず、読み出し信号(〜OE)を1に固定し、乱数モード信号(〜RN)を1に固定し、アドレス線(A)にデータを書き込みたいMTJ素子のアドレスを指定し、データ線(D)に書き込みたいデータの値を指定し、書き込み信号(〜W)を1から0にして乱数発生器に書き込みを指示する。その結果、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して、データ線(D)に指定された値を記憶させる。ライトドライバ82によるMTJ素子へのデータの書き込みは、データ線(D)に指定された値が0であるMTJ素子に対しては、MTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に確実に反転させる方向の書き込み電流のパルスを流し、逆に、データ線(D)に指定された値が1であるMTJ素子に対しては、MTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に確実に反転させる方向の書き込み電流のパルスを流すことで行う。書き込み信号(〜W)を0から1に戻すことで書き込み処理を終了する。
図28は図25の乱数発生器に新しい乱数を発生させる時の各信号線のタイミングチャートである。ここで、図28の動作の前に、図26の動作によって、乱数を発生させたいMTJ素子のアドレスを指定して現在の値があらかじめ読み出されているものとする。乱数発生器に接続したマイクロプロセッサなどの外部回路が乱数発生器に乱数発生を指示する場合、まず、読み出し信号(〜OE)を1に固定し、アドレス線(A)に乱数を発生させたいMTJ素子のアドレスを指定し、先に読み出しておいた現在の乱数値の各ビットの否定をとった値である乱数発生方法データをデータ線(D)に指定し、乱数モード信号(〜RN)を1から0にした後、書き込み信号(〜W)を1から0にすることにより乱数発生器に乱数発生を指示する。その結果、ライトドライバ82は、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して、データ線(D)に指定された値に基づいて乱数を発生させる。ライトドライバ82によるMTJ素子への乱数発生は、データ線(D)に指定された値が0であるMTJ素子に対しては、MTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に確率的に反転させる方向の乱数発生電流のパルスを流し、逆に、データ線(D)に指定された値が1であるMTJ素子に対しては、MTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に反転させる方向の乱数発生電流のパルスを流すことで行う。書き込み信号(〜W)と乱数モード信号(〜RN)を0から1に戻すことで書き込み処理を終了する。
図25の乱数発生器は、MRAMと同等の回路を用い、乱数モード信号(〜RN)の値に応じて、MRAMの書き込みパルスの電流値と、MTJ素子を確率的に反転させる乱数生成パルスの電流値とを切り替えるように変更するだけで実現できる。
図25の乱数発生器を図19のようにマイクロプロセッサ63に接続する場合、通常のプロセッサのバスにはデータの読み出しと書き込みの信号線はあるが、乱数モード信号を接続するために適切な信号線がない場合がある。そのような場合には、乱数発生器をプロセッサのメモリ空間の2つの領域にマッピングし、一方の領域への書き込みの場合はMRAMとしての通常の書き込みを行い、もう一方の領域への書き込みの場合は乱数発生を行うようにすればよい。つまり、乱数モード信号(〜RN)を、乱数発生器内のMTJ素子を指定するアドレス線(A)のさらに上位のアドレス線と考えればよい。
なお、図25の乱数発生器を用いれば、まず低抵抗状態(論理値0)にリセットしたMTJ素子に対して、低抵抗状態(論理値0)から高抵抗状態(論理値1)へ確率的に状態を反転させる乱数発生電流のパルスを流して乱数を発生させる、従来の乱数発生方法も実現することができる。この場合、乱数発生器に接続したマイクロプロセッサ等の外部回路は、乱数発生器に対して、乱数発生に使いたいMTJ素子のアドレスを指定して、まず全ビットに論理値0のデータを通常のMRAMの書き込み方法で書き込む。次に、同じアドレスに対して、全ビット論理値1のデータである乱数発生方法データを指定し、乱数発生を指示することで、乱数を発生させることができる。
図25の乱数発生器と同様に、図13や図16の乱数発生器も、MTJ素子を通常のMRAMのメモリ素子としても乱数発生用にも利用できるように変形して実施できる。
図29は、図13の乱数発生器を、MRAMとしても利用できるように変形した実施例(第7の実施例)である。図25の乱数発生器と同様に、図13の乱数発生器における乱数発生信号(〜W)は、図29の乱数発生器では書き込み信号(〜W)になり、メモリとしての書き込みの指示と乱数発生の指示の両方の役割を兼ねる。図29の乱数発生器は、図13の乱数発生器の回路構成に加えて、乱数モード信号(〜RN)とセレクタ95が加わっている。乱数モード信号(〜RN)はセレクタ95に接続されている。セレクタ95は、乱数モード信号(〜RN)が0の時はレジスタ94の出力を、乱数モード信号(〜RN)が1の時はデータ線(D)のデータを、ライトドライバ92に伝送する。乱数モード信号(〜RN)はライトドライバ92にも接続されている。ライトドライバ92は書き込み信号(〜W)が1から0に変化した時に、乱数モード信号(〜RN)が1であれば通常のメモリへの書き込み処理を行う。つまり、ライトドライバ92は、セレクタ95から送られてくるデータ線(D)に指定されたデータに基づいて、アドレス線(A)で選択されたMTJ素子に対して、書き込みパルスを流すことで、MTJ素子の状態を変化させてデータ線(D)に指定されたデータを記憶する。すなわち指定されたデータが0のときはMTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に確実に反転させる書き込みパルス(第3の電流)を流し、逆に、指定されたデータが1のときはMTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に確実に反転させる書き込みパルス(第4の電流)を流す。一方、ライトドライバ92は書き込み信号(〜W)が1から0に変化した時に、乱数モード信号(〜RN)が0であれば乱数発生処理を行う。つまり、ライトドライバ92は、セレクタ95から送られてくるレジスタ94の出力(現在のMTJ素子の記憶データの否定をとったものになっている)に基づいて、アドレス線(A)で選択されたMTJ素子に対して、その状態を確率的に反転させる乱数発生パルスを流すことで、MTJ素子の状態をランダムに変化させて新しい乱数を発生させる。なお図29のトライステートバッファ93は図13のトライステートバッファ43と同一の機能を有する。
乱数モード信号(〜RN)が0であり書き込み信号(〜W)が0である状態は、本発明の乱数発生信号が受信された状態に相当する。また乱数モード信号(〜RN)が1であり書き込み信号(〜W)が0である状態は、本発明の書き込み信号が受信された状態に相当する。ライトドライバ92は乱数発生信号(ここでは乱数モード信号(〜RN)が0であり書き込み信号(〜W)が0である状態を示す)を受信する第1の受信手段、書き込み信号(ここでは乱数モード信号(〜RN)が1であり書き込み信号(〜W)が0である状態を示す)を受信する本発明の第3の受信手段を含む。セレクタ95は書き込みデータ(データ線(D)のデータ)を受信する本発明の第4の受信手段を含む。
図29ではレジスタ94は書き込み信号(〜W)が1から0に変化した時点でセンスアンプ91から送られてくる読み出しデータを記憶するようになっているが、この記憶したデータが必要なのは乱数発生の時だけである。それゆえ、乱数モード信号(〜RN)が0の時に書き込み信号(〜W)が1から0に変化した時点でセンスアンプ91から送られてくる読み出しデータを記憶するように実施しても良い。
図30は、図16の乱数発生器を、MRAMとしても利用できるように変形した実施例(第8の実施例)である。図25の乱数発生器と同様に、図16の乱数発生器における乱数発生信号(〜W)は、図30の乱数発生器では書き込み信号(〜W)になり、メモリとしての書き込みの指示と乱数発生の指示の両方の役割を兼ねる。図30の乱数発生器は、図16の乱数発生器の回路構成に加えて、乱数モード信号(〜RN)とセレクタ105が加わっている。乱数モード信号(〜RN)はセレクタ105に接続されている。セレクタ105は、乱数モード信号(〜RN)が0の時はレジスタ104の出力を、乱数モード信号(〜RN)が1の時はデータ線(D)のデータを、ライトドライバに102伝送する。乱数モード信号(〜RN)はライトドライバ102にも接続されている。ライトドライバ102は書き込み信号(〜W)が1から0に変化した時に、乱数モード信号(〜RN)が1であれば通常のメモリへの書き込み処理を行う。つまり、ライトドライバ102は、セレクタ105から送られてくるデータ線(D)に指定されたデータに基づいて、アドレス線(A)で選択されたMTJ素子に対して、書き込みパルスを流すことで、MTJ素子の状態を変化させてデータ線(D)に指定されたデータを記憶する。すなわち指定されたデータが0のときはMTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に確実に反転させる書き込みパルス(第3の電流)を流し、逆に、指定されたデータが1のときはMTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に確実に反転させる書き込みパルス(第4の電流)を流す。一方、ライトドライバ102は書き込み信号(〜W)が1から0に変化した時に、乱数モード信号(〜RN)が0であれば乱数発生処理を行う。つまり、ライトドライバ102は、セレクタ105から送られてくるレジスタ104の出力(現在のMTJ素子の記憶データの否定をとったものになっている)に基づいて、アドレス線(A)で選択されたMTJ素子に対して、その状態を確率的に反転させる乱数発生パルスを流すことで、MTJ素子の状態をランダムに変化させて新しい乱数を発生させる。なおセンスアンプ101、トライステートバッファ103は図16のセンスアンプ51、トライステートバッファ53と同一の機能を有する。
乱数モード信号(〜RN)が0であり書き込み信号(〜W)が0である状態は、本発明の乱数発生信号と書き込み信号との両方が受信された状態に相当する。また乱数モード信号(〜RN)が1であり書き込み信号(〜W)が0である状態は、本発明の書き込み信号が受信され乱数発生信号が受信されなかった状態に相当する。ライトドライバ102は乱数発生信号(ここでは乱数モード信号(〜RN)が0であり書き込み信号(〜W)が0である状態を示す)を受信する第1の受信手段、書き込み信号(ここでは乱数モード信号(〜RN)が1であり書き込み信号(〜W)が0である状態を示す)を受信する本発明の第3の受信手段を含む。セレクタ105は書き込みデータ(データ線(D)のデータ)を受信する本発明の第4の受信手段を含む。
これまでに説明した実施例では、乱数の発生と、乱数の読み出しを、別のタイミングで行うように実施しているが、乱数の発生と読み出しを同時に行うように実施することもできる。図31に、図13の乱数発生器を変形して、乱数の発生と読み出しを同時に行う乱数発生器の構成(第9の実施例)を示す。
図31の乱数発生器は、乱数の発生に用いるMTJ素子のアドレスを指定するアドレス線(図31ではA)、乱数の値の読み出しに用いるデータ線(図31ではD)、アドレス線(A)で指定したMTJ素子の状態を読み出してデータ線(D)に出力することとアドレス線(A)で指定したMTJ素子に新しい乱数値を生成することとを同時に指示する乱数発生信号(図31では〜W)の線との3種類の信号線で外部回路と接続される。アドレス線(A)は乱数発生器内の複数のMTJ素子が選択できるように、MTJ素子の数に合わせた複数ビットの信号線である。データ線(D)も、同時に読み出すことができる乱数値が1ビットの乱数発生器であれば1本の信号線であるが、同時に複数ビットの乱数値を読み出すことができる乱数発生器の場合には複数ビットの信号線である。データ線(D)が複数ビットの信号線である場合には、センスアンプやライトドライバも複数個用いて、複数ビットの信号を並列して扱う。
乱数発生器内部には、セルアレイ31、アドレスデコーダ32、センスアンプ111、ライトドライバ112、レジスタ113が備えられる。セルアレイ31は、乱数発生に用いる複数のMTJ素子を、複数本のワード線と複数本のビット線の交点上に配置した、アレイ構造を持つ。アドレスデコーダ32はアドレス線(A)に接続され、セルアレイ31のMTJ素子の中からアドレス線(A)で指定されたMTJ素子が乱数値の読み出しあるいは乱数発生の対象になるように、セルアレイ31のワード線と、必要に応じてビット線を制御する。センスアンプ111は、アドレス線(A)で選択されたMTJ素子に記録されている乱数値を読み出す。レジスタ113は、乱数発生信号(〜W)を受信するとセンスアンプ111から送られてくる乱数値を記憶する。レジスタ113の出力はデータ線(D)とライトドライバ112に接続されている。ライトドライバ112は、乱数発生信号(〜W)を受信すると、レジスタ113から送られてくる値に基づいて、MTJ素子に記憶している現在の乱数値を確率的に反転させる乱数発生パルスをアドレス線(A)で選択されたMTJ素子に流すことで、MTJ素子の状態をランダムに変化させて新しい乱数を発生させる。ライトドライバ112およびレジスタ113は乱数発生信号を受信する本発明の第1の受信手段を含む。
図32は図31の乱数発生器に乱数の発生と読み出しを指示する時の各信号線のタイミングチャートである。乱数発生器に接続した外部回路(例えばマイクロプロセッサなど)が乱数発生器に乱数の発生と読み出しを指示する場合は、アドレス線(A)に乱数の発生と読み出しを行いたいMTJ素子のアドレスを指定し、乱数発生信号(〜W)を1から0にして乱数発生器に乱数発生と読み出しを指示する。その結果、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して読み出し電流を流してセンスアンプ111で0/1の論理信号に変換し、その値をレジスタ113に記憶する。レジスタ113に記憶した現在のMTJ素子の値は、発生した乱数としてデータ線(D)に出力するとともに、ライトドライバ112に送られる。次に、乱数発生器のセルアレイ31の中のアドレス線(A)で指定されたMTJ素子に対して、ライトドライバ112が、レジスタ113から送られてきたMTJ素子の現在の状態を示すデータに基づいて乱数を発生させる。ライトドライバ112によるMTJ素子への乱数発生は、レジスタ113から送られてくる現在の乱数値が0であるMTJ素子に対しては、MTJ素子を低抵抗状態(論理値0に対応)から高抵抗状態(論理値1に対応)に確率的に反転させる方向の乱数発生電流のパルスを流し、逆に、レジスタ113から送られてくる現在の乱数値が1であるMTJ素子に対しては、MTJ素子を高抵抗状態(論理値1に対応)から低抵抗状態(論理値0に対応)に反転させる方向の乱数発生電流のパルスを流すことで行う。乱数発生信号(〜W)を0から1に戻すことで乱数発生処理を終了する。図31の構成では、データ線(D)への乱数値の出力は、次に乱数発生信号(〜W)によって乱数発生と読み出しを指示するまで保持される。
図31の乱数発生器は、乱数の発生と読み出しが指示されると、まずその時点のMTJ素子の状態を乱数値として出力し、その後、MTJ素子の状態をランダムに反転させることで、次の乱数を発生させている。そのため、乱数発生器に乱数の発生と読み出しを指示した時に読み出されるのは、前回の乱数の発生と読み出しの指示の時にMTJ素子に発生させておいて値である。また、乱数発生器に乱数の発生と読み出しを指示した時にMTJ素子に発生させた乱数は、次回の乱数の発生と読み出しの指示の時に読みだされる値である。このように実現することで、乱数の発生と読み出しの指示が来てから新しい乱数値を出力するまでの時間を短くすることができる。このような方式の変形として、乱数の発生と読み出しの指示が来ると、まず現在のMTJ素子の状態をランダムに反転させることで新しい乱数を発生し、次にMTJ素子の状態を読み出しで乱数値として出力するように実装しても良い。
これまで説明したいずれの乱数発生器においても、通常のメモリとしてMTJ素子へのデータ書き込みの時と、MTJ素子を乱数発生に用いる時とで、書き込み電流を変えるだけでなく、書き込みパルスの幅も変えるように実施することもできる。乱数発生時には、データ書き込み時よりも短い時間のパルスにすることで、電流の変化に対する反転確率の変化をよりなだらかにできるので、ばらつきをより小さくできる。
図10、図13、図16、図21、図25、図29、図30、図31の各実施例において、セルアレイの中のMTJ素子の数が少なく、すべてのMTJ素子に同時に読み出しや乱数生成ができる場合、つまりMTJ素子の数とデータ線(D)のビット幅が等しい場合には、アドレスでMTJ素子を選択する必要がないため、アドレス線(A)およびアドレスデコーダを省略して実装できる。
また、これまで説明した乱数発生器では、MTJ素子の記憶層と参照層の磁化の向きが電流(電子)の流れる向きと垂直な、水平磁化方式のMTJ素子を用いた実施例を示しているが、垂直磁化方式のMTJ素子を用いてもまったく同様に実施できる。
さらに、これまで説明した乱数発生器では、記憶層と参照層がトンネルバリア層を挟んだ基本的な構造のMTJ素子を用いた実施例を示しているが、さらに多層にすることでMTJ素子の特性を向上させることができることが知られており、そのようなMTJ素子を使った乱数発生器もまったく同様に実施できる。
なお、乱数を発生した後に、外乱によってMTJ素子の状態が変化してしまうことを防止するために、乱数を発生した時点で誤り訂正符号化してパリティビットを同時に記録しておくように実施しても良い。