
Logic has been included in the PCL to enable Multiblock operation - see Appendix A for the Multiblock specification. It was not feasible to include complete Multiblock logic inside the PCL gate array since considerations of cost and package size limited the number of pins available, so external logic is required to achieve Multiblock functionality.
A group of modules connected for Multiblock operation consists of a Primary module, zero or more Middle modules and an End module. The PCL input IFAT is used in the following manner:
Data transfer from the Primary module proceeds in the normal fashion (the PCL asserting AK, DK and OUST) until the end of data in the Primary module. The external logic then asserts WT, drives IFAT high and initiates a handshake to the adjacent Middle or End module. The high level on IFAT causes the attached PCL to enter a quiescent state; it continues to assert AK but no longer asserts DK or OUST. The timers, however, continue to run since a subsequent secondary address cycle may return control to the Primary module.
When control is passed to a Middle or End module, the external logic drives
IFAT high. A high level on IFAT while AK is high causes an
unattached PCL to be activated; it runs timing cycles, asserts DK and OUST,
and behaves as if it were attached (though it does not assert AK). When the
end of data in a Middle or End module is reached, the external logic drops
IFAT which causes the PCL to resume a true disconnected state, (and if a
Middle module, initiates a handshake to the next module).
When AS falls the primary PCL asserts OWT until all the middle and
end modules have properly detached.
Figure 11 shows the relevant waveforms.
The following ABEL file implements the Multiblock logic for the PCL in 3
PALs. The logic may be substantially simplified if advanced mode is not used;
it may be possible to use the OSA signal instead of IRD and IMS(2:0).
Figure 12 on page
gives the relevant schematic.
module mbglue
title 'Logic for Multiblock operation using PCL'
" Caution: This logic has been simulated but not tested; correct operation
" is not guaranteed.
PLA1 device 'P22V10' ;
PLA2 device 'P20RA10' ;
PLA3 device 'P22V10' ;
" This design needs asynchronous flipflops, which are in the 20RA10.
" The 22V10s are used in combinatorial mode; any device with sufficient
" product terms and pins could be used.
" IADV=0 if IADV to PCL is tied low, else 1
IADV = 1 ;
" PLA1 inputs
MBA_FB pin in PLA1 1 "I0" ; " monostable feedback
IMS0,IMS1,IMS2,IRD pin in PLA1 2,3,4,5 "I(1:4)" ; " from segment transceivers
IAS,IAK pin in PLA1 6,8 "I5,I7" ; " from segment transceivers
ONCL pin in PLA1 7 "I6" ; " from PCL; Clear signal
OST,OLT pin in PLA1 9,10 "I8,I9" ; " from PCL timers
OLTD pin in PLA1 11 "I10" ; " OLT delayed by 50ns (RC network)
TSI pin in PLA1 13 "I11" ; " from daisychain transceivers
MBC0,MBC1 pin in PLA1 15,14 "IO9,IO10" ; " multiblock control bits (from CSR#0)
FIFO_ERR pin in PLA1 16 "IO8" ; " from FIFO indicating it is
" FULL (for a write cycle)
" or EMPTY (for a read cycle)
IFAT pin in PLA1 17 "IO7" ; " from PLA2
" PLA1 outputs
NTAWT_RE pin in PLA1 18 "IO6" ='pos' ; " to PLA2
NTAWT_PR pin in PLA1 19 "IO5" ='pos' ; " to PLA2
HANDOVER pin in PLA1 20 "IO4" ='pos' ; " Signals that hand-over to next
" module should occur
MBSTOP pin in PLA1 21 "IO3" ='pos' ; " indicates that multiblock
" operation should stop.
MBCYC pin in PLA1 22 "IO2" ='pos' ; " to PLA2, PLA3 - timing signal
MB_ACCESS pin in PLA1 23 "IO1" ='pos' ; " MB active to LED (monostable)
" PLA2 inputs
VCC pin in PLA2 1 "PL~" ; " preload pin (tied high)
MBCYC pin in PLA2 2 "I0" ; " from PLA1
MBSTOP,HANDOVER pin in PLA2 3,4 "I1,I2" ; " from PLA1
NTAWT_PR,NTAWT_RE pin in PLA2 5,6 "I3,I4" ; " from PLA1
DSR2 pin in PLA2 7 "I5" ; " Dataspace location 2 select
" (from address decoder)
MBC0,MBC1 pin in PLA2 8,9 "I6,I7" ; " multiblock control bits (from CSR#0)
TSI pin in PLA2 10 "I8" ; " from daisychain transceivers
OST pin in PLA2 11 "I9" ; " short timer from PCL
ENTS pin in PLA2 15 "O8" ; " from PLA3
MBERR_PR pin in PLA2 20 "O3" ; " from PLA3
IFAT_PR,IFAT_RE pin in PLA2 22,21 "O1,O2" ; " from PLA3
" PLA2 outputs
IFAT pin in PLA2 14 "O9" ='reg,pos'; " to PCL; enables data cycles
" (primary) or disables (middle/end)
NTAWT pin in PLA2 16 "O7" ='reg,pos'; " to PLA3 ; delays DK(d) for MS=6
" or MS=7 NTA operaion
MBMENRDY pin in PLA2 17 "O6" ='reg,pos';"to PLA3; middle/end not ready
MBPDONE pin in PLA2 18 "O5" ='reg,pos'; " multiblock access of Primary
" module finished ; to PLA3
MBMDONE pin in PLA2 19 "O4" ='reg,pos'; " multiblock access of Middle
" module finished ; to PLA3.
" also drives IBSY on PCL to
" suppress data cycle on handover
MBERR pin in PLA2 23 "O0" ='reg,pos'; " Multiblock error to address decoder
" (causes SS=3 assertion)
" PLA3 inputs
OWT pin in PLA3 1 "I0" ; " from PCL
MBMDONE,MBPDONE pin in PLA3 4,5 "I3,I4" ; " from PLA2
MBMENRDY pin in PLA3 6 "I5" ; " from PLA2
NTAWT pin in PLA3 7 "I6" ; " from PLA2
DSR2 pin in PLA3 8 "I7" ; " Dataspace #2 select
MBC0,MBC1 pin in PLA3 9,10 "I8,I9" ; " from CSR#0
TSI,TKI pin in PLA3 11,13 "I10,I11" ; " from daisychain transceivers
HANDOVER pin in PLA3 18 "IO6" ; " from PLA1
MBSTOP pin in PLA3 19 "IO5" ; " from PLA1
MBCYC pin in PLA3 20 "IO4" ; " from PLA1
" PLA3 outputs
ENTS pin in PLA3 14 "IO10" ='pos' ; " to PLA2
TSO pin in PLA3 15 "IO9" ='pos' ; " to daisychain transceiver
TKO pin in PLA3 16 "IO8"='pos' ; " to daisychain transceiver
TWT pin in PLA3 17 "IO7" ='pos' ; " to segment WT transceiver
MBERR_PR pin in PLA3 21 "IO3" ='pos' ; " to PLA2
IFAT_PR pin in PLA3 23 "IO1" ='pos' ; " to PLA2
IFAT_RE pin in PLA3 22 "IO2" ='pos' ; " to PLA2
" Declarations
IMS = [IMS2..IMS0] ; " MS code
MBC = [MBC1..MBC0] ; " Multiblock control code
H = 1 ; L = 0 ; Z = .X. ; X = .X. ; " assignments for test vectors
" (ABEL syntax: # means OR, & means AND, == means .EQ.)
" Macros
MBPRI macro {(MBC==1)} ; " Multiblock Primary module
MBMID macro {(MBC==3)} ; " Multiblock Middle module
MBEND macro {(MBC==2)} ; " Multiblock End module
MBM_E macro {(MBMID # MBEND)} ; " Middle or end module
NTA_OP macro {((IMS == 2) # ((IMS == 6) " NTA operation
# (IMS == 7) & !IRD) & IADV)} ;
MS5 macro {((IMS == 5) & IADV)} ; " MS=5 buffer access
MS7R macro {((IMS == 7) & IRD & IADV)} ; "MS=7 read CSR#0 operation
MBMERUN macro {(MBM_E & TSI)} ;
ENSS3 macro {(!TKI & !TSO)} ; " Multiblock error (assert SS=3)
TSPASS macro {(TSI & (MBC==0))} ; " pass TSI
MBACK macro {(TKI # MBEND)} ; " acknowledge
PTSO macro {(MBMDONE # MBPDONE # TSPASS)} ;
MBWT macro {(TSO & TKI)} ; " asset WT during transfer
equations in PLA1
enable HANDOVER = 1 ;
HANDOVER = FIFO_ERR & !MS5 & !MS7R ; " hand-over at FIFO end unless
" buffer access or CSR#0 read
enable MBSTOP = 1 ; " stop MB if NTA operation, AS low or Clear
MBSTOP = NTA_OP & OLT " wait till start of cycle
# NTA_OP & MBM_E & !IFAT " unless an inactive mid/end module
# !IAS # !IAK # !ONCL ;
enable MB_ACCESS = 1 ;
!MB_ACCESS = (IFAT & MBMERUN) # !MBA_FB ;
enable MBCYC = 1 ;
MBCYC = !OST & OLT & OLTD ; " timing signal for MB logic
enable NTAWT_PR = IADV ;
NTAWT_PR = NTA_OP & MBPRI & IADV & IFAT ;
enable NTAWT_RE = IADV ;
NTAWT_RE = (!IAS # !ONCL) & IADV ;
equations in PLA3
enable TWT = 1 ;
TWT = OWT # MBWT # NTAWT & IADV ; " WT on PCL or MB handover
"or NTA cycle (DS(d))
enable TSO = 1 ;
TSO = PTSO ;
enable TKO = 1 ;
TKO = !(!MBACK # MBMENRDY & MBMERUN # MBPRI) ;
enable ENTS = 1 ;
ENTS = TKI & !TSO ;
" These set and reset terms cannot be made in PLA2 since
" the 20RA10 has only one product term for set/reset
enable IFAT_PR = 1 ;
IFAT_PR = MBPDONE # MBMERUN & MBACK ; "IFAT set
enable IFAT_RE = 1 ;
IFAT_RE = MBSTOP # MBMERUN & !MBACK ; "IFAT clear
enable MBERR_PR = 1 ;
MBERR_PR = ENSS3 & MBCYC & MBMID & HANDOVER & TSI " MBERR set
# ENSS3 & DSR2 & HANDOVER & MBPRI ;
equations in PLA2
" swap .PR and .RE functions since 20RA10 has inverting outputs
enable MBMENRDY = 1 ;
MBMENRDY := MBMERUN ;
MBMENRDY.C = !OST ;
MBMENRDY.PR = MBSTOP ;
MBMENRDY.RE = 0 ;
enable MBERR = 1 ;
MBERR.RE = MBERR_PR & !MBSTOP ;
MBERR.PR = MBSTOP ;
enable MBPDONE = 1 ;
MBPDONE.RE = MBPRI & ENTS & MBCYC & DSR2 & HANDOVER & !MBSTOP ;
MBPDONE.PR = MBSTOP ;
enable MBMDONE = 1 ;
MBMDONE.RE = ENTS & MBCYC & MBMID & HANDOVER & TSI & !MBSTOP ;
MBMDONE.PR = MBSTOP ;
enable IFAT = 1 ;
IFAT.RE = IFAT_PR & !MBSTOP & !OST ;
IFAT.PR = IFAT_RE ;
enable NTAWT = IADV ;
NTAWT:= 0 ;
NTAWT.RE = NTAWT_PR & IADV ;
NTAWT.PR = NTAWT_RE & IADV ;
NTAWT.C = !OST & IADV ; " clear NTAWT on OST(d)
"test vectors removed to save space
end mbglue
module NTA_DEC
title 'Address Decoder for Multiblock Application'
PLA4 device 'P16P8' ;
" Inputs
MBERR pin 1 ; " from multiblock PLA2 (gives SS=3)
FIFO_ERR pin 2 ; " from FIFO indicating FULL (write) or EMPTY (read)
OCND pin 3 ; " from PCL (indicates CSR space selected)
OAOR pin 4 ; " OA wire-OR as follows:
" OAOR = ADI_HI:OACA w# ADI_HI:OACB w# ADI_LO:OACA
" w# ADI_LO:OACB w# !(OA30 # OA31) w# !(OA2 # OA3) ;
IFAT pin 5 ; " from multiblock PLA2 (also drives PCL)
MBC0,MBC1 pin 6,7 ; " from CSR#0 - multiblock control bits
ORD pin 8 ; " from PCL
OA1,OA0 pin 9,11 ; " address bits (from adi)
MBMDONE pin 13 ; " from multiblock PLA2
" Outputs
USS3 pin 12 ='pos' ; " drives IUS0 and IUS1 on PCL
ISSD pin 14 ='pos' ; " to PCL
FIFO_A pin 15 ='pos' ; " selects FIFO
DSR2 pin 16 ='pos' ; " to multiblock PALs; dataspace register #2 selected
IAC2,IAC1,IAC0 pin 17,18,19 ='pos' ; " address code to PCL
" Definitions
IAC = [IAC2..IAC0] ; MBC = [MBC1..MBC0] ; OA_10 = [OA1..OA0] ;
X=.X. ;
equations
enable USS3 = 1; enable ISSD = 1; enable FIFO_A = 1;
enable DSR2 = 1; enable IAC2 = 1; enable IAC1 = 1; enable IAC0 = 1;
ISSD= MBMDONE ;
truth_table ([MBERR,FIFO_ERR,OCND,OAOR,IFAT,MBC,OA_10] ->
[USS3,ISSD,FIFO_A,DSR2,IAC])
[0,X,0,1,0, X, 0] -> [0,0, 0,0, 2] ; " DSR#0 : code 2 (error) .
[0,0,0,1,0, X, 1] -> [0,0, 1,0, 5] ; " DSR#1 : code 5 (FIFO)
[0,1,0,1,0, X, 1] -> [0,0, 1,0, 6] ; " DSR#1 : code 6 (FIFO end)
[0,X,0,1,0, 0, 2] -> [0,0, 0,0, 2] ; " DSR#2 : code 2 (error)
" (not configured - DSR2 not MB primary)
[0,X,0,1,0, 2, 2] -> [0,0, 0,0, 2] ; " DSR#2 : code 2 (error)
" (end DSR2 access not MB primary)
[0,X,0,1,0, 3, 2] -> [0,0, 0,0, 2] ; " DSR#2 : code 2 (error)
" (middle DSR2 access not MB primary)
[0,0,0,1,0, 1, 2] -> [0,0, 1,0, 5] ; " DSR#2 : code 5 (FIFO) (prim link read/write)
[0,1,0,1,0, 1, 2] -> [0,0, 1,1, 6] ; " DSR#2 : code 6 (FIFO) (prim link EOB, transfer)
[0,X,0,1,0, X, 3] -> [0,0, 0,0, 2] ; " DSR#3 : code 2 (error)
[0,X,0,0,0, X, X] -> [0,0, 0,0, 2] ; " bad dataspace : code 2 (error)
[0,X,X,X,1, 1, X] -> [0,1, 1,1, 6] ; " multiblock access primary, transferred
[0,0,X,X,1, 2, X] -> [0,0, 1,0, 5] ; " multiblock access end no error
[0,0,X,X,1, 3, X] -> [0,0, 1,0, 5] ; " multiblock access end no error
[0,1,X,X,1, 3, X] -> [0,0, 1,1, 6] ; " multiblock access middle EOB , transfer
[0,1,X,X,1, 2, X] -> [0,0, 1,0, 6] ; " multiblock access end EOB (SS=2)
[0,X,1,1,0, X, 0] -> [0,0, 0,0, 0] ; " CSR#0 : code 0
[0,X,1,1,0, X, 1] -> [0,0, 0,0, 7] ; " CSR#1 : code 7 (=csr#7)
[0,X,1,1,0, X, 2] -> [0,0, 0,0, 2] ; " CSR#2 : code 2 (error)
[0,X,1,1,0, X, 3] -> [0,0, 0,0, 3] ; " CSR#3 : code 3 (logical address)
[0,X,1,0,0, X, X] -> [0,0, 0,0, 2] ; " bad CSR : code 2 (error)
[1,X,X,X,X, X, X] -> [1,1, 0,0, 2] ; " multiblock transfer err. SS3.
" [X,X,X,X,X, X, X] -> [0,1, 0,0, 2] ; make SS=0 when MB middle done
" all unimplemented locations should produce an IAC of 2
test_vectors
([MBERR,FIFO_ERR,OCND,OAOR,IFAT,MBC0,MBC1,OA1,OA0] ->
[USS3,ISSD,FIFO_A,DSR2,IAC2,IAC1,IAC0])
[0,X,0,1,0, X,X, 0,0] -> [0,0, 0,0 ,0,1,0] ; " DSR#0 : code 2 (error) .
[0,0,0,1,0, X,X, 0,1] -> [0,0, 1,0 ,1,0,1] ; " DSR#1 : code 5 (FIFO)
[0,1,0,1,0, X,X, 0,1] -> [0,0, 1,0 ,1,1,0] ; " DSR#1 : code 6 (FIFO end)
[0,X,0,1,0, 0,0, 1,0] -> [0,0, 0,0 ,0,1,0] ; " DSR#2 : code 2 (error)
[0,X,0,1,0, X,1, 1,0] -> [0,0, 0,0 ,0,1,0] ; " DSR#2 : code 2 (error)
[0,0,0,1,0, 1,0, 1,0] -> [0,0, 1,0 ,1,0,1] ; " DSR#2 : code 5 (FIFO)
[0,1,0,1,0, 1,0, 1,0] -> [0,0, 1,1 ,1,1,0] ; " DSR#2 : code 6 (FIFO)
[0,X,0,1,0, X,X, 1,1] -> [0,0, 0,0 ,0,1,0] ; " DSR#3 : code 2 (error)
[0,X,0,0,0, X,X, X,X] -> [0,0, 0,0 ,0,1,0] ; " bad dataspace : code 2
[0,X,X,X,1, 1,0, X,X] -> [0,1, 1,1 ,1,1,0] ; " multiblock access master, transferred
[0,0,X,X,1, X,1, X,X] -> [0,0, 1,0 ,1,0,1] ; " multiblock access middle/end no error
[0,1,X,X,1, 1,1, X,X] -> [0,0, 1,1 ,1,1,0] ; " multiblock access middle EOB , transfer
[0,1,X,X,1, 0,1, X,X] -> [0,0, 1,0 ,1,1,0] ; " multiblock access end EOB (SS=2)
[0,X,1,1,0, X,X, 0,0] -> [0,0, 0,0 ,0,0,0] ; " CSR#0 : code 0
[0,X,1,1,0, X,X, 0,1] -> [0,0, 0,0 ,1,1,1] ; " CSR#1 : code 7 (=csr#7)
[0,X,1,1,0, X,X, 1,0] -> [0,0, 0,0 ,0,1,0] ; " CSR#2 : code 2 (error)
[0,X,1,1,0, X,X, 1,1] -> [0,0, 0,0 ,0,1,1] ; " CSR#3 : code 3 (logical address)
[0,X,1,0,0, X,X, X,X] -> [0,0, 0,0 ,0,1,0] ; " bad CSR : code 2 (error)
[1,X,X,X,X, X,X, X,X] -> [1,1, 0,0 ,0,1,0] ; " multiblock transfer err. SS3.
end NTA_DEC
