21 output reg [6:0] addr = 0,
22 output reg [3:0] endp = 0,
23 output reg [10:0] frame_num = 0,
52 reg [3:0] dpair_q = 0;
54 always @(posedge clk) begin
55 dpair_q[3:0] <= {dpair_q[1:0], dp, dn};
72 reg [2:0] line_state = 0;
73 localparam DT = 3'b100;
74 localparam DJ = 3'b010;
75 localparam DK = 3'b001;
76 localparam SE0 = 3'b000;
77 localparam SE1 = 3'b011;
79 wire [1:0] dpair = dpair_q[3:2];
81 always @(posedge clk) begin
87 2'b10 : line_state <= DJ;
88 2'b01 : line_state <= DK;
89 2'b00 : line_state <= SE0;
90 2'b11 : line_state <= SE1;
96 DJ :
if (dpair != 2'b10) line_state <= DT;
97 DK :
if (dpair != 2'b01) line_state <= DT;
98 SE0 :
if (dpair != 2'b00) line_state <= DT;
99 SE1 :
if (dpair != 2'b11) line_state <= DT;
102 default : line_state <= DT;
120 reg [1:0] bit_phase = 0;
122 wire line_state_valid = (bit_phase == 1);
123 assign bit_strobe = (bit_phase == 2);
125 always @(posedge clk) begin
127 if (line_state == DT) begin
131 bit_phase <= bit_phase + 1;
143 reg [5:0] line_history = 0;
144 reg packet_valid = 0;
145 reg next_packet_valid;
146 wire packet_start = next_packet_valid && !packet_valid;
147 wire packet_end = !next_packet_valid && packet_valid;
150 if (line_state_valid) begin
152 if (!packet_valid && line_history[5:0] == 6'b100101) begin
153 next_packet_valid <= 1;
157 else if (packet_valid && line_history[3:0] == 4'b0000) begin
158 next_packet_valid <= 0;
161 next_packet_valid <= packet_valid;
164 next_packet_valid <= packet_valid;
168 always @(posedge clk) begin
170 line_history <= 6'b101010;
174 if (line_state_valid) begin
175 line_history[5:0] <= {line_history[3:0], line_state[1:0]};
178 packet_valid <= next_packet_valid;
194 case (line_history[3:0])
202 if (packet_valid && line_state_valid) begin
203 case (line_history[3:0])
204 4'b0101 : dvalid_raw <= 1;
205 4'b0110 : dvalid_raw <= 1;
206 4'b1001 : dvalid_raw <= 1;
207 4'b1010 : dvalid_raw <= 1;
208 default : dvalid_raw <= 0;
215 reg [5:0] bitstuff_history = 0;
217 always @(posedge clk) begin
218 if (reset || packet_end) begin
219 bitstuff_history <= 6'b000000;
221 if (dvalid_raw) begin
222 bitstuff_history <= {bitstuff_history[4:0], din};
227 wire dvalid = dvalid_raw && !(bitstuff_history == 6'b111111);
236 reg [8:0] full_pid = 0;
237 wire pid_valid = full_pid[4:1] == ~full_pid[8:5];
238 wire pid_complete = full_pid[0];
240 always @(posedge clk) begin
241 if (packet_start) begin
242 full_pid <= 9'b100000000;
245 if (dvalid && !pid_complete) begin
246 full_pid <= {din, full_pid[8:1]};
254 wire crc5_valid = crc5 == 5'b01100;
255 wire crc5_invert = din ^ crc5[4];
256 always @(posedge clk) begin
257 if (packet_start) begin
261 if (dvalid && pid_complete) begin
264 crc5[2] <= crc5[1] ^ crc5_invert;
266 crc5[0] <= crc5_invert;
273 reg [15:0] crc16 = 0;
274 wire crc16_valid = crc16 == 16'b1000000000001101;
275 wire crc16_invert = din ^ crc16[15];
277 always @(posedge clk) begin
278 if (packet_start) begin
279 crc16 <= 16'b1111111111111111;
282 if (dvalid && pid_complete) begin
283 crc16[15] <= crc16[14] ^ crc16_invert;
284 crc16[14] <= crc16[13];
285 crc16[13] <= crc16[12];
286 crc16[12] <= crc16[11];
287 crc16[11] <= crc16[10];
288 crc16[10] <= crc16[9];
289 crc16[9] <= crc16[8];
290 crc16[8] <= crc16[7];
291 crc16[7] <= crc16[6];
292 crc16[6] <= crc16[5];
293 crc16[5] <= crc16[4];
294 crc16[4] <= crc16[3];
295 crc16[3] <= crc16[2];
296 crc16[2] <= crc16[1] ^ crc16_invert;
297 crc16[1] <= crc16[0];
298 crc16[0] <= crc16_invert;
305 wire pkt_is_token = full_pid[2:1] == 2'b01;
306 wire pkt_is_data = full_pid[2:1] == 2'b11;
307 wire pkt_is_handshake = full_pid[2:1] == 2'b10;
312 assign valid_packet = pid_valid && (
313 (pkt_is_handshake) ||
314 (pkt_is_data && crc16_valid) ||
315 (pkt_is_token && crc5_valid)
319 reg [11:0] token_payload = 0;
320 wire token_payload_done = token_payload[0];
322 always @(posedge clk) begin
323 if (packet_start) begin
324 token_payload <= 12'b100000000000;
327 if (dvalid && pid_complete && pkt_is_token && !token_payload_done) begin
328 token_payload <= {din, token_payload[11:1]};
332 always @(posedge clk) begin
333 if (token_payload_done && pkt_is_token) begin
334 addr <= token_payload[7:1];
335 endp <= token_payload[11:8];
336 frame_num <= token_payload[11:1];
340 assign pkt_start = packet_start;
341 assign pkt_end = packet_end;
342 assign pid = full_pid[4:1];
351 reg [8:0] rx_data_buffer = 0;
352 wire rx_data_buffer_full = rx_data_buffer[0];
353 assign rx_data_put = rx_data_buffer_full;
354 assign rx_data = rx_data_buffer[8:1];
356 always @(posedge clk) begin
357 if (packet_start || rx_data_buffer_full) begin
358 rx_data_buffer <= 9'b100000000;
361 if (dvalid && pid_complete && pkt_is_data) begin
362 rx_data_buffer <= {din, rx_data_buffer[8:1]};
module usb_fs_rx(input clk_48mhz, input reset, input dp, input dn, output bit_strobe, output pkt_start, output pkt_end, output[4] pid, output reg< 6:0 > addr=0, output reg< 3:0 > endp=0, output reg< 10:0 > frame_num=0, output rx_data_put, output[8] rx_data, output valid_packet)