Next: 11.9 Application Note #9 Up: 11 Application notes Previous: 11.7 Application Note #7

11.8 Application Note #8 - Multiblock operation

Multiblock

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



Next: 11.9 Application Note #9 Up: 11 Application notes Previous: 11.7 Application Note #7


A.Daviel,TRIUMF