[KEKB Bunch Feedback Group]

株式会社デジテックス研究所社製14ビット4チャンネルログレシオビーム位置モニタ18K11用EPICS Device Support(MV5500用)の製作(Japanese)


by とびやま まこと(Makoto Tobiyama)/KEKB ビームモニターグループ

警告
以下の記述に関しては、意図する、しないに関わらず多くの誤り、誤解が含まれていると思われますので、決して信用してはいけません。これを信じて起きた損害に関しては、当方は一切責任を持ちません。


If you want to contact with the author, please E-mail to makoto.tobiyama@kek.jp.
目次

1.はじめに

18K11は、4点のビーム位置モニター信号を508MHz帯域濾波器及びログアンプ を通過した後、14ビットAD変換しメモリーにセーブ出来るVME 1幅のモジュールです。 ここで紹介するデバイスサポートはEPICS R314で動作するMV5500用で、データ転送を 64bit MBLTモードで行うものです。

2.VMEバスレジスタ

18K11ボードのI/Oマップは以下の通りです。
アドレスWrite/Readデータ
313029282726252423222120191817161514131211109876543210
0x**(**00)00000(R/W)****CH3:ADデータ****CH1:ADデータ
****Ch3****CH1
0x**(**00)0FFFC****CH3:ここまで(32kワード時)****CH1:32k
****Ch3****CH1
0x**(**00)FFFFC****CH3:ここまで(256kワード時)****CH1:256k
0x**(**01)00000(R/W)****CH4:ADデータ****CH2:ADデータ
****CH4****CH2
0x**(**01)0FFFC****CH4:ここまで(32kワード時)****CH2:32k
****CH4****CH2
0x**(**01)FFFFC****CH4:ここまで(256kワード時)****CH2:256k
0x**(**10)00000R/W*AD_START
0x**(**10)00004R/W*AD_MEMORY
0x**(**10)00008R/W*TRG_POS
0x**(**10)0000CR/W*IRQ_ENB
0x**(**10)00010R/W*Reserved
0x**(**10)00014R*AD_STATUS
0x**(**10)00018R*IRQ_NO
0x**(**10)0001CR*IRQ_ID
0x**(**11)*****R*トリガポインタレジスタ(R)
0x**(**11)FFFFFN/A*(NOT USED)

MBLTモードでデータ転送を行う場合、メモリーマップは上記と異なり
63-4847-3231-1615-0
CH4:A/DデータCH2:A/DデータCH3:A/DデータCH1:A/Dデータ

の形で出てきます。

ADCのデータフォーマットは、
入力電圧ディジタル出力
(MSB)(LSB)
2V0011111111111111
1V0010000000000000
0V0000000000000000

です。

3.EPICS環境

本デバイスサポートは、EPICS R314のVxWORKS(MV5500)用に開発したものです。 MBLT(DMA転送)をサポートするため、通常のVxWorksカーネルでは動作しない と思われます。また、MVME5500側でのブートromの書き換えも必要と 思われます。VxWorksのバージョンは5.5です。MVME5500のA32アドレススペースは
0xaff00000(0x08000000)〜0xceffffff(0x27ffffff)
*cpuアドレス(VMEアドレス)
の設定となっています。

EPICSそのものに対する入門出家入道については専門家に帰依するなり、 コントロールグループのページを参照するなどの自活努力が必要です。 現時点で、KEKBではMV5500用のデバイスサポートはabco3(呪われたSun OS)で しか開発出来ません。abco3の一般的設定は大変素敵なので、開発には相当の覚悟 と絶えざる忍耐が必要です。

4.コードの概要(DMA転送)

MVME5500の通常のVMEアクセスは非常に遅く(PPC750よりずっと遅い)、大量のデータ を転送するのは大変不得手です。そこでMVME5500のPCI-VMEインターフェースの Tsundora UNIVERSE IIのDMA転送機能を使い、VME上のデータをCPUが直接アクセス できる領域にコピーし、しかる後にEPICSのwaveformに移すコードを東日技研の 岡崎さんに開発してもらいました。この内容については ここ(多分 所内限定アクセス)に詳しく書いてあります。

コードを以下に示します。

5.EPICSデータベースサンプル

サンプルファイルは以下を参照してください。 mbbiDirectのsignal=1をI/O Intrに設定し、これのFLINKに waveformレコードを指定、そのFLINKにFanoutを指定して、 EVENT確認用のレコード及び各subArrayをプロセスします。なお、 現在の所この環境ではcompactSubarrayはまだサポートされていませんので、 残念ながらsubarrayで受けるしかありません。こちらも、Makefileにちゃんと登録して gmakeをしておく必要があります。なお、subarrayのNELMが32kワードになって いますので、R313環境ではcagetできません。 R314でもEPICS_CA_MAX_ARRAY_BYTESの設定が必要です。

subArrayをやめ、EPICSシーケンサでwaveformに分割する場合

のようになります。

注意

VxWorksのメモリー空間は大変呪われていて、まるで昔のべーしっく のごとく、標準で全てグローバル変数となっています。なので、シーケンサでも 同じ名前の物を二つ動かすことはできません。もしも2つ動かしたければ、 同じ内容で、state名などが異なる、2つのシーケンサをコンパイルして 実行することになります。データベース名は外から渡すことができますが、 内部の変数などは重複していてはダメです(static宣言すれば良いという 説はあるが、ステート名はそうはいかない)。ま、VxWorksの問題という より、シーケンサの設計がお馬鹿ということかも知れません。

6.スタートアップファイルサンプル

/cont/bootp/iocの所には
# Example vxWorks startup file
#Following must be added for many board support packages
</cont/bootp/ioc/kekb_mv5500.cmd
putenv "EPICS_CA_MAX_ARRAY_BYTES=1048576"
# put your startup script below
</users/tobiyama/epics_M6/iocBoot/iocfbppc/st.test2.cmd
kekBootLog
printTime(60)
のように、自分の所のブートファイルを読みに行くように設定します。 なお、EPICS_CA_MAX_ARRAY_BYTESはクライアント側も設定しておかないと 長いwaveformを読む事が出来ません。
2枚の18k11ボードを使用する時のスタートアップファイル(の関係部分)は次のようになります。

dbLoadRecords("db/FB_DRMON.db","USER=FB51, CHAN=C0")
dbLoadRecords("db/FB_DRMON.db","USER=FB52, CHAN=C1")

dev18k11Config(2,0x24000000,0x4,0xf0)

dbpf "FB51:ADC4:MEMSIZE","0"
dbpf "FB51:ADC4:TRGPOS","4"
dbpf "FB51:ADC4:IRQENB","3"
dbpf "FB51:ADC4:START","1"
dbpf "FB52:ADC4:MEMSIZE","0"
dbpf "FB52:ADC4:TRGPOS","4"
dbpf "FB52:ADC4:IRQENB","3"
dbpf "FB52:ADC4:START","1"
測定した入力パワーに対する応答、標準偏差は以下の様になりました。

入力パワーをAM変調(1kHzで45%程度)したときのデータは以下の様でした。

対数表示でもsinはsinっぽく見えるようです。心眼で見ると上下非対称になっている のが分かります(本当か?)。

7.データ転送

通常のA32D32アクセス(AMコード0x0D)の様子をロジックアナライザ (VMEバスアナライザ)で観測した物は以下の様になります。

VMEサイクル間隔は2μ秒程度で、非常に低速です。(低速の CPUをのせているPPC750より遅い)。原因については諸説あり ますが、いずれにしても改善は難しそうです。

Tsundora UniverseIIのDMA機能を使うと、Singleアクセスモード でもCPUを介さないので、かなり高速になります。

アクセスサイクルは、500ns位まで改善しています。

64ビットMBLTアクセスは、VME64xで新たに規定されたモードで、 最初にアドレスおよびAMコードを出し、その後は、ボード側は アドレスラインおよびデータラインを使ってデータを出力し、 DTACKをだし、CPU側はDSでデータ取得完了を通知、すると次の アドレスのデータをボードが出す、というサイクルをASが 下りている間中(最大256サイクルまで)続けるというものです。

この図はMBLTの最初のサイクルを見たもので、CPU側はバスに AMコード0x0Cと最初のアドレスを出力、ボードがDTACKを出すと ブロック転送サイクルがスタート、ボードが自動的に データをアドレスバスとデータバスに出力→DTACK→CPUが データ取得→DS0,1をドライブ→ボードは次のデータを用意、 準備が出来たらDTACKをドライブ、というサイクルを繰り返して います。

statusモードでみてみると始まりは

となり(このVMEアナライザでは、MBLTであるという認識は あるようですが、アドレスラインのステート解析がうまくいかない ようです)1サイクル500ns程度の時間で処理出来ているようです。

ブロック転送なので、規定通り256サイクルで一旦止めてアドレスを 出し直しています。

全部の処理時間については、ボード1枚あたり、32k turnsデータ処理 としてVMEバスアナライザのデータからは以下の様に

の様になり(ほとんどsubarray転送が占めている)、12ボードを 読むときは0.95秒程度かかる(この悪条件でも1 Hzトリガーはなんとか 可能)ことが分かります。

呪われたsubArrayをやめて(compactSubarrayをインプリメントしてもらう とか、あるいは長いarrayをそのまま処理することにする)みると

となりました。

subArrayの代わりに、シーケンサーの中でチャンネル毎への waveform分割を行い(EPICSレコードへも記録する)、平均 標準偏差、ビーム位置(およびその分散)を計算させたところ

と微増しましたが、 12ボードを処理するとしても0.3秒以内で済むことに変わりは ありませんでした。(あまり高速に読めても後段のデータ表示とか、あるいは軌道補正が 追いつきませんのであまり意味が無いですけど)。モニターとしては 十分なデータ転送能力があることになります。

8.おわりに

D64 MBLT転送をサポートした4チャンネル同時サンプルの 14ビットログレシオADCモジュール、18k11ボードのMV5500用 EPICSデバイスサポートおよびデータベースについて紹介しました。 DMA転送の部分は、東日技研の岡崎さんによって開発されたものです。 岡崎さんには、大変お世話になりました。感謝します。
Makoto Tobiyama
4/Jun/2012

Return to FB Home Page...