1 module chan_fifo_reader
6 input [3:0] samples_format,
11 output reg [15:0]tx_q,
12 output reg [15:0]tx_i,
14 output reg underrun) ;
16 // Should not be needed if adc clock rate < tx clock rate
20 // 16 bits interleaved complex samples
28 `define TIMESTAMP1 4'd4
29 `define TIMESTAMP2 4'd5
31 `define WAITSTROBE 4'd7
38 reg[3:0] reader_state;
39 reg[3:0] reader_next_state;
47 always @(posedge tx_clock)
51 reader_state <= `IDLE;
52 reader_next_state <= `IDLE;
62 reader_state = reader_next_state;
68 reader_next_state <= `READ;
76 // Just wait for the fifo data to arrive
79 reader_next_state <= `HEADER1;
82 // First part of the header
85 reader_next_state <= `HEADER2;
87 //Check Start burst flag
95 // Read payload length
98 payload_len <= (fifodata & 16'h1FF);
100 reader_next_state <= `TIMESTAMP1;
105 timestamp <= {fifodata, 16'b0};
107 reader_next_state <= `TIMESTAMP2;
112 timestamp <= timestamp + fifodata;
113 reader_next_state <= `WAIT;
116 // Decide if we wait, send or discard samples
119 // Wait a little bit more
120 if (timestamp > adc_clock + `JITTER)
121 reader_next_state <= `WAIT;
123 else if ((timestamp < adc_clock + `JITTER
124 && timestamp > adc_clock)
125 || timestamp == 32'hFFFFFFFF)
127 reader_next_state <= `WAITSTROBE;
130 else if (timestamp < adc_clock)
132 reader_next_state <= `DISCARD;
137 // Wait for the transmit chain to be ready
140 // If end of payload...
141 if (read_len == payload_len)
143 reader_next_state <= `DISCARD;
144 skip <= (payload_len < 508);
148 reader_next_state <= `SENDWAIT;
154 reader_next_state <= `SEND;
157 // Send the samples to the tx_chain
160 reader_next_state <= `WAITSTROBE;
162 read_len <= read_len + 2;
166 tx_q <= qsample ? fifodata : 16'bZ;
167 tx_i <= ~qsample ? fifodata : 16'bZ;
168 qsample <= ~ qsample;
172 // Assume 16 bits complex samples by default
173 $display ("Error unknown samples format");
174 tx_q <= qsample ? fifodata : 16'bZ;
175 tx_i <= ~qsample ? fifodata : 16'bZ;
176 qsample <= ~ qsample;
184 reader_next_state <= `IDLE;
189 $display ("Error unknown state");
190 reader_state <= `IDLE;
191 reader_next_state <= `IDLE;