TITLE "MOP (Merger Output Processor)"; FUNCTION lpm_counter (data[LPM_WIDTH-1..0], clock, clk_en, cnt_en, updown, aclr, aset, aconst, aload, sclr, sset, sconst, sload) WITH (LPM_WIDTH, LPM_DIRECTION, LPM_MODULUS, LPM_AVALUE, LPM_SVALUE, CARRY_CNT_EN, LABWIDE_SCLR) RETURNS (q[LPM_WIDTH-1..0], eq[15..0], cout); FUNCTION lpm_mux (data[LPM_SIZE-1..0][LPM_WIDTH-1..0], sel[LPM_WIDTHS-1..0], clock, aclr) WITH (LPM_WIDTH, LPM_SIZE, LPM_WIDTHS, LPM_PIPELINE) RETURNS (result[LPM_WIDTH-1..0]); FUNCTION outprocessor(clock,hit[15..0],stream[5..0],init, fifofull[9..0],lostlock[3..0],streamdisable[9..0], endeventmask[43..0],endeventclr[43..0],endeventreset, vmebarrellayerin[5..0],barrellayeraddress[3..0], barrellayerclock,barrellayerwrite) RETURNS (vmebarrellayerout[5..0],opbarrellayeraddress[3..0], lostsyncerror[9..0],invaliddataerror[9..0], fifooverflowerror[9..0],truncateddataerror[9..0], lostlockerror[3..0], ds,d[20..0],ee,ep,validout); FUNCTION mopvmedecode(address[24..0], hf_load,hf_init,hf_freeze,hf_test,vmewrite,vme_as) RETURNS ( vmespyread, vmespywrite, fpspyread, fpspywrite, vmespycounterread, vmespycounterreset, vmebarrellayerread, vmebarrellayerwrite, vmedisableread, vmedisablewrite, vmeaendeventmaskread, vmeaendeventmaskwrite, vmeaendeventclrread, vmeaendeventclrwrite, vmeacdferrormaskread, vmeacdferrormaskwrite, vmeasvterrormaskread, vmeasvterrormaskwrite, vmeaerrorregread, vmealocalregread, vmebendeventmaskread, vmebendeventmaskwrite, vmebendeventclrread, vmebendeventclrwrite, vmebcdferrormaskread, vmebcdferrormaskwrite, vmebsvterrormaskread, vmebsvterrormaskwrite, vmeberrorregread, vmeblocalregread, vmecendeventmaskread, vmecendeventmaskwrite, vmecendeventclrread, vmecendeventclrwrite, vmeccdferrormaskread, vmeccdferrormaskwrite, vmecsvterrormaskread, vmecsvterrormaskwrite, vmecerrorregread, vmeclocalregread, vmeerrorregreset, vmeendeventreset, vmedipread, vmeidnumread, vmelastaddrread, vmelastaddrwrite); SUBDESIGN mop ( % dip switches % dip[9..0] : INPUT; % global clock % mopclock : INPUT; % MERGER interface % hit[17..0] : INPUT; stream[5..0] : INPUT; hold : OUTPUT; % HITLIST full flags % fifofull[9..0] : INPUT; % G-link lost lock alert % lostlock[3..0] : INPUT; % control interface % vmeclock : INPUT; vmewrite : INPUT; vmespare : INPUT; vme_as : INPUT; vmeaddress[24..0] : INPUT; vmedata[31..0] : BIDIR; HF_CDFerror : OUTPUT; HF_SVTerror : OUTPUT; HF_LostLock : OUTPUT; HF_Freeze : INPUT; HF_Load : INPUT; HF_Init : INPUT; HF_Test : INPUT; HF_Spare : INPUT; MOP_Spare[4..0] : INPUT; testclock : INPUT; % OSPY interface % spydata[35..0] : BIDIR; spyaddress[15..0] : OUTPUT; spyclock : OUTPUT; spyoe : OUTPUT; spycs : OUTPUT; spywritehigh : OUTPUT; spywritelow : OUTPUT; % Front Panel interface % d[20..0] : OUTPUT; ee : OUTPUT; ep : OUTPUT; ds : OUTPUT; validout : OUTPUT; validout2 : OUTPUT; dsled : OUTPUT; dsled2 : OUTPUT; fphold : INPUT; fp2hold : INPUT; holdled : OUTPUT; holdled2 : OUTPUT; ) VARIABLE op :outprocessor; % caches last vme address written % lastaddr[24..0] : DFFE; % multiplexes test data with op data for front panel % spymopmux :lpm_mux WITH (LPM_WIDTH=24, LPM_SIZE=2, LPM_WIDTHS=1); % multiplexes vme data with op data for spy access% vmefpspymux :lpm_mux WITH (LPM_WIDTH=17, LPM_SIZE=2, LPM_WIDTHS=1); % multiplexes vme data with op data for barrel/layer ram access% vmebarrellayermux :lpm_mux WITH (LPM_WIDTH=5, LPM_SIZE=2, LPM_WIDTHS=1); % counter for addressing ISPY % spycounter :lpm_counter WITH (LPM_WIDTH=16, LPM_DIRECTION="UP", LPM_MODULUS=2^16); spyoverflow :DFFE; % counter for making DS LEDs flash % slowcounter :lpm_counter WITH (LPM_WIDTH=2, LPM_DIRECTION="DOWN"); % internal nodes for barrellayer ram % barrellayer[5..0], barrellayeraddress[3..0], barrellayerclock, barrellayerwrite :NODE; % registered disable mask % disable[9..0] :DFFE; holddisable[1..0] : DFFE; dsdisable[1..0] : DFFE; % registered end event error mask % endeventmask[43..0] :DFFE; % registered end event clear % endeventclr[43..0] :DFFE; % registered CDF error mask % cdferrormask[43..0] :DFFE; % registered SVT error mask % svterrormask[43..0] :DFFE; % master error register % error_register[43..0] :DFFE; % "integrating" local copy of error register % local_register[43..0] :DFFE; % decode vme address % vmedecoder :mopvmedecode; % bus switches % vmespyread, vmespywrite, fpspyread, fpspywrite, vmespycounterread, vmespycounterreset, vmebarrellayerread, vmebarrellayerwrite, vmedisableread, vmedisablewrite, vmeaendeventmaskread, vmeaendeventmaskwrite, vmeaendeventclrread, vmeaendeventclrwrite, vmeacdferrormaskread, vmeacdferrormaskwrite, vmeasvterrormaskread, vmeasvterrormaskwrite, vmeaerrorregread, vmealocalregread, vmebendeventmaskread, vmebendeventmaskwrite, vmebendeventclrread, vmebendeventclrwrite, vmebcdferrormaskread, vmebcdferrormaskwrite, vmebsvterrormaskread, vmebsvterrormaskwrite, vmeberrorregread, vmeblocalregread, vmecendeventmaskread, vmecendeventmaskwrite, vmecendeventclrread, vmecendeventclrwrite, vmeccdferrormaskread, vmeccdferrormaskwrite, vmecsvterrormaskread, vmecsvterrormaskwrite, vmecerrorregread, vmeclocalregread, vmeerrorregreset, vmeendeventreset, vmedipread, vmeidnumread, vmelastaddrread, vmelastaddrwrite :NODE; % tri state buses % lastaddrvmetri[31..0] :TRI; spydatavmetri[31..0] :TRI; vmespydatatri[35..0] :TRI; fpspydatatri[22..0] :TRI; spycountervmetri[16..0] :TRI; barrellayervmetri[5..0] :TRI; disablevmetri[21..0] :TRI; aendeventvmetri[15..0] :TRI; aendeventclrvmetri[15..0] :TRI; aerrorregvmetri[15..0] :TRI; alocalregvmetri[15..0] :TRI; acdferrorvmetri[15..0] :TRI; asvterrorvmetri[15..0] :TRI; bendeventvmetri[15..0] :TRI; bendeventclrvmetri[15..0] :TRI; berrorregvmetri[15..0] :TRI; blocalregvmetri[15..0] :TRI; bcdferrorvmetri[15..0] :TRI; bsvterrorvmetri[15..0] :TRI; cendeventvmetri[11..0] :TRI; cendeventclrvmetri[11..0] :TRI; cerrorregvmetri[11..0] :TRI; clocalregvmetri[11..0] :TRI; ccdferrorvmetri[11..0] :TRI; csvterrorvmetri[11..0] :TRI; dipvmetri[9..0] :TRI; idnumvmetri[31..0] :TRI; % tri state nodes for BIDIR pins % spydatatri[35..0],vmedatatri[31..0]:TRI_STATE_NODE; % clock spy counter at right time % prevvalid : DFFE; % register the HOLD signal for ospy test mode % holdff : DFFE; holdff2 : DFFE; testdata[25..0] : DFFE; testdatb[25..0] : DFFE; freeze : NODE; llockff[3..0] : DFFE; llockgg[3..0] : DFFE; llockbuf[3..0] : NODE; mhff[22..0] : DFFE; mhvalid[1..0] : DFFE; freezeff1, freezeff2 : DFF; initnode : NODE; initff1, initff2 : DFF; BEGIN -- cache last vme address lastaddr[].d = vmeaddress[]; lastaddr[].clk = vmelastaddrwrite & vmeclock; lastaddrvmetri[31..27].in = GND; lastaddrvmetri[26..2].in = lastaddr[].q; lastaddrvmetri[1..0].in = GND; lastaddrvmetri[].oe = vmelastaddrread; vmedatatri[] = lastaddrvmetri[].out; -- register the hf_init signal initff1.d = hf_init; initff1.clk = mopclock; initff2.d = initff1.q; initff2.clk = mopclock; initnode = initff2.q; -- freeze signal used to be HF_Freeze; now use HF_Spare -- for OSPY freeze and use HF_Freeze for ISPY freeze -- freeze signal is now synchronized to mopclock freezeff1.d = HF_Spare; freezeff1.clk = mopclock; freezeff2.d = freezeff1.q; freezeff2.clk = mopclock; freeze = freezeff2.q; -- register the HOLD signal for ospy test mode -- (also "stop" bit from OSPY test data feigns HOLD) holdff.d = hold # testdata[25].q # testdatb[25].q; holdff.clrn = fpspyread; holdff.clk = mopclock; holdff2.d = holdff.q; holdff2.clrn = fpspyread; holdff2.clk = mopclock; -- register the Lost Losk inputs for glitch protection llockff[].d = lostlock[]; llockff[].clk = mopclock; llockff[].clrn = !hf_init; llockgg[].d = llockff[].q; llockgg[].clk = mopclock; llockgg[].clrn = !hf_init; llockbuf[] = lostlock[] & llockff[].q & llockgg[].q; -- inputs to output processor op.clock = mopclock; op.hit[15..0] = hit[15..0]; op.stream[] = stream[]; op.fifofull[] = !fifofull[]; op.lostlock[] = llockbuf[]; op.streamdisable[] = disable[].q; op.endeventmask[] = endeventmask[].q; op.endeventclr[] = endeventclr[].q; op.endeventreset = vmeendeventreset # initnode; op.init = initnode; op.vmebarrellayerin[] = barrellayer[]; op.barrellayerclock = barrellayerclock; op.barrellayeraddress[] = barrellayeraddress[]; op.barrellayerwrite = barrellayerwrite; -- register the error outputs from output processor error_register[].clk = mopclock; error_register[].clrn = !(vmeerrorregreset # initnode); error_register[9..0].d = op.lostsyncerror[] # error_register[9..0].q; error_register[19..10].d = op.fifooverflowerror[] # error_register[19..10].q; error_register[29..20].d = op.invaliddataerror[] # error_register[29..20].q; error_register[39..30].d = op.truncateddataerror[] # error_register[39..30].q; error_register[43..40].d = op.lostlockerror[] # error_register[43..40].q; -- keep "local copy" of error register that ignores hf_init local_register[].clk = mopclock; local_register[].clrn = !vmeerrorregreset; local_register[9..0].d = op.lostsyncerror[] # local_register[9..0].q; local_register[19..10].d = op.fifooverflowerror[] # local_register[19..10].q; local_register[29..20].d = op.invaliddataerror[] # local_register[29..20].q; local_register[39..30].d = op.truncateddataerror[] # local_register[39..30].q; local_register[43..40].d = op.lostlockerror[] # local_register[43..40].q; -- VME access to error register (16 bits at a time) aerrorregvmetri[15..0].in = error_register[15..0].q; aerrorregvmetri[].oe = vmeaerrorregread; vmedatatri[15..0] = aerrorregvmetri[].out; berrorregvmetri[15..0].in = error_register[31..16].q; berrorregvmetri[].oe = vmeberrorregread; vmedatatri[15..0] = berrorregvmetri[].out; cerrorregvmetri[11..0].in = error_register[43..32].q; cerrorregvmetri[].oe = vmecerrorregread; vmedatatri[11..0] = cerrorregvmetri[].out; -- VME access to "local" error register alocalregvmetri[15..0].in = local_register[15..0].q; alocalregvmetri[].oe = vmealocalregread; vmedatatri[15..0] = alocalregvmetri[].out; blocalregvmetri[15..0].in = local_register[31..16].q; blocalregvmetri[].oe = vmeblocalregread; vmedatatri[15..0] = blocalregvmetri[].out; clocalregvmetri[11..0].in = local_register[43..32].q; clocalregvmetri[].oe = vmeclocalregread; vmedatatri[11..0] = clocalregvmetri[].out; -- send HF_CDFerror, HF_SVTerror, HF_LostLock signals to Boot chip HF_CDFerror = ((error_register[].q & !cdferrormask[].q) != 0); HF_SVTerror = ((error_register[].q & !svterrormask[].q) != 0); HF_LostLock = ((llockbuf[] & !svterrormask[43..40].q) != 0); -- send Hold signal back to Merger chip hold = (fphold & !holddisable[0]) # (fp2hold & !holddisable[1]); -- connect BIDIR pins to tri-state nodes vmedata[] = vmedatatri[]; spydata[] = spydatatri[]; -- VME write to disable mask disable[9..0].d = vmedata[9..0]; holddisable[1..0].d = vmedata[11..10]; dsdisable[1..0].d = vmedata[13..12]; disable[].clk = vmeclock & vmedisablewrite; holddisable[].clk = vmeclock & vmedisablewrite; dsdisable[].clk = vmeclock & vmedisablewrite; -- VME read from disable mask (plus spare bits) if (vmeaddress[19..16]==0) then disablevmetri[9..0].in = disable[].q; disablevmetri[11..10].in = holddisable[].q; disablevmetri[13..12].in = dsdisable[].q; disablevmetri[14].in = fphold; disablevmetri[15].in = fp2hold; disablevmetri[16].in = !(slowcounter.eq[1] # dsdisable[0]); disablevmetri[17].in = !(slowcounter.eq[1] # dsdisable[1]); disablevmetri[21..18].in = lostlock[]; elsif (vmeaddress[19..16]==1) then disablevmetri[21..0] = H"155555"; elsif (vmeaddress[19..16]==2) then disablevmetri[21..0] = H"2aaaaa"; elsif (vmeaddress[19..16]==3) then disablevmetri[21..0] = H"3fffff"; else disablevmetri[21..0] = 0; end if; disablevmetri[].oe = vmedisableread; vmedatatri[21..0] = disablevmetri[].out; % write to aendeventmask over VME % endeventmask[15..0].d = vmedata[15..0]; endeventmask[15..0].clk = vmeclock & vmeaendeventmaskwrite; % read aendeventmask over VME % aendeventvmetri[15..0].in = endeventmask[15..0].q; aendeventvmetri[].oe = vmeaendeventmaskread; vmedatatri[15..0] = aendeventvmetri[].out; % write to bendeventmask over VME % endeventmask[31..16].d = vmedata[15..0]; endeventmask[31..16].clk = vmeclock & vmebendeventmaskwrite; % read bendeventmask over VME % bendeventvmetri[15..0].in = endeventmask[31..16].q; bendeventvmetri[].oe = vmebendeventmaskread; vmedatatri[15..0] = bendeventvmetri[].out; % write to cendeventmask over VME % endeventmask[43..32].d = vmedata[11..0]; endeventmask[43..32].clk = vmeclock & vmecendeventmaskwrite; % read bendeventmask over VME % cendeventvmetri[11..0].in = endeventmask[43..32].q; cendeventvmetri[].oe = vmecendeventmaskread; vmedatatri[11..0] = cendeventvmetri[].out; % write to aendeventclr over VME % endeventclr[15..0].d = vmedata[15..0]; endeventclr[15..0].clk = vmeclock & vmeaendeventclrwrite; % read aendeventclr over VME % aendeventclrvmetri[15..0].in = endeventclr[15..0].q; aendeventclrvmetri[].oe = vmeaendeventclrread; vmedatatri[15..0] = aendeventclrvmetri[].out; % write to bendeventclr over VME % endeventclr[31..16].d = vmedata[15..0]; endeventclr[31..16].clk = vmeclock & vmebendeventclrwrite; % read bendeventclr over VME % bendeventclrvmetri[15..0].in = endeventclr[31..16].q; bendeventclrvmetri[].oe = vmebendeventclrread; vmedatatri[15..0] = bendeventclrvmetri[].out; % write to cendeventclr over VME % endeventclr[43..32].d = vmedata[11..0]; endeventclr[43..32].clk = vmeclock & vmecendeventclrwrite; % read cendeventclr over VME % cendeventclrvmetri[11..0].in = endeventclr[43..32].q; cendeventclrvmetri[].oe = vmecendeventclrread; vmedatatri[11..0] = cendeventclrvmetri[].out; % write to acdferrormask over VME % cdferrormask[15..0].d = vmedata[15..0]; cdferrormask[15..0].clk = vmeclock & vmeacdferrormaskwrite; % read acdferrormask over VME % acdferrorvmetri[15..0].in = cdferrormask[15..0].q; acdferrorvmetri[].oe = vmeacdferrormaskread; vmedatatri[15..0] = acdferrorvmetri[].out; % write to bcdferrormask over VME % cdferrormask[31..16].d = vmedata[15..0]; cdferrormask[31..16].clk = vmeclock & vmebcdferrormaskwrite; % read bcdferrormask over VME % bcdferrorvmetri[15..0].in = cdferrormask[31..16].q; bcdferrorvmetri[].oe = vmebcdferrormaskread; vmedatatri[15..0] = bcdferrorvmetri[].out; % write to ccdferrormask over VME % cdferrormask[43..32].d = vmedata[11..0]; cdferrormask[43..32].clk = vmeclock & vmeccdferrormaskwrite; % read ccdferrormask over VME % ccdferrorvmetri[11..0].in = cdferrormask[43..32].q; ccdferrorvmetri[].oe = vmeccdferrormaskread; vmedatatri[11..0] = ccdferrorvmetri[].out; % write to asvterrormask over VME % svterrormask[15..0].d = vmedata[15..0]; svterrormask[15..0].clk = vmeclock & vmeasvterrormaskwrite; % read asvterrormask over VME % asvterrorvmetri[15..0].in = svterrormask[15..0].q; asvterrorvmetri[].oe = vmeasvterrormaskread; vmedatatri[15..0] = asvterrorvmetri[].out; % write to bsvterrormask over VME % svterrormask[31..16].d = vmedata[15..0]; svterrormask[31..16].clk = vmeclock & vmebsvterrormaskwrite; % read bsvterrormask over VME % bsvterrorvmetri[15..0].in = svterrormask[31..16].q; bsvterrorvmetri[].oe = vmebsvterrormaskread; vmedatatri[15..0] = bsvterrorvmetri[].out; % write to csvterrormask over VME % svterrormask[43..32].d = vmedata[11..0]; svterrormask[43..32].clk = vmeclock & vmecsvterrormaskwrite; % read csvterrormask over VME % csvterrorvmetri[11..0].in = svterrormask[43..32].q; csvterrorvmetri[].oe = vmecsvterrormaskread; vmedatatri[11..0] = csvterrorvmetri[].out; % op barrellayer interface % vmebarrellayermux.data[0][3..0] = op.opbarrellayeraddress[]; vmebarrellayermux.data[0][4] = mopclock; vmebarrellayermux.data[1][3..0] = vmeaddress[3..0]; vmebarrellayermux.data[1][4] = vmeclock & (vmebarrellayerread # vmebarrellayerwrite); vmebarrellayermux.sel[] = hf_load; barrellayerclock = vmebarrellayermux.result[4]; barrellayerwrite = vmebarrellayerwrite; barrellayeraddress[] = vmebarrellayermux.result[3..0]; barrellayer[] = vmedata[5..0]; barrellayervmetri[5..0].in = op.vmebarrellayerout[5..0]; barrellayervmetri[].oe = vmebarrellayerread; vmedatatri[5..0] = barrellayervmetri[].out; testdata[25..24] = spydata[31..30] & !spycounter.eq[0] & !spycounter.eq[1]; testdata[23] = spydata[23] & !holdff2.q & !spycounter.eq[0] & !spycounter.eq[1]; testdata[22..0].d = spydata[22..0]; testdata[].clk = spyclock; testdata[23..0].clrn = fpspyread; testdata[25..24].clrn = fpspyread; testdatb[25..0] = testdata[25..0]; testdatb[22..0].clk = mopclock; testdatb[23].clk = mopclock; testdatb[25..24].clk = mopclock; testdatb[23..0].clrn = fpspyread; testdatb[25..24].clrn = fpspyread; -- multiplex ospy test data with output-processor data spymopmux.data[0][20..0] = op.d[]; spymopmux.data[0][21] = op.ep; spymopmux.data[0][22] = op.ee; spymopmux.data[0][23] = op.validout; spymopmux.data[1][22..0] = testdatb[22..0].q; spymopmux.data[1][23] = testdatb[23].q; spymopmux.sel[] = fpspyread; -- latch 23-bit data outputs from multiplexer mhff[].d = spymopmux.result[22..0]; mhff[].clk = mopclock; mhff[].clrn = !initnode; d[] = mhff[20..0].q; ep = mhff[21].q; ee = mhff[22].q; -- latch "valid" outputs on inverted clock for data strobe mhvalid[].d = !dsdisable[].q & spymopmux.result[23]; mhvalid[].clk = !mopclock; mhvalid[].clrn = !(hf_load # initnode); validout = mhvalid[0].q; validout2 = mhvalid[1].q; ds = mopclock; % illuminate DS LEDs when data are moving % slowcounter.clock = mop_spare0; slowcounter.cnt_en = !slowcounter.eq[1]; slowcounter.data[] = 1; slowcounter.aload = hf_load; slowcounter.aclr = spymopmux.result[23]; dsled = !(spymopmux.result[23] & !dsdisable[0]); dsled2 = !(spymopmux.result[23] & !dsdisable[1]); % HOLD LEDs % holdled = !fphold; holdled2 = !fp2hold; % read dip switch bank % vmedatatri[9..0] = dipvmetri[].out; dipvmetri[9..0].in = dip[9..0]; dipvmetri[].oe = vmedipread; % interpret dip switch bank as ID number % vmedatatri[31..0] = idnumvmetri[].out; idnumvmetri[31..28] = B"0011"; IF (vmeaddress[1..0]==0) THEN idnumvmetri[27..24] = GND; END IF; IF (vmeaddress[1..0]==1) THEN idnumvmetri[27..26] = GND; idnumvmetri[25..24] = dip[9..8]; END IF; IF (vmeaddress[1..0]==2) THEN idnumvmetri[27..24] = dip[7..4]; END IF; IF (vmeaddress[1..0]==3) THEN idnumvmetri[27..24] = dip[3..0]; END IF; idnumvmetri[23..0].in = GND; idnumvmetri[].oe = vmeidnumread; % OSPY interface % % multiplex vme and fp for OSPY clock and address % prevvalid.d = op.validout # fpspyread; prevvalid.clk = !mopclock; spycounter.clock = mopclock; spycounter.cnt_en = !freeze & !hf_load & prevvalid.q & !holdff.q; spycounter.aclr = vmespycounterreset; spycounter.sclr = testdatb[24].q # (initnode & fpspyread); spyoverflow.clk = mopclock; spyoverflow.d = spyoverflow.q # spycounter.cout; spyoverflow.clrn = !vmespycounterreset; vmefpspymux.data[0][15..0] = spycounter.q[]; vmefpspymux.data[0][16] = !mopclock; vmefpspymux.data[1][15..0] = vmeaddress[15..0]; vmefpspymux.data[1][16] = (vmespyread # vmespywrite) & vmeclock; vmefpspymux.sel[] = hf_load # freeze; spyclock = vmefpspymux.result[16]; spywritehigh = !(vmespywrite # fpspywrite); spywritelow = !(vmespywrite # fpspywrite); spycs = !(fpspywrite # fpspyread # vmespywrite # vmespyread); spyoe = !(fpspyread # vmespyread); spyaddress[] = vmefpspymux.result[15..0]; spydatavmetri[] = spydata[31..0]; spydatavmetri[].oe = vmespyread; vmedatatri[] = spydatavmetri[].out; vmespydatatri[31..0].in = vmedata[31..0]; vmespydatatri[35..32].in = GND; vmespydatatri[].oe = vmespywrite; spydatatri[] = vmespydatatri[].out; fpspydatatri[20..0].in = op.d[]; fpspydatatri[21].in = op.ep; fpspydatatri[22].in = op.ee; fpspydatatri[].oe = fpspywrite; spydatatri[22..0] = fpspydatatri[].out; spycountervmetri[16].in = spyoverflow.q; spycountervmetri[15..0].in = spycounter.q[]; spycountervmetri[].oe = vmespycounterread; vmedatatri[16..0] = spycountervmetri[].out; -- inputs to VME decoder vmedecoder.address[] = vmeaddress[]; vmedecoder.hf_freeze = freeze; vmedecoder.hf_init = initnode; vmedecoder.hf_load = hf_load; vmedecoder.hf_test = hf_test; vmedecoder.vmewrite = vmewrite; vmedecoder.vme_as = vme_as; -- outputs from VME decoder vmespyread = vmedecoder.vmespyread; vmespywrite = vmedecoder.vmespywrite; fpspyread = vmedecoder.fpspyread; fpspywrite = vmedecoder.fpspywrite; vmespycounterread = vmedecoder.vmespycounterread; vmespycounterreset = vmedecoder.vmespycounterreset; vmebarrellayerread = vmedecoder.vmebarrellayerread; vmebarrellayerwrite = vmedecoder.vmebarrellayerwrite; vmedisableread = vmedecoder.vmedisableread; vmedisablewrite = vmedecoder.vmedisablewrite; vmeaendeventmaskread = vmedecoder.vmeaendeventmaskread; vmeaendeventmaskwrite = vmedecoder.vmeaendeventmaskwrite; vmeaendeventclrread = vmedecoder.vmeaendeventclrread; vmeaendeventclrwrite = vmedecoder.vmeaendeventclrwrite; vmeacdferrormaskread = vmedecoder.vmeacdferrormaskread; vmeacdferrormaskwrite = vmedecoder.vmeacdferrormaskwrite; vmeasvterrormaskread = vmedecoder.vmeasvterrormaskread; vmeasvterrormaskwrite = vmedecoder.vmeasvterrormaskwrite; vmeaerrorregread = vmedecoder.vmeaerrorregread; vmealocalregread = vmedecoder.vmealocalregread; vmebendeventmaskread = vmedecoder.vmebendeventmaskread; vmebendeventmaskwrite = vmedecoder.vmebendeventmaskwrite; vmebendeventclrread = vmedecoder.vmebendeventclrread; vmebendeventclrwrite = vmedecoder.vmebendeventclrwrite; vmebcdferrormaskread = vmedecoder.vmebcdferrormaskread; vmebcdferrormaskwrite = vmedecoder.vmebcdferrormaskwrite; vmebsvterrormaskread = vmedecoder.vmebsvterrormaskread; vmebsvterrormaskwrite = vmedecoder.vmebsvterrormaskwrite; vmeberrorregread = vmedecoder.vmeberrorregread; vmeblocalregread = vmedecoder.vmeblocalregread; vmecendeventmaskread = vmedecoder.vmecendeventmaskread; vmecendeventmaskwrite = vmedecoder.vmecendeventmaskwrite; vmecendeventclrread = vmedecoder.vmecendeventclrread; vmecendeventclrwrite = vmedecoder.vmecendeventclrwrite; vmeccdferrormaskread = vmedecoder.vmeccdferrormaskread; vmeccdferrormaskwrite = vmedecoder.vmeccdferrormaskwrite; vmecsvterrormaskread = vmedecoder.vmecsvterrormaskread; vmecsvterrormaskwrite = vmedecoder.vmecsvterrormaskwrite; vmecerrorregread = vmedecoder.vmecerrorregread; vmeclocalregread = vmedecoder.vmeclocalregread; vmeerrorregreset = vmedecoder.vmeerrorregreset; vmeendeventreset = vmedecoder.vmeendeventreset; vmedipread = vmedecoder.vmedipread; vmeidnumread = vmedecoder.vmeidnumread; vmelastaddrread = vmedecoder.vmelastaddrread; vmelastaddrwrite = vmedecoder.vmelastaddrwrite; END;