% THE TTC INPUT FIFO sub-ckt of dspinfpga JUNE 12'00 % FUNCTION lpm_fifo (data[(LPM_WIDTH-1)..0],rdreq,wrreq,clock,aclr) WITH (LPM_WIDTH,LPM_NUMWORDS,LPM_WIDTHU) RETURNS (q[(LPM_WIDTH-1)..0],empty,full) ; SUBDESIGN TTC (CP, INIT_TTC, INIT_BLK, TTC_BCID, TTC_TYPE, TTC_D[7..0], INHIBIT :INPUT; DO[31..0], BLKO[15..0], ERR, WDAT, WADD :OUTPUT;) VARIABLE BUFB :lpm_fifo WITH (LPM_WIDTH=24,LPM_NUMWORDS=16,LPM_WIDTHU=4); BUFT :lpm_fifo WITH (LPM_WIDTH=8 ,LPM_NUMWORDS=16,LPM_WIDTHU=4); BYT :DFF ; CNT[2..0] :DFF ; REGB[7..0] :DFFE ; REGE[7..0] :DFFE ; QVAL :DFF ; BLK[15..0] :DFF ; RD :LCELL ; SEQ[1..0] :DFF ; UDEL :DFF ; QINC :DFF ; BEGIN % BUFFER THE BCID: % BYT.CLK = CP ; BYT.CLRN = !INIT_TTC ; BYT.D = !BYT & TTC_BCID # BYT & !(CNT[]==7) ; CNT[].CLK = CP ; CNT[].CLRN = BYT ; IF BYT THEN CNT[].D = CNT[] + 1 ; ELSE CNT[].D = CNT[] ; END IF ; REGB[].CLK = CP ; REGB[].ENA = TTC_BCID & (CNT[]==0) & !BYT ; REGB[].D = TTC_D[] ; REGE[].CLK = CP ; REGE[].ENA = (CNT[]==1) ; REGE[].D = TTC_D[] ; BUFB.aclr = INIT_TTC ; BUFB.clock = CP ; BUFB.rdreq = RD ; BUFB.wrreq = (CNT[]==3) ; BUFB.data[7..0] = REGB[] ; BUFB.data[15..8] = REGE[] ; BUFB.DATA[23..16] = TTC_D[] ; % BUFFER THE TRIGGER TYPE: % BUFT.aclr = INIT_TTC ; BUFT.clock = CP ; BUFT.rdreq = RD ; BUFT.wrreq = TTC_TYPE ; BUFT.data[] = TTC_D[] ; ERR = BUFT.full # BUFB.full # BUFB.EMPTY & !BUFT.EMPTY ; % READ THE BUFFER OUTPUT DATA:% RD = !BUFB.EMPTY & !BUFT.EMPTY & !QVAL; QVAL.CLK = CP ; QVAL.D = RD # QVAL & !(SEQ[]==2); DO[23..0] = BUFB.q[23..0]; DO[31..24] = BUFT.q[7..0] ; % THE TTC BLOCK NUMBER WRITTEN TO THE DUAL-PORT BUFFER: % QINC.CLK = CP ; QINC.CLRN = !INIT_BLK ; QINC.D = (SEQ[]==2); BLK[].CLK = CP ; BLK[].CLRN = !INIT_BLK ; IF QINC THEN BLK[].D = BLK[] + 1 ; ELSE BLK[].D = BLK[] ; END IF; BLKO[] = BLK[] ; % WRITE TTC DATA AND BLK# TO THE DUAL PORT BUFFER: % SEQ[].CLK = CP ; SEQ[].CLRN = QVAL ; IF !INHIBIT & QVAL THEN SEQ[].D = SEQ[] + 1 ; ELSE SEQ[].D = SEQ[] ; END IF; UDEL.CLK = CP ; UDEL.D = SEQ[0]; WDAT = SEQ[0] & !UDEL ; WADD = SEQ[1] ; END ;