Entity: usbdev_usbif
- File: usbdev_usbif.sv
Diagram
Description
Copyright lowRISC contributors. Licensed under the Apache License, Version 2.0, see LICENSE for details. SPDX-License-Identifier: Apache-2.0
USB Full-Speed Device Interface core internals
This module runs on the 48MHz USB clock
Generics
| Generic name | Type | Value | Description |
|---|---|---|---|
| NEndpoints | int | 12 | |
| AVFifoWidth | int | 4 | |
| RXFifoWidth | int | 4 | |
| MaxPktSizeByte | int | 64 | |
| NBuf | int | 4 | |
| SramAw | int | 4 | |
| NBufWidth | int | $clog2(NBuf) | derived parameter |
| PktW | int | $clog2(MaxPktSizeByte) | derived parameter |
Ports
| Port name | Direction | Type | Description |
|---|---|---|---|
| clk_48mhz_i | input | 48MHz USB clock | |
| rst_ni | input | ||
| usb_d_i | input | Pins (synchronous) | |
| usb_dp_i | input | ||
| usb_dn_i | input | ||
| usb_d_o | output | ||
| usb_se0_o | output | ||
| usb_oe_o | output | ||
| usb_pullup_en_o | output | ||
| usb_sense_i | input | ||
| rx_setup_i | input | [NEndpoints-1:0] | receive (OUT or SETUP) side |
| rx_out_i | input | [NEndpoints-1:0] | |
| rx_stall_i | input | [NEndpoints-1:0] | |
| av_rvalid_i | input | ||
| av_rready_o | output | ||
| av_rdata_i | input | [AVFifoWidth - 1: 0] | |
| event_av_empty_o | output | ||
| rx_wvalid_o | output | ||
| rx_wready_i | input | ||
| rx_wdata_o | output | [RXFifoWidth - 1:0] | |
| event_rx_full_o | output | ||
| setup_received_o | output | ||
| out_endpoint_o | output | [3:0] | |
| out_endpoint_val_o | output | ||
| in_buf_i | input | [NBufWidth - 1:0] | transmit (IN) side |
| in_size_i | input | [PktW:0] | |
| in_stall_i | input | [NEndpoints-1:0] | |
| in_rdy_i | input | [NEndpoints-1:0] | |
| set_sent_o | output | ||
| in_endpoint_o | output | [3:0] | |
| in_endpoint_val_o | output | ||
| mem_req_o | output | memory interface | |
| mem_write_o | output | ||
| mem_addr_o | output | [SramAw-1:0] | |
| mem_wdata_o | output | [31:0] | |
| mem_rdata_i | input | [31:0] | |
| enable_i | input | control | |
| devaddr_i | input | [6:0] | |
| clr_devaddr_o | output | ||
| ep_iso_i | input | [NEndpoints-1:0] | |
| cfg_eop_single_bit_i | input | 1: detect a single SE0 bit as EOP | |
| cfg_rx_differential_i | input | 1: use differential rx data on usb_d_i | |
| tx_osc_test_mode_i | input | Oscillator test mode: constant JK output | |
| data_toggle_clear_i | input | [NEndpoints-1:0] | Clear the data toggles for an EP |
| frame_start_o | output | status | |
| frame_o | output | [10:0] | |
| link_state_o | output | [2:0] | |
| link_disconnect_o | output | ||
| link_connect_o | output | ||
| link_reset_o | output | ||
| link_active_o | output | ||
| link_suspend_o | output | ||
| link_resume_o | output | ||
| link_in_err_o | output | ||
| link_out_err_o | output | ||
| host_lost_o | output | ||
| rx_crc_err_o | output | ||
| rx_pid_err_o | output | ||
| rx_bitstuff_err_o | output |
Signals
| Name | Type | Description |
|---|---|---|
| out_max_used_d | logic [PktW:0] | OUT or SETUP direction |
| out_max_used_q | logic [PktW:0] | OUT or SETUP direction |
| out_ep_put_addr | logic [PktW-1:0] | |
| out_ep_data | logic [7:0] | |
| out_ep_current | logic [3:0] | |
| out_ep_data_put | logic | |
| out_ep_acked | logic | |
| out_ep_rollback | logic | |
| current_setup | logic | |
| all_out_blocked | logic | |
| out_ep_newpkt | logic | |
| out_ep_setup | logic [NEndpoints-1:0] | |
| out_ep_full | logic [NEndpoints-1:0] | |
| out_ep_stall | logic [NEndpoints-1:0] | |
| setup_blocked | logic [NEndpoints-1:0] | |
| out_blocked | logic [NEndpoints-1:0] | |
| wdata | logic [31:0] | |
| mem_read | logic | |
| mem_waddr | logic [SramAw-1:0] | |
| mem_raddr | logic [SramAw-1:0] | |
| link_reset | logic | |
| sof_valid | logic | |
| std_write_d | logic | always_comb don't write if the address has wrapped (happens for two CRC bytes after max data) |
| std_write_q | logic | always_comb don't write if the address has wrapped (happens for two CRC bytes after max data) |
| out_max_minus1 | logic [PktW:0] | |
| in_ep_xfr_end | logic | IN (device to host) transfers |
| in_ep_data_get | logic | IN (device to host) transfers |
| in_data_done | logic | IN (device to host) transfers |
| in_ep_newpkt | logic | IN (device to host) transfers |
| pkt_start_rd | logic | IN (device to host) transfers |
| in_ep_data_done | logic [NEndpoints-1:0] | |
| in_ep_get_addr | logic [PktW-1:0] | |
| in_ep_data | logic [7:0] | |
| in_ep_current | logic [3:0] | |
| frame_index_raw | logic [10:0] | |
| rx_jjj_det | logic | |
| ns_cnt | logic [5:0] | us_tick ticks for one cycle every us |
| us_tick | logic |
Constants
| Name | Type | Value | Description |
|---|---|---|---|
| NBufWidth | int | $clog2(NBuf) | derived parameter |
| PktW | int | $clog2(MaxPktSizeByte) | derived parameter |
Processes
- unnamed: ( )
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
Description
Pop the available fifo after the write that used the previous value
- unnamed: ( )
Type: always_comb
- unnamed: ( @(posedge clk_48mhz_i or negedge rst_ni) )
Type: always_ff
Description
Need extra read at start of packet to get the first word of data Delay by one cycle from the in_endpoint update
- 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
Capture frame number (host sends evert 1ms)
Instantiations
- u_usb_fs_nb_pe: usb_fs_nb_pe
- u_usbdev_linkstate: usbdev_linkstate