Constant Fraction Discriminator(CFD)の実装
Cosmo-Zに放射線計測用の信号処理回路を実装しています。
ディジタル版のTFAとCFDと波形整形回路を作ろうとしているのですが、まずはCFDから作り始めています。
CFDというのは、入ってきたパルス(指数関数で減衰する波形)でトリガをかけようとした際に、パルスの高さによってトリガが発生する時刻が変わってしまうことを防ぐための回路です。
放射線の波形は、上の図のように、有限の時間で立ち上がったあと、指数関数的に減衰します。放射線のエネルギーによってピークの高さが違うのですが、立ち上がりや減衰の時定数は同じです。
このような波形に対してレベルでトリガをかけると、ピークの高さによってトリガがかかる時刻がずれてしまいます。
そのため、何時何分何ナノ秒でそのイベントが起きたかというのが、正確ではなくなってしまいます。
この問題に対処するのがConstant Fraction Discriminator(CFD)という回路です。
CFDの動作は簡単で、ある入力信号を減衰させた波形から、入力信号を一定時間遅延させた波形を引く、というものです。
負のパルスが入ると、出力はマイナスからプラスに転じるタイミングがあるのですが、そのタイミングは元の信号の高さに関わらず常に一定になるというのです。
実際にFPGAに実装して、試してみました。
下の図で、緑の波形が元の入力波形です。これは実際のシンチレータからの信号ではなく、FPGAの中で作り出したテスト波形です。茶色の波形が、CFDの出力です。遅延時間は5クロック(63ns)、減衰は×0.5にしています。
一度波形が下がったあと、急激に立ち上がって、ゼロをクロスしているのがわかります。
いくつもの波形を重ねて描いてみると・・・
たしかに、ピークの高さに関わらず、同じ場所でクロスしているような気がします。
うむ。完璧ですね。
さらに、ゼロクロスする前後の点の値から計算すれば、ゼロクロスする時刻を、クロック周期以上の精度で良く求められるはずです。
Cosmo-ZのADCクロックは最高125MHzなので、4nsの時間分解能ですが、CFDを使えば1nsくらいでイベントが生じた時刻を推測できるかもしれません。
| 固定リンク
コメント