| ////////////////////////////////////////////////////////////////////// |
| //// //// |
| //// //// |
| //// Description //// |
| //// USB Device level integration. //// |
| //// Following modules are integrated //// |
| //// 1. usb1_phy //// |
| //// 2. usb1_core //// |
| //// Ver 0.1 : 01.Mar.2013 //// |
| //// //// |
| //// To Do: //// |
| //// nothing //// |
| //// //// |
| //// Author(s): //// |
| //// - Dinesh Annayya, dinesha@opencores.org //// |
| //// //// |
| ////////////////////////////////////////////////////////////////////// |
| //// //// |
| //// Copyright (C) 2000 Authors and OPENCORES.ORG //// |
| //// //// |
| //// 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 source file is free software; you can redistribute it //// |
| //// and/or modify it under the terms of the GNU Lesser General //// |
| //// Public License as published by the Free Software Foundation; //// |
| //// either version 2.1 of the License, or (at your option) any //// |
| //// later version. //// |
| //// //// |
| //// This source is distributed in the hope that it will be //// |
| //// useful, but WITHOUT ANY WARRANTY; without even the implied //// |
| //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //// |
| //// PURPOSE. See the GNU Lesser General Public License for more //// |
| //// details. //// |
| //// //// |
| //// You should have received a copy of the GNU Lesser General //// |
| //// Public License along with this source; if not, download it //// |
| //// from http://www.opencores.org/lgpl.shtml //// |
| //// //// |
| ////////////////////////////////////////////////////////////////////// |
| |
| |
| module usb1d_top( |
| clk_i, |
| rstn_i, |
| |
| // Transciever Interface |
| usb_dp, |
| usb_dn, |
| |
| // 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 rstn_i; |
| |
| inout usb_dp; |
| inout usb_dn; |
| |
| input phy_tx_mode; |
| output 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; |
| |
| // 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; |
| |
| |
| //----------------------------------- |
| // 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 |
| /////////////////////////////////////////////////////////////////// |
| // Local Wires and Registers |
| /////////////////////////////////////////////////////////////////// |
| //------------------------------------ |
| // UTMI Interface |
| // ----------------------------------- |
| wire [7:0] DataOut; |
| wire TxValid; |
| wire TxReady; |
| wire [7:0] DataIn; |
| wire RxValid; |
| wire RxActive; |
| wire RxError; |
| wire [1:0] LineState; |
| wire clk; |
| wire rst; |
| wire phy_tx_mode; |
| wire usb_rst; |
| |
| // USB Traceiver interface |
| wire usb_txdp; // USB TX + |
| wire usb_txdn; // USB TX - |
| wire usb_txoe; // USB TX OEN, Output driven at txoe=0 |
| wire usb_rxd; |
| wire usb_rxdp; // USB RX+ |
| wire usb_rxdn; // USB RX- |
| |
| assign usb_dp = (usb_txoe == 1'b0) ? usb_txdp : 1'bz; |
| assign usb_dn = (usb_txoe == 1'b0) ? usb_txdn : 1'bz; |
| |
| assign usb_rxd = usb_dp; |
| assign usb_rxdp = usb_dp; |
| assign usb_rxdn = usb_dn; |
| |
| |
| usb1d_phy u_usb_phy( |
| .clk ( clk_i ), |
| .rstn ( rstn_i ), |
| .phy_tx_mode ( phy_tx_mode ), |
| .usb_rst ( usb_rst ), |
| |
| // Transceiver Interface |
| .rxd ( usb_rxd ), |
| .rxdp ( usb_rxdp ), |
| .rxdn ( usb_rxdn ), |
| .txdp ( usb_txdp ), |
| .txdn ( usb_txdn ), |
| .txoe ( usb_txoe ), |
| |
| // 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 ) |
| ); |
| |
| |
| usb1d_core u_usb_core( |
| .clk_i ( clk_i ), |
| .rst_i ( rstn_i ), |
| |
| |
| // USB Misc |
| .phy_tx_mode ( phy_tx_mode ), |
| .usb_rst ( usb_rst ), |
| |
| // UTMI Interface |
| .DataIn ( DataIn ), |
| .RxValid ( RxValid ), |
| .RxActive ( RxActive ), |
| .RxError ( RxError ), |
| .DataOut ( DataOut ), |
| .TxValid ( TxValid ), |
| .TxReady ( TxReady ), |
| .LineState ( LineState ), |
| |
| // Interrupts |
| .dropped_frame ( dropped_frame ), |
| .misaligned_frame ( misaligned_frame ), |
| .crc16_err ( crc16_err ), |
| |
| // Vendor Features |
| .v_set_int ( v_set_int ), |
| .v_set_feature ( v_set_feature ), |
| .wValue ( wValue ), |
| .wIndex ( wIndex ), |
| .vendor_data ( vendor_data ), |
| |
| // USB Status |
| .usb_busy ( usb_busy ), |
| .ep_sel ( ep_sel ), |
| |
| // Endpoint Interface |
| .ep1_cfg ( ep1_cfg ), |
| .ep1_din ( ep1_din ), |
| .ep1_we ( ep1_we ), |
| .ep1_full ( ep1_full ), |
| .ep1_dout ( ep1_dout ), |
| .ep1_re ( ep1_re ), |
| .ep1_empty ( ep1_empty ), |
| .ep1_bf_en ( ep1_bf_en ), |
| .ep1_bf_size ( ep1_bf_size ), |
| |
| .ep2_cfg ( ep2_cfg ), |
| .ep2_din ( ep2_din ), |
| .ep2_we ( ep2_we ), |
| .ep2_full ( ep2_full ), |
| .ep2_dout ( ep2_dout ), |
| .ep2_re ( ep2_re ), |
| .ep2_empty ( ep2_empty ), |
| .ep2_bf_en ( ep2_bf_en ), |
| .ep2_bf_size ( ep2_bf_size ), |
| |
| .ep3_cfg ( ep3_cfg ), |
| .ep3_din ( ep3_din ), |
| .ep3_we ( ep3_we ), |
| .ep3_full ( ep3_full ), |
| .ep3_dout ( ep3_dout ), |
| .ep3_re ( ep3_re ), |
| .ep3_empty ( ep3_empty ), |
| .ep3_bf_en ( ep3_bf_en ), |
| .ep3_bf_size ( ep3_bf_size ), |
| |
| .ep4_cfg ( ep4_cfg ), |
| .ep4_din ( ep4_din ), |
| .ep4_we ( ep4_we ), |
| .ep4_full ( ep4_full ), |
| .ep4_dout ( ep4_dout ), |
| .ep4_re ( ep4_re ), |
| .ep4_empty ( ep4_empty ), |
| .ep4_bf_en ( ep4_bf_en ), |
| .ep4_bf_size ( ep4_bf_size ), |
| |
| .ep5_cfg ( ep5_cfg ), |
| .ep5_din ( ep5_din ), |
| .ep5_we ( ep5_we ), |
| .ep5_full ( ep5_full ), |
| .ep5_dout ( ep5_dout ), |
| .ep5_re ( ep5_re ), |
| .ep5_empty ( ep5_empty ), |
| .ep5_bf_en ( ep5_bf_en ), |
| .ep5_bf_size ( ep5_bf_size ), |
| |
| .ep6_cfg ( ep6_cfg ), |
| .ep6_din ( ep6_din ), |
| .ep6_we ( ep6_we ), |
| .ep6_full ( ep6_full ), |
| .ep6_dout ( ep6_dout ), |
| .ep6_re ( ep6_re ), |
| .ep6_empty ( ep6_empty ), |
| .ep6_bf_en ( ep6_bf_en ), |
| .ep6_bf_size ( ep6_bf_size ), |
| |
| .ep7_cfg ( ep7_cfg ), |
| .ep7_din ( ep7_din ), |
| .ep7_we ( ep7_we ), |
| .ep7_full ( ep7_full ), |
| .ep7_dout ( ep7_dout ), |
| .ep7_re ( ep7_re ), |
| .ep7_empty ( ep7_empty ), |
| .ep7_bf_en ( ep7_bf_en ), |
| .ep7_bf_size ( ep7_bf_size ), |
| |
| // 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 ) |
| |
| |
| ); |
| |
| |
| |
| endmodule |