TITLE "VME address decoder for vmerger chip"; FUNCTION lpm_decode (data[LPM_WIDTH-1..0], enable, clock, aclr) WITH (LPM_WIDTH, LPM_DECODES, LPM_PIPELINE) RETURNS (eq[LPM_DECODES-1..0]); CONSTANT fifonum = 5; CONSTANT mergenum = 6; CONSTANT disablenum = B"00"; CONSTANT fifoefnum = B"10"; SUBDESIGN mergevmedecode ( vmeaddress[10..0] :INPUT; load :INPUT; vmewrite :INPUT; vme_as :INPUT; vmefiforead[9..0] :OUTPUT; vmedisableread :OUTPUT; vmedisablewrite :OUTPUT; vmefifoefread :OUTPUT; ) VARIABLE devices[4..0],fifostream[3..0],subaddress[1..0]:NODE; decstream :lpm_decode WITH (LPM_WIDTH=4,LPM_DECODES=10); BEGIN devices[] = vmeaddress[10..6]; fifostream[] = vmeaddress[5..2]; subaddress[] = vmeaddress[1..0]; decstream.data[] = fifostream[]; vmefiforead[] = load & !vmewrite & vme_as & decstream.eq[] & (devices[] == fifonum); vmedisablewrite = load & vmewrite & vme_as & (devices[] == mergenum) & (subaddress[] == disablenum); vmedisableread = load & !vmewrite & vme_as & (devices[] == mergenum) & (subaddress[] == disablenum); vmefifoefread = load & !vmewrite & vme_as & (devices[] == mergenum) & (subaddress[] == fifoefnum); END;