可変解像度なADCと、リアルタイムなFFTと、LabViewとのインタフェースと、高速なDACを作ろうと思いました。
こういったあらゆる実験で使えそうな基本的で重要な要素は、どんどん実装して、世の中に広めていこうと思います。
平成27年4月24日
Cosmo-Zの件で東工大のある研究室に行ってきました。
可変解像度なADCと、リアルタイムなFFTと、LabViewとのインタフェースと、高速なDACを作ろうと思いました。
こういったあらゆる実験で使えそうな基本的で重要な要素は、どんどん実装して、世の中に広めていこうと思います。
平成27年4月24日
ついに、ZYNQ搭載ADCボード「Cosmo-Z」の32ch動作に成功しました。
何が苦労したかというと、消費電流と発熱です。
Cosmo-Z本体(ADC 8ch)は、現在のところ7W程度の消費電流ですが、8chの拡張ボードは1枚あたり4W程度も食うのです。32chフルに実装すると20Wにも達します。
5V4Aの電源から供給すればよいのですが、20Wの発熱をする物体がそこにあるともわーっとした空気を感じてしまいます。
拡張基板の何がそんなに無駄な電力をつかっているのかといろいろ調べました。基板のパターンをカットしたり、スイッチング電源を外して各部の電流を測ったりしたのですが・・
結局、無駄な電力を消費しているのはスイッチングレギュレータの後のLDOと、フロントエンドの高速OPアンプでした。
ひとまず、低消費電力化はあきらめ、FPGAの中身の開発を進めることにしました。
![]()
すぐに動作確認したいときには、バウンダリスキャンを使ってLVDSの信号が来ているかどうかを調べると便利です。
CH1とCH2.。これはメイン基板です。LVDSの信号はバウンダリスキャンで見てもそれなりに対称的に見えますね。
拡張基板のCH3とCH4。これも問題なく信号が来ています。
最後にCH7とCH8
このように、全チャネルの端子にLVDSの信号が来ていることが確認できました。バウンダリスキャンって、便利ですね。
全チャネルにLVDSが来ていることが確認できたので、ソフトを起動してみたところ・・
バッチリ32個のCHのLVDSの同期が取れました。480MHzの差動信号が64本束ねられて送られてきて、デコードできたのですから、すごいものです。
ADC値を見てみると・・
このように、それなりに2048(0V)付近の値が見えていました。
動作も問題ないようです。.
現在の問題としてはADCのクロックを一番低い80MHzに設定しないとLVDSのロックが取れないことです。電力の問題なのか、それとも、LVDSのラインに誤って47Ω×2個のダンピング抵抗を挿入してしまったので、それが原因なのかもしれません。
平成27年4月22日
先月、学会でCosmo-Zを展示した反省点を踏まえ、大規模な機能の整理と向上を行っています。
もともとCosmoZは放射線、とりわけミューオンの検出用に開発したのですが、まずは柔軟なデータロガーとして動くように内部構造を整理しました。
次のようにすっきりとしました。
まず、可変クロック発生器(図の左下)というものがあって、こいつがすべてのADCのクロックの源を出しています。このクロック発生器は、単純に水晶から作っているのではなく、MMCMのダイナミックリコンフィギュレーションを用いて発振周波数を80MHz,100MHz,125MHzに動的に変えるのです。そして、Max 255分周の分周期でADCのサンプリングレートを1MHz~125MHzまで変えられるようにしています。
Gbpsに迫る速度でADCから送られてきたLVDSのデータをデコードするのが、ADC LVDSデコード回路の役割です。デコードされたデータは、オフセットと、ゲインをかけて補正を行い、その後、可変遅延回路に入ります。可変遅延回路というのは要はリングバッファです。
可変遅延回路を出力したデータはマルチプレクスされてメインメモリに格納されるというしくみです。
簡単に書いていますが、AXIバスは4本あります。ZYNQの中のAXI HPポートは高々64bit 250MHzまでしかいかないので、たった4Gbpsの帯域しかないのです。32ch同時に100MHzサンプリングしたらAXIバスが詰まってしまいます。
だから4本のAXIバスに分けてADからのデータをDDR3に送り込んでやろうというわけです。入口は狭いけど、きっと中は広いはず。
実際にどんな感じか、実験してみてみましょう。まず、Cosmo-Zの入力CH1とCH2をショートし、CH1とCH2に同じ信号が入るようにします。
Cosmo-Zを起動したら、helpコマンドを打ってみましょう。
ソフトウェアのバージョンも0.5になって、だいぶん洗練されたと思います。
今回のバージョンからは、cosmozのソフトの中でコンソールを持つようになったので、毎回毎回cosmoz.elfを起動する必要がなくなりました。
adc helpと打つと、ADC関係のコマンドのヘルプが出ます。
adc freq 25と打つと、ADCのサンプリングレートを25MHzに変更できます。
adc dispmodeは、表示をHEXにするかDECにするかを指定します。
adcとだけ打つと、現在の値を表示します。
上の図では8ch分しかありませんが、adc boards コマンドでチャネル数を増やすこともできます。
captureコマンドを打つと、データをキャプチャして画面に表示してくれます。ファイルに保存するモードであれば、レートとチャネル数にもよりますが、数十Mサンプリングまでできます。
見てわかるとおり、信号を入れていないチャネルは信号が±1しか変化しません。ノイズの影響はほとんどありません。
![]()
このように、ADCの速度をはじめとした様々なパラメータはLinuxのコンソールから行うのですが、波形はやはり画像で見たいものです。
そこで、Cosmo-ZのIPアドレスをブラウザに入力して、Web画面(のcgi-bin/pngwave.cgi)を開くと、現在のキャプチャされた波形が表示されるようにしました。
綺麗な正弦波ですね。
この波形キャプチャ画像ツールは、縦横の単位やサイズが自由自在に伸び縮みします。例えば、80MHzで10万ポイントをサンプリングして、横8000pixelの画像にすることもできます。
![]()
遅延時間や、ゲイン、オフセットはチャネルごとに個別に設定できるので、たとえば遅延時間を2つのチャネルでずらしてやると、同じ波形なのにこう見せたり、
こう見せたりできます。
これが何の役に立つのかというと、2つのチャネルから入ってきた信号を、どちらか一方だけ遅らせてトリガをかけるとか、信号の到達時間の差を補正するというのに使えるかと思います。
4月22日水曜日中には、この新しいデザインをリリースできるよう頑張りたいと思います。
![]()
平成27年4月11日
平成27年4月10日
Cosmo-ZのADコンバータのサンプリング周波数を動的に変更できるようにしました。
Cosmo-ZのADコンバータはのサンプリング周波数は、80MHz、100MHz、125MHzと3種類の選択肢があります。
このADコンバータのクロックはPLL(MMCM)で作っているので、いままでは、FPGAのソースコードを変更して再ビルドしなければなりませんでした。そこで、この周波数を動的に変更しようと考えました。
基本的なやり方は、過去の記事「XILINX 7 シリーズにおけるMMCM周波数の動的変更」で書いたのですが、MMCMのDRP(ダイナミック・リコンフィギュレーション・ポート)を使います。
基本的にはDRPを通じてレジスタに設定値を送り込めばMMCMは新しい周波数で動作を開始するのですが、望みの周波数で発振させるためにはどんな設定値を書けばよいのか、わからないと思います。
そこで、まず、80MHz、100MHZ、125MHzで動作するMMCMをCoreGenで作って、DRPを通じて現在の値を読み出します。その値をVHDLでハードコーディングして、必要なときに送り込むようにすればよいというわけです。
このようにしてDRPポートに送り込んでいるときの波形は次のとおりです。
こうして作ったクロックによって、Cosmo-ZのADCは80MHz/100MHz/125MHzを動的に切り替えられます。
クロックが変わったら、ADCから送られてくるシリアルデータをデコードする回路をリセットして、やらねばなりません。
次の図は、ISERDESのIDELAY_CEと、BitSlipのパルスです。
80MHzのとき。
100MHzのとき。
125MHzのとき。
このように、動的に周波数を変更し、再同期を行うことができるようにしました。