Entity: usb_fs_nb_out_pe
- File: usb_fs_nb_out_pe.sv
Diagram
Description
Copyright lowRISC contributors. Copyright Luke Valenty (TinyFPGA project) Licensed under the Apache License, Version 2.0, see LICENSE for details. SPDX-License-Identifier: Apache-2.0 USB Full Speed Non-Buffered Protocol Engine for OUT/SETUP endpoints
Decode OUT/SETUP requests from host and accept data unless buffers are full (SETUP is a special form of OUT and starts a transaction sequence)
Based on usb_fs_out_pe.v from the TinyFPGA-Bootloader project but this version contains no packet buffers
Generics
| Generic name | Type | Value | Description |
|---|---|---|---|
| NumOutEps | logic [4:0] | 2 | |
| MaxOutPktSizeByte | int unsigned | 32 | |
| OutEpW | int unsigned | $clog2(NumOutEps) | derived parameter |
| PktW | int unsigned | $clog2(MaxOutPktSizeByte) | derived parameter |
Ports
| Port name | Direction | Type | Description |
|---|---|---|---|
| clk_48mhz_i | input | ||
| rst_ni | input | ||
| link_reset_i | input | ||
| dev_addr_i | input | [6:0] | |
| out_ep_current_o | output | [3:0] | Other signals address to this ep, |
| out_ep_data_put_o | output | put the data (put addr advances after) | |
| out_ep_put_addr_o | output | [PktW - 1:0] | Offset to put data (0..pktlen) |
| out_ep_data_o | output | [7:0] | |
| out_ep_newpkt_o | output | new packed, current was set | |
| out_ep_acked_o | output | good termination, device has acked | |
| out_ep_rollback_o | output | bad termination, discard data | |
| out_ep_setup_o | output | [NumOutEps-1:0] | |
| out_ep_full_i | input | [NumOutEps-1:0] | Cannot accept data |
| out_ep_stall_i | input | [NumOutEps-1:0] | Stalled |
| out_ep_iso_i | input | [NumOutEps-1:0] | Configure endpoint in isochronous mode |
| data_toggle_clear_i | input | [NumOutEps-1:0] | Clear the data toggles for an EP |
| rx_pkt_start_i | input | /////////// rx path // /////////// Strobed on reception of packet. | |
| rx_pkt_end_i | input | ||
| rx_pkt_valid_i | input | ||
| rx_pid_i | input | [3:0] | Most recent packet received. |
| rx_addr_i | input | [6:0] | |
| rx_endp_i | input | [3:0] | |
| rx_data_put_i | input | rx_data is pushed into endpoint controller. | |
| rx_data_i | input | [7:0] | |
| tx_pkt_start_o | output | /////////// tx path // /////////// Strobe to send new packet. | |
| tx_pkt_end_i | input | ||
| tx_pid_o | output | [3:0] |
Signals
| Name | Type | Description |
|---|---|---|
| unused_1 | logic | suppress warnings |
| out_xfr_state | state_out_e | |
| out_xfr_state_next | state_out_e | |
| out_xfr_start | logic | |
| new_pkt_end | logic | |
| rollback_data | logic | |
| nak_out_transfer | logic | set when the endpoint buffer is unable to receive the out transfer |
| data_toggle_q | logic [NumOutEps - 1:0] | data toggle state |
| data_toggle_d | logic [NumOutEps - 1:0] | data toggle state |
| token_received | logic | Decode the rx token |
| out_token_received | logic | Decode the rx token |
| setup_token_received | logic | Decode the rx token |
| invalid_packet_received | logic | |
| data_packet_received | logic | |
| non_data_packet_received | logic | |
| bad_data_toggle | logic | |
| ep_impl_d | logic | |
| ep_impl_q | logic | |
| out_ep_current_d | logic [3:0] | |
| current_xfer_setup_q | logic | 1: If the current transfer is a SETUP, 0: OUT |
| rx_pid_type | usb_pid_type_e | More syntax so can compare with enum |
| rx_pid | usb_pid_e | |
| out_ep_index | logic [OutEpW-1:0] | Make widths work - out_ep_current_d/out_ep_current_o only hold implemented endpoint IDs. These signals can be used to index signals of NumOutEps width. They are only valid if ep_impl_d/q are set, i.e., if the specified endpoint is implemented. |
| out_ep_index_d | logic [OutEpW-1:0] | |
| increment_addr | logic | address increment whenever there is a data put unless -- already going to NAK transaction and replay things -- the address is at max packet size NOTE if more than max packet size received then data is lost |
Constants
| Name | Type | Value | Description |
|---|---|---|---|
| OutEpW | int unsigned | $clog2(NumOutEps) | derived parameter |
| PktW | int unsigned | $clog2(MaxOutPktSizeByte) | derived parameter |
Types
| Name | Type | Description |
|---|---|---|
| state_out_e | enum logic [2:0] { StIdle, StRcvdOut, StRcvdDataStart, StRcvdDataEnd, StRcvdIsoDataEnd } |
Processes
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff
- unnamed: ( )
Type: always_comb
Description
////////////////////////////// out transfer state machine // //////////////////////////////
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff
- proc_data_toggle_d: ( )
Type: always_comb
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff
Description
put data strobe follows the rx strobe (which will latch the data)
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff
Description
nack an OUT if any data comes in with the endpoint full Note that if there is a full size packet buffer this will only be all or nothing but in the case there was a FIFO with less than a max packet size free you could get lucky and the packet received be small and fit with no need to NAK
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff