2016.04.30
2016.04.29
秋葉原で買い物
今日は秋葉原でいろいろ買い物をしました。
まず、Agilentの標準信号発生器「E4432B」です。
これは、3GHzまでの変調(FSK,PSK,QAMなど)をかけた標準信号を発生させる機械です。
Cosmo-Zは最大125MHzでのサンプリングですが、それより高い周波数の信号を与えた場合の特性を測ったり、Cosmo-Z用の1GHzサンプリング拡張ボードを作ったりするときの検証に使う予定です。
機械としては様々な変調や任意のビットパターンで変調した信号を作れるようなのですが、とりあえずは正弦波発振器として使う予定です。
もちろん中古ですが、お店で測定してもらって、極めて正確な(7ケタだか9ケタだったか)周波数の精度が出ていることを確認してもらいました。
それから、秋月で、Raspberry Pi 3といろいろな周辺部品を購入しました。
本体とケースと、液晶と、雑誌とその部品セットなどです。
今はCosmo-Zのコントロールにパソコンが必要なのですが、パソコンを一緒に持ち運ばないと計測できないのは不便です。
そこで、タブレット型のコントロールパネルを内蔵した放射線計測装置が良いかなと思い、その研究用として買いました。
その夜は、RasPi3でたっぷり遊んで堪能しました。
2016.04.28
回路マンガ「おれデバ」第弐話をリニューアル
回路マンガ「おれデバ」の、とても久しぶりの更新です。
第弐話は展示会の話で、昨年11月に公開したのですが、尻切れトンボで終わっていました。今年から特電に新しく加わったスタッフさんが続きを書いてくれました。
本当は回路設計のマンガだったのですが、今回は、展示会出展の(裏)ノウハウを紹介しています。
http://www.tokudenkairo.co.jp/manga/
春や秋の展示会へ出展を検討されている皆さまには役に立つように、
展示会へお越しの予定の皆さまには共感してもらえるように、描いたつもりです。
また、P板.comがGW稼働してますキャンペーンとかいうのをやっていたので、この基板を出図しました。
これはCosmo-Zの拡張基板で、125MHz 14bit 2chのDAC出力基板です。
なぜか、RS-422の出力付という謎仕様です。
基板のほとんどの部分は、アルバイトの学生さんが4日間ほどで設計してくれました。最後に私が電源のSplit Planeを分けたり、配線の細かいチェックを行った程度で、基本的にはアルバイトさんが作ってくれたのです。嬉しいですね。
2016.04.27
MITOUJTAG BASIC/Pro 3.0をリリースしました
お待たせしました。
ついに、MITOUJTAG 3.0をリリースしました。
MITOUJTAGは
2003年度に未踏ソフトウェア創造事業で開発をスタートしてから、頻繁にバージョンアップしてきたのですが、バージョンアップ番号の上げ方が
0.2→0.24→1.0→1.2→1.24→1.25→1.5→2.0→2.1→2.3→2.4→2.5→2.6→2.9→3.0(たぶん)と、かなり控えめなので、14年目にして未だに3.0なのです。
各バージョンごとにかなり違いがあるので、実質的にはバージョン14くらいでしょう。
主な更新点は、
- いままでの更新パッチを累積したことと
- ユーザ用データのフォルダをマイドキュメント配下に変更したこと
- ユーザが作ったEXEファイルからJTAGファンクションジェネレータを呼び出せるようにした
- 複数のBLOGANA対応デバイスがつながっている場合のサポート
- XILINX Artix-7の小さいもの(XC7A15,35)の書き込みサポート
などです。
また、今回からはインストールイメージのダウンロードもできるようにしました。
現在、MITOUJTAGをお使い(でライセンスの有効期間内の方)は、下記のページから無償でダウンロードできます。
https://www.tokudenkairo.co.jp/login2/download.php
ダウンロードで迅速に提供しますが、もちろん従来どおりCD-ROMも付けて販売します。
今回の目玉機能である、MITOUJTAG ProのJTAGファンクションジェネレータのリモート化を使うには、ファイルの「アプリケション・データ・フォルダを開く」を行ってください。
MITOUJTAGのデータフォルダが入ったフォルダが開きます。
この中のAjfgRemoteを開きます。
中にはAjfgClient.dllとAjfgClient.libとAjfgClient_vc.libとjtagscr.hが入っています。
VisualC++で使う場合には、
cl userprogram.cpp AjfgClient_vc.lib
でコンパイルします。
BorlandC++で使う場合には、
cl userprogram.cpp AjfgClient.lib
でコンパイルします。
これで、貴方の作ったプログラムからJTAGスクリプトを呼び出すことができます。
JTAGスクリプトの書き方は、一昨日のブログ
http://nahitafu.cocolog-nifty.com/nahitafu/2016/04/mram-74d8.html
を参考にしてください。
今回からダウンロードでの提供を開始した理由は、CD-ROMというメディアは時代遅れなのと、CD-ROMが存在しないPCも多いことなどです。
ですが、特電はCD-ROMを無くすことはしません。
「ダウンロードのみ」という形のないものだと、大手の企業様や学校などでは検収がやりづらいと思われるからです。
従来のように「CD-ROMに入ったソフト」と、「JTAGケーブル」と「印刷されたマニュアル」があればどの企業様でも問題なく検収を上げていただくことができるでしょう。
でも、ダウンロード販売ONLYにしてクレジット払いとかのイマドキ風にするとどうでしょう?
大手様や学校様では、形がないものに対する検収が難しいかもしれません。帳簿上は、機械工具器具、備品消耗品ではなく、支払手数料(会計規則上クラウドサービスのような物を伴わないサービスは支払手数料として仕訳するルールになっている)になるのかもしれません。
実際に私も支払手数料という仕訳は好きではありませんし、この仕訳を避けたくなる会社もあるはずです。
だから、CD-ROMをJTAGケーブルと紙のマニュアルはなくさないことにしているのです。
2016.04.25
MRAMをバウンダリスキャンで操作する
MRAMというメモリがあります。何やら磁気を利用したメモリらしいのですが、メリットは、
- 書き換え回数の制限がない(FlashROMより優れている)
- SRAM並に高速(DRAMより優れている)
- 不揮発性
ということらしいです。
さて、今月、MITOUJTAGをお買い上げいただいたお客様から、バウンダリスキャンでMRAMを書き換えできないかという問い合わせをいただいたので、実際に試してみました。
私はMRAMの単品は持っていなかったのdですが、ちょうどヒューマンデータ製のFPGAボード(XCM-022)がMRAMを搭載していて、そのXCM-022を乗せた試作ボードがあったので、そのシステムを使ってMRAMの実験をしてみることにしまいた。
MITOUJTAG Proには、アドバンスドJTAGファンクションジェネレータ(AJFG)、JTAGスクリプトといって、FPGAの端子をC++言語で書いたとおりに動かす機能があります。
ここでは、そのJTAGスクリプトを使ってFPGA(XC7K160T)の端子を動かし、MRAMにアクセスしてみました。
まず、仕様しているMRAMは、Everspin社のMR2A16AMA35だそうです。
※このEVERSPINという社名を聞いて思わず笑ってしまいました。素晴らしい社名です。とてもセンスがあります。
データシートを見て驚いたのは、SPI ROMやDDR2 SDRAMのようなコマンドがないこと。普通のSRAMと同じように使えばよいのです。これは楽だ・・・・
まずは、ピン配置ファイルを作ります。俗に言うUCFです。
NET "MRAM_WE" LOC="F21"; NET "MRAM_OE "LOC="J22"; NET "MRAM_DQU<15>" LOC="U20"; NET "MRAM_DQU<14>" LOC="T20"; NET "MRAM_DQU<13>" LOC="R19"; NET "MRAM_DQU<12>" LOC="P19"; NET "MRAM_DQU<11>" LOC="P20"; NET "MRAM_DQU<10>" LOC="N19"; NET "MRAM_DQU<9>" LOC="L21"; NET "MRAM_DQU<8>" LOC="K21"; NET "MRAM_DQL<7>" LOC="L20"; NET "MRAM_DQL<6>" LOC="K19"; NET "MRAM_DQL<5>" LOC="L18"; NET "MRAM_DQL<4>" LOC="K16"; NET "MRAM_DQL<3>" LOC="V17"; NET "MRAM_DQL<2>" LOC="J19"; NET "MRAM_DQL<1>" LOC="M16"; NET "MRAM_DQL<0>" LOC="J20"; NET "MRAM_CE" LOC="F20"; NET "MRAM_BE<1>" LOC="J21"; NET "MRAM_BE<0>" LOC="K22"; NET "MRAM_A<18>" LOC="N18"; NET "MRAM_A<17>" LOC="P17"; NET "MRAM_A<16>" LOC="R17"; NET "MRAM_A<15>" LOC="M21"; NET "MRAM_A<14>" LOC="U16"; NET "MRAM_A<13>" LOC="M20"; NET "MRAM_A<12>" LOC="K17"; NET "MRAM_A<11>" LOC="H20"; NET "MRAM_A<10>" LOC="R18"; NET "MRAM_A<9>" LOC="T19"; NET "MRAM_A<8>" LOC="M18"; NET "MRAM_A<7>" LOC="M17"; NET "MRAM_A<6>" LOC="N20"; NET "MRAM_A<5>" LOC="G22"; NET "MRAM_A<4>" LOC="H22"; NET "MRAM_A<3>" LOC="E22"; NET "MRAM_A<2>" LOC="G20"; NET "MRAM_A<1>" LOC="G21";
このUCFをMITOUJTAGで処理すると、↓のようなピン定義ファイルになります。
MRAM_WE F21 MRAM_OE J22 MRAM_DQ U20 T20 R19 P19 P20 N19 L21 K21 L20 K19 L18 K16 V17 J19 M16 J20 MRAM_CE F20 MRAM_BE J21 K22 MRAM_A N18 P17 R17 M21 U16 M20 K17 H20 R18 T19 M18 M17 N20 G22 H22 E22 G20 G21
それから、JTAGスクリプトを書きます。
#include "default.h" #include "conio.h" JEXPORT int jmain() { j_bypass(); j_sample();j_extest(); // AJFGで端子を操作するにはこの行を有効にしてください int addr = 0; MRAM_WE = "1"; MRAM_OE = "1"; MRAM_CE = "1"; MRAM_BE <= "00"; MRAM_CE = "0"; printf("Skip MRAM write (Y/n) ?\n"); if(getch() == 'n'){ printf("Write to MRAM...\n"); for(int addr=0;addr < 1000;addr++) { MRAM_A = addr; MRAM_DQ = ~addr; MRAM_WE <= "0"; MRAM_WE <= "1"; } } MRAM_OE = "0"; MRAM_CE = "0"; MRAM_DQ <= "Z"; printf("Read from MRAM...\n"); for(int addr=0;addr < 1000;addr++) { MRAM_A <= addr; if((addr & 7) == 0) printf("%08lx : ",addr); printf("%04x ",(int)MRAM_DQ); if((addr & 7) == 7) printf("\n"); } MRAM_OE <= "1"; MRAM_CE <= "1"; return 0; }
普通のC言語のように見えますが、高位合成じゃなくてJTAGスクリプトです。ここで書いたMRAM_CEやMRAM_Aといった変数が変化すると、実際のFPGAの端子が動くというものです。
上のプログラムを実行すると、DOSプロンプトが開いて、このように表示されます。
そして、そのときの端子の波形がJTAGロジアナに表示されます。
赤い波形が出力ピン、緑の波形は入力ピンです。書いてから読んでいるので、DQ端子は赤から緑に変化しているのがわかります。
結論をいうと、SRAMと同じ手順でアクセスできました。これは、DDRメモリやFlashROM、SPI Flashと比べてはるかに楽です。この手軽さには、かなり感動しました。
私はMRAMの特徴(メリット)に
- 伝統的なパラレルSRAMと同じ手順で簡単にアクセスできる
もあると、声を大きくして言いたいです。
2016.04.23
2016.04.22
ベースライン回復回路
ベースライン回復回路(Base Line Restorer)という回路を作っています。
こういうパルスの高さを計測する場合を考えてみます。
0Vからのパルスの高さを図りたいのですが、交流結合していると、ベースラインがシフトしてしまいます。
ベースラインがずれると、パルスの高さが減ってしまうわけです。
放射線の信号は不定期に入ってくるので、真の値から少し減った値(しかも毎回異なる)が計測されることになります。
これでは都合が悪いので、ベースライン回復回路というものが間に入ることになります。Knoll本とかによればこういう回路なのですが、
このスイッチを入れる条件がどうもわかりませんでした。
先日、市販のBLRハイブリッドICの回路図を見つけ、ようやくわかりました。
出力電圧が負になったときにスイッチをONにし、出力電圧が正の場合にはスイッチをOFFにすればよいのです。単純です。
つまり、出力が正の場合はCRの時定数が大きいのでゆるゆるにすべて通し、出力が負になったらスイッチを閉じてCを急速に充電し、0V付近にとどめるというわけです。
これをFPGA内のディジタル信号処理でやってみました。
茶色が入力信号、緑が出力信号です。茶色の信号はTFAの出力で、0.1Vのバイアスが乗っていますが、BLRを通すとバイアスも消えます。
拡大すると、
緑の線がちょこっとだけ持ち上がりますが、速やかに0Vに戻っています。
一方、台形波形整形回路の出力にBLRを通した場合は、
一見、大丈夫なように見えますが・・・
平らな部分でサグが出ています。時定数がある回路なので、正確な波形にはならないです。
今回実装したBLR回路は、絵に描けば、ダイオードを使ったような簡単なものです。
ほかにも、いろいろなアルゴリズムがあるようです。この回路はShaperの後ろではなくTFAの後ろに入れるのが正しいのではないかと思います。
2016.04.19
フォトマル用のプリアンプを入れてみた
最近のCosmo-Zは、入力のアンチエイリアシングフィルタの遮断周波数を60MHzに上げたので、高周波特性が良くなりました。
しかし、その分、幅の鋭いパルスの計測が難しくなりました。
例えば、プラスチックシンチレータとフォトマルから出てくる信号は数nsくらいの幅しかないそうなのですが、この鋭いパルスをCosmo-Zで受け取ると何が何だかわからない結果となります。
現在、特電でCosmo-Zの実験に使っているβ線、γ線、ミューオン用の検出器はこんな感じです。
上の写真の真ん中にある円柱の中に、プラスチックシンチレータとフォトマルが入っています。いままではフォトマルからCosmo-Zまで直結していたので信号レベルが弱くて困っていました。
今回、フォトマルの下にある四角い箱の中にアンプを入れてみました。フォトマルの近くにアンプがあれば、ノイズの影響を受けにくいと考えたからです。
まず、フォトマルからCosmo-Zへ直結した場合の波形。
酷い時には信号が1クロック分しかないなど、これでは信号処理のしようがありません。
ですが、この信号をCosmo-Zの基板上のゲインをいじって、単純に増幅すると、ケーブルがノイズをひろっているらしくて、S/Nがあまり向上しないのです。
そこで、フォトマルの近くにアンプを入れました。
結果
直結した場合に比べて波形がはっきりしてきました。
幅が50nsくらい、高さが250mV程度です。
できればパルスストレッチャーを入れて、もう少し良く見えるようにしたいところです。
この波形ならMCAも使えるようです。
さあ、意味のあるデータが取れればよいのですが・・
2016.04.18
ピークホールド回路
Cosmo-Zを、フルディジタルな放射線計測用信号処理システム(DSP)とするため、FPGAの開発を続けています。
今日はピーク・ホールド(Peak Hold)回路を作りました。ピーク・ホールド回路とは、その名のとおり最大値を保持する回路です。
トリガが入っている間の最大値(あるいは最小値)を保持します。なお、茶色の線が入力信号。赤の線がピークホールド出力。灰色の線がトリガ期間を示します。
いろいろな高さの波形が入ったときの動作は、こんな感じです。
この波形は、FPGA内で作り出したテスト波形でしたが、実際にプラスチックシンチレータとフォトマルをつないで、バックグラウンドの波形でやってみました。
横の1ポイントは12.5nsに相当します。ちゃんとピークをホールドしてくれているのがわかります。
2016.04.13
Cosmo-Zのパルス整形機能がだいたいできた
ZYNQ搭載のADCボード「Cosmo-Z」に、放射線計測用のデジタルパルス整形機能がだいたいできてきました。
現在のCosmo-Zの内部構造はだいたいこのような感じになりました。
入力された信号にオフセットとゲインと遅延を与え、TFAでパルスを鋭くしてCFDでタイミングを確定させ、台形整形回路で弾道欠損を補正して波形モニタで取るという感じです。
ただ、普通はCFDの出力をTrapezoidal Shaperに入れることはしないので、このデータパスについては、まだまだ検討の余地はありそうです。
任意のチャネルでRise/Fallのトリガもかけられるようになりました。トリガレベルの設定は画面上でマウスでクリックすればよいので簡単です。
TFAやCFDの設定も、Windows上で設定できるようになったので、とても操作が楽になりました。下の図では緑が入力信号、青がTFA出力、茶色がCFD出力です。
台形型波形整形回路も無事に動くようになりました。
これで、Cosmo-Zのディジタル波形整形回路はひとまず完成です。
次はプログラマブル・ゲート・ジェネレータを作りたいと思います。
2016.04.09
TFAのディジタル化
放射線の計測、特にゲルマニウム検出器(HPGe)などでは、TFA(Timing Filter Amplifier)という回路がよく使われます。TFAというのは、入ってきたパルスの幅を鋭くしてタイミングをはっきりさせるためのもので、市販のモジュールではORTEC社の474などが有名です。
(ORTECのカタログのPDFより引用)
このモジュールでは、ゲインの調整、積分時定数の調整、微分時定数の調整、ポールゼロの調整、反転・非反転の切り替えなどができます。微分・積分の時定数は、なし~500nsまで段階的に調整できるようです。
そもそもTFAはどんな回路かというと、
このような、CR微分回路とRC微分回路をくっつけたものです。間にバッファが入っていて、インピーダンスの隔離ができています。
これをディジタル回路で実現しようとしているのですが、昨日は微分回路のディジタルフィルタ化ができたので、今日は積分回路をディジタル化しようとしています。
RCの積分回路をディジタルで実現すると、
y[k] = by[k-1] + a[k] ・・・ (1)
ただし、a=1/(1+τ)、b=τ/(1+τ)、τ=CR/T ※T=サンプリング周波数
で実現できます。つまり、1個前の出力結果と、新しい入力を適当な比で足し合わせたものになります。
なお、回路全体にゲインを持たせたい場合は、aの代わりにa×Gにすればよいでしょう。
実際にFPGAに実装して、やってみました。
こんなコントロールパネルから、時定数やゲインを滑らかに変えられるようにしました。
まず、微分の時定数が0.5usで積分の時定数が0(積分なし)の場合。微分のみの出力が得られています。
次は微分が0.5us、積分も0.5usの場合。積分はLPFなので出力振幅が減ってしまうので、ゲインを2倍にしています。なんとなくパルスが広がったのがわかります。
今度は積分の時定数を1.5usにした場合。
せっかく鋭くしたパルスを広げてどうするのかと言われそうですが、あくまでも動作テストなので。
最後に、TFAとCFD(Constant Fraction Discriminator)を通した波形を示します。
データの点に■を付けてみました。最初の10個くらいの部分が重要なのがわかります。緑の波形が乳慮kう波形。青がTFA出力、茶色がCFDの出力です。
入力された長いテイルの波形が鋭くなって、ゼロクロスによってタイミングがはっきりと確定しています。
このように、TFA+CFDという、放射線計測でよく使われる波形整形回路がディジタル化できました。
ディジタルフィルタってのは実際に作ってみると面白いですね。パラメータを滑らかに変更できるのが最高です。
2016.04.08
CR微分回路のディジタルフィルタ化
放射線計測などの分野では、指数関数的に減衰するパルスを扱うことがあります。減衰の時定数が長いと、1回目のパルスの尾の部分で2回目のパルスが入る(パイルアップするという)ってパルス高さの正確な測定ができなくなるので、CR微分回路とRC積分回路を使ってパルスを鋭く整形します。
まずは、次の図の普通のCR微分回路を考えてみます。
入力がステップ関数であれば、出力は指数関数的に減衰する波形となります。
ですが、指数関数の減衰というのは意外と遅いので、もっと鋭くしたくなります。
実際には放射線のパルスは(電荷を収集する時間がゼロではないので)瞬時には立ち上がらず、プリアンプの前に微分回路が入っていることなどが多いので、回路への入力時点で指数関数的に減衰するカーブになっています。
もともと減衰している信号を微分回路に入れると、出力にはアンダーシュートが生じてしまいます。
そこで、微分回路のコンデンサに並列に補償抵抗を入れます。これをRpzとします。
詳しい理由は後述しますが、Rpzをうまく設定するとアンダーシュートが消えるのです!これがポールゼロ補償というものです。
なぜアンダーシュートが生じるかと、どうすればアンダーシュートが消えるかは、ラプラス変換で考えるとわかります。CR微分回路の伝達関数は、
sτ/(1+sτ) ・・・ (1)
です。時定数τ1と時定数τ2の微分回路を2回通すと、伝達関数は
s^2τ_1τ_2/{(1+sτ_1)(1+sτ_2)} ・・・ (2)
となって、ポールが2個出てきます。この伝達関数は指数関数的には減衰しません。
ところで、コンデンサと並列にポールゼロ補償抵抗Rpzを追加した回路
の伝達関数は、
τ(1+sRpzC1)/{(RpzC1sτ+RpzC1+τ)} ・・・ (3)
ですが、この回路の前に時定数τ2を持つ、別の微分回路があるならば、全体の伝達関数は、
τ1(1+sRpzC1)sτ2/{(1+sτ2)(RpzC1sτ1+RpzC1+τ1)} ・・・ (4)
となります。ここでτ1は上の図の微分回路の時定数=CRで、τ2は入力信号の減衰の時定数です。
RpzとCで作られる時定数CRpzをτ2と等しくなるように設定すると、式(4)は簡略化されて、
s/{s+(τ1+τ2)/τ1τ2} ・・・ (5)
となります。つまり、s/(s+k)の形になるので、指数関数の減衰波形となるわけです。
時間軸的に考えれば、CRだけだとアンダーシュートしてしまいますが、RpzとRの抵抗分圧によって減衰された入力波形を足し合わせることによって、アンダーシュートしないように持ち上げているともいえます。
このCR微分回路の伝達関数をZ変換を使って表現すると、
y[k]= x[k]- (1-τpz )×x[k-1]+(1-τ-τpz )×y[k-1] ・・・ (5)
となります。
※τ=T/CR、τpz=T/(CRpz )で、Tはサンプリング周期
図で表すとこうなります。
つまり、入ってきた信号から、1クロック遅らせた信号と(1-τpz)を掛けたものを引き、出力に(1-τ-τpz)を掛けたものを1クロック遅らせて足します。
わかりにくいかもしれませんが、手を動かして計算すれば理解できるでしょう。
これを実際にFPGAに実装して試してみました。
まず、入力信号を時定数τ=0.5usの微分回路に通した場合の図をご覧ください。緑が入力信号で、茶色が出力信号です。
確かにパルスは0.5usくらいで減衰して、出力信号は緑の入力信号に比べて鋭くなりましたが、派手なアンダーシュートを生じています。ここではτpz=10usという大きな値に設定しているのでRpzがほぼ機能していないような状態だからです。
さて、τpz=2.2usにしてみると、だいぶん、アンダーシュートは減りました。
もう少し減らして、τpz=1.4usくらにすると、アンダーシュートは全くなくなりました。
さらにτpzを減らして1.0usにすると、アンダーシュートは出ませんが、尾を長く引いてしまいます。
すなわち、τpzには最適な値があるというわけです。
微分回路の時定数を滑らかに変えることができるというのは、ディジタルフィルタならではの特長と言えます。
Cosmo-ZのWindows版コントロールアプリでは、スクロールバーで時定数を滑らかに設定できるようにしました。
例えば、τ=0.1us、τpz=1.4usとして整形すると、入力パルスはこんなに鋭くなります。これならパイルアップにも強くなるでしょう。
ディジタル微分回路の各部分がどういう動作をしているかは、次の図をご覧ください。
緑が入力信号、紫が1つ目の減算器の出力(つまり1つ前との差分)です。青が乗算器の出力で、茶色が最終的な出力です。
1つ前との差分(紫)と、現在の出力値(茶)に係数を乗じて足したもの(青)を次の出力とするという動作をしています。
2016.04.07
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くらいでイベントが生じた時刻を推測できるかもしれません。
2016.04.02
2016.04.01
Artix-7ボードのUSB3.0の速度
特電のArtix-7ボードをご検討いただいているお客様から、USB3.0の通信速度はどのくらい出るのかというご質問をいただきました。
OUT方向で300MB/s以上出したいとのこと。
いくつかのパソコンで試してみたところ、まずSurface。CPUはAtomの1.6G。
32MBのデータを読み書きしたところ、IN方向は300MB程度、OUT方向は270MB/s程度でした。
次はPanasonicのLet's note CF-AX2。CPUはCore-i5で1.8GHz。
IN方向は355MB/sで、OUT方向は285MB/s。数年前のモデルなのにSurfaceよりずっと速い。
FPGAに実装した回路や、USBチップのファームウェアは十分に高速で、これ以上の最適化の余地はないので、OUT方向で300MB/sを超えるのは難しいかもしれません。
とりあえず自宅にあるPCで速そうなのはこれくらいなので、これ以上は試せませんでした。
最近のコメント