1 | function [fft_load, fft_lts_load, samp_skip_mode] = rx_fft_ctrl_fsm(lts_sync, fft_load_done, pkt_done) |
---|
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 |
---|
8 | % pkt_done: Resets state (last FFT is performed, pkt Rx ends early, etc.) |
---|
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; |
---|
34 | fft_lts_load = 0; |
---|
35 | |
---|
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 |
---|
45 | fft_load = 0;%1; |
---|
46 | fft_lts_load = 1; |
---|
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 |
---|
58 | fft_load = 0;%1; |
---|
59 | fft_lts_load = 1; |
---|
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; |
---|
72 | fft_lts_load = 0; |
---|
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; |
---|
83 | fft_lts_load = 0; |
---|
84 | samp_skip_mode = 0; |
---|
85 | fsm_state = ST_LTS_WAIT; |
---|
86 | |
---|
87 | otherwise |
---|
88 | fft_load = 0; |
---|
89 | fft_lts_load = 0; |
---|
90 | samp_skip_mode = 0; |
---|
91 | fsm_state = ST_LTS_WAIT; |
---|
92 | |
---|
93 | end %end switch |
---|
94 | |
---|
95 | end %end function |
---|
96 | |
---|