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