[2128] | 1 | function [fft_load, fft_lts_load, samp_skip_mode] = rx_fft_ctrl_fsm(lts_sync, fft_load_done, pkt_done) |
---|
[2088] | 2 | |
---|
| 3 | persistent fsm_state, fsm_state=xl_state(0, {xlUnsigned, 3, 0}); |
---|
| 4 | |
---|
| 5 | %Inputs: |
---|
| 6 | % lts_sync: Successful correlation of second LTS (must be 1 cycle) |
---|
| 7 | % fft_load_done: Last FFT input sample loaded |
---|
[4282] | 8 | % pkt_done: Resets state (last FFT is performed, pkt Rx ends early, etc.) |
---|
[2088] | 9 | |
---|
| 10 | %Outputs: |
---|
| 11 | % fft_load: Start FFT load operation |
---|
| 12 | % samp_skip_mode: Selection of number of samples to skip post FFT load |
---|
| 13 | % 0: Skip 0 samples (first LTS) |
---|
| 14 | % 1: Skip CP_LEN samples (second LTS and all DATA symbols) |
---|
| 15 | |
---|
| 16 | %States: |
---|
| 17 | % ST_LTS_WAIT: Waiting for LTS sync (this is the idle/reset state) |
---|
| 18 | % ST_LTS_LOAD1: Load first LTS into FFT |
---|
| 19 | % ST_LTS_LOAD2: Load second LTS into FFT |
---|
| 20 | % ST_DATA_LOAD: Load DATA symbols into FFT |
---|
| 21 | % ST_DATA_DONE: Finished loading DATA symbols (returns to LTS_WAIT) |
---|
| 22 | |
---|
| 23 | ST_LTS_WAIT = 0; |
---|
| 24 | ST_LTS_LOAD1 = 1; |
---|
| 25 | ST_LTS_LOAD2 = 2; |
---|
| 26 | ST_DATA_LOAD = 3; |
---|
| 27 | ST_DATA_DONE = 4; |
---|
| 28 | |
---|
| 29 | switch double(fsm_state) |
---|
| 30 | |
---|
| 31 | case ST_LTS_WAIT |
---|
| 32 | fft_load = 0; |
---|
| 33 | samp_skip_mode = 0; |
---|
[2128] | 34 | fft_lts_load = 0; |
---|
| 35 | |
---|
[2088] | 36 | if( (pkt_done==1) ) |
---|
| 37 | fsm_state = ST_LTS_WAIT; |
---|
| 38 | elseif( (lts_sync==1) ) |
---|
| 39 | fsm_state = ST_LTS_LOAD1; |
---|
| 40 | else |
---|
| 41 | fsm_state = ST_LTS_WAIT; |
---|
| 42 | end |
---|
| 43 | |
---|
| 44 | case ST_LTS_LOAD1 |
---|
[2128] | 45 | fft_load = 0;%1; |
---|
| 46 | fft_lts_load = 1; |
---|
[2088] | 47 | samp_skip_mode = 0; |
---|
| 48 | |
---|
| 49 | if( (pkt_done==1) ) |
---|
| 50 | fsm_state = ST_LTS_WAIT; |
---|
| 51 | elseif( (fft_load_done==1) ) |
---|
| 52 | fsm_state = ST_LTS_LOAD2; |
---|
| 53 | else |
---|
| 54 | fsm_state = ST_LTS_LOAD1; |
---|
| 55 | end |
---|
| 56 | |
---|
| 57 | case ST_LTS_LOAD2 |
---|
[2128] | 58 | fft_load = 0;%1; |
---|
| 59 | fft_lts_load = 1; |
---|
[2088] | 60 | samp_skip_mode = 1; |
---|
| 61 | |
---|
| 62 | if( (pkt_done==1) ) |
---|
| 63 | fsm_state = ST_LTS_WAIT; |
---|
| 64 | elseif( (fft_load_done==1) ) |
---|
| 65 | fsm_state = ST_DATA_LOAD; |
---|
| 66 | else |
---|
| 67 | fsm_state = ST_LTS_LOAD2; |
---|
| 68 | end |
---|
| 69 | |
---|
| 70 | case ST_DATA_LOAD |
---|
| 71 | fft_load = 1; |
---|
[2128] | 72 | fft_lts_load = 0; |
---|
[2088] | 73 | samp_skip_mode = 1; |
---|
| 74 | |
---|
| 75 | if( (pkt_done==1) ) |
---|
| 76 | fsm_state = ST_DATA_DONE; |
---|
| 77 | else |
---|
| 78 | fsm_state = ST_DATA_LOAD; |
---|
| 79 | end |
---|
| 80 | |
---|
| 81 | case ST_DATA_DONE |
---|
| 82 | fft_load = 0; |
---|
[2128] | 83 | fft_lts_load = 0; |
---|
[2088] | 84 | samp_skip_mode = 0; |
---|
| 85 | fsm_state = ST_LTS_WAIT; |
---|
| 86 | |
---|
| 87 | otherwise |
---|
| 88 | fft_load = 0; |
---|
[2128] | 89 | fft_lts_load = 0; |
---|
[2088] | 90 | samp_skip_mode = 0; |
---|
| 91 | fsm_state = ST_LTS_WAIT; |
---|
| 92 | |
---|
| 93 | end %end switch |
---|
| 94 | |
---|
| 95 | end %end function |
---|
| 96 | |
---|