SEQ - Sequencer
The sequencer block performs automatic execution of sequenced lines to produce timing signals. Each line optionally waits for an external trigger condition and runs for an optional phase1, then a mandatory phase2 before moving to the next line. Each line sets the block outputs during phase1 and phase2 as defined by user-configured mask. Individual lines can be repeated, and the whole table can be repeated, with a value of 0 meaning repeat forever.
Fields
Name  | 
Type  | 
Description  | 
|---|---|---|
ENABLE  | 
bit_mux  | 
Stop on falling edge, reset and enable on rising edge  | 
BITA  | 
bit_mux  | 
BITA for optional trigger condition  | 
BITB  | 
bit_mux  | 
BITB for optional trigger condition  | 
BITC  | 
bit_mux  | 
BITC for optional trigger condition  | 
POSA  | 
pos_mux  | 
POSA for optional trigger condition  | 
POSB  | 
pos_mux  | 
POSB for optional trigger condition  | 
POSC  | 
pos_mux  | 
POSC for optional trigger condition  | 
TABLE  | 
table  | 
Sequencer table of lines
        REPEATS             Number of times the line will repeat 
        TRIGGER             The trigger condition to start the phases 
        POSITION            The position that can be used in trigger condition 
        TIME1               The time the optional phase 1 should take 
        OUTA1               Output A value during phase 1 
        OUTB1               Output B value during phase 1 
        OUTC1               Output C value during phase 1 
        OUTD1               Output D value during phase 1 
        OUTE1               Output E value during phase 1 
        OUTF1               Output F value during phase 1 
        TIME2               The time the mandatory phase 2 should take 
        OUTA2               Output A value during phase 2 
        OUTB2               Output B value during phase 2 
        OUTC2               Output C value during phase 2 
        OUTD2               Output D value during phase 2 
        OUTE2               Output E value during phase 2 
        OUTF2               Output F value during phase 2  
15:0                REPEATS 
19:16               TRIGGER enum 
    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 int 
95:64               TIME1 
20:20               OUTA1 
21:21               OUTB1 
22:22               OUTC1 
23:23               OUTD1 
24:24               OUTE1 
25:25               OUTF1 
127:96              TIME2 
26:26               OUTA2 
27:27               OUTB2 
28:28               OUTC2 
29:29               OUTD2 
30:30               OUTE2 
31:31               OUTF2 
 | 
PRESCALE  | 
param time  | 
Prescalar for sequencer table times  | 
REPEATS  | 
param  | 
Number of times the table will repeat  | 
ACTIVE  | 
bit_out  | 
Sequencer active flag  | 
OUTA  | 
bit_out  | 
Output A for phase outputs  | 
OUTB  | 
bit_out  | 
Output B for phase outputs  | 
OUTC  | 
bit_out  | 
Output C for phase outputs  | 
OUTD  | 
bit_out  | 
Output D for phase outputs  | 
OUTE  | 
bit_out  | 
Output E for phase outputs  | 
OUTF  | 
bit_out  | 
Output F for phase outputs  | 
TABLE_REPEAT  | 
read  | 
Current iteration through the entire table  | 
TABLE_LINE  | 
read  | 
Current line in the table that is active  | 
LINE_REPEAT  | 
read  | 
Current iteration of the active table line  | 
STATE  | 
read enum  | 
Internal state machine state 
0   UNREADY 
1   WAIT_ENABLE 
2   WAIT_TRIGGER 
3   PHASE1 
4   PHASE2 
 | 
HEALTH  | 
read enum  | 
Was last run successful? 
0   OK 
1   DMA underrun 
2   Not ready for table 
 | 
Sequencer Table Line Composition
Bit Field  | 
Name  | 
Description  | 
|---|---|---|
[15:0]  | 
REPEATS  | 
Number of times the line will repeat  | 
[19:16]  | 
TRIGGER  | 
The trigger condition to start the phases 
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  | 
The position that can be used in trigger condition  | 
[95:64]  | 
TIME1  | 
The time the optional phase 1 should take  | 
[20:20]  | 
OUTA1  | 
Output A value during phase 1  | 
[21:21]  | 
OUTB1  | 
Output B value during phase 1  | 
[22:22]  | 
OUTC1  | 
Output C value during phase 1  | 
[23:23]  | 
OUTD1  | 
Output D value during phase 1  | 
[24:24]  | 
OUTE1  | 
Output E value during phase 1  | 
[25:25]  | 
OUTF1  | 
Output F value during phase 1  | 
[127:96]  | 
TIME2  | 
The time the mandatory phase 2 should take  | 
[26:26]  | 
OUTA2  | 
Output A value during phase 2  | 
[27:27]  | 
OUTB2  | 
Output B value during phase 2  | 
[28:28]  | 
OUTC2  | 
Output C value during phase 2  | 
[29:29]  | 
OUTD2  | 
Output D value during phase 2  | 
[30:30]  | 
OUTE2  | 
Output E value during phase 2  | 
[31:31]  | 
OUTF2  | 
Output F value during phase 2  | 
Generating fixed pulse trains
The basic use case is for generating fixed pulse trains when enabled. For example we can ask for 3x 50% duty cycle pulses by writing a single line table that is repeated 3 times. When enabled it will become active and immediately start producing pulses, remaining active until the pulses have been produced:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
3  | 
Immediate  | 
0  | 
5  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
5  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
We can also use it to generate irregular streams of pulses on different outputs by adding more lines to the table. Note that OUTB which was high at the end of Phase2 of the first line remains high in Phase1 of the second line:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
2  | 
Immediate  | 
0  | 
5  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
2  | 
0  | 
1  | 
0  | 
0  | 
0  | 
0  | 
3  | 
Immediate  | 
0  | 
1  | 
1  | 
1  | 
0  | 
0  | 
0  | 
0  | 
2  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
And we can set repeats on the entire table too. Note that in the second line of this table we have suppressed phase1 by setting its time to 0:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
2  | 
Immediate  | 
0  | 
5  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
2  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
1  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
5  | 
0  | 
1  | 
0  | 
0  | 
0  | 
0  | 
There are 6 outputs which allow for complex patterns to be generated:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
1  | 
Immediate  | 
0  | 
3  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
4  | 
1  | 
1  | 
0  | 
0  | 
0  | 
0  | 
1  | 
Immediate  | 
0  | 
5  | 
1  | 
1  | 
1  | 
0  | 
0  | 
0  | 
6  | 
1  | 
1  | 
1  | 
1  | 
0  | 
0  | 
1  | 
Immediate  | 
0  | 
7  | 
1  | 
1  | 
1  | 
1  | 
1  | 
0  | 
8  | 
1  | 
1  | 
1  | 
1  | 
1  | 
1  | 
Statemachine
There is an internal statemachine that controls which phase is currently being output. It has a number of transitions that allow it to skip PHASE1 if there is none, or skip WAIT_TRIGGER if there is no trigger condition.
External trigger sources
The trigger column in the table allows an optional trigger condition to be waited on before the phased times are started. The trigger condition is checked on each repeat of the line, but not checked during phase1 and phase2. You can see when the Block is waiting for a trigger signal as it will enter the WAIT_TRIGGER(2) state:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
3  | 
BITA=1  | 
0  | 
2  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
1  | 
BITB=1  | 
0  | 
3  | 
0  | 
1  | 
0  | 
0  | 
0  | 
0  | 
2  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
You can also use a position field as a trigger condition in the same way, this is useful to do a table based position compare:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
1  | 
POSA>=POSITION  | 
20  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
4  | 
0  | 
1  | 
0  | 
0  | 
0  | 
0  | 
3  | 
Immediate  | 
0  | 
1  | 
1  | 
1  | 
0  | 
0  | 
0  | 
0  | 
3  | 
0  | 
1  | 
0  | 
0  | 
0  | 
0  | 
2  | 
POSA<=POSITION  | 
10  | 
1  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
3  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
Prescaler
Each row of the table gives a time value for the phases. This value can be scaled with a block wide prescaler to allow a frame to be longer than 2**32 * 8e-9 = about 34 seconds. For example:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
2  | 
Immediate  | 
0  | 
1  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
Interrupting a sequence
Setting the repeats on a table row to 0 will cause it to iterate until interrupted by a falling ENABLE signal:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
0  | 
Immediate  | 
0  | 
5  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
5  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
In a similar way, REPEATS=0 on a table will cause the whole table to be iterated until interrupted by a falling ENABLE signal:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
1  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
5  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
2  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
3  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
And a rising edge of the ENABLE will re-run the same table from the start:
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
1  | 
Immediate  | 
0  | 
5  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
5  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
Streaming tables
When TABLE_LENGTH has the most significant bit set, it indicates there will be one more table pushed. The condition in which a new table can be pushed is signaled via an interrupt. When the last table is pushed (indicated by TABLE_LENGTH’s most significant bit cleared), the sequencer will repeat that table according to the value of the REPEATS register.
(Source code, png, hires.png, pdf)
T1  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
1  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
20  | 
1  | 
0  | 
0  | 
0  | 
0  | 
0  | 
1  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
20  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
T2  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
1  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
20  | 
0  | 
1  | 
0  | 
0  | 
0  | 
0  | 
1  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
10  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
1  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
10  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
T3  | 
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#  | 
Trigger  | 
Phase1  | 
Phase1 Outputs  | 
Phase2  | 
Phase2 Outputs  | 
|||||||||||
Repeats  | 
Condition  | 
Position  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
Time  | 
A  | 
B  | 
C  | 
D  | 
E  | 
F  | 
1  | 
Immediate  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
0  | 
20  | 
0  | 
0  | 
1  | 
0  | 
0  | 
0  |