| /********************************************************************** |
| * Ported to USB2UART Project |
| * Author: Dinesh Annayya |
| * Email:- dinesha@opencores.org |
| * |
| * Date: 4th Feb 2013 |
| * Changes: |
| * A. Warning Clean Up |
| * B. USB1-phy is move to core level |
| * |
| **********************************************************************/ |
| ///////////////////////////////////////////////////////////////////// |
| //// //// |
| //// USB 1.1 function IP core //// |
| //// //// |
| //// //// |
| //// Author: Rudolf Usselmann //// |
| //// rudi@asics.ws //// |
| //// //// |
| //// //// |
| //// Downloaded from: http://www.opencores.org/cores/usb1_funct///// |
| //// //// |
| ///////////////////////////////////////////////////////////////////// |
| //// //// |
| //// Copyright (C) 2000-2002 Rudolf Usselmann //// |
| //// www.asics.ws //// |
| //// rudi@asics.ws //// |
| //// //// |
| //// This source file may be used and distributed without //// |
| //// restriction provided that this copyright statement is not //// |
| //// removed from the file and that any derivative work contains //// |
| //// the original copyright notice and the associated disclaimer.//// |
| //// //// |
| //// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //// |
| //// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //// |
| //// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //// |
| //// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //// |
| //// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, //// |
| //// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES //// |
| //// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE //// |
| //// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR //// |
| //// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF //// |
| //// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT //// |
| //// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT //// |
| //// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE //// |
| //// POSSIBILITY OF SUCH DAMAGE. //// |
| //// //// |
| ///////////////////////////////////////////////////////////////////// |
| |
| // CVS Log |
| // |
| // $Id: usb1_core.v,v 1.2 2002-10-11 05:48:20 rudi Exp $ |
| // |
| // $Date: 2002-10-11 05:48:20 $ |
| // $Revision: 1.2 $ |
| // $Author: rudi $ |
| // $Locker: $ |
| // $State: Exp $ |
| // |
| // Change History: |
| // $Log: not supported by cvs2svn $ |
| // Revision 1.1 2002/09/25 06:06:49 rudi |
| // - Added New Top Level |
| // - Remove old top level and associated files |
| // - Moved FIFOs to "Generic FIFOs" project |
| // |
| // |
| // |
| // |
| // |
| // |
| // |
| |
| `include "usb1d_defines.v" |
| |
| /* |
| |
| // USB PHY Interface |
| tx_dp, tx_dn, tx_oe, |
| rx_d, rx_dp, rx_dn, |
| These pins are a semi-standard interface to USB 1.1 transceivers. |
| Just match up the signal names with the IOs of the transceiver. |
| |
| // USB Misc |
| phy_tx_mode, usb_rst, |
| The PHY supports single ended and differential output to the |
| transceiver Depending on which device you are using, you have |
| to tie the phy_tx_mode high or low. |
| usb_rst is asserted whenever the host signals reset on the USB |
| bus. The USB core will internally reset itself automatically. |
| This output is provided for external logic that needs to be |
| reset when the USB bus is reset. |
| |
| // Interrupts |
| dropped_frame, misaligned_frame, |
| crc16_err, |
| dropped_frame, misaligned_frame are interrupt to indicate error |
| conditions in Block Frame mode. |
| crc16_err, indicates when a crc 16 error was detected on the |
| payload of a USB packet. |
| |
| // Vendor Features |
| v_set_int, v_set_feature, wValue, |
| wIndex, vendor_data, |
| This signals allow to control vendor specific registers and logic |
| that can be manipulated and monitored via the control endpoint |
| through vendor defined commands. |
| |
| // USB Status |
| usb_busy, ep_sel, |
| usb_busy is asserted when the USB core is busy transferring |
| data ep_sel indicated the endpoint that is currently busy. |
| This information might be useful if one desires to reset/clear |
| the attached FIFOs and want to do this when the endpoint is idle. |
| |
| // Endpoint Interface |
| This implementation supports 8 endpoints. Endpoint 0 is the |
| control endpoint and used internally. Endpoints 1-7 are available |
| to the user. replace 'N' with the endpoint number. |
| |
| epN_cfg, |
| This is a constant input used to configure the endpoint by ORing |
| these defines together and adding the max packet size for this |
| endpoint: |
| `IN and `OUT select the transfer direction for this endpoint |
| `ISO, `BULK and `INT determine the endpoint type |
| |
| Example: "`BULK | `IN | 14'd064" defines a BULK IN endpoint with |
| max packet size of 64 bytes |
| |
| epN_din, epN_we, epN_full, |
| This is the OUT FIFO interface. If this is a IN endpoint, ground |
| all unused inputs and leave outputs unconnected. |
| |
| epN_dout, epN_re, epN_empty, |
| this is the IN FIFO interface. If this is a OUT endpoint ground |
| all unused inputs and leave outputs unconnected. |
| |
| epN_bf_en, epN_bf_size, |
| These two constant configure the Block Frame feature. |
| |
| */ |
| |
| |
| module usb1d_core(clk_i, rst_i, |
| |
| // UTMI Interface |
| DataOut, TxValid, TxReady, RxValid, |
| RxActive, RxError, DataIn, LineState, |
| // USB Misc |
| phy_tx_mode, usb_rst, |
| |
| // Interrupts |
| dropped_frame, misaligned_frame, |
| crc16_err, |
| |
| // Vendor Features |
| v_set_int, v_set_feature, wValue, |
| wIndex, vendor_data, |
| |
| // USB Status |
| usb_busy, ep_sel, |
| |
| // Endpoint Interface |
| ep1_cfg, |
| ep1_din, ep1_we, ep1_full, |
| ep1_dout, ep1_re, ep1_empty, |
| ep1_bf_en, ep1_bf_size, |
| |
| ep2_cfg, |
| ep2_din, ep2_we, ep2_full, |
| ep2_dout, ep2_re, ep2_empty, |
| ep2_bf_en, ep2_bf_size, |
| |
| ep3_cfg, |
| ep3_din, ep3_we, ep3_full, |
| ep3_dout, ep3_re, ep3_empty, |
| ep3_bf_en, ep3_bf_size, |
| |
| ep4_cfg, |
| ep4_din, ep4_we, ep4_full, |
| ep4_dout, ep4_re, ep4_empty, |
| ep4_bf_en, ep4_bf_size, |
| |
| ep5_cfg, |
| ep5_din, ep5_we, ep5_full, |
| ep5_dout, ep5_re, ep5_empty, |
| ep5_bf_en, ep5_bf_size, |
| |
| ep6_cfg, |
| ep6_din, ep6_we, ep6_full, |
| ep6_dout, ep6_re, ep6_empty, |
| ep6_bf_en, ep6_bf_size, |
| |
| ep7_cfg, |
| ep7_din, ep7_we, ep7_full, |
| ep7_dout, ep7_re, ep7_empty, |
| ep7_bf_en, ep7_bf_size, |
| |
| // Register Interface |
| reg_addr, |
| reg_rdwrn, |
| reg_req, |
| reg_wdata, |
| reg_rdata, |
| reg_ack |
| |
| ); |
| |
| input clk_i; |
| input rst_i; |
| //------------------------------------ |
| // UTMI Interface |
| // ----------------------------------- |
| output [7:0] DataOut; |
| output TxValid; |
| input TxReady; |
| input [7:0] DataIn; |
| input RxValid; |
| input RxActive; |
| input RxError; |
| input [1:0] LineState; |
| |
| input phy_tx_mode; |
| input usb_rst; |
| output dropped_frame, misaligned_frame; |
| output crc16_err; |
| |
| output v_set_int; |
| output v_set_feature; |
| output [15:0] wValue; |
| output [15:0] wIndex; |
| input [15:0] vendor_data; |
| |
| output usb_busy; |
| output [3:0] ep_sel; |
| |
| //----------------------------------- |
| // Register Interface |
| // ---------------------------------- |
| output [31:0] reg_addr; // Register Address |
| output reg_rdwrn; // 0 -> write, 1-> read |
| output reg_req; // Register Req |
| output [31:0] reg_wdata; // Register write data |
| input [31:0] reg_rdata; // Register Read Data |
| input reg_ack; // Register Ack |
| |
| // Endpoint Interfaces |
| input [13:0] ep1_cfg; |
| input [7:0] ep1_din; |
| output [7:0] ep1_dout; |
| output ep1_we, ep1_re; |
| input ep1_empty, ep1_full; |
| input ep1_bf_en; |
| input [6:0] ep1_bf_size; |
| |
| input [13:0] ep2_cfg; |
| input [7:0] ep2_din; |
| output [7:0] ep2_dout; |
| output ep2_we, ep2_re; |
| input ep2_empty, ep2_full; |
| input ep2_bf_en; |
| input [6:0] ep2_bf_size; |
| |
| input [13:0] ep3_cfg; |
| input [7:0] ep3_din; |
| output [7:0] ep3_dout; |
| output ep3_we, ep3_re; |
| input ep3_empty, ep3_full; |
| input ep3_bf_en; |
| input [6:0] ep3_bf_size; |
| |
| input [13:0] ep4_cfg; |
| input [7:0] ep4_din; |
| output [7:0] ep4_dout; |
| output ep4_we, ep4_re; |
| input ep4_empty, ep4_full; |
| input ep4_bf_en; |
| input [6:0] ep4_bf_size; |
| |
| input [13:0] ep5_cfg; |
| input [7:0] ep5_din; |
| output [7:0] ep5_dout; |
| output ep5_we, ep5_re; |
| input ep5_empty, ep5_full; |
| input ep5_bf_en; |
| input [6:0] ep5_bf_size; |
| |
| input [13:0] ep6_cfg; |
| input [7:0] ep6_din; |
| output [7:0] ep6_dout; |
| output ep6_we, ep6_re; |
| input ep6_empty, ep6_full; |
| input ep6_bf_en; |
| input [6:0] ep6_bf_size; |
| |
| input [13:0] ep7_cfg; |
| input [7:0] ep7_din; |
| output [7:0] ep7_dout; |
| output ep7_we, ep7_re; |
| input ep7_empty, ep7_full; |
| input ep7_bf_en; |
| input [6:0] ep7_bf_size; |
| |
| /////////////////////////////////////////////////////////////////// |
| // |
| // Local Wires and Registers |
| // |
| |
| wire [7:0] rx_data; |
| wire rx_valid, rx_active, rx_err; |
| wire [7:0] tx_data; |
| wire tx_valid; |
| wire tx_ready; |
| wire tx_first; |
| wire tx_valid_last; |
| |
| // Internal Register File Interface |
| wire [6:0] funct_adr; // This functions address (set by controller) |
| wire [3:0] ep_sel; // Endpoint Number Input |
| wire crc16_err; // Set CRC16 error interrupt |
| wire int_to_set; // Set time out interrupt |
| wire int_seqerr_set; // Set PID sequence error interrupt |
| wire [31:0] frm_nat; // Frame Number and Time Register |
| wire nse_err; // No Such Endpoint Error |
| wire pid_cs_err; // PID CS error |
| wire crc5_err; // CRC5 Error |
| |
| reg [7:0] tx_data_st; |
| wire [7:0] rx_ctrl_data; |
| wire [7:0] rx_ctrl_data_d; |
| reg [13:0] cfg; |
| wire rx_ctrl_dvalid; |
| wire rx_ctrl_ddone; |
| wire idma_re; |
| wire idma_we; |
| reg ep_empty; |
| reg ep_full; |
| wire [7:0] rx_size; |
| wire rx_done; |
| |
| wire [7:0] ep0_din; |
| wire [7:0] ep0_dout; |
| wire ep0_re, ep0_we; |
| wire [13:0] ep0_cfg; |
| wire [7:0] ep0_size; |
| wire [7:0] ep0_ctrl_dout, ep0_ctrl_din; |
| wire ep0_ctrl_re, ep0_ctrl_we; |
| wire [3:0] ep0_ctrl_stat; |
| |
| wire ctrl_setup, ctrl_in, ctrl_out; |
| wire send_stall; |
| wire token_valid; |
| reg rst_local; // internal reset |
| wire dropped_frame; |
| wire misaligned_frame; |
| wire v_set_int; |
| wire v_set_feature; |
| wire [15:0] wValue; |
| wire [15:0] wIndex; |
| |
| reg ep_bf_en; |
| reg [6:0] ep_bf_size; |
| wire [6:0] rom_adr; |
| wire [7:0] rom_data; |
| |
| wire ep0_full; |
| wire ep0_empty; |
| |
| /////////////////////////////////////////////////////////////////// |
| // |
| // Misc Logic |
| // |
| |
| // Endpoint type and Max transfer size |
| assign ep0_cfg = `CTRL | ep0_size; |
| |
| always @(posedge clk_i) |
| rst_local <= #1 rst_i & ~usb_rst; |
| |
| /////////////////////////////////////////////////////////////////// |
| // |
| // Module Instantiations |
| // |
| /******* Move to phy logic is move to core level |
| usb_phy phy( |
| .clk( clk_i ), |
| .rst( rst_i ), // ONLY external reset |
| .phy_tx_mode( phy_tx_mode ), |
| .usb_rst( usb_rst ), |
| |
| // Transceiver Interface |
| .rxd( rx_d ), |
| .rxdp( rx_dp ), |
| .rxdn( rx_dn ), |
| .txdp( tx_dp ), |
| .txdn( tx_dn ), |
| .txoe( tx_oe ), |
| |
| // UTMI Interface |
| .DataIn_o( DataIn ), |
| .RxValid_o( RxValid ), |
| .RxActive_o( RxActive ), |
| .RxError_o( RxError ), |
| .DataOut_i( DataOut ), |
| .TxValid_i( TxValid ), |
| .TxReady_o( TxReady ), |
| .LineState_o( LineState ) |
| ); |
| *******************************/ |
| // UTMI Interface |
| usb1d_utmi_if u0( |
| .phy_clk( clk_i ), |
| .rst( rst_local ), |
| // Interface towards Phy-Tx |
| .DataOut( DataOut ), |
| .TxValid( TxValid ), |
| .TxReady( TxReady ), |
| |
| // Interface towards Phy-rx |
| .RxValid( RxValid ), |
| .RxActive( RxActive ), |
| .RxError( RxError ), |
| .DataIn( DataIn ), |
| |
| // Interfcae towards protocol layer-rx |
| .rx_data( rx_data ), |
| .rx_valid( rx_valid ), |
| .rx_active( rx_active ), |
| .rx_err( rx_err ), |
| |
| // Interfcae towards protocol layer-tx |
| .tx_data( tx_data ), |
| .tx_valid( tx_valid ), |
| .tx_valid_last( tx_valid_last ), |
| .tx_ready( tx_ready ), |
| .tx_first( tx_first ) |
| ); |
| |
| // Protocol Layer |
| usb1d_pl u1( .clk( clk_i ), |
| .rst( rst_local ), |
| // Interface towards utmi-rx |
| .rx_data( rx_data ), |
| .rx_valid( rx_valid ), |
| .rx_active( rx_active ), |
| .rx_err( rx_err ), |
| |
| // Interface towards utmi-tx |
| .tx_data( tx_data ), |
| .tx_valid( tx_valid ), |
| .tx_valid_last( tx_valid_last ), |
| .tx_ready( tx_ready ), |
| .tx_first( tx_first ), |
| |
| // Interface towards usb-phy-tx |
| .tx_valid_out( TxValid ), |
| |
| // unused outputs |
| .token_valid( token_valid ), |
| .int_to_set( int_to_set ), |
| .int_seqerr_set( int_seqerr_set ), |
| .pid_cs_err( pid_cs_err ), |
| .nse_err( nse_err ), |
| .crc5_err( crc5_err ), |
| .rx_size( rx_size ), |
| .rx_done( rx_done ), |
| |
| // Interface towards usb-ctrl |
| .fa( funct_adr ), |
| .frm_nat( frm_nat ), |
| .ctrl_setup( ctrl_setup ), |
| .ctrl_in( ctrl_in ), |
| .ctrl_out( ctrl_out ), |
| .send_stall( send_stall ), |
| |
| // usb-status |
| .ep_sel( ep_sel ), |
| .x_busy( usb_busy ), |
| .int_crc16_set( crc16_err ), |
| .dropped_frame( dropped_frame ), |
| .misaligned_frame( misaligned_frame ), |
| |
| .ep_bf_en( ep_bf_en ), |
| .ep_bf_size( ep_bf_size ), |
| .csr( cfg ), |
| .tx_data_st( tx_data_st ), |
| |
| .rx_ctrl_data (rx_ctrl_data ), |
| .rx_ctrl_data_d (rx_ctrl_data_d ), |
| .rx_ctrl_dvalid (rx_ctrl_dvalid ), |
| .rx_ctrl_ddone (rx_ctrl_ddone ), |
| |
| .idma_re( idma_re ), |
| .idma_we( idma_we ), |
| .ep_empty( ep_empty ), |
| .ep_full( ep_full ) |
| ); |
| |
| usb1d_ctrl u4( .clk( clk_i ), |
| .rst( rst_local ), |
| |
| .rom_adr( rom_adr ), |
| .rom_data( rom_data ), |
| |
| .ctrl_setup( ctrl_setup ), |
| .ctrl_in( ctrl_in ), |
| .ctrl_out( ctrl_out ), |
| |
| .rx_ctrl_data (rx_ctrl_data ), |
| .rx_ctrl_dvalid (rx_ctrl_dvalid ), |
| .rx_ctrl_ddone (rx_ctrl_ddone ), |
| |
| |
| .ep0_din( ep0_ctrl_dout ), |
| .ep0_dout( ep0_ctrl_din ), |
| .ep0_re( ep0_ctrl_re ), |
| .ep0_we( ep0_ctrl_we ), |
| .ep0_stat( ep0_ctrl_stat ), |
| .ep0_size( ep0_size ), |
| |
| .send_stall( send_stall ), |
| .frame_no( frm_nat[26:16] ), |
| .funct_adr( funct_adr ), |
| .configured( ), |
| .halt( ), |
| |
| .v_set_int( v_set_int ), |
| .v_set_feature( v_set_feature ), |
| .wValue( wValue ), |
| .wIndex( wIndex ), |
| .vendor_data( vendor_data ), |
| |
| // Register Interface |
| .reg_addr (reg_addr), |
| .reg_rdwrn (reg_rdwrn), |
| .reg_req (reg_req), |
| .reg_wdata (reg_wdata), |
| .reg_rdata (reg_rdata), |
| .reg_ack (reg_ack) |
| |
| ); |
| |
| |
| usb1d_rom1 rom1( .clk( clk_i ), |
| .adr( rom_adr ), |
| .dout( rom_data ) |
| ); |
| |
| // CTRL Endpoint FIFO |
| /************* |
| usb1d_generic_fifo #(8,6,0) u10( |
| .clk( clk_i ), |
| .rst( rst_i ), |
| .clr( usb_rst ), |
| .din( rx_ctrl_data_d ), |
| .we( ep0_we ), |
| .dout( ep0_ctrl_dout ), |
| .re( ep0_ctrl_re ), |
| .full_r( ), |
| .empty_r( ), |
| .full( ep0_full ), |
| .empty( ep0_ctrl_stat[1] ), |
| .full_n( ), |
| .empty_n( ), |
| .full_n_r( ), |
| .empty_n_r( ), |
| .level( ) |
| ); |
| |
| *************/ |
| // CTRL Endpoint FIFO |
| usb1d_sync_fifo #(8,8) u10( |
| .clk (clk_i), |
| .reset_n (rst_i), |
| .clr (usb_rst), |
| .wr_en (ep0_we), |
| .wr_data (rx_ctrl_data_d), |
| .full (ep0_full), |
| .empty (ep0_ctrl_stat[1]), |
| .rd_en (ep0_ctrl_re), |
| .rd_data (ep0_ctrl_dout) |
| ); |
| usb1d_generic_fifo #(8,6,0) u11( |
| .clk( clk_i ), |
| .rst( rst_i ), |
| .clr( usb_rst ), |
| .din( ep0_ctrl_din ), |
| .we( ep0_ctrl_we ), |
| .dout( ep0_dout ), |
| .re( ep0_re ), |
| .full_r( ), |
| .empty_r( ), |
| .full( ep0_ctrl_stat[2] ), |
| .empty( ep0_empty ), |
| .full_n( ), |
| .empty_n( ), |
| .full_n_r( ), |
| .empty_n_r( ), |
| .level( ) |
| ); |
| |
| |
| /////////////////////////////////////////////////////////////////// |
| // |
| // Endpoint FIFO Interfaces |
| // |
| |
| always @(ep_sel or ep0_cfg or ep1_cfg or ep2_cfg or ep3_cfg or |
| ep4_cfg or ep5_cfg or ep6_cfg or ep7_cfg) |
| case(ep_sel) // synopsys full_case parallel_case |
| 4'h0: cfg = ep0_cfg; |
| 4'h1: cfg = ep1_cfg; |
| 4'h2: cfg = ep2_cfg; |
| 4'h3: cfg = ep3_cfg; |
| 4'h4: cfg = ep4_cfg; |
| 4'h5: cfg = ep5_cfg; |
| 4'h6: cfg = ep6_cfg; |
| 4'h7: cfg = ep7_cfg; |
| endcase |
| |
| // In endpoints only |
| always @(posedge clk_i) |
| case(ep_sel) // synopsys full_case parallel_case |
| 4'h0: tx_data_st <= #1 ep0_dout; |
| 4'h1: tx_data_st <= #1 ep1_din; |
| 4'h2: tx_data_st <= #1 ep2_din; |
| 4'h3: tx_data_st <= #1 ep3_din; |
| 4'h4: tx_data_st <= #1 ep4_din; |
| 4'h5: tx_data_st <= #1 ep5_din; |
| 4'h6: tx_data_st <= #1 ep6_din; |
| 4'h7: tx_data_st <= #1 ep7_din; |
| endcase |
| |
| // In endpoints only |
| always @(posedge clk_i) |
| case(ep_sel) // synopsys full_case parallel_case |
| 4'h0: ep_empty <= #1 ep0_empty; |
| 4'h1: ep_empty <= #1 ep1_empty; |
| 4'h2: ep_empty <= #1 ep2_empty; |
| 4'h3: ep_empty <= #1 ep3_empty; |
| 4'h4: ep_empty <= #1 ep4_empty; |
| 4'h5: ep_empty <= #1 ep5_empty; |
| 4'h6: ep_empty <= #1 ep6_empty; |
| 4'h7: ep_empty <= #1 ep7_empty; |
| endcase |
| |
| // OUT endpoints only |
| always @(ep_sel or ep0_full or ep1_full or ep2_full or ep3_full or |
| ep4_full or ep5_full or ep6_full or ep7_full) |
| case(ep_sel) // synopsys full_case parallel_case |
| 4'h0: ep_full = ep0_full; |
| 4'h1: ep_full = ep1_full; |
| 4'h2: ep_full = ep2_full; |
| 4'h3: ep_full = ep3_full; |
| 4'h4: ep_full = ep4_full; |
| 4'h5: ep_full = ep5_full; |
| 4'h6: ep_full = ep6_full; |
| 4'h7: ep_full = ep7_full; |
| endcase |
| |
| always @(posedge clk_i) |
| case(ep_sel) // synopsys full_case parallel_case |
| 4'h0: ep_bf_en = 1'b0; |
| 4'h1: ep_bf_en = ep1_bf_en; |
| 4'h2: ep_bf_en = ep2_bf_en; |
| 4'h3: ep_bf_en = ep3_bf_en; |
| 4'h4: ep_bf_en = ep4_bf_en; |
| 4'h5: ep_bf_en = ep5_bf_en; |
| 4'h6: ep_bf_en = ep6_bf_en; |
| 4'h7: ep_bf_en = ep7_bf_en; |
| endcase |
| |
| always @(posedge clk_i) |
| case(ep_sel) // synopsys full_case parallel_case |
| 4'h1: ep_bf_size = ep1_bf_size; |
| 4'h2: ep_bf_size = ep2_bf_size; |
| 4'h3: ep_bf_size = ep3_bf_size; |
| 4'h4: ep_bf_size = ep4_bf_size; |
| 4'h5: ep_bf_size = ep5_bf_size; |
| 4'h6: ep_bf_size = ep6_bf_size; |
| 4'h7: ep_bf_size = ep7_bf_size; |
| endcase |
| |
| assign ep1_dout = rx_ctrl_data_d; |
| assign ep2_dout = rx_ctrl_data_d; |
| assign ep3_dout = rx_ctrl_data_d; |
| assign ep4_dout = rx_ctrl_data_d; |
| assign ep5_dout = rx_ctrl_data_d; |
| assign ep6_dout = rx_ctrl_data_d; |
| assign ep7_dout = rx_ctrl_data_d; |
| |
| assign ep0_re = idma_re & (ep_sel == 4'h0); |
| assign ep1_re = idma_re & (ep_sel == 4'h1) & !ep1_empty; |
| assign ep2_re = idma_re & (ep_sel == 4'h2) & !ep2_empty; |
| assign ep3_re = idma_re & (ep_sel == 4'h3) & !ep3_empty; |
| assign ep4_re = idma_re & (ep_sel == 4'h4) & !ep4_empty; |
| assign ep5_re = idma_re & (ep_sel == 4'h5) & !ep5_empty; |
| assign ep6_re = idma_re & (ep_sel == 4'h6) & !ep6_empty; |
| assign ep7_re = idma_re & (ep_sel == 4'h7) & !ep7_empty; |
| |
| assign ep0_we = idma_we & (ep_sel == 4'h0); |
| assign ep1_we = idma_we & (ep_sel == 4'h1) & !ep1_full; |
| assign ep2_we = idma_we & (ep_sel == 4'h2) & !ep2_full; |
| assign ep3_we = idma_we & (ep_sel == 4'h3) & !ep3_full; |
| assign ep4_we = idma_we & (ep_sel == 4'h4) & !ep4_full; |
| assign ep5_we = idma_we & (ep_sel == 4'h5) & !ep5_full; |
| assign ep6_we = idma_we & (ep_sel == 4'h6) & !ep6_full; |
| assign ep7_we = idma_we & (ep_sel == 4'h7) & !ep7_full; |
| |
| endmodule |