製品情報>ZYNQ搭載 ADCボード「Cosmo-Z」>開発日記>2016年8月

2016年8月

大量のコントロール・ステータス・レジスタをVivadoで作る方法

2016.08.30

FPGAの中に機能をコントロールするためのレジスタを作り、そのレジスタをCPU(PL)から操作するようなシステムを効率的に作るにはどうしたらよいでしょうか。

つまり、

if(wr_en(0) = '1') then
    reg0 <= axi_wdata;
end if;
if(wr_en(1) = '1') then
    reg1 <= axi_wdata;
end if;
if(wr_en(2) = '1') then
    reg2 <= axi_wdata;
end if;
if(wr_en(3) = '1') then
    reg3 <= axi_wdata;
end if;
・・・

こういう場合です。

作られたレジスタの値をIPインテグレータの別のモジュールで使いたい場合、IPIのブロックから大量のレジスタの線が出ていくことになり、ごちゃごちゃになってしまいます。

書き込みだけではなく、読み出し用のステータスレジスタもたくさんある場合を考えてみてください。

こういうレジスタがたくさんある場合、VivadoのIPインテグレータではどうするのがベストでしょうか。

AXI Liteのバスを作って、各モジュールのコントロールレジスタはモジュール内に作るというのも一つの手段だと思います。

別の解決方法としては、インタフェースを作って、その中にすべてのレジスタを放り込むこむというのも良いのではないかと思います。

sun

次の図は、Cosmo-Zの内部回路のものです。

Csr1

CSRと書かれたバスが、このようなレジスタをまとめたインタフェースとなっています。
※CSRはControl Status Registerの意味

広げてみると・・

Csr2

と、画面に収まりきらないほどのレジスタが含まれています。

Cosmo-Zは、32bit×64本のコントロール・ステータス・レジスタがあるので、128個のポートが存在しているわけです。

 

これらのたくさんのレジスタを纏めて「インタフェース」化して、ADCやCAPTURE、DSPなどの各モジュールに分配しようというわけです。

sun

ただ、Vivadoでポート数の多いインタフェースを作るのはとても面倒です。標準的なInterface Editor(下の画面。File→Open IP-XACT Fileで開ける)で編集するのはしんどいし、テキストエディタで編集しようにもXMLなので、かえって面倒になります。

Csr3

 

特電のアルバイトさんが、64種32bit×2のレジスタをインタフェースとして登録してくれました。

実際にやってみたところ、Vivadoのインタフェースは単一の信号とは違って分岐できないという問題に当たりましたが、CSR InterconnectというIPコアを作ってこのCSRバスを分岐させるようにして解決してくれました。

Csr4

これで、Cosmo-ZデザインをVivado化する上での困難がすべて解消できました。

感謝感謝です。

 

青函トンネルでのミューオン測定結果

2016/8/23

やっぱ青函トンネルに潜ったら、宇宙線を測りたくなりますよね。

先週の日曜日に、5台のプラスチックシンチレータ&MPCCで測った結果の解析をしてみました。

まず、奥津軽いまべつ駅を出てから1分ごとのカウント数を測ってみた結果が下のグラフですが、昨日のブログで書いたとおり、このままでは青函トンネルは全然見えていません。

Am1008_okutsugaru_2

奥津軽いまべつ駅を出てから3分くらいでトンネルに入り、30分弱くらいで北海道に出るのですが・・・全然わからないですね。

 

さて、プラスチックシンチレータが発光する原因は、だいたいはγ線かβ線かミューオンです。そこで会社で、K40の線源(塩化カリウム。要するに減塩しお)を使って、K40の有無によるスペクトラムの違いを見てみると・・

K40

この検出器では、およそ680以下の部分でK40からのγ線が見えているということになります。逆に、700以上を高さのパルスだけを測れば、ガンマ線やβ線の影響は受けにくく、ミューオンだけが見えるだろうと考えられます。

次の図は、新幹線の中で奥津軽いまべる~函館新北斗間で測ったスペクトラム全体です。

Spec_all

まぁ、このグラフを見ても特にわからないですが、700以上の高エネルギー成分と、700未満の低エネルギー成分に分けて、1分ごとのカウント数の推移を見てみようというわけです。

まずは、低エネルギーの成分。青函トンネルの中のほうがむしろ多いという結果になりました。これはコンクリートに由来するカリウムから出ているガンマ線を見ているものと思われます。

Ganma

 

次は高エネルギーの成分。これこそが見たかったミューオンと思われるものです。

Muon

青函トンネルを越えてからも2回ほどミューオンが減っている場所があります。Googleマップで見てみると、青函トンネルを出てから「知床信号所」というところで一度地上に出て、再びトンネルに入っているようです。

その後、木古内町で地上に出て駅に停車。再びトンネルに潜って出て、函館新北斗駅というわけです。

地図と、線量をプロットしてみると・・

Total

青函トンネルと、その続くトンネル内でミューオンが減る効果を見ることができました。ミューオンの数は地表からの深さを示しているので、知床信号所と木古内の間のトンネルの深さは地下100mくらいかな・・なんてこともわかります。

 

面白いのは、トンネル内ではむしろガンマ線と思われる低エネルギーの成分が増えていることです。トンネルの上にある山の高さと一致しているような形を示しています。

これは何を意味しているのでしょう。カリウムやウランが見えているのでしょうか!?

 

青函トンネルで宇宙線を測定してきました

2016.08.22

家族旅行で、「はやぶさ」に乗って北海道へいってきました。

青函トンネルをくぐるので、せっかくなので宇宙線を測定してきました。

Mppcshinkansen

このとおり、新幹線の座席テーブルの上にZYNQ搭載ADCボード「Cosmo-Z」と、5台のシンチレーション検出器が乗っています。

sun

この5台の検出器でガンマ線や宇宙線のミューオンを測ろうというものです。ミューオンは上空から降ってきているので、地下深くでは数が減るはずです。

ならば、青函トンネルのような深いところではより一層数が減っているはず・・と思い、この旅行に検出器を持っていくことを計画していたのです。

Danmen
(Wikipediaより)

最大深度は海底下100mということなので、240m分の厚みがあります。

以前にも地下鉄大江戸線や東海道新幹線で測ったことはあったのですが、今回は検出器が5台に増え、もしかしたら飛来方向も少しはわかるようになったかもしれません。

「奥津軽いまべつ駅」を出てから50分間のカウント数を1分ごとに計測しました。

Am1008_okutsugaru

このグラフはミューオンだけではなくコンクリート由来のγ線とか、MPPCのダークカウントとかも相当含まれています。

それらを含んで測定しているので、最初の30分間(つまりトンネルの中)のほうが、若干、カウント数が多いという結果になりました。ダークカウントの量は変わらないでしょうから、ガンマ線の数がミューオンよりもかなり多いのでしょう。

 

下のグラフは、測定した結果から再現したスペクトラムです。

Spec

ミューオンによるパルスは、このスペクトラムの右のほうにごくわずかにいるのでしょう。

Cosmo-Zは、ただのデジタルMCAや、カウント数計とは異なり、観測された波形の1つ1つを記録しています。

Am0700pulse

パルスの形とともに計測開始後何ns目に起きたイベントかというのを全て記録しているので、後日、データ処理して1分ごとのミューオント数を取り出せるでしょう。

 

MPPCとFPGAで宇宙線検出器を作った

2016.08.18

持ち運びに便利な宇宙線検出器ができました。

Mppc5

この積みあがった黒い箱の中にプラスチックシンチレータとMPPCと高速アンプが入っていて、

Mppc_in_case

そこから出た同軸ケーブルがZYNQ搭載のADCボード「Cosmo-Z」へとつながっています。

プラスチックシンチレータというのは、β線やミューオンなどの荷電粒子が入ると光るやつで、MPPCというのは微弱光用のセンサです。これらを組み合わせると、宇宙線などの荷電粒子センサになるというわけです。(検出しているのはミューオンだけじゃないけど)

基板を輪ゴムで止めているのかと思うかもしれませんが、この輪ゴムというのが絶妙な力加減を発揮してくれる弾性体であることに気が付きました。

真ん中に基板を寄せてくれるし、振動からやさしく保護してくれるし、MPPCのガラス面をぴたっとシンチレータに押し付けてくれるし、輪ゴム最高!です。

sun

MPPCからの信号は、下の図のような感じで10μ秒に10~20発くらい出てくるのですが、ほとんどがダークカウントという偽のイベントです。

Scope_10

よく見ると、濃さが段になっているのがわかると思います。この1つの段が、フォトン1個分の電圧に相当します。

この信号をFPGAで処理したいのですが、Cosmo-Z(コスモゼット)には最大125MHzサンプリングの高速ADCが乗っているので、高速な信号をキャプチャしてFPGAで処理するにはたいへん便利です。

Mppchist_2

FPGAといっても、ARMプロセッサ搭載のZYNQなので、波形の統計処理までオンチップでやってくれます。

125MHzのADCはメイン基板に8ch(最大32ch)乗っているので、5個のMPPC箱をそのままつなげて、同時に処理できます。

Mppchist5ch

5台のMPPCで少しずつゲインが違っているようですね。Cosmo-Zではリアルタイムにこういうのが見えるので、ゲインのずれが一瞬でわかるので便利です。

sun

上のスペクトルを見ると、横軸0~50くらいまでのところは急に減衰して、50以上では閑散としているのがわかります。

試しにシンチレータを取り外してMPPCだけで測ってみると、

Mppcboxspec

シンチレータを外したら大きいパルスが全くなくなりました。、高さ50くらいまでの信号はダークカウント(偽のイベント)だったようです。50以上のものはMPPCの発光(つまりミューオンとかβ線とかγ線とか)のようです。

sun

スペクトルを長時間溜めていくと、こうなります。

Mppc6hour

左の方(ダークカウントの1p.e.に相当)では、10^9を超えるカウント数が記録されています。毎秒10^6回くらいのイベントが発生しているわけなのですが、

FPGAのハードウェアで処理しているので取りこぼすことはありません。

まぁ、本当はMPPCでスペクトラムがみたいわけではなく、イベントが発生した時刻とチャネル番号の情報を集めたいので、これからがFPGAの本領の発揮となります。

そもそも、なんで5chかというと、シンチレータがたくさんあれば宇宙線の飛来した方向がわかるからです。本当は16chで作りたかったのですが、うまくいかないリスクも考えてMPPCを5個しか買っていなかったためです。残りの11個は近々追加購入することになるでしょう。

sun

持ち運び可能な宇宙線検出器ができました。とりわけミューオンを対象にしています。今のところ消費電力はトータル15Wくらいですから、モバイルバッテリでも動かせないことはありません。

いやー、ZYNQって本当にすばらしい。

 

MPPCとプラスチックシンチレータで遊んでます(3)

2016.08.10

先週までの実験で、シンチレータからの光を効率よくMPPCに導くために、アクリルでいろんな光ガイドを作ってみましたが、どれも駄目でした。

Mppc_1Mppc_2

このとんがったところから向こうを見ても、シンチレータ全体が見えるわけではなく、向こうの景色が普通に見えるだけだったので、

Mppc_3

光が屈折してガイドに入ってきているということはなかったのでしょう。そこで、光ガイドはあきらめて、直接、シンチレータにMPPCを貼り付けることにしました。

その結果が下の図です。

Mppc_5

MPPCはダークカウントが多いので、ディスクリをかけて、ある程度高いパルスのものだけをカウントします。

様々な場所にMPPCを貼り付けて、5分間測ったときのパルスの数は下の図のとおりでした。

Mppc_4

シンチレータの側面に付けたときのほうが、真ん中に付けるよりも多いようです。この結果解釈はいろいろできるのですが、とにかく、MPPCが見ているであろうシンチレータの体積はかなり小さいと予想されました。

 

そこで、MPPCの側面を白い紙やアルミホイルで覆って、端のほうで光ったものを反射や拡散させて、真ん中の穴で見えるようにしました。

Mppc_6Mppc_7

5分測った結果、

Mppc_9

アルミホイルで囲むと、大きなイベントが有意に増えます。

 

ROIをかけた範囲のパルスの数を数えてみたところ、こうなりました。

Mppc_8

アルミホイルで包んだときが、一番、光量が稼げています。

反射させるのが良いようですね。

 

VivadoHLSとCosmo-Zでリアルタイム信号処理

2016.08.04

Cosmo-Zで計測したデータに、リアルタイムで信号処理を行う回路を設計しています。

もちろんVHDLで書けなくはないのですが、できれば今回の案件からはC言語で設計したいと思い、FPGAマガジンを読みながら頑張っています。
(実際に頑張っているのは私ではなく、インターンの学生さんだったりする)

その数値計算というのは、ある種のレーダー(軍事ではない)の信号処理回路で、浮動小数点や複素数がたくさん出てくる計算です。

VivadoHLSだと、確かに、複雑な計算回路が簡単に書けます。

Hls1_2


しかも、何クロック目にどの部分の計算が行われて、

Hls2

最終的に何クロックで計算ができるかの見積もりを示してくれるのがスゴイと思います。

Hls3

Intervalは次のデータを受け入れるまでに必要なクロック数で、6クロック間隔を開けなければならないという意味ですが、このIntervalが必要になるのは浮動小数点数の積和が入っているためではないかと思います。

XILINXのFPGAでの浮動小数点計算は11クロック前後かかると思っていましたので。

クロック100MHzでInterval=6ということなので、およそ16MHzでやってくる信号をリアルタイムで処理できることになります。

Hls4

DSPブロックやBRAMもほとんど使わず、C言語で書いた回路が本当にこの速さで動くならば有難いですね。

 

プラシンとMPPCの測定結果

2016.08.03

プラシン+MPPCの信号をCosmo-Zに入れて、MCAでスペクトラムを出してみました。

Mppc6

MPPCはダークカウントが多い(周波数に換算すると1MHzくらい)ので、大きさの小さなパルスはディスクリで落とします。↑のグラフの横軸500未満のところを拡大すると、

ダークカウントによるピークが6p.e.のところまでは見えています。

Mppc7

したがって、250くらいのところでディスクリをかければよいのですが、何も見えないと寂しいので150くらいのところでディスクリをかけておきます。

つまり、高さ150以上のパルスのみがカウントされるようにします。ただし、意味のある信号としてカウントする(ROI)のは250以上にしておきます。

下のスペクトラムは1分間の測定によるものです。

Mppc4

250以下の信号は、カリウムのありなしでほとんど差がないので、250以上の部分だけを見てみます。

Mppc5

1分しか測っていないので、ほとんどのチャネルでカウント数が0か1なので、あまりよくわからないですね。大きさ250以上のパルスはどちらも1分間で20発前後でした。カリウムありのほうが若干カウント数が多いのですが、誤差の範囲です。

 

プラスチックシンチレータとMPCCのテスト治具

2016.08.01

プラスチックシンチレータに光ガイドを付け、MPCCで測るための治具をアルバイトさんが作ってくれました。

まず、60mm×60mm×10mmのプラスチックシンチレータの上に、四角錐型のアクリル製光ガイドを付け、その先にMPPCアンプ基板を乗せます。

Mpcc1

光ガイドは様々な形状のものを試すので、高さは変えられるようにしています。

このアルミの箱を閉じて遮光します。コネクタ等から光が漏れてくるので気を付けます。

Mppc2

そして、箱全体をブラックシートで覆います。

Mppc3

そこに置いてある基板がCosmo-Zで、近くに置いてある試薬瓶は、塩化カリウムで、線源として使っています。

オシロで見た感じでは、光ガイドを付けたときも大きなパルスは観察されるけれども、劇的(例えば100p.e.とか1000p.e.とか)な改善はありませんでした。


© 2017 TokushuDenshiKairo Inc. All rights reserved