qcm_seq0.q1asm#
qcm_seq0.q1asm#
1 .DEF T_TOTAL {T_TOTAL} # ns, total waveform duration (<= 65535)
2 .DEF START_ALIGN {START_ALIGN} # ns, alignment before the loop
3
4 .DEF TRIG_HIGH 20 # ns, marker high time for trigger pulse
5 .DEF TRIG_LOW 4 # ns, marker low update time (keeps timing explicit)
6 .DEF TRIG_MRK_MASK 1 # 0b0001 -> marker M1 high
7
8 .DEF GAUSS_INIT_DELAY {GAUSS_INIT_DELAY} # ns, base delay from trigger to Gaussian start
9 .DEF GAUSS_DUR {T_GAUSS} # ns, play duration for Gaussian waveform
10 .DEF GAUSS_GAIN {GAUSS_GAIN} # AWG gain (signed 16-bit range: -32768..32767)
11 .DEF GAUSS_W0 0 # waveform index on path 0 (Gaussian)
12 .DEF GAUSS_W1 0 # waveform index on path 1 (unused, gain=0)
13
14 .DEF DRIFT_STEP 1
15 .DEF DRIFT_MAX {DRIFT_MAX}
16 .DEF DRIFT_JUMP_SHOT 300
17 .DEF DRIFT_JUMP 100
18
19 .DEF ZERO R0
20 .DEF PEAK_SHIFT R1
21 .DEF GAUSS_DELAY R2
22 .DEF POST_WAIT R3 # remaining wait to complete the shot period
23 .DEF SHOT_COUNT R4
24 .DEF TMP R5
25
26 wait_sync 4
27
28 move 0, $ZERO
29 move 0, $PEAK_SHIFT
30 move 0, $SHOT_COUNT
31
32 move 78945612, R61 # initial seed value
33
34 wait $START_ALIGN
35
36 shot_loop:
37 wait_trigger 1, 8 # marker M1, timeout 8 ns (minimum is 8 ns)
38 move $GAUSS_INIT_DELAY, $GAUSS_DELAY
39 nop
40 add $GAUSS_DELAY, $PEAK_SHIFT, $GAUSS_DELAY
41
42 move $T_TOTAL, $POST_WAIT # POST_WAIT = T_TOTAL
43 nop
44 sub $POST_WAIT, $TRIG_HIGH, $POST_WAIT # POST_WAIT = POST_WAIT - TRIG_HIGH
45 nop
46 sub $POST_WAIT, $TRIG_LOW, $POST_WAIT # POST_WAIT = POST_WAIT - TRIG_LOW
47 nop
48 sub $POST_WAIT, $GAUSS_DELAY, $POST_WAIT # POST_WAIT = POST_WAIT - GAUSS_DELAY
49 nop
50 sub $POST_WAIT, $GAUSS_DUR, $POST_WAIT # POST_WAIT = POST_WAIT - GAUSS_DUR
51
52 # ## xorshift32
53 asl R61,13,R62
54 nop
55 xor R61,R62,R61
56 nop
57
58 asr R61,17,R62
59 nop
60 and R62,0x7FFF,R62 # logical >> 17 mask
61 nop
62 xor R61,R62,R61
63 nop
64
65 asl R61,5,R62
66 nop
67 xor R61,R62,R61
68 nop
69
70 asr R61,24,R50
71 nop
72 and R50,0xFF,R50 # top 8 bits as unsigned
73 nop
74 add R50,$DRIFT_JUMP,R50
75
76
77 ## -------------------------------------------------------------------------
78 ## RT timeline: Trigger pulse (marker M1)
79 ## Note: set_mrk is latched; upd_param applies it and consumes RT time.
80 ## -------------------------------------------------------------------------
81 set_mrk $TRIG_MRK_MASK # 0b0001 Marker M1 high
82 upd_param $TRIG_HIGH # wait TRIG_HIGH
83 set_mrk 0 # Marker low
84 upd_param $TRIG_LOW # wait TRIG_LOW
85
86 ## -------------------------------------------------------------------------
87 ## RT timeline: Wait, then play the Gaussian peak
88 ## -------------------------------------------------------------------------
89 nop
90 wait $GAUSS_DELAY # wait GAUSS_DELAY ns
91
92 ## Apply gain for path0; keep path1 silent with gain=0.
93 set_awg_gain $GAUSS_GAIN, 0 # path 0's gain, path 1's gain=0
94 play $GAUSS_W0, $GAUSS_W1, $GAUSS_DUR # gaussian waveform, (dummy), duration
95
96 # Finish the fixed-length shot
97 wait $POST_WAIT # wait POST_WAIT # cannot be upd_param
98
99 add $SHOT_COUNT, 1, $SHOT_COUNT # counter for drift
100 nop
101 jge $SHOT_COUNT, $DRIFT_JUMP_SHOT, @do_jump # if SHOT_COUNT > DRIFT_JUMP_SHOT: jump
102 nop
103 nop
104 jmp @after_jump
105 nop
106
107 do_jump:
108# add $PEAK_SHIFT, $DRIFT_JUMP, $PEAK_SHIFT
109 add $PEAK_SHIFT, R50, $PEAK_SHIFT
110 nop
111 move 0, $SHOT_COUNT
112 after_jump:
113 # add $PEAK_SHIFT, $DRIFT_STEP, $PEAK_SHIFT
114 # add $PEAK_SHIFT, R50, $PEAK_SHIFT
115 nop
116 drift_wrap:
117 jlt $PEAK_SHIFT, $DRIFT_MAX, @drift_ok # if PEAK_SHIFT < DRIFT_MAX: ok
118 nop
119 sub $PEAK_SHIFT, $DRIFT_MAX, $PEAK_SHIFT # drift too much
120 nop
121 jmp @drift_wrap
122 nop
123 # move 0, $PEAK_SHIFT
124 drift_ok:
125 jmp @shot_loop
126 nop
127 stop