////////////////////////////////////////////////////////////////////// | |
//// //// | |
//// //// | |
//// 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 |