Extending SEQ to deal with positions - PandABlocks/PandABlocks-FPGA GitHub Wiki

Background

The sequencer currently lets you make a series of pulses, optionally waiting for a bit_bus value for each pulse. This can be used for a tomography scan with position based rotation and time based pulses within it like this:

+----------+       +-----------+      +---------------+     +-----------+
|      val +-------+ trig  out +------+ inpa     outa +-----+ val       |
|          |       | start=0   |      | repeats=6     |     |           |
|          |       | width=1   |      | wait for inpa |     |           |
|          |       | step=180  |      | 360 1ms pulses|     |           |
|          |       | num=6     |      |     on outa   |     |           |
+----------+       +-----------+      +---------------+     +-----------+
   INENC1              PCOMP                SEQ                 TTLOUT1

A grid scan can be accomplished with a second output of SEQ being used to gate the enable of PCOMP, and a snake scan can be accomplished with 2 PCOMP blocks or-ed together.

However, there is no way to do variable length rows

Proposal

Add position inputs to sequencer, so that each row contains the PCOMP information:

+----------+     +----------------+     +-----------+
|      val +-----+ posa      outa +-----+ val       |
|          |     |                |     |           |
|          |     | wait posa>0    |     |           |
|          |     | 360 1ms pulses |     |           |
|          |     |     on outa    |     |           |
+----------+     | wait posa>180  |     +-----------+
   INENC1        | 180 2ms pulses |         TTLOUT1
                 |     on outa    |
                 +----------------+
                        SEQ

This would also allow us to easily specify a snake and insert arbitrary intermediate points to control jitter in the turnaround. It is more powerful than table based position compare as it allows multiple axes to be used as the trigger.

For instance, a position compare on segments of a spiral with time based pulses could be:

 +---------+     +---------------+     +-----------+
 |     val +-----+ posa     outa +-----+ val       |
 +---------+     |               |     |           |
    INENC1    +--+ posb          |     |           |
              |  |               |     |           |
 +---------+  |  | wait posa>0   |     |           |
 |     val +--+  | 100 1ms pulses|     +-----------+
 +---------+     |     on outa   |         TTLOUT1
    INENC2       | wait posb>500 |
                 | 120 1ms pulses|
                 |     on outa   |
                 +---------------+
                       SEQ

Table specification

15:0 REPEATS (was 32 bit)
19:16 TRIGGER enum (was input mask and values)
    0 Immediate
    1 BITA=0
    2 BITA=1
    3 BITB=0
    4 BITB=1
    5 BITC=0
    6 BITC=1
    7 POSA>=POSITION
    8 POSA<=POSITION
    9 POSB>=POSITION
    10 POSB<=POSITION
    11 POSC>=POSITION
    12 POSC<=POSITION
63:32 POSITION (new)
95:64 TIME1 (was PH1_TIME)
20:20 OUTA1 (was PH1_OUTA)
21:21 OUTB1 (was PH1_OUTB)
22:22 OUTC1 (was PH1_OUTC)
23:23 OUTD1 (was PH1_OUTD)
24:24 OUTE1 (was PH1_OUTE)
25:25 OUTF1 (was PH1_OUTF)
127:96 TIME2 (was PH2_TIME)
26:26 OUTA2 (was PH2_OUTA)
27:27 OUTB2 (was PH2_OUTB)
28:28 OUTC2 (was PH2_OUTC)
29:29 OUTD2 (was PH2_OUTD)
30:30 OUTE2 (was PH2_OUTE)
31:31 OUTF2 (was PH2_OUTF)

Progress

  • For discussion on 01/09/2017
  • Soleil to send details about flyscan
  • Implemented in seq_pos branch
  • Reviewed by Soleil and merged into master