本開示に係る実施形態が、比較例と対比しながら説明される。
(比較例)
図1に示されるように、比較例に係る時刻生成装置900は、加算器910と、ラッチ920と、クリップ回路930とを備える。
加算器910は、ラッチ920の出力であるL_OUTと、定数であるK_CPとを加算してラッチ920に出力する。ラッチ920は、クロック信号の立ち上がりエッジで、加算器910の出力をラッチする。したがって、ラッチ920の出力であるL_OUTは、クロック信号の立ち上がりが入力される毎に、定数であるK_CPだけ増加する。クロック信号は、CKで表される。ラッチ920は、PPS(Pulse Per Second)信号の立ち上がりエッジのタイミングでゼロにクリアされる。PPS信号は、PPSで表される。
クリップ回路930は、ラッチ920の出力(L_OUT)とK_CP_CLIPとを比較して出力を決定する。クリップ回路930は、L_OUTの値がK_CP_CLIPの値以下である場合、L_OUTの値を出力する。クリップ回路930は、L_OUTの値がK_CP_CLIPの値より大きい場合、K_CP_CLIPの値を出力する。つまり、クリップ回路930は、K_CP_CLIPの値を上限として、ラッチ920の出力値を決定する。クリップ回路930の出力は、TIME_CPと表される。
PPS信号は、1秒毎に立ち上がるパルス信号である。クロック信号は、1秒より短い所定周期で立ち上がるパルス信号である。クロック信号の周波数が例えば250MHzであるとする。この場合、クロック信号は、4ns(ナノ秒)毎に立ち上がる。時刻生成装置900は、K_CPの値を4とすることによって、ラッチ920の出力(L_OUT)として、PPS信号の立ち上がりエッジのタイミングを基準時刻とするナノ秒単位の時刻データ(TIME_CP)を出力できる。
ここで、クロック信号の周波数は、誤差を有する。例えば、水晶発振器が出力するクロック信号の周波数は、±50ppm程度の誤差を有する。ここで、周波数が250MHzのクロック信号において、周波数に+50ppmの誤差があるとする。この場合、クロック信号の立ち上がりエッジの周期は、4nsより小さくなり、約3.9998nsとなる。このような誤差を有するクロック信号に基づいてラッチ920の出力(L_OUT)が4ずつ加算される場合、L_OUTの値と実際の時刻との誤差が増大していく。ナノ秒単位の時刻データが999999996である場合に、実際の時刻は、3.9998ns×249999999=999949996nsとなる。時刻データと実際の時刻との差は、50000nsにまで達する。
以上述べてきたように、比較例に係る時刻生成装置900は、クロック信号の周波数の誤差がある場合に、時刻データに誤差が生じるという課題を有している。
そこで、本開示は、高精度の時刻データを生成できる時刻生成装置1(図2等参照)を説明する。
(本開示の一実施形態)
図2に示されるように、一実施形態に係る時刻生成装置1は、第1カウンタ10と、ラッチ20と、小数点位置変更回路30と、第1整数/小数分離回路40と、フラグ生成器50と、時刻データ生成器60とを備える。図3に示されるように、フラグ生成器50は、第1加算器51と、第2整数/小数分離回路52と、第2加算器53と、比較器54と、第2カウンタ55とを備える。図4に示されるように、時刻データ生成器60は、第3加算器62と、乗算器64と、クリップ回路66とを備える。
時刻生成装置1は、PPS信号(PPS)とクロック信号(CK)とを取得する。時刻生成装置1は、PPS信号とクロック信号とに基づいて、PPS信号より短い間隔の時刻データを生成する。
PPS信号は、1秒毎にLOレベルからHIレベルに立ち上がるエッジ、又は、HIレベルからLOレベルに立ち下がるエッジを有するパルス信号である。時刻生成装置1は、PPS信号を、例えばGPS(Global Positioning System)から受信してもよいし、IEEE1588の規格に基づく機器から受信してもよい。
クロック信号は、所定周期でLOレベルからHIレベルに立ち上がるエッジ、又は、HIレベルからLOレベルに立ち下がるエッジを有するパルス信号である。クロック信号は、例えば水晶発振器等の発振器によって生成されてよい。クロック信号は、パルス信号を含んでよい。時刻生成装置1は、クロック信号を外部から取得してもよいし、クロック信号を生成する発振器を備えてもよい。本実施形態に係る時刻生成装置1は、外部からクロック信号を取得する。
クロック信号の周波数は、PPS信号の周波数である1Hzより大きい。本実施形態において、クロック信号の周波数は、250MHzであるとする。クロック信号のデューティ比は50%であるとする。この場合、クロック信号の周期及びパルス幅はそれぞれ、4ns及び2nsとなる。
本実施形態において、PPS信号のパルス幅は、クロック信号の周期である4nsであるとする。つまり、本実施形態のPPS信号は、通常LOレベルになっており、1秒毎にクロック信号の1周期分においてHIレベルになるとする。PPS信号のパルス幅は、4nsより狭くても広くてもよいし、クロック信号の周期と無関係であってもよい。
第1カウンタ10は、PPS信号がLOレベルである間、クロック信号の立ち上がりのタイミングで1ずつカウントアップする。第1カウンタ10は、PPS信号がHIレベルになっている場合、クロック信号の立ち上がりのタイミングでカウント値を1に初期化する。つまり、第1カウンタ10は、1つのPPS信号を受信してから次のPPS信号を受信するまでの間のクロック信号の数を整数でカウントする。第1カウンタ10は、カウントしたクロック信号の数を第1カウント値として出力する。第1カウント値は、CT_CK1で表されるとする。
第1カウンタ10のビット長は、符号無しの28ビット、且つ、小数部0ビットであるとする。この場合、第1カウント値は、CT_CK1[27:0]とも表される。第1カウンタ10のビット長は、28に限られず、27以下であってもよいし29以上であってもよい。第1カウンタ10は、カウント値が16進数でFFFFFFFに達したらカウントアップを停止し、カウント値をFFFFFFFで保持する。第1カウンタ10のビット長は、カウントアップを停止することなくPPS信号間のクロック信号の数をカウントできるように設定される。
ラッチ20は、PPS信号がHIになっている間に第1カウンタ10から入力されている第1カウント値(CT_CK1)をラッチし、PPS信号がHIからLOになったタイミングで、ラッチした第1カウント値を、PPS間クロック数として出力する。言い換えれば、ラッチ20は、PPS信号がHIからLOになるタイミングにおいて入力されている値を保持し、その値を出力し続ける。PPS間クロック数は、CT_CKPで表されるとする。PPS間クロック数のビット長は、第1カウント値のビット長と同じであるとする。PPS間クロック数は、1秒間のクロック数に対応する。本実施形態において、ラッチ20のビット長は、符号無しの28ビット、且つ、小数部0ビットであるとする。PPS間クロック数は、CT_CKP[27:0]とも表される。
小数点位置変更回路30は、ラッチ20が出力するPPS間クロック数(CT_CKP)の小数点位置を所定ビット数だけ上位に変更する。小数点位置変更回路30は、小数点位置を変更したデータを、所定期間クロック数として出力する。所定期間クロック数は、CT_NSで表されるとする。
本実施形態において、小数点位置変更回路30は、PPS間クロック数の小数点位置を23ビットだけ上位に変更する。小数点位置を23ビットだけ上位に変更することは、PPS間クロック数に2の−23乗(2^−23)を乗じることに対応する。1秒に2の−23乗を乗じた時間は、119.209290ns(約119ns)である。つまり、本実施形態において、所定期間クロック数は、約119ns当たりのクロック数に対応する。所定期間クロック数は、119nsクロック数とも称される。
小数点位置変更回路30のビット長は、符号無しの28ビット、且つ、小数部23ビットであるとする。所定期間クロック数は、CT_NS[27:0]とも表される。
第1整数/小数分離回路40は、所定期間クロック数(CT_NS)の、小数点よりも上位のビット、つまり所定期間クロック数の整数部を整数データとして出力する。所定期間クロック数の整数部に対応する整数データは、INT_CT_NSで表されるとする。第1整数/小数分離回路40は、所定期間クロック数(CT_NS)の、小数点よりも下位のビット、つまり所定期間クロック数の小数部を小数データとして出力する。所定期間クロック数の小数部に対応する小数データは、REM_CT_NSで表されるとする。
本実施形態において、所定期間クロック数は、ビット長が28ビットであるデータにおいて、小数点位置が23ビットだけ上位に変更されたデータとなっている。したがって、所定期間クロック数の整数部のビット長は、5ビットである。整数データは、INT_CT_NS[4:0]とも表される。所定期間クロック数の小数部のビット長は、23ビットである。小数データは、REM_CT_NS[22:0]とも表される。第1整数/小数分離回路40のビット長は、符号無しの28ビット長、且つ、小数部23ビットであるとする。小数部23ビットは、小数点が23ビット分上位に移動していることを表している。第1整数/小数分離回路40は、ビット長が5ビットの整数データと、ビット長が23ビットの小数データとを出力する。
フラグ生成器50は、所定期間クロック数の整数データ及び小数データに基づいて、時刻データを加算するタイミングを定めるフラグを生成する。フラグは、FLで表されるとする。以下、フラグ生成器50の各構成部の動作が説明される。
第1加算器51は、所定期間クロック数の小数データ(REM_CT_NS)と、後述する第2整数/小数分離回路52が出力する小数データとの和を、小数部積み残し合計値として出力する。小数部積み残し合計値は、SUM_REMで表されるとする。
第1加算器51は、加算する2つの小数データを入力データとして取得する。第1加算器51の入力のビット長は、符号無しの23ビット、且つ、小数部23ビットであるとする。第1加算器51は、2つの数を加算した数を小数部積み残し合計値として出力する。第1加算器51の出力のビット長は、符号無しの24ビット、且つ、小数部23ビットであるとする。小数部積み残し合計値は、SUM_REM[23:0]とも表される。
第2整数/小数分離回路52は、フラグ生成器50が出力するフラグ(FL)がHIになっている場合の小数部積み残し合計値の整数部と小数部とをそれぞれ、フラグがHIからLOになるタイミングで出力する。小数部積み残し合計値の整数部は、小数部積み残し合計値の上位1ビットに対応する。小数部積み残し合計値の小数部は、小数部積み残し合計値の2ビット目以降の下位ビットに対応する。第2整数/小数分離回路52は、小数部積み残し合計値の整数部を、積み残し整数データとして出力する。積み残し整数データは、INT_SUMで表されるとする。第2整数/小数分離回路52は、小数部積み残し合計値の小数部を、積み残し小数データとして出力する。積み残し小数データは、REM_SUMで表されるとする。
第2整数/小数分離回路52のビット長は、符号無しの24ビット、且つ、小数部23ビットであるとする。この場合、第2整数/小数分離回路52が小数部積み残し合計値の整数部として出力する積み残し整数データのビット長は1ビットである。積み残し整数データは、INT_SUM[0]とも表される。第2整数/小数分離回路52が小数部積み残し合計値の小数部として出力する積み残し小数データのビット長は23ビットである。積み残し小数データは、REM_SUM[22:0]とも表される。
第2加算器53は、第1整数/小数分離回路40から出力された、所定期間クロック数の整数データ(INT_CT_NS)と、第2整数/小数分離回路52から出力された、積み残し整数データ(INT_SUM)とを加算する。第2加算器53は、加算した値を、加算クロック数として出力する。加算クロック数は、INT_CT_ADDで表されるとする。
第2加算器53は、所定期間クロック数の整数データと積み残し整数データとを入力データとして取得する。第2加算器53の所定期間クロック数の整数データを取得する入力のビット長は、符号無しの5ビット、且つ、小数部0ビットであるとする。第2加算器53の積み残し整数データを取得する入力のビット長は、符号無しの1ビット、且つ、小数部0ビットであるとする。第2加算器53は、入力された2つの値を加算した値を加算クロック数として出力する。第2加算器53の出力のビット長は、符号無しの5ビット、且つ、小数部0ビットであるとする。加算クロック数は、INT_CT_ADD[4:0]とも表される。
第2カウンタ55は、フラグ(FL)がLOである場合、クロック信号の立ち上がりのタイミングで1ずつカウントアップし、第2カウント値として出力する。第2カウント値は、CT_CK2で表されるとする。第2カウンタ55は、フラグ(FL)がHIである場合、クロック信号の立ち上がりのタイミングで第2カウント値を1に初期化する。つまり、第2カウンタ55は、フラグ(FL)がHIになったタイミングからのクロック数を整数でカウントする。
第2カウンタ55のビット長は、符号無しの5ビット、且つ、小数部0ビットであるとする。この場合、第2カウンタ55は、CT_CK2[4:0]とも表される。
比較器54は、第2カウンタ55が出力する第2カウント値(CT_CK2)と、第2加算器53が出力する加算クロック数(INT_CT_ADD)とを比較した結果に基づいてフラグ(FL)をHIレベル又はLOレベルの信号として出力する。比較器54は、第2カウント値が加算クロック数未満である場合にフラグ(FL)をLOにし、第2カウント値が加算クロック数以上になった場合にフラグ(FL)をHIにする。
以上述べてきたように、フラグ生成器50は、第1加算器51と第2整数/小数分離回路52と第2加算器53とによって、加算クロック数(INT_CT_ADD)を生成する。フラグ生成器50は、比較器54と第2カウンタ55とによって、クロック信号の立ち上がりエッジの数が加算クロック数に達したタイミングでフラグ(FL)をHIにする。このようにすることで、フラグ生成器50は、所定期間クロック数に端数として含まれる小数部を考慮してクロック信号の数をカウントできる。後述するように、フラグ(FL)がHIになったタイミングで時刻データ生成器60は、時刻データを更新する。フラグ生成器50が所定期間クロック数に端数として含まれる小数部を考慮してクロック信号の数をカウントすることで、所定期間クロック数の小数部によって生じる時刻データの更新のタイミングの誤差が低減され得る。
時刻データ生成器60は、フラグ(FL)がHIになるタイミングで、時刻データを更新し出力する。時刻データは、TIME_DATAで表されるとする。以下、時刻データ生成器60の各構成部の動作が説明される。
第3加算器62は、フラグ(FL)がHIになっている場合において第3加算器62自身が出力している値とKで表される定数とを加算する。第3加算器62は、フラグ(FL)がHIからLOになるタイミングで、加算した値をFS時刻データとして出力する。FS時刻データは、TIME_FSで表されるとする。第3加算器62は、PPS信号を取得し、PPS信号がHIになったタイミングで、FS時刻データをゼロに初期化する。したがって、第3加算器62は、PPS信号がHIになったタイミングから、次にPPS信号がHIになるタイミングまで、1秒よりも短い単位で表されるFS時刻データを増加させる。このようにすることで、第3加算器62は、PPS信号がHIになるタイミングで表される1秒間隔の時刻よりも短い間隔の時刻を表すデータを出力できる。
定数(K)は、小数点位置変更回路30において変更される小数点位置のビット数に基づいて定まる。小数点位置変更回路30において小数点位置が23ビットだけ上位に変更される場合、定数(K)は、1秒に2の−23乗を乗じた時間に対応する数値となる。本実施形態において、FS時刻データは、fs(フェムト秒)単位で生成されるとする。この場合、定数(K)は、119209290[fs]に設定される。
第3加算器62は、第3加算器62自身が出力している値と、定数(K)とを入力データとして取得する。第3加算器62の、定数(K)を取得する入力のビット長は、符号無しの27ビット、且つ、小数部0ビットであるとする。定数は、K[26:0]とも表される。第3加算器62の、第3加算器62自身が出力している値を取得する入力のビット長は、符号無しの50ビット、且つ、小数部0ビットであるとする。第3加算器62は、入力された2つの値を加算した値をFS時刻データとして出力する。第3加算器62の出力のビット長は、符号無しの50ビット、且つ、小数部0ビットであるとする。FS時刻データは、TIME_FS[49:0]とも表される。
乗算器64は、FS時刻データに、K_1em6で表される定数を乗じて、NS時刻データとして出力する。NS時刻データは、TIME_NSで表されるとする。本実施形態において、NS時刻データは、ns(ナノ秒)単位で生成されるとする。この場合、定数(k_1em6)は、10の−6乗(10^−6又は1e−6)に設定される。
乗算器64は、FS時刻データと定数(K_1em6)とを入力データとして取得する。乗算器64のFS時刻データを取得する入力のビット長は、符号無しの50ビット、且つ、小数部0ビットであるとする。乗算器64の定数(K_1em6)を取得する入力のビット長は、符号無しの32ビット、且つ、小数部50ビットであるとする。小数部50ビットは、小数点が50ビット分上位に移動していることを表している。定数は、K_1em6[31:0]とも表される。K_1em6の値を表すデータにおいて仮に小数点が削除された場合、K_1em6の値は、(1e−6)/(2^−50)=1125899907となる。この値において、小数点位置を50ビット分上位に変更した値は、1e−6(10の−6乗)になる。
乗算器64は、NS時刻データを出力する。乗算器64の出力のビット長は、符号無しの32ビット、且つ、小数部0ビットであるとする。NS時刻データは、TIME_NS[31:0]とも表される。
クリップ回路66は、NS時刻データと、K_CLIPで表される定数とを比較して、NS単位時刻データとして出力する値を決定する。時刻データは、TIME_DATAで表されるとする。クリップ回路66は、NS時刻データがK_CLIP以下である場合、NS時刻データを時刻データとして出力する。クリップ回路66は、NS時刻データがK_CLIPより大きい場合、K_CLIPの値を時刻データとして出力する。定数(K_CLIP)は、1秒よりも1ナノ秒だけ短い時間を表すデータに設定される。具体的には、K_CLIP=(1e9)−1=999999999[ns]に設定される。
クリップ回路66の入力及び出力のビット長は、符号無しの32ビット、且つ、小数部0ビットであるとする。
以上述べてきたように、時刻データ生成器60は、フラグ生成器50が出力するフラグ(FL)がHIになるタイミングで時刻データを更新する。このようにすることで、時刻生成装置1は、PPS信号によって特定される1秒の間隔よりも短い間隔の時刻データを生成できる。
以下、図5、図6及び図7に例示されるタイミングチャートに基づいて、時刻生成装置1の動作が説明される。
タイミングチャートは、PPS信号がHIからLOになるタイミングで複数の期間に分けられる。図5、図6及び図7において、その期間は、第1期間P1、第2期間P2、第3期間P3又は第4期間P4に分けて表されるとする。例えば、第1期間P1においてPPS信号がHIになった場合、第1期間P1は、PPS信号がHIからLOになるタイミングまで続く。そして、PPS信号がHIからLOになるタイミングの後から第2期間P2が開始する。
第1カウンタ10は、クロック信号を取得し、取得したクロック信号の立ち上がりエッジの数を期間毎にカウントする。クロック信号の立ち上がりエッジの数は、クロック数に対応する。第1カウンタ10は、CT_CK1の値を、クロック信号の1周期毎に1ずつカウントアップする。例えば、第2期間P2において第1カウンタ10が取得したクロック数がCK_P2個である場合、第2期間P2の終了時点における第1カウント値は、CK_P2個となる。第1期間P1の終了時における第1カウント値は、CK_P1個と表されるとする。第3期間P3の終了時における第1カウント値は、CK_P3個と表されるとする。
ラッチ20は、PPS信号がHIからLOになるタイミングで、第1カウンタ10から入力されている第1カウント値をラッチしてPPS間クロック数(CT_CKP)として出力する。したがって、第1期間P1における第1カウント値がCK_P1個であった場合、ラッチ20は、第2期間P2において、PPS間クロック数としてCK_P1を出力し続ける。同様に、ラッチ20は、第3期間P3において、PPS間クロック数としてCK_P2を出力し続ける。
小数点位置変更回路30は、ラッチ20から入力されるPPS間クロック数のデータにおいて、小数点位置を23ビットだけ上位に変更し、所定期間クロック数(CT_NS)として出力する。第2期間P2における所定期間クロック数は、CN_P1個であるとする。同様に、第3期間P3における所定期間クロック数は、CN_P2個であるとする。
第1整数/小数分離回路40は、所定期間クロック数の整数データ(INT_CT_NS)と、小数データ(REM_CT_NS)とを出力する。第2期間P2における所定期間クロック数の整数データ及び小数データは、それぞれCI_P1個及びCR_P1個であるとする。同様に、第2期間P2における所定期間クロック数の整数データ及び小数データは、それぞれCI_P2個及びCR_P2個であるとする。
本実施形態において、第1期間P1において第1カウンタ10でカウントしたクロック数が250012501個だったとする。この場合、CK_P1=250012501(個)となる。また、CN_P1=250012501×2^−23=29.80381262(個)となる。つまり、約119nsの間のクロック数は、29.80381262(個)となる。そして、CI_P1=29、及び、CR_P1=0.80381262となる。
時刻データ生成器60において、約119nsの間のクロック数が29.80381262(個)に達する毎にFS時刻データに119209290[fs]が加算される場合、FS時刻データと実際の時刻との誤差がゼロになる又はゼロに近づけられる。しかし、クロック数は、整数値でしかカウントできない。つまり、クロック数は、CI_P1の値である29個としかカウントされない。そこで、フラグ生成器50において、CR_P1=0.80381262の分を考慮したカウントが実行される。
図6を参照して、第2期間P2における、フラグ生成器50及び時刻データ生成器60の各構成部の動作が説明される。第2期間P2において、フラグ生成器50に入力される所定期間クロック数の整数データ(INT_CT_NS)及び小数データ(REM_CT_NS)は、それぞれCI_P1及びCR_P1である。
第2期間P2は、フラグ(FL)がHIからLOになるタイミングでN個の区間に分けられるとする。第2期間P2の開始からフラグ(FL)がHIからLOになるタイミングが初めて来るまでの区間は、第1区間とも称される。続く区間はそれぞれ、第2区間、・・・、第N区間とも称される。
<フラグがHIからLOになるタイミングが初めて来るまでの区間>
第2期間P2の開始からフラグ(FL)がHIからLOになるタイミングが初めて来るまでの区間、すなわち第1区間において、フラグ生成器50の内部のデータの値は、以下の文字変数で表されるとする。
積み残し整数データ(INT_SUM):SI_Q1
積み残し小数データ(REM_SUM):SR_Q1
小数部積み残し合計値(SUM_REM):SUM_Q1
加算クロック数(INT_CT_ADD):CA_Q1
各データは、以下の値になっている。
SI_Q1=0、SR_Q1=0
SUM_Q1=CR_P1+SR_Q1
=0.80381262+0=0.80381262
CA_Q1=CI_P1+SI_Q1
=29+0=29
この場合、CA_Q1=29であることから、比較器54は、加算クロック数として入力されている29と第2カウント値とを比較する。比較器54は、第2カウント値が29未満である場合にフラグ(FL)としてLOを出力し、第2カウント値が29以上になったとき又は第2カウント値が29に到達したときにフラグ(FL)としてクロック1個分の長さでHIを出力する。
また、第1区間において、時刻データ生成器60の内部のデータの値は、以下の文字変数で表されるとする。
FS時刻データ(TIME_FS):FS_Q1
NS時刻データ(TIME_NS):NS_Q1
時刻データ(TIME_DATA):TM_Q1
各データの値は、第2期間P2の開始時点でゼロにクリアされている。よって、各データの値は、以下のようになっている。
FS_Q1=0、NS_Q1=0、TM_Q1=0
<フラグがHIからLOになるタイミングが初めて来たときの動作>
フラグ(FL)がHIからLOになるタイミングで第2整数/小数分離回路52が出力を更新することによって、INT_SUM及びREM_SUMの値が更新される。INT_SUM及びREM_SUMの値が更新されることによって、SUM_REM及びINT_CT_ADDが更新される。また、フラグ(FL)がHIからLOになるタイミングで第2カウンタ55がリセットされることによって、第2カウント値が1に初期化される。
また、フラグ(FL)がHIからLOになるタイミングで、時刻データ生成器60の第3加算器62が出力を更新することによって、FS時刻データが更新される。FS時刻データが更新されることによって、NS時刻データ及び時刻データが更新される。
<フラグがHIからLOになる2回目のタイミングが来るまでの区間>
フラグ(FL)がHIからLOになる2回目のタイミングが来るまでの区間、すなわち第2区間において、フラグ生成器50の内部のデータの値は、以下の文字変数で表されるとする。
積み残し整数データ(INT_SUM):SI_Q2
積み残し小数データ(REM_SUM):SR_Q2
小数部積み残し合計値(SUM_REM):SUM_Q2
加算クロック数(INT_CT_ADD):CA_Q2
各データの値は、フラグ(FL)がHIからLOになったタイミングで更新されたことによって、以下の値になっている。
SI_Q2=int(SUM_Q1)
=int(0.80381262)=0
SR_Q2=rem(SUM_Q1)
=rem(0.80381262)=0.80381262
SUM_Q2=CR_P1+SR_Q2
=0.80381262+0.80381262
=1.60762524
CA_Q2=CI_P1+SI_Q2
=29+0=29
ここで、int(・)は、引数の整数部を出力する関数であるとする。rem(・)は、引数から整数部を引いた値、つまり引数の小数部を出力する関数であるとする。
この場合、CA_Q2=29であることから、比較器54は、加算クロック数として入力されている29と第2カウント値とを比較する。比較器54は、第2カウント値が29未満である場合にフラグ(FL)としてLOを出力し、第2カウント値が29以上になったとき又は第2カウント値が29に到達したときにフラグ(FL)としてHIを出力する。
また、第2区間において、時刻データ生成器60の内部のデータの値は、以下の文字変数で表されるとする。
FS時刻データ(TIME_FS):FS_Q2
NS時刻データ(TIME_NS):NS_Q2
時刻データ(TIME_DATA):TM_Q2
各データの値は、フラグ(FL)がHIからLOになったタイミングで更新されたことによって、以下のようになっている。
FS_Q2=FS_Q1+K
=0+119209290=119029290
NS_Q2=FS_Q2×(1e−6)=119
TM_Q2=clip(NS_Q2)=119
ここで、clip(・)は、引数が上限値以下である場合に引数をそのまま出力し、引数が上限値を超える場合に上限値を出力する関数であるとする。
<フラグがHIからLOになる2回目のタイミングが来たときの動作>
フラグ(FL)がHIからLOになる2回目のタイミングでも第2整数/小数分離回路52が出力を更新することによって、INT_SUM及びREM_SUMの値が更新される。INT_SUM及びREM_SUMの値が更新されることによって、SUM_REM及びINT_CT_ADDが更新される。また、フラグ(FL)がHIからLOになる2回目のタイミングでも第2カウンタ55がリセットされることによって、第2カウント値が1に初期化される。
また、フラグ(FL)がHIからLOになるタイミングで、時刻データ生成器60の第3加算器62が出力を更新することによって、FS時刻データが更新される。FS時刻データが更新されることによって、NS時刻データ及び時刻データが更新される。
<フラグがHIからLOになる3回目のタイミングが来るまでの区間>
さらに、フラグ(FL)がHIからLOになる3回目のタイミングが来るまでの区間、すなわち第3区間において、フラグ生成器50の内部のデータの値は、以下の文字変数で表されるとする。
積み残し整数データ(INT_SUM):SI_Q3
積み残し小数データ(REM_SUM):SR_Q3
小数部積み残し合計値(SUM_REM):SUM_Q3
加算クロック数(INT_CT_ADD):CA_Q3
各データは、以下の値になっている。
SI_Q3=int(SUM_Q2)
=int(1.60762524)=1
SR_Q3=rem(SUM_Q2)
=rem(1.60762524)=0.60762524
SUM_Q3=CR_P1+SR_Q3
=0.80381262+0.60762524=1.41143786
CA_Q3=CI_P1+SI_Q3
=29+1=30
この場合、CA_Q3=30であることから、比較器54は、加算クロック数として入力されている30と第2カウント値とを比較する。比較器54は、第2カウント値が30未満である場合にフラグ(FL)としてLOを出力し、第2カウント値が30以上になったとき又は第2カウント値が30に到達したときにフラグ(FL)としてHIを出力する。
また、第3区間において、時刻データ生成器60の内部のデータの値は、以下の文字変数で表されるとする。
FS時刻データ(TIME_FS):FS_Q3
NS時刻データ(TIME_NS):NS_Q3
時刻データ(TIME_DATA):TM_Q3
各データの値は、フラグ(FL)がHIからLOになったタイミングで更新されたことによって、以下のようになっている。
FS_Q3=FS_Q2+K
=119209290+119209290=238418580
NS_Q3=FS_Q3×(1e−6)=238
TM_Q3=clip(NS_Q3)=238
<フラグがHIからLOになる3回目のタイミングが来たときの動作>
フラグ(FL)がHIからLOになる3回目のタイミングでも第2整数/小数分離回路52が出力を更新することによって、INT_SUM及びREM_SUMの値が更新される。INT_SUM及びREM_SUMの値が更新されることによって、SUM_REM及びINT_CT_ADDが更新される。また、フラグ(FL)がHIからLOになる3回目のタイミングでも第2カウンタ55がリセットされることによって、第2カウント値が1に初期化される。
また、フラグ(FL)がHIからLOになるタイミングで、時刻データ生成器60の第3加算器62が出力を更新することによって、FS時刻データが更新される。FS時刻データが更新されることによって、NS時刻データ及び時刻データが更新される。
<フラグがHIからLOになる4回目のタイミングが来るまでの区間>
さらに、フラグ(FL)がHIからLOになる4回目のタイミングが来るまでの区間、すなわち第4区間において、フラグ生成器50の内部のデータの値は、以下の文字変数で表されるとする。
積み残し整数データ(INT_SUM):SI_Q4
積み残し小数データ(REM_SUM):SR_Q4
小数部積み残し合計値(SUM_REM):SUM_Q4
加算クロック数(INT_CT_ADD):CA_Q4
各データは、以下の値になっている。
SI_Q4=int(SUM_Q3)
=int(1.41143786)=1
SR_Q4=rem(SUM_Q3)
=rem(1.41143786)=0.41143786
SUM_Q4=CR_P1+SR_Q4
=0.80381262+0.41143786=1.21525048
CA_Q4=CI_P1+SI_Q4
=29+1=30
この場合、CA_Q4=30であることから、比較器54は、加算クロック数として入力されている30と第2カウント値とを比較する。比較器54は、第2カウント値が30未満である場合にフラグ(FL)としてLOを出力し、第2カウント値が30以上になったとき又は第2カウント値が30に到達したときにフラグ(FL)としてHIを出力する。
また、第4区間において、時刻データ生成器60の内部のデータの値は、以下の文字変数で表されるとする。
FS時刻データ(TIME_FS):FS_Q4
NS時刻データ(TIME_NS):NS_Q4
時刻データ(TIME_DATA):TM_Q4
各データの値は、フラグ(FL)がHIからLOになったタイミングで更新されたことによって、以下のようになっている。
FS_Q4=FS_Q3+K
=238418580+119209290=357627870
NS_Q3=FS_Q3×(1e−6)=358
TM_Q3=clip(NS_Q3)=358
なお、NS_Q3の算出において、小数点以下の端数は四捨五入で処理されているとする。端数は、切り捨てられてもよいし、切り上げられてもよい。
<フラグがHIからLOになる4回目のタイミングが来たときの動作>
フラグ(FL)がHIからLOになる4回目のタイミングでも第2整数/小数分離回路52が出力を更新することによって、INT_SUM及びREM_SUMの値が更新される。INT_SUM及びREM_SUMの値が更新されることによって、SUM_REM及びINT_CT_ADDが更新される。また、フラグ(FL)がHIからLOになる4回目のタイミングでも第2カウンタ55がリセットされることによって、第2カウント値が1に初期化される。
また、フラグ(FL)がHIからLOになるタイミングで、時刻データ生成器60の第3加算器62が出力を更新することによって、FS時刻データが更新される。FS時刻データが更新されることによって、NS時刻データ及び時刻データが更新される。
以下、フラグ生成器50及び時刻データ生成器60は、PPS信号がHIになるタイミングが来るまで同様の動作を繰り返す。
以上述べてきたように、時刻生成装置1は、フラグ(FL)がHIからLOになるタイミングで分けられる各区間において、小数部積み残し合計値に基づいて加算クロック数を制御する。時刻生成装置1は、加算クロック数を29にしたり30にしたりすることによって、長期間にわたって加算クロック数を平均化した値が、小数部を含む所定期間クロック数に近づけられる。その結果、所定期間クロック数の端数である小数部に起因する時刻データの誤差が低減される。
<区間が2つの期間にまたがる場合の動作>
図7を参照して、区間が2つの期間にまたがる場合の動作が説明される。図7において、PPS信号(PPS)及びクロック信号(CK)は、縦棒で表されている。縦棒の位置は、各信号のパルスが立ち下がるタイミングを表すとする。
図7において、第2期間P2は、第1区間から第N区間までを含んでいる。第1区間から第(N−1)区間までの各区間は、第2期間P2に含まれる。第N区間は、第2期間P2と第3期間P3とにまたがることがある。第N区間は、第2期間P2が終了するタイミングで終了することもある。本実施形態において、第N区間は、第2期間P2と第3期間P3とにまたがるとする。
図7に、各区間でカウントするクロック数が記載されている。各区間でカウントするクロック数は、M、又は、(M+1)のいずれかである。Mは、所定期間クロック数の整数データ(INT_CT_NS)に等しい。つまり、各区間でカウントするクロック数は、所定期間クロック数の整数データの値、又は、その値に1を加えた値のいずれかである。各区間におけるクロック数は、積み残し整数データ(INT_SUM)が0である場合にMとなり、積み残し整数データ(INT_SUM)が1である場合に(M+1)となる。図7の第2期間P2に含まれる各区間のクロック数は、図6に例示された値に基づいて定まる。例えば、第2期間P2の第1区間においてカウントするクロック数は、Mで表されている。第2期間P2の第3区間においてカウントするクロック数は、(M+1)で表されている。
各区間におけるフラグ生成器50及び時刻データ生成器60の各データの値は、以下の文字変数で表されるとする。
積み残し小数データ(REM_SUM):SR_Q1、・・・、SR_QN
小数部積み残し合計値(SUM_REM):SUM_Q1、・・・、SUM_QN
FS時刻データ(TIME_FS):FS_Q1、・・・、FS_QN
時刻データ(TIME_DATA):TM_Q1、・・・、TM_QN
各データのうち、第1区間から第4区間までのデータに関する説明は、既に図6に基づいて説明されている。
第N区間におけるデータの値は、QNが付された、SR_QN、SUM_QN、FS_QN、及びFS_QN等の文字変数で表される。第N区間における各データの値は、以下の各式に基づいて算出される。
SR_QN=rem(SUM_QN-1)
SUM_QN=CR_P1+SR_QN
FS_QN=FS_QN-1+K
TM_QN=clip(FS_QN×(1e−6))
ここで、clip(・)は、引数が上限値以下である場合に引数をそのまま出力し、引数が上限値を超える場合に上限値を出力する関数であるとする。
本実施形態において、各データの値は、具体的に以下のようになる。
SR_QN=0.17082034
SUM_QN=0.97463296
FS_QN=1000000003768320
TM_QN=999999999
TM_QNの値は、NS_QNの値がFS_QN×(1e−6)=1000000004となることによって、上限値の999999999にされている。
第2期間P2の第N区間の途中で、PPS信号がHIからLOになるタイミングが到来する。このタイミングで、第2期間P2が終了し、第3期間P3が開始する。FS_QN及びTM_QNの値は、第N区間の途中であっても期間の変更のタイミングでゼロにクリアされる。これによって、時刻生成装置1は、時刻データをPPS信号に同期させてゼロから生成することができる。
また、第3期間P3が開始するタイミングで、PPS間クロック数(CT_CKP)は、第2期間P2の間に第1カウンタ10でカウントしたクロック数を表すCK_P2に更新される。PPS間クロック数が更新されたことによって、所定期間クロック数(CT_NS)は、CN_P2に更新される。また、所定期間クロック数の整数データ(INT_CT_NS)及び小数データ(REM_CT_NS)はそれぞれ、CI_P2及びCR_P2に更新される。図7において、所定期間クロック数の小数データ(REM_CT_NS)を表す文字変数は、第2期間P2においてCR_P1と記載され、第3期間P3においてCR_P2と記載されている。また、期間の変更のタイミングで所定期間クロック数(CT_NS)が変更されることに伴って、小数部積み残し合計値(SUM_REM)の値が変更される。図7において、第N区間の小数部積み残し合計値(SUM_REM)は、第2期間P2と第3期間P3とで区別可能に記載されている。第N区間の小数部積み残し合計値(SUM_REM)は、期間変更前においてSUM_QNで表され、期間変更後においてSUM_Q0で表されるとする。図7において、SUM_Q0は、簡略化されてQ0と表されている。
本実施形態において、第2期間P2でカウントされたPPS間クロック数は、249987654個であるとする。つまり、CK_P2=249987654であるとする。この場合、所定期間クロック数は、29.80085063個になる。つまり、CN_P2=29.80085063である。所定期間クロック数の整数データは、29になる。つまり、CI_P2=29である。所定期間クロック数の小数データは、0.80085063になる。つまり、CR_P2=0.80085063である。この場合、第N区間の途中で第3期間P3が開始した場合の小数部積み残し合計値は、0.97167097となる。つまり、SUM_Q0=0.97167097となる。
<フラグがHIからLOになるタイミングが期間をまたいで初めて来たときの動作>
フラグ(FL)がHIからLOになるタイミングが第3期間P3の開始後に初めて来たときに、第2期間P2から続く第N区間が終了し、第3期間P3の第1区間が開始する。
フラグ(FL)がHIからLOになるタイミングで第2整数/小数分離回路52が出力を更新することによって、INT_SUM及びREM_SUMの値が更新される。INT_SUM及びREM_SUMの値が更新されることによって、SUM_REM及びINT_CT_ADDが更新される。また、フラグ(FL)がHIからLOになるタイミングで第2カウンタ55がリセットされることによって、第2カウント値が1に初期化される。
また、フラグ(FL)がHIからLOになるタイミングで、時刻データ生成器60の第3加算器62が出力を更新することによって、FS時刻データが更新される。FS時刻データが更新されることによって、NS時刻データ及び時刻データが更新される。
第3期間P3の第1区間における、フラグ生成器50及び時刻データ生成器60の内部のデータの値は、以下の文字変数で表されるとする。図7に記載した文字変数は、簡略化のために「@P3」を省略している。
積み残し小数データ(REM_SUM):SR_Q1@P3
小数部積み残し合計値(SUM_REM):SUM_Q1@P3
FS時刻データ(TIME_FS):FS_Q1@P3
時刻データ(TIME_DATA):TM_Q1@P3
小数部積み残し合計値(SUM_REM)について、第2期間P2の第N区間の途中で第3期間P3が開始した場合の値は、上述のとおりSUM_Q0で表されるが、他のデータの文字変数と合わせるために「@P3」を付して、SUM_Q0@P3とも表される。
第3期間P3の第1区間における各データの値は、以下の各式に基づいて算出される。ここで、第2期間P2の第N区間のデータを表す文字変数に、識別のために「@P2」が付されている。
SR_Q1@P3=rem(SUM_Q0@P3)
SUM_Q1@P3=CR_P2+SR_Q1@P3
FS_Q1@P3=0+K
TM_Q1@P3=clip(FS_Q1@P3×(1e−6))
各データの値は、フラグ(FL)がHIからLOになったタイミングで更新されることによって、具体的に以下の値になる。
SR_Q1@P3=rem(0.97167097)=0.97167097
SUM_Q1@P3=0.80085063+0.97167097
=1.77252160
FS_Q1@P3=0+119209290=119209290
TM_Q1@P3=clip(119209290×(1e−6))=119
また、第3期間P3の第2区間における各データの値は、具体的に以下の値になる。
SR_Q2@P3=rem(SUM_Q1@P3)
=rem(1.77252160)=0.77252160
SUM_Q2@P3=CR_P2+SR_Q2@P3
=0.80085063+0.77252160
=1.57337223
FS_Q2@P3=FS_Q1@P3+K
=119209290+119209290=238418580
TM_Q2@P3=clip(FS_Q2@P3×(1e−6))
=clip(238418580×(1e−6))=238
以上述べてきたように、PPS信号がHIからLOになるタイミングで時刻データがゼロにリセットされることによって、各期間の開始から積み重なった時刻データの誤差がPPS信号の立ち下がり毎にゼロにリセットされる。また、第N区間が2つの期間にまたがる場合に第N区間のクロック数を次の期間に持ち越すことによって、次の期間における時刻データの誤差が低減され得る。
本実施形態に係る時刻生成装置1は、以下のように動作するといえる。
第1カウンタ10とラッチ20とは、PPS信号の立ち下がりエッジのタイミングに基づいて、例えば第1期間P1の間に取得したクロック数をカウントし、次の第2期間P2においてPPS間クロック数として出力する。PPS間クロック数をカウントした期間は、第1基準期間とも称される。次の期間は第2基準期間とも称される。つまり、第1カウンタ10とラッチ20とは、第1基準期間の間に取得したクロック数をカウントし、次の第2基準期間において、PPS間クロック数として出力する。
小数点位置変更回路30は、PPS間クロック数の小数点位置を上位ビットに変更した所定期間クロック数を生成する。第1整数/小数分離回路40は、所定期間クロック数の整数部と小数部とを分離して出力する。
フラグ生成器50は、所定期間クロック数の整数部の値に基づいて加算クロック数を設定し、第2カウンタ55がカウントしたクロック数が加算クロック数以上になった場合にフラグ(FL)をHIにする。時刻データ生成器60は、フラグ(FL)がHIになったタイミングで時刻データを更新する。つまり、時刻生成装置1は、フラグ生成器50と時刻データ生成器60とによって、第2カウンタ55がカウントしたクロック数が加算クロック数以上になった場合に時刻データを更新する。
小数点位置変更回路30と第1整数/小数分離回路40とフラグ生成器50と時刻データ生成器60とは、まとめて制御部とも称される。
本実施形態に係る時刻生成装置1は、以上のように動作することによって、入力されるクロック信号の周波数に誤差がある場合でも、時刻データと実際の時刻との誤差を小さくできる。
また、本実施形態に係る時刻生成装置1は、回路規模の大きくなる除算器を使わず、加算器及び乗算器で構成される回路規模を小さくできる回路を使うことによって、時刻データの誤差を低減する構成を実現できる。
また、本実施形態に係る時刻生成装置1は、外部から入力されるクロック信号の周波数が時間的にゆっくり変化する場合でも、基準期間ごとにクロック数をカウントして次の基準期間における制御に反映させることによって、クロック信号の周波数の変化に追従した高精度の時刻データを生成できる。その結果、時刻生成装置1は、クロック信号の周波数に要求される精度を低くしつつ、時刻データの精度を向上できる。したがって、クロック信号を生成する水晶発振器として、高精度の高価格のものではなく、低精度の安価なものが採用され得る。
本実施形態に係る時刻生成装置1は、更に以下のように動作するといえる。
フラグ生成器50は、所定期間クロック数の小数部の値を加算した小数部積み残し合計値を算出し、小数部積み残し合計値に更に基づいて加算クロック数を設定してもよい。また、フラグ生成器50は、加算クロック数を、小数部積み残し合計値の整数部と所定クロック数の整数部とを加算した値に設定してもよい。このようにすることで、時刻生成装置1は、加算クロック数に所定期間クロック数の端数を反映させることができ、加算クロック数に基づいて更新する時刻データの精度をさらに高めることができる。
時刻生成装置1の各構成部の少なくとも一部は、例えばCPU(Central Processing Unit)等のプロセッサを含んで構成されてよい。時刻生成装置1は、プロセッサに所定のプログラムを実行させることによって所定の機能を実現してもよい。時刻生成装置1は、記憶部を備えてもよい。記憶部は、時刻生成装置1の各構成部の動作に用いられる各種情報、又は、時刻生成装置1の各構成部の機能を実現するためのプログラム等を格納してよい。記憶部は、時刻生成装置1の各構成部のワークメモリとして機能してよい。記憶部は、例えば半導体メモリ等で構成されてよい。
以上説明してきた時刻生成装置1の各構成部の動作は、時刻生成装置1が実行する時刻生成方法とみなされる。また、以上説明してきた時刻生成装置1の各構成部の動作は、時刻生成装置1が備えるプロセッサに実行させる時刻生成プログラムとして実現されてもよい。時刻生成プログラムは、非一時的なコンピュータ読み取り可能媒体に格納されてもよい。
本開示に係る実施形態について、諸図面及び実施例に基づき説明してきたが、当業者であれば本開示に基づき種々の変形又は修正を行うことが容易であることに注意されたい。従って、これらの変形又は修正は本開示の範囲に含まれることに留意されたい。例えば、各構成部に含まれる機能などは論理的に矛盾しないように再配置可能であり、複数の構成部を1つに組み合わせたり、或いは分割したりすることが可能である。