(57)【要約】【課題】  完全なランダムパルスを自発的に発生するランダムパルス発生源を用いて、完全にランダムな信号を生成し認証信号や乱数及び確率を作成することができるデバイス／方法を提供する。【解決手段】  本発明に係るデバイスは、完全なランダムパルス発生源を内部に一体に取り付け、完全にランダムな信号を生成し認証信号や乱数及び確率を作成するよう構成し、また本発明に係る方法／プログラムは、上記ランダムパルス発生源を設けるとともに、発生したランダムパルスの時間間隔を計時しもしくは電圧値を測定し、ディジタル値に変換することで、乱数を発生し及び／又は確率を生成するよう構成する。【選択図】  図３
2006050577.tif 000002
【特許請求の範囲】
【請求項１】
原子核の崩壊に伴って放出されるα粒子、ベータ線あるいはα粒子と及びベータ線を放出する放出体と、放出されるα粒子等を検出する検出器とを含み、前記放出体を溶液とし、この溶液を前記検出器の検出面に滴下したことを特徴とするランダムパルス発生源。
【請求項２】
原子核の崩壊に伴って放出されるα粒子、ベータ線あるいはα粒子と及びベータ線を放出する放出体と、放出されるα粒子等を検出する検出器とを含み、前記放出体を溶液とし、この溶液を蒸着したまたはロール法などで盤状に加工された部材を、前記検出器と所定の距離を介して対向させたことを特徴とするランダムパルス発生源。
【請求項３】
α粒子等を放出する前記放出体として、ウラン系列の全ての核種、トリウム系列の全ての核種、これらの核種間の放射平衡を形成する210Pb-210Po等の全ての核種、244Ｃｍあるいは241Amを使用することを特徴とする請求項１または２のランダムパルス発生源。
【請求項４】
前記検出器がＰＮ型半導体、ＰＮＰ型半導体、ＰＩＮホトダイオード、ホトトランジスタまたはホトダイオードを含むことを特徴とする請求項１乃至３のいずれかに記載のランダムパルス発生源。
【請求項５】
更に前記放出体を遮蔽する遮蔽壁を有し、該遮蔽壁は、少なくとも、使用するα粒子等の飛程の距離を遮蔽することを特徴とする請求項１乃至４のいずれかに記載のランダムパルス発生源。
【請求項６】
自発的にランダムパルスを発生するランダムパルス発生源（以下ＲＰＧという）を設けるとともに、該ＲＰＧから発生したランダムパルスの時間間隔を計時しもしくは電圧値を測定し、ディジタル値に変換することで、乱数を発生し及び／又は確率を生成するように構成した半導体デバイス。
【請求項７】
前記ＲＰＧが、原子核の崩壊に伴って放出されるα粒子、ベータ線あるいはα粒子と及びベータ線（粒子）を放出する放出体を含むことを特徴とする請求項６に記載の半導体デバイス。
【請求項８】
α粒子等を放出する前記放出体として、ウラン系列の全ての核種、トリウム系列の全ての核種、これらの核種間の放射平衡を形成する210Pb-210Po等の全ての核種、244Ｃｍあるいは241Amを使用することを特徴とする請求項７に記載の半導体デバイス。
【請求項９】
前記ＲＰＧは、更に、放出されるα粒子等を検出する検出器を含み、前記放出体を溶液とし、この溶液を前記検出器の検出面に滴下し、あるいはこの溶液を蒸着しまたはロール法等で盤状に加工された部材を、前記検出器と所定の距離を介して対抗させたことを特徴とする請求項６乃至８のいずれかに記載の半導体デバイス。
【請求項１０】
前記検出器がＰＮ型半導体、ＰＮＰ型半導体、ＰＩＮホトダイオード、ホトトランジスタまたはホトダイオードを含むことを特徴とする請求項９に記載の半導体デバイス。
【請求項１１】
前記ＲＰＧが、更に前記放出体を遮蔽する遮蔽壁を有し、該遮蔽壁は、少なくとも、使用するα粒子等の飛程の距離を遮蔽することを特徴とする請求項６乃至１０のいずれかに記載の半導体デバイス。
【請求項１２】
前記ＲＰＧが、熱電子、ノイズまたはジッターを増幅してランダムパルスを発生させるように構成したことを特徴とする請求項６に記載の半導体デバイス。
【請求項１３】
前記ＲＰＧから発生するランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成することを特徴とする請求項６乃至１２のいずれかに記載の半導体デバイス。
【請求項１４】
前記ＲＰＧから発生されるパルスについて同じパルス間隔が発生する確率を示す指数分布から必要数の確率を求め、この確率を基に一様乱数を作成することを特徴とする請求項１３に記載の半導体デバイス。
【請求項１５】
前記指数分布を使用してｔ1とｔ2の時間間隔から確率を求めるとき、ｔ2時間を無限時間と仮定してｔ1時間を越えたときに所定の確率のパルスと認定することを特徴とする請求項１４に記載の半導体デバイス。
【請求項１６】
指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、パルスの平均放出率が変動しても同じ演算処理を行って、指数分布乱数、一様分布乱数の安定した出現確率密度分布を実現することを特徴とする請求項１３乃至１５に記載の半導体デバイス。
【請求項１７】
前記ＲＰＧから発生した乱数を認証信号またはアンチクローン信号として記憶し、外部から入力された信号を前記記憶された信号と比較認証することを特徴とする請求項６乃至１６のいずれかに記載の半導体デバイス。
【請求項１８】
更に、前記比較認証の度に、新たな乱数を認証データとして書き換えることを特徴とする請求項１７に記載の半導体デバイス。
【請求項１９】
更に、認証データの送受を行うことを特徴とする請求項１７または１８に記載の半導体デバイス。
【請求項２０】
前記認証データの送受は、無線通信、赤外線通信、または接触による回路接続方式による通信で行うことを特徴とする請求項１９に記載の半導体デバイス。
【請求項２１】
請求項１乃至５のいずれかに記載のランダムパルス発生源を組込んだＩＣカード、ＩＣタグ、ＰＣ接続可能な機器、機器組み込み型モジュール等。
【請求項２２】
請求項６乃至２０のいずれかに記載の半導体デバイスを組込んだＩＣカード、ＩＣタグ、ＰＣ接続可能な機器、機器組み込み型モジュール等。
【請求項２３】
指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、指数分布乱数の分布を安定させると共に、一様分布乱数の生成と確率の生成を同時に処理することを特徴とする請求項１６に記載の半導体デバイス。
【請求項２４】
指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、計時を行うマイコン等のハードウェアの発振周波数などの動作クロックの変動を自動補正することを特徴とする請求項１６に記載の半導体デバイス。
【請求項２５】
自発的にランダムパルスを発生するランダムパルス発生源（以下ＲＰＧという）を設けるステップと、該ＲＰＧから発生したランダムパルスの時間間隔を計時しもしくは電圧値を測定し、ディジタル値に変換するステップと、ディジタル値に変換したランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップとから成る、乱数及び／又は確率を生成する方法。
【請求項２６】
ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、ランダムパルスについて同じパルス間隔が発生する確率を示す指数分布から必要数の確率を求め、この確率を基に一様乱数を作成することを特徴とする請求項２５に記載の方法。
【請求項２７】
ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、前記指数分布を使用してｔ1とｔ2の時間間隔から確率を求めるとき、ｔ2時間を無限時間と仮定してｔ1時間を越えたときに所定の確率のパルスと認定することを特徴とする請求項２６に記載の方法。
【請求項２８】
ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、パルスの平均放出率が変動しても同じ演算処理を行って、指数分布乱数、一様分布乱数の安定した出現確率密度分布を実現することを特徴とする請求項２５乃至２７のいずれかに記載の方法。
【請求項２９】
ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、指数分布乱数の分布を安定させると共に、一様分布乱数の生成と確率の生成を同時に処理することを特徴とする請求項２５乃至２８に記載の方法。
【請求項３０】
ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、計時を行うマイコン等のハードウェアの発振周波数などの動作クロックの変動を自動補正することを特徴とする請求項２９に記載の方法。
【請求項３１】
乱数及び／又は確率を生成する方法をコンピュータを使用して実施するためのプログラムであって、当該方法は、自発的にランダムパルスを発生するランダムパルス発生源（以下ＲＰＧという）から発生したランダムパルスの時間間隔を計時しもしくは電圧値を測定し、ディジタル値に変換するステップと、ディジタル値に変換したランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップとから成ることを特徴とするプログラム。
【請求項３２】
ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、ランダムパルスについて同じパルス間隔が発生する確率を示す指数分布から必要数の確率を求め、この確率を基に一様乱数を作成することを特徴とする請求項３１に記載のプログラム。
【請求項３３】
前記指数分布を使用してｔ1とｔ2の時間間隔から確率を求めるとき、ｔ2時間を無限時間と仮定してｔ1時間を越えたときに所定の確率のパルスと認定することを特徴とする請求項３２に記載のプログラム。
【請求項３４】
指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、パルスの平均放出率が変動しても同じ演算処理を行って、指数分布乱数、一様分布乱数の安定した出現確率密度分布を実現することを特徴とする請求項３１乃至３３のいずれかに記載のプラグラム。
【請求項３５】
指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、指数分布乱数の分布を安定させると共に、一様分布乱数の生成と確率の生成を同時に処理することを特徴とする請求項３１乃至３４のいずれかに記載のプログラム。
【請求項３６】
指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、計時を行うマイコン等のハードウェアの発振周波数などの動作クロックの変動を自動補正することを特徴とする請求項３５に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は完全なランダムパルスを自発的に発生するα粒子放射体等を設けたランダムパルス発生源に関し、またこのようなランダムパルス発生源を内部に一体に取り付け、完全にランダムな信号を生成し認証信号や乱数及び確率を作成することのできる、ＩＣ等半導体デバイスに関し、またランダムパルスから乱数及び／又は確率を発生するための方法、プログラムに関する。
【背景技術】
【０００２】
セキュリティを向上させたＩＣタグとしては、例えば特許公開２００３−３３７９２８、特許公開２００３−１６３９６に開示されたものがある。前者は、端末装置との接続により電力を蓄電し、この電力によりＩＣ内部のＣＰＵによってワンタイム・パスワードを作成し、これをメモリに保持し、蓄電された電力が放電されると保持されたパスワードが消去する構成となっており、後者は、タグから２回以上認証データを読み取るとともに、認証データとして擬似ランダムな値を用いる構成となっている。
【０００３】
【特許文献１】特許公開２００３−３３７９２８
【特許文献２】特許公開２００３−１６３９６
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、これらのＩＣタグは、その認証用に使用されるＩＣに、完全にランダムな信号の発生器、またはそのような信号を生成する機能を内蔵していない。この種の認証用ＩＣでは記憶回路が組み込まれており、認証データは無線通信や赤外線通信で外部から送信された信号を受信し、あるいはＩＣチップ内で作成し、その記憶回路に書き込んでいる。そして、受信側のＩＣチップに記憶していたデータは外部から読み出すことが可能であって、機密性が弱くセキュリティ上問題があった。また、ＩＣの区別のため乱数データを使用する場合は、送信側でプログラムにより作成する擬似乱数であることが多く、送信側の機密の保持が不可欠であり、また乱数データから規則性を推測できる脆弱性があり、更に組み合わせ数も限界があって、複数の同じ識別番号が混在することが懸念されていた。また、このようなＩＣタグを追跡用に使用する場合、個人情報が追跡側に蓄積する等の問題が生じ、普及の阻害要因となっていた。
【０００５】
また、電子錠のような認証装置において、相手を認証するために使用される従来のＩＣは、チップ自身に認証信号生成機能が組み込まれていなかった。アンチクローン（偽造防止）のために、無線や赤外通信で外部から認証信号を送り、この認証データをチップ内の記憶素子に記憶させ、送信元の記憶したデータと一致した時に正式な相手側として認識していた。従って、記憶したデータをそっくりコピーした場合は、送信元では真偽の判定が出来ない。そこで、前述のＩＣタグの場合と同様に、セキュリティ上問題があった。
【０００６】
また熱雑音やノイズを使用した乱数発生器が組み込まれたＩＣもあるが、熱雑音やノイズは熱や電磁波などの環境変化に影響される為、完全にランダムな信号ではなく、擬似乱数の取扱いをしなければならず、信頼性に限界があった。また雑音を使用する方式では、それを元に作成された乱数は現象論的に乱雑であるが、乱数自身の性能に関しては各種評価方法に基づくもの以外、理論的な裏付けもない。
【課題を解決するための手段】
【０００７】
本発明は、上述した従来の問題点を解消するために開発されたものである。
本発明に係るランダムパルス発生器（発生源）（以下ＲＰＧという）は、原子核の崩壊に伴って放出されるα粒子、ベータ線あるいはα粒子と及びベータ線を放出する放出体と、放出されるα粒子等を検出する検出器とを含み、前記放出体を溶液とし、この溶液を前記検出器の検出面に滴下するように構成する。
【０００８】
本発明に係るＲＰＧは、また、原子核の崩壊に伴って放出されるα粒子、ベータ線あるいはα粒子と及びベータ線を放出する放出体と、放出されるα粒子等を検出する検出器とを含み、前記放出体を溶液とし、この溶液を蒸着しまたはロール法などで盤状に加工された部材を、前記検出器と所定の距離を介して対向させるよう構成する。
【０００９】
また、本発明にかかる、ＩＣを含む半導体デバイスは、自発的にランダムパルスを発生するランダムパルス発生源を設けるとともに、該ＲＰＧから発生したランダムパルスの時間間隔を計時しもしくは電圧値を測定し、ディジタル値に変換することで、乱数を発生し及び／又は確率を生成するように構成する。
【００１０】
例えば、本発明を認証装置に適用する場合、自然崩壊で無限に放出されるα粒子放出源をもつランダムパルス発生器（ＲＰＧ）をＩＣ本体内部に組み込み、ＲＰＧからの完全ランダムな信号を得て、この信号を認証信号として利用する。即ち、ＩＣチップ自身が常時認証信号を発生して、認証の度に新しい認証データに書き換え、コピーが意味をなさないようにする。このとき、ほぼ無限の認証信号の組み合わせが、プログラムを使用せずに可能となり、ＩＣチップ製造側での認証データの管理を不要とし、ＩＣチップを有する使用者側では、完全なセキュリティを確立することができる。
更に、詳細は後述するが、本発明では、ＩＣチップ内で、ＲＰＧの信号から完全な乱数及び確率を容易に作成することができるから、そのようなＩＣを提供することにより、乱数及び確率の利用を容易にさせる。
【００１１】
本発明に係る乱数及び／又は確率を生成する方法／プログラムは、ＲＰＧを設けるステップと、該ＲＰＧから発生したランダムパルスの時間間隔を計時しもしくは電圧値を測定し、ディジタル値に変換するステップと、ディジタル値に変換したランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップとから成る。
【００１２】
上記方法において、ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、ランダムパルスについて同じパルス間隔が発生する確率を示す指数分布から必要数の確率を求め、この確率を基に一様乱数を作成する。
【００１３】
また、ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、前記指数分布を使用してｔ1とｔ2の時間間隔から確率を求めるとき、ｔ2時間を無限時間と仮定してｔ1時間を越えたときに所定の確率のパルスと認定する。
【００１４】
また、ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、パルスの平均放出率が変動しても同じ演算処理を行って、指数分布乱数、一様分布乱数の安定した出現確率密度分布を実現する。
【００１５】
また、ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、指数分布乱数の分布を安定させると共に、一様分布乱数の生成と確率の生成を同時に処理する。
【００１６】
ランダムパルスから、所定のビット長の指数分布の乱数、一様乱数を発生し、及び／又は確率を生成するステップは、指数分布から乱数を作成するときに、計測の基本周期を変動させることにより、計時を行うマイコン等のハードウェアの発振周波数などの動作クロックの変動を自動補正する。
【発明の効果】
【００１７】
本発明は環境条件に全く作用されず、かつ人的コントロールが一切出来ないオリジナルな信号発生源をＩＣ本体に組み込み、ＩＣ自身が発生するランダム信号を認証信号や乱数及び確率作成の源信号として使用する。これにより、人為的操作が不可能で安全性が確立した認証システムが構築できる。
【００１８】
また認証システムの供給側でデータの保存が必要なく、コスト面の大幅な削減が出来る。本発明で生成される一様乱数は完全な乱数の取扱いが出来、また人的な不正が不可能な確率発生器として使用できる。
【発明を実施するための最良の形態】
【００１９】
具体的な説明には、無線タグの機能を付加したＲＰＧ−ＲＦＩＤ（Radio Frequency Identification）チップを例に取り説明する。ただし、本発明はこれに限定されず、他の認証信号や、乱数、確率を生成するＩＣ等の半導体デバイスに適用できることは勿論である
【００２０】
また、本発明は、以下に説明するランダムパルス発生源（ＲＰＧ）を組込んだＩＣカード、ＩＣタグ、ＰＣ接続可能な機器、機器組み込み型モジュール等に適用することも、またこのようなＲＰＧを設けるとともに、該ＲＰＧから発生したランダムパルスの時間間隔を計時しもしくは電圧値を測定し、ディジタル値に変換することで、乱数を発生し及び／又は確率を生成するように構成した半導体デバイスを組込んだＩＣカード、ＩＣタグ、ＰＣ接続可能な機器、機器組み込み型モジュール等に適用することも可能である。
【００２１】
本発明に係るＩＣタグは以下の構造から成る。完全なランダムなパルスを発生させるＲＰＧ（ランダムパルス発生器）は、本発明者の取得した特許第２９２６５３９号に記載されているα粒子を利用したパルス発生装置を改良して使用する。α粒子放出体は自然崩壊する241Am、244Cm、210Pb-210Po、210Po等を使用する。より具体的には、ウラン系列の全ての核種、トリウム系列の全ての核種、これらの核種間の放射平衡を形成する210Pb-210Po等の全ての核種、244Ｃｍあるいは241Amを使用することができる。なお、ＩＣタグの使用先に遮蔽設置スペースがある部位に使用するＩＣタグであればベータ線やガンマ線を使用しランダムパルスを発生するＲＰＧでも良い。
【００２２】
α粒子やベータ線、ガンマ線は、温度、圧力、湿度や電磁波など環境に影響されないため、人為的な操作が出来ない。この特質ＩＣは他の方法では実現出来ず安全が確保する上で重要な要素である。完全な安全性が要求されない部位に使用するＩＣタグであれば熱雑音や半導体のジッターなどをランダムパルスの発生源とするＲＰＧを使用することができるであろう。
【００２３】
ＩＣタグのＲＰＧ−ＲＦＩＤチップは、ＲＰＧとＲＰＧから送出されるランダムパルスを認証信号として使用できるようにするための電子回路、認証信号を記憶するための回路、記憶素子、通信の形態に応じた認証信号を相手側に送出するための回路、アンテナ及び通信素子などが組み込まれる。電源は、ＲＰＧ−ＲＦＩＤチップの場合はアンテナからＲＦエネルギーを供給されるが、設置スペースがある場合は端子を設けて供給しても良い。
【００２４】
ＲＰＧ−ＲＦＩＤチップの認証手順は、まずＲＰＧ−ＲＦＩＤチップの自身の認証信号として内蔵されたＲＰＧからのランダム信号（発生時間とパルスの時間間隔）を内部の記憶素子に書き込む。またこの記憶する信号を外部からＲＰＧ−ＲＦＩＤチップとの通信手段を使用して、または直接接触による接続によって取り出して確認し、同一ロットに同じ認証信号の組み合わせが無いことを確認する。
【００２５】
出荷するＲＰＧ−ＲＦＩＤチップを特定の物品管理に使用する場合で、出荷時から移動情報などの管理において配布範囲が比較的限定されている場合には、出荷時にＲＰＧ−ＲＦＩＤチップ個々の認証信号を通信により読みだして保存して利用する。
この認証手順と認証データ保存を通信のたびに行い、認証データをＲＰＧ−ＲＦＩＤチップ自身で発生するランダム信号で置き換える。
【００２６】
以下、図面を参照して本発明のランダムパルス発生器（ＲＰＧ）付ＲＰＧ−ＲＦＩＤチップの実施形態に付いて詳細に説明する。
【００２７】
まず自発的にランダムパルスを発生するランダムパルス発生器（ＲＰＧ）について説明する。
ＲＰＧは、図１に示すようなＲＰＧ-ＲＦＩＤチップの中央部位に、α粒子放射体と、ＰＮ型半導体、ＰＮＰ型半導体、ＰＩＮホトダイオード、ホトトランジスタあるいはホトダイオード等によって構成されている。このパルス発生器の素子は、ＲＰＧ−ＲＦＩＤチップが要求される安全度に応じて選択される。なお、図１において、１０はα粒子放射体及び検出器の取り付け部位を示し、１００は基体（シリコン・ベース）を示す。
【００２８】
α粒子放射体が取り付けられたＲＰＧ−ＲＦＩＤチップのα粒子検出器周辺の構造を図２に示す。α粒子放射体から放出されるα粒子（He原子）の放出は温度、圧力、電磁波など環境に全く影響されず、電源も不要で自発的に半減期に応じて半永久的に放出される。つまりこの方式では認証に使用する原信号は人為的操作が全く出来ない信号源を使用することが出来ることが特徴である。よって外部からは一切変更が出来ない信号発生源となる。なお、このＩＣにおける取付け部位が完全な安全性を要求されない場合は、パルス発生器にノイズを発生させるためのダイオード等を使用しても良い。図２において、１１は、蒸着され、あるいは滴下されるなどしたα粒子放射体、１２は検出器を示す。
【００２９】
α粒子放射体をＩＣ内部に組み込む方法は、α粒子放射体が蒸着された或はロール法で製造され円盤状に加工された製品を使用する方法と、α粒子放射体の溶液を滴下する（インクジェット方式による噴射も含む）方法とがある。
【００３０】
円盤状に加工されたα粒子放射体を組み込む方法は、α粒子検出ダイオードの直上に取り付ける。取付け方法としては、検出ダイオードとα粒子放射体との距離が所定の距離となるようスペーサを取付けその上に載せる方法と、封止板に接着して取り付ける方法とがある。取付けた構造を図３に示す。この図において、１１はα粒子放射体、１２は検出器、１３は封止材、１４は、放射体と検出器との距離を設定するためのスペーサである。
【００３１】
α粒子放射体の溶液を滴下して検出器を構成する場合は次のようにする。（図４Ａ乃至４Ｃ参照）
【００３２】
まずは滴下する検出器の周囲を含めた容積を計算し、外部へ流失しない体積を求める。滴下する溶液量はこの容積と同じ体積とする。α粒子放射体の濃度は、所定のパルス数となるように滴下量に含まれるα粒子放射体の原子数を求め、その濃度となるよう滴下前に濃度の調整をする。
【００３３】
マイクロシリンジ２０等の滴下ジグに必要量を吸引し、前もって決定しておいた滴下量のα粒子放射体の溶液１１‘を押し出して検出器１２の表面に滴下する（図４Ａ参照）。滴下した後は、エポキシの封止材１５で密封し（図４Ｂ参照）、あるいは封止用のディスク１６等で密封となるように封止する（図４Ｃ参照）。インクジェット方式を使用して溶液の噴射により滴下する場合も同様な手順となる。
【００３４】
α粒子放射体と回路部との距離（図１及び図２の距離ｄ）は、α粒子による誤作動を防止するため以下に示す式で求められるα粒子の飛程より大きく取る。α粒子の空気中での飛程は一般に図７に示すようになる。横軸はα粒子放射体と検出器間の距離、縦軸は計数値（任意単位）である。α粒子放出体に210Ｐｂ-210Ｐｏを使用した時の計算を以下に示す。
【００３５】
α粒子のエネルギーＥ（ＭｅＶ）と空気中の飛程Ｒ（ｃｍ）の関係はよく調べらており、ガイガーの式で表される。
Ｅ＝2.12Ｒ2/3        （4＜Ｅ＜7）
Ｒ＝0.323Ｅ3/2       （3＜Ｒ＜7）
よって、空気中でのＰｏα粒子の飛程は
【数１】
2006050577.tif 000003
【００３６】
固体物質中のα粒子の飛程Ｒｓ（ｃｍ）は、空気中の飛程が既知であれば次のブラッグ・クレーマンの式で求められる。
【数２】
2006050577.tif 000004
Ａ：固体物質の原子量
ρ：密度
Ｓｉ中におけるα粒子の飛程は、
【数３】
2006050577.tif 000005
よって、回路と分離する為にＳｉの遮蔽材（遮蔽壁）を用いる場合は２９μｍ以上とすれば良いことになる。
【００３７】
また210Ｐｂ-210Ｐｏは、極微弱のベータ線を放出する。ベータ線は、α粒子と違い図８に示すように指数関数的に距離と共に到達電子数が減少する。ベータ線は電子そのものであり内部ＩＣ回路には全く影響を及ぼさないが、不要な誤解を招かない為にも外部へ漏れない構造とする。必要な遮蔽材の厚さは下記式で求められる。なお、図８において、横軸はＡｌの厚さを、また縦軸は電子数を示す。
Pb-210ベータ線の最大エネルギーＥｍは0.061MeVであるからWillsonの式より最大飛程Ｒｍを計算する。
Ｒｍ＝2400(Em)2＝2400×(0.061)2＝2400×0.003721＝8.9304mg/cm2
【００３８】
また、アイソトープ便覧（改訂３版、丸善、1985年4月）図から60ＫｅＶでは、Ａｌ中の飛程は6ｍｇ/ｃｍ2である。Alの密度は2.7ｇ/ｃｍ3であるから、
【数４】
2006050577.tif 000006
よって、ＲＰＧ−ＲＦＩＤチップに必要な図１に示す封止材は33μｍ以上あれば良いことになる。
【００３９】
ところで、本発明はＲＰＧ−ＲＦＩＤチップばかりでなく一般のＩＣにも容易に組み込むことが出来る。図５Ａ及び５ＢにＤＩＰ型のＩＣに組み込む場合の配置図を示す。α粒子放射体を組み込む位置は同図のように中央にする必要も無く、ＩＣ回路の設計に応じて変更可能である。（MMチップにおいても同様である）図示において、３０はα放射体の取り付け部を、３１は封止用キャップまたはピッチを、また３２はα放射体を滴下したダイオードチップを示す。
【００４０】
本発明に係るＲＰＧ−ＲＦＩＤチップの一例について、その全体のブロック回路を図6に示す。ＲＰＧ−ＲＦＩＤチップはＲＰＧ４０、波形整形増幅回路４１、ロジック回路(制御演算)４２、記憶回路４３、ＲＦ回路４４及びアンテナ４５から構成される。
波形整形増幅回路４１は、ＲＰＧ４０から出力される尖頭波形を、ディジタル処理が可能な整形された矩形波とするためのものである。ロジック回路４２は、ランダムパルス信号を目的とする信号として取り扱うための処理回路である。記憶回路４３は信号処理後のデータを記憶する回路である。ＲＦ回路４４は外部とのアンテナ４５を介して通信を行うための回路である。
【００４１】
ＲＰＧからの信号を数値化して記憶する方法としては、図９に示したように、ＲＰＧのランダムパルスは、波高値とパルス間隔がランダムであるので、パルス間隔を計測し又は波高値の電圧をサンプル＆ホールドしてディジタル変換し、その測定値又は変換値を乱数値とすることもできる。また電圧、クロックパルス数の組み合わせを用いる事も出来る。
【００４２】
次に、ＲＰＧで生成されるパルスを認証信号として使用した場合、全く同じパルス間隔が発生する確率を求める。
【００４３】
計算例として通常使用されるパルスの平均放出率ｎ＝10個の場合で求めてみる。
パルス間隔の確率は次の式で求められる。
【数５】
2006050577.tif 000007
【００４４】
ＲＰＧの平均放出率ｎ＝10の時、認証信号として１sec間の平均個数１０個のパルスを使用するとする。
【表１】
2006050577.tif 000008
１０個のパルス間隔が平均のパルス間隔0.1secで出現したとすると、同じ時間間隔で１０個のパルスが次に出現する確率としては、次の表の計算結果となる。
【００４５】
【表２】
2006050577.tif 000009
上記表の計算結果から同じパルス間隔のパルス列10個が出現する確率は、１/2.97E＋21となる。
【００４６】
よって、本方式を用いる方法では、高々１０個のパルスで同じ組み合わせとなる確率は１／2.97E+21以下が実現できる。この確率は、同一のパルス発生器での確率であり、個々のパルス発生器はそれぞれｎ値が異なっている。よって、別々のパルス発生器同士が同じパルス列となる確率は（1/3E+21）2以下となる。
【００４７】
認証用に本方式を使用するＩＣの使用目的に応じて、使用するパルス数を選択し安全性を向上させる事ができる。
【００４８】
次に一様乱数の作成方法について記載する。
時間間隔ｔ1からｔ2に出現するパルスの確率は前記（1）式で求められる。
この式を変形し、
t2＝−1/n＊log(e-nt1−p)      -----------（2）
【００４９】
ここで、t2＞t1であるので、上記式をtk＝t2、tk-1＝t1と置き換え、t0＝0から順次t1、t2、・・・・を求めることにより、1/p通りの一様な出現確率を持つ時間幅（Δｔ）の閾値を求めることができる。
【００５０】
tk+1＝−1/n＊log  (  e-ntk−p)-----------（3）    但し  t0＝0
この（3）式においては、ｎとｐを固定することにより、各tk値は一義的に決定できる。パルス間隔時間測定を１６ビット長（0-65535）で行う場合、変換後の有効桁数を考えると、上記閾値により置き換えるデータ長は８ビット長程度にしないと、短い時間間隔において誤差の影響を無視できなくなる。従って、上記ｐを256に設定し、0-65535（１６ビット長）の区間を上記閾値により0-255（８ビット長）区間に変換することにする。ビット長として１６ビットが求められる場合、２個の８ビット長データを繋ぎ合わせることで生成できる。
【００５１】
この方法においてはｎ値が大きくなれば、出現時間間隔は相対的に小さくなり、時間間隔測定分解能を一定とした場合誤差が問題になる。逆にｎ値が小さくなると相対的に時間間隔は大きくなり、時間間隔測定分解能を一定とした場合上位数値において丸め誤差（オーバーフロー）が発生する。
【００５２】
そこで、ｎ値の変動に関しては、時間計測の基本周期を変動させることで対応することにする。つまり計測されたｎ値が小さい場合には計測の基本周期を大きく、一方ｎ値が大きい場合、計測の基本周期を小さくすることで、計測結果としての数値データの分布は常に一定になり、その後の演算処理回路の簡略化を行うことが出来る。また、時間計測の基本周期の変動は単位時間当たりの平均放出数にのみ依存するので、処理能力の観点で演算回路の動作スピードが間に合う範囲内で演算回路の基準動作周波数の変動も補正される。従って、演算回路のクロックを生成する発振回路の周波数の精度も要求されない。具体的には、
tk+1＝−1/n ＊log(e-ntk−p)  ---------（4）    但し  t0＝0
の式で、ｎの変動成分をｍとし、n=n×ｍとすると、
tk+1＝−1/nm＊log(e-nmtk−p)----------（5）    但し  t0＝0
となる。ここで、計測時間の基本周期をｍに応じて変動させる（tk＝tl/m）ことで
tl+1＝−1/n ＊log(e-ntl−p)  ---------（6）    但し  t0＝0
となり、基本演算式がそのまま適用できる。
【００５３】
演算回路で使用する動作周波数を２５MHｚ程度とすると、基本サイクルクロックは４０ｎSであり、仮にｎ値を１０とすると平均のパルス間隔は１００ｍS、それを計測基本周期を１００μSとして計測すると考えると、計測基本周期を作り出す分周数は１００μS／４０ｎS＝２５００カウントとなる。従って上記変動値ｍの最小値（分解能）は、0.4/100=0.004（０．４％）となり、ｎ値の変動に対する計測基準時間の変動の分解能は問題ない。
【００５４】
この方式で２５６値を得るために必要な測定時間はｎが小さいほど大きくなる、たとえば、n＝4の場合の２５５番目の閾値は1.386秒、n＝3のときは1.848秒、n＝2のときは2.773秒となり、最大この時間まではカウントしなければならない。それ以上の時間幅は時間計測データの最大値（65535）に丸め込むことができる。（丸め込んでも最大データ255の出現頻度は変わらない）従って、計測のmax値はｎ値により変動することになる。
次に確率の作成方法を記載する。
【００５５】
自然崩壊を使用した確率は、（1）式で求めることが出来る。（1）式は
p ＝ e-nt1−e-nt2  ---------------（7）
であるから、発生すべき確率値を満たすt1とt2を定め、その間にパルスが入っているか否かを判定すれば良い。ここでt2を無限大とすると、２項目のe-nt2は0となり無視でき、計測された時間幅をt1と比較することで当りの判定が出来る。t2を無限大とすることで、e-ntの出現頻度が小さい領域を使用することになるため、分解能は広く取ることが出来る。従って、確率計算時の丸め誤差も最小にすることが出来る。
【００５６】
t2を無限大としたときの式
p ＝ e-nt1  ------------------------（8）
の両辺に対し対数をとり、t1を求めると
t1＝−log(p)/n --------------------（9）
となり、t1の値は設定確率値（p）と一秒あたりのパルス数（n）から求めることが出来る。
【００５７】
この場合でもｎ値の変動により、必要とされる計測時間が変動し、特に確率値が小さい場合、長時間の計測を有効にしておく必要がある。そこで、前記一様乱数の演算と同様に測定の基本周期を変動させることにより、カウンタのオーバーフローや精度不足の問題を解決できる。但し、この方法においては、非常に微小な確率値まで対応できるが、確率値が小さい場合、計測のmax値は大きくなり計測時間が長くなる場合が発生する。しかし、演算回路部に過去の計測値を記憶しておく機構を設けることにより、レスポンス時間の問題は回避できる。
【００５８】
上記の（9）式、t1＝−log(p)/nは、外部より確率値の設定が行われたときに演算しておけば良く、計測時には演算は発生しない。従って、演算時間が多少かかっても実動作に及ぼす影響は非常に小さい。設定確率値に柔軟に対処し、さまざまな確率値を外部からの入力により選定できるようにするために、上記の対数演算は計算を省略する為のテーブルを使用せず、マイコンで計算させることが出来る。
【００５９】
次に、基本周期を変動させる為のｎ値に対する基準計測時間の設定について記載する。
ｐ＝ｅ-nt1−ｅ-nt2  ---------------------（7）
において、t0を0とし、閾値の最大値（255）の時間間隔は
ｐ＝255/256＝１−ｅ-nt255
より、
t255＝−(1/n)＊log(1/256)＝5.545177/n  ------------（10）
で求めることが出来る。
【００６０】
多少余裕をみて、上記２５５番目の閾値＋５％を１６ビットタイマがオーバーフローする時間と設定することにすると１６ビットタイマでカウントできる最大時間間隔は
tmax＝5.545177＊1.05/n＝5.822436/n  ---------------（11）
となり、これよりタイマのカウント基準クロックの周期は
tclk＝(5.822436/65536)/n＝88.84333μS/n となる。
演算回路の基本動作周波数を25MHzとすると、システムクロックの周期は
tsys＝40 nS
であり、上記タイマの基準クロックtclkを作り出すためのプリスケーラの値は、
tpres＝(88843.33/40.816)/n＝2176.7/n となる。
【００６１】
上記のように、ｎの値に応じてタイマのカウント基準周期を変動させることにより、一様乱数生成のための閾値を求めるには（4）式を使用すればよく
tk+1＝−1/n＊log(e-ntk−p)    但し  t0＝0
上式において、n=5.822436の場合の各tkを計算すると、１から２５５までの閾値が算出でき、下記の表のようになる。
【００６２】
【表３−１】
2006050577.tif 000010
【００６３】
【表３−２】
2006050577.tif 000011
この表のデータを閾値として、計測データがどの閾値間に入るかを求めれば、その結果が８ビット長の一様乱数となる。
【００６４】
計測データがどの閾値間にはいるかを求める方法としては２通りの方法がある。ひとつは計測完了後に二分探索により大小比較を行う方法。もうひとつは計測の過程で、現在の計測値がどのエリアに入っているかをチェックする方法である。それぞれについて以下に示す。
【００６５】
二分探索法
今回の変換は計測データ１６ビット、変換後のデータが８ビット長となるので二分探索には絶好の条件であり、プログラムは非常に簡略化できる。以下に本案件に特化したアルゴリズムの例を示す。
BitIndicator＝10000000b;
Result＝BitIndicator;
Repeat
If MeasuredValue＜DataTable(Result) then Result＝Result xor BitIndicator;  
BitIndicator＝RightLotate(BitIndicator, 1bit);
Result＝Result xor BitIndicator;
Until BitIndicator. bit7＝“1”;
この変換では、１６ビット長の比較とビット処理（xor）、及びデータテーブルの参照を８回行う。
【００６６】
計測過程での判定
上記の閾値テーブルは、０から２５５の順番で数値が大きくなっている。そのため、パルス間隔を計測するごとに、データテーブルとの比較を行うことにより、処理は非常に単純化され、また、計測完了時（次パルス）が来た時点で一様乱数化の変換は完了していることになり、レスポンスも非常に良くなる。上述の二分探索を用いる方法のように、ある一定時間を演算処理に拘束されることもない。演算処理にマイコンなどを使用する場合には有効に働く可能性がある。具体的なアルゴリズムは以下のようになる。
この方式の場合、上記テーブルの1-255のデータは0-254に格納されている事とする。
＜初期処理＞
Result＝０;    テーブルの先頭
＜プリスケーラオーバーフロー毎に＞
if MeasuredValue＝DataTable(Result) then Result＝Result＋１;
このように極めて、単純なやり方であり、閾値の検索処理が分散して行われるため、演算処理部の処理能力に対する負荷も非常に小さい。
【００６７】
次に、本発明に係る一様乱数及び確率を発生するデバイス／方法における処理手順の一例を、より詳細に説明する。
【００６８】
ここで説明する方法は、通常（スタンドアロン）・モード、デモ・モード及びマルチモジュール・モードの３つのモードを有し、以下の特徴を持つ。
【００６９】
通常モードは、ホストと１対１で接続するモードで、パルスの計測ごとに指数分布乱数列及び一様乱数列を出力し、確率判例読み出しコマンドの入力に応じ確率判定結果を出力する。デモ・モードは、デモ用に用意されたモードで、パルスの計測ごとに指数分布乱数列、一様分布乱数列、確率判定結果を出力する。マルチ・モードは複数個のモジュールの接続が可能で、乱数の生成速度を早くすることができ、指数分布乱数列、一様分布乱数列、確率判定結果は、それぞれコマンド入力に応じて出力される。
【００７０】
図１０Ａ乃至１０Ｃは、本発明のデバイス／方法を、マイコンを使用して処理する場合の動作（アルゴリズム）の一例を示すフロー・チャートである。
【００７１】
まず、図１０Ａに示すように、ＲＡＭのクリア、各種レジスタの初期設定、フラッシュ・メモリのデフォルト値の呼び出し等の初期化作業を行い、メイン・ルーチンに飛ぶ。
【００７２】
メイン・ルーチンでは、まず、処理されていない新規計測時間データが在るか否か調べる（ステップＳ１１０）、在れば、マルチ・モードでないことを条件に（ステップＳ１２０）、そのデータを呼び出す（Ｓ１３０）。次いで、パルス間時間（パルス時間間隔、パルス・インターバル）計測用タイマのプリスケーラ値を設定し（ステップＳ１４０）、タイマをクリアする(ステップＳ１５０)。ＲＰＧパルスを検知すると(ステップＳ１６０)そのタイマをスタートさせ（ステップＳ１７０）、ＲＰＧパルスを検知する毎に（ステップＳ１８０）、タイマから計測値を出力し（ステップＳ１９０）、指数分布乱数値として格納する（ステップＳ２００）。次いで、一様分布乱数に変換し（ステップＳ２１０）、確率（あたり・はずれ）の判断を行う（ステップＳ２２０）。次いで動作モードがデモ・モードか否か判断し（ステップＳ２３０）、デモ・モードであれば、無条件で（乱数出力の選択の有無にかわわらず）指数分布乱数をホストに送信し（ステップＳ２６０）、かつ一様分布乱数を送信し（ステップＳ２７０）、また確率判定値を送信する（ステップ２８０）。
【００７３】
デモ・モードでないとき（即ち、通常モードのとき）、指数分布乱数の出力が選択されているとき（ステップＳ２４０）に送信し、また一様分布乱数の出力が選択されているとき（ステップＳ２５０）に送信する。
【００７４】
一方ＣＰＳ値（パルス数）の計測は、図１０Ｂに示すように、まず、デフォルト値が設定され(ステップＳ３１０)、ＲＰＧパルスを検知すると(ステップＳ３２０)、ＣＰＳ計測時間設定用タイマを初期化し（ステップＳ３３０）、計測時間を設定する（ステップＳ３４０）。次いで、パルス数カウンタをクリアし（ステップＳ３５０）、ＲＰＧを検知する毎に（ステップＳ３６０）、その計測値を積算する（ステップＳ３７０）。これは設定計測時間（例えば６４秒、１時間等）になるまで繰り返される。計測設定時間になると（ステップＳ３８０）、設定計測時間のＣＰＳ値を計算し（ステップＳ３９０）、またパルス時間間隔（パルス・インターバル）計測用基準時間を算出する（ステップＳ４００）。次いで新ＣＰＳデータをフラッシュ・メモリに書き込み（ステップＳ４１０）、計測を再開始する（ステップＳ４２０）。
【００７５】
なお、図１０Ａ及び図１０Ｂに示した計測処理は、同時並行で行われ、またパルス間時間（パルス・インターバル）の計測は、全パルス間で行われる。
【００７６】
本発明の実施例では、図１０Ｃに示す如く、シリアルデータ（コマンド）を受信すると（ステップＳ５００）、新データがあるときのみ、コマンド処理ルーチンを起動させている（ステップＳ５１０）。
【００７７】
コマンド処理ルーチンは、後述する処理手順（アルゴリズム）の詳細を記載したプログラムに記載するように、動作条件設定コマンドの処理、内部ステータス読み出しコマンドの処理、確率設定コマンドの処理、動作モードコマンドの処理、モジュールアドレスと指定アドレスの比較処理等が行われる。
【００７８】
以下に示すプログラムは、本発明に係る一様乱数及び確率を発生する方法をマイコンを使用して処理する場合の、マイコン内部の処理アルゴリズムを記載したものである。
【００７９】
＜マイコン内部の処理アルゴリズム＞
マイクロコンピュータ：  C8051F330
動作周波数：  ２４．５MHｚ
システム・クロック：  １／１
１．ポート割当て、割込み機能
P0.0 :  パルス入力
P0.4 :  シリアル出力
P0.5 :  シリアル入力
P1.3 :  LED出力
外部割込み０  ：  パルスの入力検知
タイマ１      ：  UARTの転送レート生成
タイマ２      ：  パルス間時間計測に使用
：  CPSによってプリスケーラ値を変更
タイマ３      ：  一定時間（CPS計測時間）作成用
シリアル割込み：  データ受信で使用
【００８０】
２．タイマ
タイマ０：  Not used
タイマ１：  ＲＳ２３２Ｃの Baud Rate Generator
Timer1 Condition {
pre-scale = 1/1
8 bit Reload Mode
Reload Value = 96h
｝
タイマ２：  パルスカウント用プリスケーラ
Timer2 Condition ｛
16 bit Reload Mode
pre-scale = 1/1
Reload Value = tpres
｝
タイマ３：  CPSカウント用タイマ
Timer3 Condition ｛
16 bit Reload mode
Pre-scale = 1/12
Reload Value = 40833 ; Overflow = 20 mS
｝
ＰＣＡ：    (1)Watch Dog Timer
【００８１】
３．メモリ
SerialBuffer(0..15) as M[8]; シリアル受信バッファ
IntervalTime(0..3) as M[17]; パルス計測時間内部格納バッファ
SerialWPointer as M[8]; 割込み処理ルーチンでシリアル受信データを受信バッ
ファに書き込む際に、書き込み位置を示すポインタ。
SerialRPointer as M[8]; メインルーチンでシリアル受信バッファ内の次に処理
すべきシリアルデータの位置を示すポインタ。
IntervalWPointer as M[8];割込み処理ルーチンでパルス計測時間を次に書き込
む位置を示すポインタ。
IntervalRPointer as M[8];メインルーチンで次に処理すべきパルス計測時間の
バッファ内の位置を示すポインタ。
IntervalCounter as M[17]; 割込み処理ルーチン内でパルス時間間隔をカウント
するカウンタ。
CPSSecCounter as M[8];  1秒カウント  （２５回×２０ｍS）
CPSTimeCounter as M[8]; 64秒カウント
CPSCounter as M[16];    CPS値カウンタ
CPS as M[16];           CPS値
Prob(0..7) as M[16];    確率設定値
PValue(0..7) as M[16];  確率対数演算後の閾値
PSetting as M[16];      確率設定入力値
PArg as M[8];           確率設定引数
BEXP as M[8];           対数計算時の被演算値の指数部
CycleCounter as M[8];   演算部で使用、繰り返し回数のカウンタ
BitIndicator as M[8];   除算演算で使用
NOPTimeCount as M[8];   １時間当たりのパルス数計測カウンタ
RandomEXP as M[24];     指数分布乱数値の最終結果
UniformedData as M[8];  一様分布乱数地の最終結果
CPSForceData as M[16];  CPS強制設定値
CPSMeasureTime as M[8];       CPS計測時間の設定値
NumberOfPulse as M[24];       １時間当りのパルス数
CPSReadOut as M[16];          CPS計測値を割込みからメインに渡す領域
CPSACTimeCount as M[8];       CPS積算回数のカウント
CPSAccumulation as M[24];     CPS計測時間読出し積算バッファ
;     64秒間の計測値を設定計測時間になるまで積算
LastCPSAccumulation as M[24]; CPS計測時間の過去メモリ
NOPCountBuffer as M[24];      １時間パルス数計測バッファ
NumberOfNewData as M[8];      シリアル受信未処理データ数
; ビットエリア
InternalFlag as M[8] =｛
CPSDetected as M[1]    ;CPS  カウント終了フラグ
LogASignMinus as M[1]  ;Log(A)の符号
CountRestartF as M[1]  ;カウント再開
DataFlip as M[1]       ;一様乱数折り返し
NOPCaptureF as M[1]    ;一時間計測完了
SerialReceived as M[1] ;シリアル受信フラグ
CPSForceF as M[1]      ;bit7 : ＣＰＳ強制設定
｝
OperationMode as M[8] =｛    ; 動作モード
UniformDataOutF as M[1]      ;一様分布乱数出力
EXPDataOutF as M[1]          ;指数分布乱数出力
DemoModeF as M[1]            ;デモモード
MultiModeF as M[1]           ;マルチモード
｝
StatusFlag as M[8] =｛       ; エラーステータス
CPSTooLittleF as M[1]  ;ＣＰＳ無検出
CPSTooManyF as M[1]    ;ＣＰＳ過多検出
IntervalTimeOF as M[1] ;計測値バッファオーバーフロー
SerialBufferOF as M[1] ;シリアルバッファオーバーフロー
｝
ProbFlag as M[8] =｛         ; 確率判定（当り／はずれ）
PJudge0 as M[1]        ;確率番号０の判定
PJudge1 as M[1]        ;確率番号１の判定
PJudge2 as M[1]        ;確率番号２の判定
PJudge3 as M[1]        ;確率番号３の判定
PJudge4 as M[1]        ;確率番号４の判定
PJudge5 as M[1]        ;確率番号５の判定
PJudge6 as M[1]        ;確率番号６の判定
PJudge7 as M[1]        ;確率番号７の判定
｝
InternalFlag1 as M[8] =｛    ;内部フラッグ
AddressExist as M[1]   ;マルチモードでアドレス有り
AddressSelected as M[1];マルチモードでアドレス選択されたとき
｝
; 定数
CPSMAX as #100*64  / １秒間に１００パルス以上
CPSMIN as #1*64    / １秒間に１パルス以下
ConstEXPData as #01h
ConstUniformedData as #02h
ConstSecCount as #50
ConstTimeCount as #64
ConstNOPCount as #56
SAck as #05h
SNak as #50h
ConstSPFilter as #10101111b
ConstITFilter as #11001111b
【００８２】
４．Initial処理
/ Initial 処理 /
R0 = 00h;  RAM クリア
Repeat
RAM(R0) = 00h
R0 += 1
until R0=0;
SerialWPointer = #SerialBuffer;   バッファの先頭アドレスを設定
SerialRPointer = #SerialBuffer;
IntervalWPointer = #IntervalTime; バッファの先頭アドレスを設定
IntervalRPointer = #IntervalTime;
NOPTimeCount = #ConstNOPCount;
InitializeSFR; ８０５１SFRの設定
LoadFlashData; フラッシュ部のデータ読出し。初回はデフォルト値が読み出される
CalcTPreScaler; Timer2のプルスケール値の演算、および設定
CountRestart; 計測再開のためのメモリ初期化、割込み許可
jump to Main;
/ InitializeSFR /
p0.4 = OutputMode;
P1.3 = OutputMode;
Timer1 = Timer1Condition;
Timer2 = Timer2Condition;
Timer3 = Timer3Condition;
PCA = PCACondition;
Timer2INTEnable = true;
Timer3INTEnable = true;
/ LoadFlashData /     ;  フラッシュメモリに書き込まれたデータの読出し
;  デフォルト値はあらかじめフラッシュデータ部に
;  書き込んで置く。
CPS = FlashCPS;
CPSMeasureTime = FlashCPSMT;
NumberOfPulse = FlashNofP;
StatusFlag = FlashStatus;
OperationMode = FlashOPMode;
LastCPSAccumulation = FlashLastCPSAccumulation;
PROB(o..7) = FlashPROB(0..7);
Pvalue(0..7) = FlashPT(0..7);
【００８３】
５．メインルーチン
ConstEXPData as “01h”;
ConstUniformedData as “02h”;
Repeat
if IntervalWPointer<>IntervalRPointer then /処理されていない新規計測
/時間データはあるか？
if not(MultiModeF) then  /マルチモードでは処理しない
ReadIntervalTime;  /新計測時間の読出し
ConvertToUniform;  /一様分布乱数への変換
CalcProb;  /確率（あたり／はずれ）のジャッジ
if DemoMode
then  /デモモード中は無条件に送信
SendRandomEXP;  /指数分布乱数の送信
SendRandomUniform;  /一様分布乱数の送信
SendPJudge;  /確率判定値の送信
else  /通常モードでは乱数出力が選択されている時のみ送信
if EXPDataOutF then SendRAndomEXP;
if UniformDataOutF then SendRAndomUniform;
endif
endif
endif
if CPSDetected then
CPSDetected = false;  /ＣＰＳ値の計測（６４秒）が終わった時の処理
AccumulateCPS;   /計測時間の設定値になるまで
/６４秒間のＣＰＳ値を積算していく
CPSACTimeCount -= 1;
if CPSACTimeCount=0 then /計測設定時間になった場合
CalcCPS;  /ＣＰＳ値を１６秒間の平均値に変換
if not(CPSForceF) then CalcTPeScaler; /プリスケーラ値の計算
WriteToFlash;  /新ＣＰＳデータをフラッシュに書き込み
CountRestart;  /計測の再開始
endif;
endif
if NumberOfNewData<>0 then CommandHandling;  /シリアルデータの受信
/  新データがある時のみ、コマンド処理ルーチンを起動
endif
until forever;
【００８４】
６．割込み処理ルーチン
/ 外部割込み（INT0）: パルス入力割込み(p0)、立上りEdge検出 /
if CountRestartF
then
CountRestartF = false;  /計測再開時には計測タイマを開始するのみ
Start Timer2;
else
IntervalTime(IntervalWPointer) = IntervalCounter;
/計測結果を計測データバッファに書き込み
IntervalWPointer = (IntervalWPointer+1) and #ConstITFiler;
/  ポインタの更新
if IntervalWPointer=IntervalRPointer then IntervalTimeOF=true;
/ バッファオーバーフローチェック
IntervalCounter = 0;
CPSCounter +=1;  /ＣＰＳカウンタのカウントアップ
endif
Return from Int;
/ Serial割込み /
if SerialReceiveINTF then  /受信割込みの時のみ処理を行う。送信割込みは無視
SerialReceiveINTF = false;
SerialBuffer(SerialInputPointer) = SerialReceivedData;
/ シリアル受信データを受信バッファに書き込み
SerialWPointer = (SerialWPointer+1) and #ConstSPFilter;
/  シリアル書き込みポインタの更新
NumberOfNewData += 1;
if NumberOfNewData>=32 then SerialBufferOF=true;
/ バッファオーバーフローチェック
endif
Return from Int;
/ Timer2割込み /
IntervalCounter +=1;  /パルス間時間計測カウンタのカウントアップ
Return from Int;
/ Timer3  割込み /
CPSSecCounter -= 1;  /１秒のカウント
if CPSSecCounter = 0
then
CPSSecCounter = #ConstSecCount;
CPSTimeCounter -= 1;  /６４秒のカウント
if CPSTimeCounter=0
then
CPSTimeCounter = #ConstTimeCount;
CPSReadOut = CPSCounter;
/６４秒経過したのでＣＰＳカウント値の読出し
CPSCounter=0;
CPSDetected = true;
/  ＣＰＳ検出フラグセット
end if
endif
Return form Int
【００８５】
７．サブルーチン
/ CountRestart /  パルス間時間計測を再開する。
/  ＣＰＳが更新されたとき、フラッシュへの書き込みが行われたとき、初期状態
CPSSecCounter = #ConstSecCounter;
CPSTimeCounter = #ConstTimeCount;
CPSACTimeCount = CPSMeasureTime;
CPSCounter = 0;
CPSAccumulation = 0;
IntervalCounter = 0;
CountRestartF = true;
CPSDetected = false;
/ ReadIntervalTime /  時間計測値のバッファから計測時間を読み出す
RandomEXP = IntervalTime(IntervalRPointer);
IntervalReadPointer = (IntervalReadPointer+4) and #ConstITFilter;
/ AccumulateCPS /  ＣＰＳ計測値の積算
/  ６４秒毎の計測値を積算してゆき設定計測時間のＣＳＰ値を求める
/  １時間毎のＣＳＰ計測値もここで求める
/  １時間毎の計測値は６４秒毎の計測値を５６回積算し３５８４秒の積算値を求めた後
/  次の６４秒の計測値を１／４し、加える。（3584+64*0.25）=3600
CPSAccumulation = CPSAccumulation + CPSReadOut;
/  ＣＰＳ値の積算  ここから１時間のパルス数の積算
if NOPCaptureF then CPSReadOut = CPSReadOut/4;
NOPCountBuffer = NOPCountBuffer + CPSReadOut;
if NOPCaptureF
then  /  １時間の計測完了
NumberOfPulse = NOPCountBuffer;
NOPCaptureF = false;
if DemoModeF then SendNOP;
WriteToFlash;
CountRestart;
else
NOPTimeCount -= 1;
if NOPTimeCount=0 then 
NOPCaptureF = true;
NOPTimeCount = #ConstNOPCount;
endif
endif
/ CalcCPS /    ６４秒間のＣＰＳ値の算出
CPSAccumulation = (CPSAccumulation + LastCPSAccumulation) / 2;
LastCPSAccumulation = CPSAccumulation;
Breg = CPSMeasureTime;
if Breg.bit0<>“1” then
repeat
CPSAccumulation = CPSAccumulation/2;
RightShift(b, 1bit);
until Breg.bit0=“1”;
endif;
CheckCPSMAXMIN;  ＣＰＳ値の最大、最小のチェック
if not(CPSTooLittleF or CPSTooManyF) then CPS = CPSAccumulation;
if DemoModeF then SendCPS;
WriteToFlash:
CountRestart;
/ CheckCPSMAXMIN /
/  ＣＰＳ値が規定の範囲を超えていないかチェック
/  ＣＰＳ値が大きすぎる場合、Timer2の割込み周期が非常に短くなり、
/  常に割込みがかかった状態となって処理が廻らなくなるので注意必要。
Breg = #0;
If CPSAccumulation >= #CPSMAX then Breg.bit1 =“1”;
If CPSAccumulation < #CPSMIN then Breg.bit0 =“1”;
if StatusFlag<>Breg then
StatusFlag = Breg;
SendStatus;
endif;
/ SendRandomEXP /  指数分布乱数のシリアル出力
SerialOutput = #ConstEXPData;
if RandomEXP[23..16]=“0”
then
SerialOutput = RandonEXP;
Else
SerialOutput = #FFFFh;
endif
/ SendRandomUniform /  一様分布乱数のシリアル出力
SerialOutput = #ConstUniformData;
SerialOutput = UniformedData;
/ SendCPS /  CPS値のシリアル出力
/  内部ステータスの読出し時とデモモードでＣＰＳ値が変化した時
SerialOutput = #11h;
SerialOutput = CPS;
/ SendCPSMT /  ＣＰＳ計測時間のシリアル出力
/  内部ステータスの読出し時
SerialOutput = #12h;
SerialOutput = CPSMeasureTime;
/ SendNOP /  １時間あたりのパルス数のシリアル出力
/  内部ステータスの読出し時とデモモードで1時間当たりＣＰＳ値が変化した時
SerialOutput = #13h;
SerialOutput = NumberOfPulse;
/ SendStatus /  ステータス情報のシリアル出力
/  内部ステータス（ＣＰＳエラー）状態が変化した時と内部ステータスの読出し時
SerialOutput = #14h;
SerialOutput = StatusFlag;
/ SendVersion /  バージョン情報のシリアル出力
/  内部ステータスの読出し時
SerialOutput = #15h;
i = 0;
repeat
SerialOutput = FlashVer(i);
i += 1;
until FlashVer(i)=“FFh”;
/ SendProbSetting /  確率設定値のシリアル出力
/  内部ステータスの読出し時
SerialOutput = SerialCommand;
SerialOutput = PROB(Command and “FFh”);
/ SendPJudge /  確率判定値のシリアル出力
/  確率読出しコマンドを受信した時、デモモードではパルス入力毎に、内部ステータス
/  の読出しコマンドを受信したとき
SerialOutput = #28h;
SerialOutput = ProbFlag;
/ CalcProb /  指数分布乱数値からあたり／はずれの判定を行う
i = 0;
ProbFlag =“0”;
Repeat
if PValue(i)<=RandomEXP then ProbFlag[bit i] =“1”;
i += 1;
until i=“8”;
/ CommandHandling /.  シリアルコマンドの処理
if (SerialBuffer(SerialRPointer) and“F0h”) =“00h”then /動作条件設定コマンド
if SerialBuffer(SerialRPointer) =“00h” then
/  アサインされていないコードを受信した場合ＮＡＫを返す
SendNAK;
exit;
endif
if SerialBuffer(SerialRPointer) =“01h” then  /ＣＰＳ値の強制設定？
if NumberOfNewData<3 then exit;
/  オペランド（設定データ）未受信の場合、何もしない。
RenewSRP;
if (MultiModeF and AddressExist and not(AddressSelected)
then
/  マルチモードでアドレスが一致しない場合コマンドを無視
RenewSRP;
SendNal;
Exit
else
RenewSRP;
CPSForceData = SerialBuffer(SerialRPointer);
/  ＣＰＳ強制値の読出し
CPSForceF = true;
/  ＣＰＳ強制フラグのセット
CalcTPrescaler;
/  プリスケーラ値の計算（強制データで）
RenewSRP;
SendAck;
endif
if SerialBuffer(SerialRPointer) =“02h” then  /ＣＰＳ強制設定解除
if (MultiModeF and AddressExist and not(AddressSelected)
then
/  マルチモードでアドレスが一致しない場合コマンドを無視
SendAck;
exit
else
CPSForceF = false;
/  ＣＰＳ強制フラグのリセット
SendAck;
Exit
endif
if SerialBuffer(SerialRPointer) =“03h” then  /  ＣＰＳ計測時間設定
if NumberOfNewData<2 then exit;
/  オペランド（設定データ）未受信の場合、何もしない。
RenewSRP;
if (MultiModeF and AddressExist and not(AddressSelected)
then
/  マルチモードでアドレスが一致しない場合コマンドを無視
SendAck;
Exit
else
/  ＣＳＰ計測時間を読出し、設定
CPSMeasureTime = SerialBuffer(SerialRPointer);
WriteToFlash;
CountRestart;
SendAck;
Exit
endif
if SerialBuffer(SerialRPointer) =“0Fh” /  自己破壊
then
if NumberOfNewData<5 then exit;
/  オペランド（設定データ）未受信の場合、何もしない。
if (MultiModeF and AddressExist and not(AddressSelected)
then
/  マルチモードでアドレスが一致しない場合コマンドを無視
SerialRPointer += 4;
NumberOfNewData -=4;
RenewSRP;
exit
else
RenewSRP;
If SerialBuffer(SerialRPointer)=“86h,51h,29h,78h”
then
/ 正規データ列が受信された場合、フラッシュデータの消去
Destroy;
exit;
else
/  そうでない場合、コマンドを無視しＮａｋを返送
SerialRPointer += 3;
NumberOfNewData -=3;
SendNAk;
exit
endif;
endif
else
SendNAK;
exit;
endif
endif
if (SerialBuffer(SerialRPointer) and“F0h”) =“10h”then /内部ステータス読出し
if SerialBuffer(SerialRPointer)=(“10h” or “16h” or “17h”) then
/  無効データの場合Nakを返送
SendNak;
exit;
endif;
ACC = SerialBuffer(SerialRPointer
Sirent;
if (not(MultiModeF) or (AddressExist and AddressSelected))
then
/  スタンドアロンモードの時、およびマルチモードでアドレスが一致した場合
if ACC=“11h” then  /ＣＰＳ返送
SendCPS;
exit;
endif;
if ACC=“12h” then  /ＣＳＰ計測時間返送
SendCPSMT;
exit;
endif;
if ACC=“13h” then  /１時間ＣＰＳ値返送
SendNOP;
exit;
endif;
if ACC=“14h” then  /ステータスデータ返送
SendStatus;
exit;
endif;
if ACC=“15h” then  /バージョン返送
SendVersion;
exit;
endif;
SendProbSetting;   /確率設定値返送
exit;
else
exit;
endif
endif
if (SerialBuffer(SerialRPointer) and “F0h”) =“20h” then  /確率設定コマンド
if SerialBuffer(SerialRPointer)=“28h” then
/  確率判定値の読出し
if (not(MultiModeF) or (AddressExist and AddressSelected))
/ then SendPJudge;
/スタンドアロンモード、およびマルチモードでアドレス一致した場合
/のみ確率判定値を返送
Sirent;
exit;
endif
if SerialBuffer(SerialRPointer)<“28h” then
if NumberOfNewData<3 then exit;
/  オペランド（設定データ）未受信の場合、何もしない。
if (MultiModeF and AddressExist and not(AddressSelected)
then
/  マルチモードでアドレスが一致しない場合コマンドを無視
SerialRPointer += 2;
NumberOfNewData -=2;
Sirent;
exit;
else
/  確率設定値を設定する
PArg = SerialBuffer(SerialRPointer) and “00000111b”;
/  確率番号の算出
RenewSRP;
PROB(PArg) = SerialBuffer(SerialRPointer);
/  確率設定値の書き込み
RenewSRP;
CalcPThreshold;
/  確率判定スレショルドの算出
WriteToFlash;
SendAck;
CountRestart;
exit;
endif;
endif
SendNak;
exit;
endif
if (SerialBuffer(SerialRPointer) and“F0h”) =“40h”then / 動作モードコマンド
if SerialBuffer(SerialRPointer)<“45h”
then
if (MultiModeF and AddressExist and not(AddressSelected))
then
/  マルチモードでアドレスが一致しない場合コマンドを無視
RenewSRP;;
AddressSelected = false;
AddressExist = false;
exit;
else
Breg = OperationMode;
OperationMode = SerialBuffer(SerialRPointer)and“00000111b”;
if Breg<>OperationMode then
/  動作モード設定に変化があったとき
WriteToFlash;
CountRestart;
endif;
SendAck;
exit;
endif
else
SendNak;
exit;
endif
endif
if SerialBuffer(SerialRPointer) =“7Fh” then MultiModeF = true;
if SerialBuffer(SerialRPointer) =“7Eh” then MultiModeF = false;
if SerialBuffer(SerialRPointer) = (“7Eh” or “7Fh”) then
/  マルチモードコマンド受信処理
WriteToFlash;
CountRestart;
Sirent;
exit;
endif
if SerialBuffer(SerialRPointer) < “80h” then
SendNak;
exit;
endif;
if not(MultiModeF) then
SendNak;
exit;
endif;
AddressExist = true;
if (SerialBuffer(SerialRPointer) and “00111111b”) = #ModuleAddress
then AddressSelected = true;
else AddressSelected = false;
/  モジュールアドレスと指定アドレスの比較
endif;
if SerialBuffer(SerialRPointer) >= “C0h”
then
/  マルチモードで、コマンド入力用アドレス選択
RenewSRP;;
exit;
else
/  マルチモードで乱数データの読出し
if IntervalWPointer=IntervalRPointer
then
/  乱数データがない場合
SendNakWhenNoData;
exit;
else
/  乱数データが有る場合
if AddressSelected then
/  アドレスが選択されている場合
ReadIntervalTime;
/  時間計測値の読み出し
ConvertToUniform;
/  一様分布乱数へ変換
CalcProb;
/  確率判定
if EXPDataOutF then SendRandomEXP;
if UniformDataOutF then SendRandomUniform;
/  乱数出力
endif;
Sirent;
endif;
endif;
/ SendNak /  NAKコードの送出
if (not(MultiModeF) or (AddressExist and AddressSelected) then SerialOutput 
/= #SNAK;/  マルチモードでアドレスが一致しない場合はNAK送信せず
AddressSelected = false;
AddressExist = false;
SerialRPointer += 1;
SerialRPointer = SerialRPointer and #ConstSPFilter;
/  シリアル読出しポインタの更新
NumberOFNewData -= 1;
/ SendNakWhenNoData /  マルチモード乱数読出し時、乱数がない場合
SerialOutput = #SNAK;
AddressSelected = false;
AddressExist = false;
NumberOFNewData -= 1;
/ SendAck /    ACKコードの送出
if (not(MultiModeF) or (AddressExist and AddressSelected) then SerialOutput 
/= #SACK;/  マルチモードでアドレスが一致しない場合はACK送信せず
AddressSelected = false;
AddressExist = false;
SerialRPointer += 1;
SerialRPointer = SerialRPointer and #ConstSPFilter;
/  シリアル読出しポインタの更新
NumberOFNewData -= 1;
/ RenewSRP /  シリアルポインタの更新
SerialRPointer += 1;
SerialRPointer = SerialRPointer and #ConstSPFilter;
NumberOFNewData -= 1;
/ Sirent / 無効データで何もせず
AddressSelected = false;
AddressExist = false;
SerialRPointer += 1;
SerialRPointer = SerialRPointer and #ConstSPFilter;
NumberOFNewData -= 1;
/ WriteToFlash /  フラッシュメモリへのデータ書き込み
FlashCPS = CPS;
FlashCPSMT = CPSMeasureTime;
FlashNofP = NumberOfPulse;
StatusFlag = FlashStatus;
FlashOPMode = OperationMode;
FlashLastCPSAccumulation = LastCPSAccumulation;
FlashPROB(0..7) = PROB(o..7);
FlashPT(0..7) = Pvalue(0..7);
/ ConvertToUniform /  一様分布乱数への変換
if RandomEXP[23..16]<>“0”
then
/  指数分布乱数が“FFh”を超えた場合には“FFh”とする
UniformedData = “FFh”;
else
/  ２分探索にて一様分布へ変換
BitIndicator = 10000000b;
UniformedData = “0”;
repeat
UniformedData = UniformedData xor BitIndicator;
if RandomEXP < DataTable(UniformedData)
then UniformedData = UniformedData xor BitIndicator; 
endif;
Carry = “0”;
RightLotateWithCarry(BitIndicator, 1bit);
until Carry=“1”;
endif;
/ CalcTPreScaler /  CPSからTimer2のプリスケーラ値を算出
/ この演算では、６４秒間のパルス数（CPS値）が０−３の場合、正確なプリスケーラ値
/ は求まらない。事前に確認が必要 >  CPSMAXとCPSMINで切り出す
a as M32 {
aH as M[16];
aL as M[16];
}
CycleCounter as M[8];
a = 2246Dh;
CycleCounter=16;
LeftShiftWithCarry(a,1bit);
repeat
if CPSForceF
then
/  ＣＰＳ値が強制設定されている場合、強制設定データを使用
if (aH-CPSForceData)>=0 
then
Carry = 1;
aH = aH  CPSForceData;
else Carry = 0;
else
if (aH-CPS)>=0
then
Carry = 1;
aH = aH  CPS;
else Carry = 0;
endif;
LeftShiftWithCarry(a,1bit);
CycleCounter = CycleCounter  1;
until CycleCounter=0;
Timer2ReloadREG = aL;
/ CalcPThreshold /確率設定値から内部で使用する確率判定用の時間カウント閾値を計算
/  対数演算を行う。処理内容については設計仕様書を参照。
W as M[32] {
W0 as M[8];
W1 as M[8];
W2 as M[8];
W3 as M[8]; /演算バッファX
}
X as M[32] {
X0 as M[8];
X1 as M[8];
X2 as M[8];
X3 as M[8]; /演算バッファX
}
Y as M[32] {
Y0 as M[8];
Y1 as M[8];
Y2 as M[8];
Y3 as M[8]; /演算バッファY
}
LogA as M[32] {
LogA0 as M[8];
LogA1 as M[8];
LogA2 as M[8];
LogA3 as M[8]; /演算バッファW
}
Z as M[32] {
Z0 as M[8];
Z1 as M[8];
Z2 as M[8];
Z3 as M[8]; /演算バッファZ
}
ZZ as M[32] {
ZZ0 as M[8];
ZZ1 as M[8];
ZZ2 as M[8];
ZZ3 as M[8]; /演算バッファZZ
}
Result as M[32] {
Result0 as M[8];
Result1 as M[8];
Result2 as M[8];
Result3 as M[8]; /演算バッファZZ
}
LogASign as M[1]; /Log(A)の符号
CalcAB;
CalcZ;
CalcZZ;
CalcLogA;
CalcLogB;
CalcResult;
/ CalcAB /
B as M[8];
X1&X2=P(PArg);
X0=X3=0;
B=“0Fh”;
repeat
LeftShift(X, 1 bit);
B -= 1;
until X0.bit0=“1”;  /結果：  XにAが残る。
/ CalcZ /
Root2 as “01.6A09E6”;
CycleCounter as M[8]
Y=X;          /X,Y両バッファにAをセット
X=X - Root2;  /X = (a-√2)の計算、もし結果が負なら補数をとる。
if X<0 then 
X= 0  X;
LogASign = true;
else
LogASign = false;
end if
Y=Y + Root2;   /Y = (a+√2)の計算
CycleCounter = 22; /除数yのビット長
z = 0;    /ここから、Z = X/Yの計算
ShiftLeft(X, 2bit)
Repeat
if (X-Y) > 0
then
Carry = “1”; /結果zの最下位ビットを“1”にセット
X =X - Y;
else
Carry = “0”; /結果zの最下位ビットを“0”にリセット
end if
ShiftLeftWithC(Z, 1bit);
ShiftLeft(X, 1bit);
CycleCounter = CycleCounter  1;
until CycleCounter=0    ;    /Zに演算結果が残る
/ CalcZZ /
CycleCounter as M[8];
X = Z;
X = Z;
WeqXmulY;
ZZ = W;
/ CalcLogA /
Const10 as “01.000000h”;  /1
Const03 as “00.555555h”;  /0.3333333
Const02 as “00.333333h”;  /0.2
Const07 as “00.249248h”;  /“.0010 0100 1001 0010 0100 1000” = 0.1428571
CycleCounter as M[8];
/    ＺＺ／７の演算、変数×定数の演算なので、定数が“0”のビット位置は単純シフト
/    定数が“1”のビット位置は加算を行い、処理時間を短縮する
Y = ZZ;
X = 0;
CycleCounter = 7
repeat
ShiftRight(Y(1..3), 3bit);
X(1..3) = X(1..3)+Y(1..3);
CycleCounter -= 1;
until CycleCounter = 0;    /結果はＸに残る
X = X + Const02;
Y = ZZ      ;      /zz*(0.2 + zz*0.1428571)の演算
WeqXmulY;
W =W + Const03;
Y = ZZ      ;      /zz*(0.3333333 + zz*(0.2 + zz*0.1428571)の演算
X = 0;
WeqXmulY;
W = W + Const10;
Y = Z      ;      /2*z*(1 + zz*(0.3333333 + zz*(0.2 + zz*0.1428571)))
X = W;
WeqXmulY4;
LogA = 2 * W;
/ CalcLogB /
Const05 as “00.800000h”;
ConstLog2 as “0B17217Fh”;  /演算簡素化のため、Log(2)＊１６を入れておく
X = B + 0.5
W = 0;
Y = ConstLog2;
CycleCounter = 5;      /X=(B+0.5)*Log(2)
repeat
if W0.bit3=“1” then W =W + Y;
ShiftRight(Y,1bit);
ShiftLeft(W(0..1),1bit)
until CycleCounter = 0;    /Xに結果が残る
/ CalcResult /
ConstN as (“00.2BF7C4h” shl 2) =“0.1010 1111 1101 1111 0001 0000”;
/ 0.1717494 *4 = 4/5.822436
if LogASign
then W = W + LogA
else W = W  LogA;
Result = 0;
Y = ConstN;
CycleCounter=22;
repeat
ShiftLeft(Y(1..3),1bit)
if Carry=“1” then Result = Result + X;
ShiftRight(X,1bit);
until CycleCounter = 0;  /Resultに結果が残る
/ WeqXmulY /
/ W = X * Y の演算（小数点以下のみの計算）
W = 0;
CycleCounter=24;
repeat
ShiftRight(X(1..3),1bit);
ShiftLeft(Y(1..3),1bit)
if Carry=“1” then W = W + X;
until CycleCounter = 0;    /Wに結果が残る
/ WeqXmulY4 /
/ W = X * Y の演算（４桁の計算、Ｘは４桁、Ｙは１未満の場合のみ）
W = 0;
CycleCounter=24;
repeat
ShiftRight(X,1bit);
ShiftLeft(Y,1bit)
if Carry=“1” then W = W + X;
until CycleCounter = 0;    /  Wに結果が残る
/ FlashROMDataArea /  フラッシュメモリ内のデータ領域。
/  初期値として各データのデフォールト値を入れておく
FlashCPS as M[16] =“00C0h”;
FlashCPSMT as M[8] =“01h”;
FlashNofP as M[24] =“FFFFFFh”;
FlashStatus as M[8] =“00h”;
FlashOPMode as M[8] =“00010011b”;
;                                    bit2 : デモモード
;                                    bit1 : 指数分布乱数出力
;                                    bit0 : 一様分布乱数出力
FlashLastCPSAccumulation as M[24] =“0000C0h”;
FlashPROB(8) as M[16] = (“0002h”,“0003h”,“0005h”,“0010h”,“0080h”,
/“0100h”,“1000h”,“8000h”);
FlashPT(8) as M[17] = (“001D8Dh”,“002ED7h”,“00449Eh”,“00CEDEh”,
/“00EC6Ch”,“0162A2h”,“01BB4Ah”);
ModuleAddress as M[8] =“FFh”;
FlashVer as String =“RGZ-1 Ver 1.00”,“0Dh”,“0Ah”,“2004-05-10”,“0Dh”,
“0Ah”,“CopyRight 2004, RPG Technics & Zixsys Inc.”,
“FFh”;
【図面の簡単な説明】
【００８６】
【図１】α粒子放射体のＩＣタグへの取付け例を示す図である。
【図２】α粒子放射体の取付け部拡大図である。
【図３】α粒子放射体取付け部拡大図（α粒子放射体が円盤状の場合の取付け例）である。
【図４Ａ】α粒子放射体の滴下と封止例を示す図である。
【図４Ｂ】α粒子放射体の滴下と封止例を示す図である。
【図４Ｃ】α粒子放射体の滴下と封止例を示す図である。
【図５】図５Ａ及び５Ｂは、ＤＩＰ型ＩＣにパルス発生源を取付けた場合を示す図である。
【図６】本発明に係るＲＰＧ−ＲＦＩＤの一例を示すブロック図である。
【図７】α粒子放射体−検出器間距離とα粒子の計数率の関係を示すグラフである。
【図８】アルミニウムの厚さの増加に伴う電子数の減少を示すグラフである。
【図９】ＲＰＧ出力パルスの一例を示す図である。
【図１０Ａ】本発明の一実施例の動作の一部を示すフロー・チャートである。
【図１０Ｂ】本発明の一実施例の動作の一部を示すフロー・チャートである。
【図１０Ｃ】本発明の一実施例の動作の一部を示すフロー・チャートである。
【図１】
2006050577.tif 000012
【図２】
2006050577.tif 000013
【図３】
2006050577.tif 000014
【図４Ａ】
2006050577.tif 000015
【図４Ｂ】
2006050577.tif 000016
【図４Ｃ】
2006050577.tif 000017
【図５】
2006050577.tif 000018
【図６】
2006050577.tif 000019
【図７】
2006050577.tif 000020
【図８】
2006050577.tif 000021
【図９】
2006050577.tif 000022
【図１０Ａ】
2006050577.tif 000023
【図１０Ｂ】
2006050577.tif 000024
【図１０Ｃ】
2006050577.tif 000025