VME 2幅 ダブルハイト
VMEアクセスがあったとき緑色に点灯。
緑:トリガー許可状態
赤:メモリー書き込み中(メモリーへのアクセス及びトリガー不可)
橙:A/D終了(メモリーの最後まで書き込んだ状態)
点灯時はADC温度(ファン停止)あるいは電源電圧異常。よく(?)あるのは、 VMEバスへの突っ込み不足で電圧異常が起きているとき点灯する。
緑:FPGA正常(ブートOK)
赤:FPGA異常(ブート未了、あるいはブート失敗)
各信号入力時に点灯
NIMレベル。インピーダンス50Ω。立ち下がりでADスタート。20ns程度の幅があることが望ましい。
NIMレベルトリガー出力。
リング周回周波数、NIMレベル、立ち下がり動作。20ns程度の幅があることが望ましい。 動作中は常に(正確に)供給されていること。
Rev出力
サンプルクロック入力。インピーダンス50Ω。内蔵EP196により、最大10ns、ステップ10psのdelay可能。 -10dBm〜5dBmの正弦波を想定。内部でラインレシーバーによりタイミング取得している。
インピーダンス50Ω。内蔵THS4303により14dB(5倍)に増幅し、MAX108 ADCに入力する。
アドレス | Write/Read | データ | |||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||
0x*****(***00)00 | (R/W) | BOARD RESET | |||||||||||||||||||||||||||||||||
0x*****(***00)04 | (R/W) | TRIG_ENB | |||||||||||||||||||||||||||||||||
0x*****(***00)08 | (R/W) | MEM_TRIG | |||||||||||||||||||||||||||||||||
0x*****(***00)0C | (R/W) | MEM_SIZE | |||||||||||||||||||||||||||||||||
0x*****(***00)10 | (R/W) | IRQ_ENB | |||||||||||||||||||||||||||||||||
0x*****(***00)14 | (R/W) | ADCLK_DLY | |||||||||||||||||||||||||||||||||
0x*****(***00)18 | (R/W) | ADC_RST | |||||||||||||||||||||||||||||||||
0x*****(***00)1C | (R/W) | ADRDPT_RST | |||||||||||||||||||||||||||||||||
0x*****(***00)20 | (R/W) | MEM_CL | |||||||||||||||||||||||||||||||||
0x*****(***00)24 | (R/W) | FPGA_OUT | |||||||||||||||||||||||||||||||||
0x*****(***00)28 | |||||||||||||||||||||||||||||||||||
0x*****(***00)2C | |||||||||||||||||||||||||||||||||||
0x*****(***00)30 | (R) | BOARD_STS | |||||||||||||||||||||||||||||||||
0x*****(***00)34 | (R) | AD_STS | |||||||||||||||||||||||||||||||||
0x*****(***00)38 | (R) | REC_MODE | |||||||||||||||||||||||||||||||||
0x*****(***00)3C | (R) | HARMONIC | |||||||||||||||||||||||||||||||||
0x*****(***00)40 | (R) | IRQ_NO | |||||||||||||||||||||||||||||||||
0x*****(***00)44 | (R) | IRQ_ID | |||||||||||||||||||||||||||||||||
0x*****(***00)48 | (R) | FPGA_IN | |||||||||||||||||||||||||||||||||
0x*****(***00)4C | |||||||||||||||||||||||||||||||||||
0x*****(***00)50 | (R) | DEBUG0 | |||||||||||||||||||||||||||||||||
0x*****(***00)54 | (R) | DEBUG1 | |||||||||||||||||||||||||||||||||
0x*****(***00)58 | |||||||||||||||||||||||||||||||||||
0x*****(***00)FC | |||||||||||||||||||||||||||||||||||
0x*****(***01)00 | (R) | Data 0 | Data 1 | Data 2 | Data 3 | ||||||||||||||||||||||||||||||
0x*****(***01)04 | (R) | Data 4 | Data 5 | Data 6 | Data 7 | ||||||||||||||||||||||||||||||
(R) | Data n | Data n+1 | Data n+2 | Data n+3 | |||||||||||||||||||||||||||||||
0x*****(***01)FC | (R) | Data 252 | Data 253 | Data 254 | Data 255 |
入力電圧 | ディジタル出力 | |||||||
---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
100mV | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
0V | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-100mV | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
電源オン状態にリセット、FPGAはFlashよりコードを再ロード
1でtrigger許可。0にすると強制停止。ADスタート後、自動0クリア
メモリーモード時のトリガー位置。BCMモード時は-100%に固定です。 0の時-100%、1の時0%、2の時100%です。ほとんどの場合、 0の-100%の設定になると思います。
メモリーモード時の記憶容量で、ハーモニック数×この記録周回数と なります。
0で4096(h=5120のとき20MB)、1で8192(h=5120の時40MB)、2で16384(h=5120の時80MB) です。
割り込み許可です。LSBがADデータ取得終了時の割り込み許可で1でenableです。2bit目は デバッグ用の5秒タイムアウト割り込みで、デバッグ以外使うことはありません。
ADC用のclockをEP195を使いdelayするもので、10ビットあります。1ビットが10psにあたります。 最大10ns程度までdelayさせることは可能ですが、大きなdelayではEP195の温度特性により 大きな誤差が生じますので、精々2ns程度までの設定にした方が良いです。
MAX108 ADCのインターリーブド出力をFPGAからのADCLK/4に同期させるコマンドで、もしも Ach-Bchが入れ替わっていたとき試してみると役に立つかもしれません(1回で同期出来る 保証は無いので、だめなら数回試してみる必要があります)。
VMEからのADリードポインタを0クリアします。メモリー読み出し時前に1回発効する 必要があります。
1でADデータメモリのクリアを行います。データは常に上書きされていますので、 デバッグ以外でこのコマンドを発効する必要はありません。
予備レジスタ
ボードステータスで
10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
ADCオーバーフロー(1でNG) | ADC_FAN(1でOK) | RF OK | Rev OK | FPGA DONE(1でOK) | DDR2 OK | FPGAパワーOK | ADC温度OK | -5VA OK | +5VA OK | +3.3VD OK |
AD処理ステータスです。
4 | 3 | 2 | 1 | 0 |
トリガー検出 | ADC overflow | データ強制終了 | ADC OK |
0でBCMモード、1でメモリーモード
設定ハーモニック数読み出し。0で230(DR)、1で312(PF)、2で640(AR)、3で5120(KEKB)。
割り込みレベル(1〜7)。ボード上の設定読みだし
割り込みvector。ボード上の設定読みだし
EPICSそのものに対する入門出家入道については徳の高い専門家に帰依するなり、 コントロールグループのページを尊い修行と思って読破するなどの自活努力をお願いします。
device(bo,VME_IO,devBo18k10KB2,"V18K10KB2") device(bi,VME_IO,devBi18k10KB2,"V18K10KB2") device(mbbiDirect,VME_IO,devMbbi18k10KB2,"V18K10KB2") device(ao,VME_IO,devAo18k10KB2,"V18K10KB2") device(waveform,VME_IO,devWf18k10KB2,"V18K10KB2") device(longout,VME_IO,devLo18k10KB2,"V18K10KB2") device(longin,VME_IO,devLi18k10KB2,"V18K10KB2") device(stringin,VME_IO,devSi18k10KB2,"V18K10KB2")です。
このデバイスサポートの主要部は18k10の 説明に書きましたので、以下は変更部のみ示します。
struct GREFMEM { epicsUInt8 control_reg[12288]; unsigned long R_MEML[2048]; unsigned long R_MEMH[2048]; unsigned long R_MEMDR[1024]; epicsUInt8 condition[4096]; epicsUInt32 delay[4096]; epicsUInt32 opccr_alarm; epicsUInt32 tmlc8_alarm; epicsUInt32 opccr_count; epicsUInt32 tmlc8_count; epicsUInt32 mrbcm_count; epicsUInt32 drbcm_count; epicsUInt32 positron_bunch; epicsUInt32 electron_bunch; epicsUInt8 operation[4064]; epicsUInt8 RESERVE[1003520]; };と定義します。バンチ電流情報部は、18K10から読んだものをそのままReflective memory に移送するため、同じ構造にしてあります。
volatile struct GREFMEM *p2; BASE5565=0x0D000000; if (sysBusToLocalAdrs(VME_AM_EXT_SUP_DATA,(char *)BASE5565,(char **)&p2) == ERROR) { logMsg("devVme18k10KB2 : cannot find extended address space for RefMem\n",0,0,0,0,0,0); return(ERROR); } else { logMsg("devVme18k10KB2 allocated memory for RefMem\n",0,0,0,0,0,0); } if (vxMemProbe((char*) &(p2->mrbcm_count),READ, 4, (char *)&probeVal[0])!= OK) { logMsg("No refmem probe= %x\n",(int)p2,0,0,0,0,0);mems.rmem = NULL;} else { logMsg("Found Rmem\n",0,0,0,0,0,0); mems.rmem = p2; mems.lock = epicsMutexMustCreate(); epicsMutexUnlock((mems.lock)); }
static long write_ao(pao) struct aoRecord *pao; { double f1; switch(pao->out.value.vmeio.signal){ case 0 : f1 = pao->val; LER_LIM = (int)(f1/cal_fac_bcm_L); break; case 1: f1 = pao->val; HER_LIM = (int)(f1/cal_fac_bcm_H); break; case 2 : f1 = pao->val; if (f1 <4e-3) f1= 8.1731422e-3; cal_fac_bcm_L = f1; break; case 3 : f1 = pao->val; if (f1 <4e-3) f1=8.8861577e-3; cal_fac_bcm_H = f1; break; default : break; } return(0); }
if (cardN==0) { iDmaStartRc = sysVmeDmaL2VCopy( gplTmpDataB,&mems.rmem->R_MEML[is*64],64*4 ); } else { iDmaStartRc = sysVmeDmaL2VCopy( gplTmpDataB,&mems.rmem->R_MEMH[is*64],64*4 ); }
over_one = 0; emer_flag =0; for (i=0; i<5120;i++) { f_thing[i]=cal_fac_bcm_L*bc_o[i]; if (bc_o[i]>LER_LIM) over_one =1; if (bc_o[i]>LER_LIMA) emer_flag =1; } if ((over_one == 1) && (LER_OVER_ONE==1)) { over_flag = 1; } else if (over_one == 1) { LER_OVER_ONE = 1; } else { LER_OVER_ONE = 0; over_flag = 0; }
#include <recGbl.h> #include <alarm.h>アラーム情報を以下の様に設定します。
if (emer_flag >0) { recGblSetSevr(pwf,HIGH_ALARM,MAJOR_ALARM);} else if (over_flag > 0) { recGblSetSevr(pwf,HIGH_ALARM,MINOR_ALARM);} else { recGblSetSevr(pwf,HIGH_ALARM,NO_ALARM); }
if (Rmem_watchdog >32766) Rmem_watchdog=0; Rmem_watchdog++; mems.rmem->mrbcm_count = Rmem_watchdog;
# 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=167772160" # put your startup script below </users/tobiyama/epics_M7/iocBoot/iocfbppc/st.iocfbfb4j.cmd kekBootLog printTime(60)のように、自分の所のブートファイルを読みに行くように設定します。 なお、EPICS_CA_MAX_ARRAY_BYTESはクライアント側も設定しておかないと 長いwaveformを読む事が出来ません。
dbLoadRecords("db/FB_BCMKB2.db","USER=FBL, CHAN=C0") dbLoadRecords("db/FB_BCMKB2.db","USER=FBH, CHAN=C1")
dev18k10KB2Config(2,0x09000000,0x5,0x90)
dbpf "FBL:BCM:IRQENB","1" dbpf "FBH:BCM:IRQENB","1" dbpf "FBL:BCM:TRG_ENB","1" dbpf "FBH:BCM:TRG_ENB","1" dbpf "FBL:BCM:IRQENB","1" dbpf "FBH:BCM:IRQENB","1" dbpf "FBL:BCM:TRG_ENB","1" dbpf "FBH:BCM:TRG_ENB","1"
このうちの、前半でデータを読み取っているところが18K10からバンチ電流 情報をCPUに転送しているところ(64×4)、後半がReflective memoryへ 同じデータを書き込んでいるところです。いずれもAMコードは0Fで、32bit BLTモード転送をしています。18K10からの読み出しが、Reflectiveメモリー と比べて約4倍時間がかかっていますが、これはFPGAとVME制御用のCPLD の間のバスが狭いため、4データ読むのに4アクション近くかかっているためです。
バスアナライザをステートモードにして、割り込みからデータ転送終了までの 時間を測定したところ、大体11ms弱でしたので、50Hzの動作には問題無く 対応出来ます。
KEKB時代に使用していたDelphiで書いたバンチ電流表示ソフトを、R314対応に
して書き直しました。以下のように、ちゃんと表示できています。