/*************************************************************************/ /* VFI_VETO.TDL */ /* */ /* Program for U20 of the VME-Fastbus Interface for the SuperK OD DAQ: */ /* */ /* 1) generate the delayed FTRG pulse (Fastbus TRiGger = TDC common */ /* stop) from the global trigger input (incl. veto function) via */ /* delay counter 'DELAYCNT' (PLD U20). */ /* 2) generate the Struck stop Trigger (STRG) from the global trigger */ /* with selectable pulsewidth 0...300 nsec. */ /* 3) vetos from the delay counter and the BIP signals (from PLD */ /* 'BIPFORM'). */ /* _ _ */ /* Inputs: TRG _| |_______________| |______________________________ */ /* _____________ _____________ */ /* BIPBUSY |_____________________| |__ */ /* _______________ */ /* CNT* ____________________| |_______________ */ /* _ */ /* Outputs: STRG ___________________| |______________________________ */ /* _ */ /* FTRG _______________________________| |__________________ */ /* ______________________________ */ /* VETO ___________________| |_ */ /* */ /* (vetoed) |<- delay ->| */ /* |<-->| wait-for-BIP */ /* 1 usec */ /* */ /* TRG = trigger input, activating the delay counter. */ /* BIPBUSY = BIP busy/veto signal from the 'BIPFORM' PLD. */ /* CNT* = indicates the delay counter (U20) not equal zero. */ /* When RQ[]=50, then a FTRG pulse is sent. */ /* 50 more counts (1 usec) are used to wait for the return */ /* of the BIP signal from the outer huts [150' twisted-pair */ /* = approx. 550 nsec signal roundtrip, measured]. */ /* STRG = Struck stop trigger, pulse length variable by W[] input */ /* (BCD switch): W[]=0 ==> no STRG */ /* W[]=1 ==> STRG=20ns */ /* W[]=2 ==> STRG=40ns */ /* : : : */ /* W[]=15 ==> STRG=300ns */ /* FTRG = Fastbus trigger output, delayed pulse of 100ns width. */ /* VETO = combined delay counter and BIP busy signal, i.e. flags */ /* the period when input triggers are ignored. */ /*************************************************************************/ #define PALNAME VFI_VETO #define JEDFILE "VFI_VETO.JED" #define PALTYPE "G26CV12" #define DESIGNER H.G. Berns #define COMPANY SuperK group, UW-Physics, Seattle #define PARTNUM G26CV12 #define REVISION V1.0 (last: July 9, 1996) #define COMMENTS \ VFI module: Trigger delay + Struck Stop + Veto. /************ I/O definitions ********************************************/ PALNAME (in clk, /* Clock input (50 MHz) */ rq9..0, /* Counter values from 'DELAYCNT' PLD */ trg, /* Global trigger input */ bipveto, /* Busy signal from 'BIPFORM' PLD */ !w3; /* BCD switch selector bit 3 */ io !w2..0; /* BCD switch selector for STRG pulse width */ reg veto, /* combined VETO output flag */ rs4..0, /* internal register flags */ trgedge, /* trigger edge (feedback to 'DELAYCNT' PLD) */ strg, /* output STRG (Struck latch stop trigger) */ ftrg) /* output FTRG (Fastbus common stop trigger) */ /************ PLD equations **********************************************/ { group rg[veto,trgedge,strg,ftrg,rs4..0], w[w3..0], rq[rq9..0], ins[w2..0], rw[strg,rs3..0]; rg[].ck = clk; /* register clock hook up */ rg[].pre = 0; /* no presets */ rg[].aclr = (rq[]==1023); /* register clear */ rg[].oe = ~0; /* all outputs enabled */ ins[].oe = 0; /* all io inputs high Z */ veto = rq[]!=0 | bipveto | trgedge | rw[]!=0; /* VETO flag */ if (trg) { /* internal flag to */ if (veto & !((rq[]!=0) | bipveto)) /* ignore overlapping */ rs4 = 1; /* triggers and vetos */ else rs4 = rs4; } else rs4 = 0; if (trg & /* trigger and */ (rq[]==0) & !bipveto & !veto & !rs4 & /* no veto and */ (rw[]==0)) { /* int. counter=0 ? */ trgedge = 1; /* set trigger edge */ } else { trgedge = 0; /* reset trigger edge */ } if (trgedge & rw[]==0) { table (w[] => strg,rs3,rs2,rs1,rs0) { ( 0 => 0,1,1,1,1); /* set STRG width */ ( 1 => 1,0,0,0,0); /* and start */ ( 2 => 1,0,0,0,1); /* internal counter */ ( 3 => 1,0,0,1,0); /* depending on the */ ( 4 => 1,0,0,1,1); /* w[] presetting */ ( 5 => 1,0,1,0,0); ( 6 => 1,0,1,0,1); ( 7 => 1,0,1,1,0); ( 8 => 1,0,1,1,1); ( 9 => 1,1,0,0,0); (10 => 1,1,0,0,1); (11 => 1,1,0,1,0); (12 => 1,1,0,1,1); (13 => 1,1,1,0,0); (14 => 1,1,1,0,1); (15 => 1,1,1,1,0); } } else { if (rw[]!=0) { rw[]--; /* internal count down*/ } else { rw[] = 0; } } ftrg = (rq[]==50 | rq[]==49 | rq[]==48 | /* FTRG ouput (100ns) */ rq[]==47 | rq[]==46); /************ PLD part definition ****************************************/ putpart(PALTYPE, JEDFILE, clk, rq0, rq9, rq8, rq7, rq6, VCC, rq5, rq4, rq3, rq2, rq1, trg, bipveto, rs0, rs1, rs2, rs3, rs4, trgedge, GND, strg, ftrg, veto, w0, w1, w2, w3) { neg(veto); } /************ Test vector(s) *********************************************/ test (clk,trg,w[],rq[],bipveto => rw[],veto,rs4,trgedge,strg,ftrg) { tracef("%w %w %2d %4d %w => %2d %w %w %w %w %w", clk,trg,w[],rq[],bipveto,rw[],veto,rs4,trgedge,strg,ftrg); ( 0,?, ?,1023,? => 0,1,0,0,0,0); /* init (reset) */ (\C,0, ?, 0,0 => 0,0,0,0,0,0); (\C,_,12, _,_ => _,_,_,_,_,_); /* set W[]=3 (!12) ==> STRG=60ns */ (\C,1, _, _,_ => _,_,_,1,_,_); /* incoming global trigger */ (\C,_, _, _,_ => 18,1,_,_,1,_); (\C,_, _, 100,_ => 17,_,_,0,_,_); (\C,_, _, 99,_ => 16,_,_,_,_,_); (\C,_, _, 98,_ => 15,_,_,_,0,_); (\C,_, _, 97,_ => 14,_,_,_,_,_); (\C,_, _, 96,_ => 13,_,_,_,_,_); (\C,_, _, 95,_ => 12,_,_,_,_,_); (\C,_, _, 94,_ => 11,_,_,_,_,_); (\C,_, _, 93,_ => 10,_,_,_,_,_); (\C,0, _, 92,_ => 9,_,_,_,_,_); (\C,_, _, 91,_ => 8,_,_,_,_,_); (\C,_, _, 90,_ => 7,_,_,_,_,_); (\C,_, _, 89,_ => 6,_,_,_,_,_); (\C,_, _, 88,_ => 5,_,_,_,_,_); (\C,_, _, 87,_ => 4,_,_,_,_,_); (\C,_, _, 86,_ => 3,_,_,_,_,_); (\C,_, _, 85,_ => 2,_,_,_,_,_); (\C,_, _, 84,_ => 1,_,_,_,_,_); (\C,_, _, 83,_ => 0,_,_,_,_,_); (\C,_, _, 51,_ => _,_,_,_,_,_); (\C,_, _, 50,_ => _,_,_,_,_,1); /* delayed FTRG generated */ (\C,_, _, 49,_ => _,_,_,_,_,_); (\C,_, _, 48,_ => _,_,_,_,_,_); (\C,_, _, 47,_ => _,_,_,_,_,_); (\C,_, _, 46,_ => _,_,_,_,_,_); (\C,_, _, 45,_ => _,_,_,_,_,0); (\C,_, _, 44,_ => _,_,_,_,_,_); (\C,_, _, 43,_ => _,_,_,_,_,_); (\C,_, _, 42,_ => _,_,_,_,_,_); (\C,_, _, 3,1 => _,_,_,_,_,_); /* BIP busy signal coming in */ (\C,_, _, 2,_ => _,_,_,_,_,_); (\C,_, _, 1,_ => _,_,_,_,_,_); (\C,_, _, 0,_ => _,_,_,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,0 => _,0,_,_,_,_); /* BIP busy end = veto end */ (\C,_, 7, _,_ => _,_,_,_,_,_); /* set W[]=8 (!7) ==> STRG=140ns */ (\C,1, _, _,_ => _,_,_,1,_,_); /* new incoming trigger */ (\C,_, _, _,_ => 23,1,_,_,1,_); (\C,_, _, 100,_ => 22,_,_,0,_,_); (\C,_, _, 99,_ => 21,_,_,_,_,_); (\C,_, _, 98,_ => 20,_,_,_,_,_); (\C,_, _, 97,_ => 19,_,_,_,_,_); (\C,_, _, 96,_ => 18,_,_,_,_,_); (\C,_, _, 95,_ => 17,_,_,_,_,_); (\C,_, _, 94,_ => 16,_,_,_,_,_); (\C,_, _, 93,_ => 15,_,_,_,0,_); (\C,0, _, 92,_ => 14,_,_,_,_,_); (\C,_, _, 91,_ => 13,_,_,_,_,_); (\C,_, _, 90,_ => 12,_,_,_,_,_); (\C,_, _, 89,_ => 11,_,_,_,_,_); (\C,_, _, 88,_ => 10,_,_,_,_,_); (\C,_, _, 87,_ => 9,_,_,_,_,_); (\C,_, _, 86,_ => 8,_,_,_,_,_); (\C,_, _, 85,_ => 7,_,_,_,_,_); (\C,_, _, 84,_ => 6,_,_,_,_,_); (\C,?, _, 83,_ => 5,_,_,_,_,_); /* ignored (vetoed) trigger */ (\C,_, _, 82,_ => 4,_,_,_,_,_); (\C,_, _, 81,_ => 3,_,_,_,_,_); (\C,_, _, 80,_ => 2,_,_,_,_,_); (\C,_, _, 79,_ => 1,_,_,_,_,_); (\C,_, _, 78,_ => 0,_,_,_,_,_); (\C,_, _, 77,_ => _,_,_,_,_,_); (\C,_, _, 51,_ => _,_,_,_,_,_); (\C,_, _, 50,_ => _,_,_,_,_,1); /* delayed FTRG generated */ (\C,_, _, 49,_ => _,_,_,_,_,_); (\C,_, _, 48,_ => _,_,_,_,_,_); (\C,_, _, 47,_ => _,_,_,_,_,_); (\C,_, _, 46,_ => _,_,_,_,_,_); (\C,_, _, 45,_ => _,_,_,_,_,0); (\C,_, _, 44,_ => _,_,_,_,_,_); (\C,_, _, 43,_ => _,_,_,_,_,_); (\C,_, _, 42,_ => _,_,_,_,_,_); (\C,_, _, 3,_ => _,_,_,_,_,_); (\C,_, _, 2,_ => _,_,_,_,_,_); (\C,_, _, 1,1 => _,_,_,_,_,_); /* BIP busy signal coming in */ (\C,_, _, 0,_ => _,_,_,_,_,_); /* continue veto */ (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); /* ignored trigger (BIP veto) */ (\C,0, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,0 => _,0,_,_,_,_); /* BIP busy end = veto end */ (\C,_,15, _,_ => _,_,_,_,_,_); /* set W[]=0 (!15) ==> no STRG! */ (\C,1, _, _,_ => _,_,_,1,_,_); /* incoming trigger */ (\C,_, _, _,_ => 15,1,_,_,_,_); (\C,?, _, 100,_ => 14,_,_,0,_,_); (\C,_, _, 99,_ => 13,_,_,_,_,_); (\C,_, _, 98,_ => 12,_,_,_,_,_); (\C,_, _, 97,_ => 11,_,_,_,_,_); (\C,_, _, 96,_ => 10,_,_,_,_,_); (\C,_, _, 95,_ => 9,_,_,_,_,_); (\C,_, _, 94,_ => 8,_,_,_,_,_); (\C,_, _, 93,_ => 7,_,_,_,_,_); (\C,_, _, 92,_ => 6,_,_,_,_,_); (\C,_, _, 51,_ => 5,_,_,_,_,_); (\C,_, _, 50,_ => 4,_,_,_,_,1); /* delayed FTRG */ (\C,_, _, 49,_ => 3,_,_,_,_,_); (\C,_, _, 48,_ => 2,_,_,_,_,_); (\C,_, _, 47,_ => 1,_,_,_,_,_); (\C,_, _, 46,_ => 0,_,_,_,_,_); (\C,_, _, 45,_ => _,_,_,_,_,0); (\C,_, _, 44,_ => _,_,_,_,_,_); (\C,_, _, 43,_ => _,_,_,_,_,_); (\C,_, _, 42,_ => _,_,_,_,_,_); (\C,_, _, 3,_ => _,_,_,_,_,_); (\C,_, _, 2,1 => _,_,_,_,_,_); (\C,_, _, 1,_ => _,_,_,_,_,_); (\C,_, _, 0,_ => _,_,_,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,1, _, _,_ => _,_,_,_,_,_); /* incoming trigger */ (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,0 => _,0,1,_,_,_); /* BIP end => veto end, but */ (\C,_, _, _,_ => _,_,_,_,_,_); /* overlapping trigger vetoed */ (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,0, _, _,_ => _,_,0,_,_,_); /* wait until end of trigger */ (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, 0, _,_ => _,_,_,_,_,_); /* set W[]=15 (!0) ==> STRG=300ns */ (\C,1, _, _,_ => _,_,_,1,_,_); /* new trigger, etc... */ (\C,_, _, _,_ => 30,1,_,_,1,_); /* new trigger, etc... */ (\C,_, _, 120,_ => 29,_,_,0,_,_); (\C,_, _, 119,_ => 28,_,_,_,_,_); (\C,_, _, 118,_ => 27,_,_,_,_,_); (\C,_, _, 117,_ => 26,_,_,_,_,_); (\C,_, _, 116,_ => 25,_,_,_,_,_); (\C,_, _, 115,_ => 24,_,_,_,_,_); (\C,_, _, 114,_ => 23,_,_,_,_,_); (\C,_, _, 113,_ => 22,_,_,_,_,_); (\C,_, _, 112,_ => 21,_,_,_,_,_); (\C,?, _, 111,_ => 20,_,_,_,_,_); (\C,_, _, 110,_ => 19,_,_,_,_,_); (\C,_, _, 109,_ => 18,_,_,_,_,_); (\C,_, _, 108,_ => 17,_,_,_,_,_); (\C,_, _, 107,_ => 16,_,_,_,_,_); (\C,_, _, 106,_ => 15,_,_,_,0,_); (\C,_, _, 105,_ => 14,_,_,_,_,_); (\C,_, _, 104,_ => 13,_,_,_,_,_); (\C,_, _, 103,_ => 12,_,_,_,_,_); (\C,_, _, 102,_ => 11,_,_,_,_,_); (\C,_, _, 101,_ => 10,_,_,_,_,_); (\C,_, _, 100,_ => 9,_,_,_,_,_); (\C,_, _, 99,_ => 8,_,_,_,_,_); (\C,_, _, 98,_ => 7,_,_,_,_,_); (\C,_, _, 97,_ => 6,_,_,_,_,_); (\C,_, _, 96,_ => 5,_,_,_,_,_); (\C,_, _, 95,_ => 4,_,_,_,_,_); (\C,_, _, 94,_ => 3,_,_,_,_,_); (\C,_, _, 93,_ => 2,_,_,_,_,_); (\C,_, _, 92,_ => 1,_,_,_,_,_); (\C,_, _, 91,_ => 0,_,_,_,_,_); (\C,_, _, 90,_ => _,_,_,_,_,_); (\C,_, _, 50,_ => _,_,_,_,_,1); (\C,_, _, 49,_ => _,_,_,_,_,_); (\C,_, _, 48,_ => _,_,_,_,_,_); (\C,_, _, 47,_ => _,_,_,_,_,_); (\C,_, _, 46,_ => _,_,_,_,_,_); (\C,_, _, 45,_ => _,_,_,_,_,0); (\C,_, _, 44,_ => _,_,_,_,_,_); (\C,_, _, 3,_ => _,_,_,_,_,_); (\C,1, _, 2,1 => _,_,_,_,_,_); (\C,_, _, 1,_ => _,_,_,_,_,_); (\C,_, _, 0,_ => _,_,_,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,0 => _,0,1,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,0, _, _,_ => _,_,0,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,_, _, _,_ => _,_,_,_,_,_); (\C,1, _, _,_ => _,_,_,1,_,_); (\C,_, _, _,_ => 30,1,_,_,1,_); } } /************ end of TDL file *********************************************/