OpenCores
URL https://opencores.org/ocsvn/usbhostslave/usbhostslave/trunk

Subversion Repositories usbhostslave

[/] [usbhostslave/] [trunk/] [RTL/] [hostController/] [USBHostControlBI.v] - Diff between revs 18 and 22

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 18 Rev 22
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
////                                                              ////
////                                                              ////
//// USBHostControlBI.v                                           ////
//// USBHostControlBI.v                                           ////
////                                                              ////
////                                                              ////
//// This file is part of the usbhostslave opencores effort.
//// This file is part of the usbhostslave opencores effort.
//// <http://www.opencores.org/cores//>                           ////
//// <http://www.opencores.org/cores//>                           ////
////                                                              ////
////                                                              ////
//// Module Description:                                          ////
//// Module Description:                                          ////
//// 
//// 
////                                                              ////
////                                                              ////
//// To Do:                                                       ////
//// To Do:                                                       ////
//// 
//// 
////                                                              ////
////                                                              ////
//// Author(s):                                                   ////
//// Author(s):                                                   ////
//// - Steve Fielding, sfielding@base2designs.com                 ////
//// - Steve Fielding, sfielding@base2designs.com                 ////
////                                                              ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
////                                                              ////
////                                                              ////
//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG          ////
//// Copyright (C) 2004 Steve Fielding and OPENCORES.ORG          ////
////                                                              ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any   ////
//// either version 2.1 of the License, or (at your option) any   ////
//// later version.                                               ////
//// later version.                                               ////
////                                                              ////
////                                                              ////
//// This source is distributed in the hope that it will be       ////
//// This source is distributed in the hope that it will be       ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// PURPOSE. See the GNU Lesser General Public License for more  ////
//// PURPOSE. See the GNU Lesser General Public License for more  ////
//// details.                                                     ////
//// details.                                                     ////
////                                                              ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// Public License along with this source; if not, download it   ////
//// from <http://www.opencores.org/lgpl.shtml>                   ////
//// from <http://www.opencores.org/lgpl.shtml>                   ////
////                                                              ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
`timescale 1ns / 1ps
`include "timescale.v"
 
 
 
 
`include "usbHostControl_h.v"
`include "usbHostControl_h.v"
 
 
module USBHostControlBI (address, dataIn, dataOut, writeEn,
module USBHostControlBI (address, dataIn, dataOut, writeEn,
  strobe_i,
  strobe_i,
  busClk,
  busClk,
  rstSyncToBusClk,
  rstSyncToBusClk,
  usbClk,
  usbClk,
  rstSyncToUsbClk,
  rstSyncToUsbClk,
  SOFSentIntOut, connEventIntOut, resumeIntOut, transDoneIntOut,
  SOFSentIntOut, connEventIntOut, resumeIntOut, transDoneIntOut,
  TxTransTypeReg, TxSOFEnableReg,
  TxTransTypeReg, TxSOFEnableReg,
  TxAddrReg, TxEndPReg, frameNumIn,
  TxAddrReg, TxEndPReg, frameNumIn,
  RxPktStatusIn, RxPIDIn,
  RxPktStatusIn, RxPIDIn,
  connectStateIn,
  connectStateIn,
  SOFSentIn, connEventIn, resumeIntIn, transDoneIn,
  SOFSentIn, connEventIn, resumeIntIn, transDoneIn,
  hostControlSelect,
  hostControlSelect,
  clrTransReq,
  clrTransReq,
  preambleEn,
  preambleEn,
  SOFSync,
  SOFSync,
  TxLineState,
  TxLineState,
  LineDirectControlEn,
  LineDirectControlEn,
  fullSpeedPol,
  fullSpeedPol,
  fullSpeedRate,
  fullSpeedRate,
  transReq,
  transReq,
  isoEn,
  isoEn,
  SOFTimer
  SOFTimer
  );
  );
input [3:0] address;
input [3:0] address;
input [7:0] dataIn;
input [7:0] dataIn;
input writeEn;
input writeEn;
input strobe_i;
input strobe_i;
input busClk;
input busClk;
input rstSyncToBusClk;
input rstSyncToBusClk;
input usbClk;
input usbClk;
input rstSyncToUsbClk;
input rstSyncToUsbClk;
output [7:0] dataOut;
output [7:0] dataOut;
output SOFSentIntOut;
output SOFSentIntOut;
output connEventIntOut;
output connEventIntOut;
output resumeIntOut;
output resumeIntOut;
output transDoneIntOut;
output transDoneIntOut;
 
 
output [1:0] TxTransTypeReg;
output [1:0] TxTransTypeReg;
output TxSOFEnableReg;
output TxSOFEnableReg;
output [6:0] TxAddrReg;
output [6:0] TxAddrReg;
output [3:0] TxEndPReg;
output [3:0] TxEndPReg;
input [10:0] frameNumIn;
input [10:0] frameNumIn;
input [7:0] RxPktStatusIn;
input [7:0] RxPktStatusIn;
input [3:0] RxPIDIn;
input [3:0] RxPIDIn;
input [1:0] connectStateIn;
input [1:0] connectStateIn;
input SOFSentIn;
input SOFSentIn;
input connEventIn;
input connEventIn;
input resumeIntIn;
input resumeIntIn;
input transDoneIn;
input transDoneIn;
input hostControlSelect;
input hostControlSelect;
input clrTransReq;
input clrTransReq;
output preambleEn;
output preambleEn;
output SOFSync;
output SOFSync;
output [1:0] TxLineState;
output [1:0] TxLineState;
output LineDirectControlEn;
output LineDirectControlEn;
output fullSpeedPol;
output fullSpeedPol;
output fullSpeedRate;
output fullSpeedRate;
output transReq;
output transReq;
output isoEn;     //enable isochronous mode
output isoEn;     //enable isochronous mode
input [15:0] SOFTimer;
input [15:0] SOFTimer;
 
 
wire [3:0] address;
wire [3:0] address;
wire [7:0] dataIn;
wire [7:0] dataIn;
wire writeEn;
wire writeEn;
wire strobe_i;
wire strobe_i;
wire busClk;
wire busClk;
wire rstSyncToBusClk;
wire rstSyncToBusClk;
wire usbClk;
wire usbClk;
wire rstSyncToUsbClk;
wire rstSyncToUsbClk;
reg [7:0] dataOut;
reg [7:0] dataOut;
 
 
reg SOFSentIntOut;
reg SOFSentIntOut;
reg connEventIntOut;
reg connEventIntOut;
reg resumeIntOut;
reg resumeIntOut;
reg transDoneIntOut;
reg transDoneIntOut;
 
 
reg [1:0] TxTransTypeReg;
reg [1:0] TxTransTypeReg;
reg TxSOFEnableReg;
reg TxSOFEnableReg;
reg [6:0] TxAddrReg;
reg [6:0] TxAddrReg;
reg [3:0] TxEndPReg;
reg [3:0] TxEndPReg;
wire [10:0] frameNumIn;
wire [10:0] frameNumIn;
wire [7:0] RxPktStatusIn;
wire [7:0] RxPktStatusIn;
wire [3:0] RxPIDIn;
wire [3:0] RxPIDIn;
wire [1:0] connectStateIn;
wire [1:0] connectStateIn;
 
 
wire SOFSentIn;
wire SOFSentIn;
wire connEventIn;
wire connEventIn;
wire resumeIntIn;
wire resumeIntIn;
wire transDoneIn;
wire transDoneIn;
wire hostControlSelect;
wire hostControlSelect;
wire clrTransReq;
wire clrTransReq;
reg preambleEn;
reg preambleEn;
reg SOFSync;
reg SOFSync;
reg [1:0] TxLineState;
reg [1:0] TxLineState;
reg LineDirectControlEn;
reg LineDirectControlEn;
reg fullSpeedPol;
reg fullSpeedPol;
reg fullSpeedRate;
reg fullSpeedRate;
reg transReq;
reg transReq;
reg isoEn;
reg isoEn;
wire [15:0] SOFTimer;
wire [15:0] SOFTimer;
 
 
//internal wire and regs
//internal wire and regs
reg [1:0] TxControlReg;
reg [1:0] TxControlReg;
reg [4:0] TxLineControlReg;
reg [4:0] TxLineControlReg;
reg clrSOFReq;
reg clrSOFReq;
reg clrConnEvtReq;
reg clrConnEvtReq;
reg clrResInReq;
reg clrResInReq;
reg clrTransDoneReq;
reg clrTransDoneReq;
reg SOFSentInt;
reg SOFSentInt;
reg connEventInt;
reg connEventInt;
reg resumeInt;
reg resumeInt;
reg transDoneInt;
reg transDoneInt;
reg [3:0] interruptMaskReg;
reg [3:0] interruptMaskReg;
reg setTransReq;
reg setTransReq;
 
 
//clock domain crossing sync registers
//clock domain crossing sync registers
//STB = Sync To Busclk
//STB = Sync To Busclk
reg [1:0] TxTransTypeRegSTB;
reg [1:0] TxTransTypeRegSTB;
reg TxSOFEnableRegSTB;
reg TxSOFEnableRegSTB;
reg [6:0] TxAddrRegSTB;
reg [6:0] TxAddrRegSTB;
reg [3:0] TxEndPRegSTB;
reg [3:0] TxEndPRegSTB;
reg preambleEnSTB;
reg preambleEnSTB;
reg SOFSyncSTB;
reg SOFSyncSTB;
reg [1:0] TxLineStateSTB;
reg [1:0] TxLineStateSTB;
reg LineDirectControlEnSTB;
reg LineDirectControlEnSTB;
reg fullSpeedPolSTB;
reg fullSpeedPolSTB;
reg fullSpeedRateSTB;
reg fullSpeedRateSTB;
reg transReqSTB;
reg transReqSTB;
reg isoEnSTB;
reg isoEnSTB;
reg [10:0] frameNumInSTB;
reg [10:0] frameNumInSTB;
reg [7:0] RxPktStatusInSTB;
reg [7:0] RxPktStatusInSTB;
reg [3:0] RxPIDInSTB;
reg [3:0] RxPIDInSTB;
reg [1:0] connectStateInSTB;
reg [1:0] connectStateInSTB;
reg SOFSentInSTB;
reg SOFSentInSTB;
reg connEventInSTB;
reg connEventInSTB;
reg resumeIntInSTB;
reg resumeIntInSTB;
reg transDoneInSTB;
reg transDoneInSTB;
reg clrTransReqSTB;
reg clrTransReqSTB;
reg [15:0] SOFTimerSTB;
reg [15:0] SOFTimerSTB;
 
 
 
 
//sync write demux
//sync write demux
always @(posedge busClk)
always @(posedge busClk)
begin
begin
  if (rstSyncToBusClk == 1'b1) begin
  if (rstSyncToBusClk == 1'b1) begin
    isoEnSTB <= 1'b0;
    isoEnSTB <= 1'b0;
    preambleEnSTB <= 1'b0;
    preambleEnSTB <= 1'b0;
    SOFSyncSTB <= 1'b0;
    SOFSyncSTB <= 1'b0;
    TxTransTypeRegSTB <= 2'b00;
    TxTransTypeRegSTB <= 2'b00;
    TxLineControlReg <= 5'h00;
    TxLineControlReg <= 5'h00;
    TxSOFEnableRegSTB <= 1'b0;
    TxSOFEnableRegSTB <= 1'b0;
    TxAddrRegSTB <= 7'h00;
    TxAddrRegSTB <= 7'h00;
    TxEndPRegSTB <= 4'h0;
    TxEndPRegSTB <= 4'h0;
    interruptMaskReg <= 4'h0;
    interruptMaskReg <= 4'h0;
  end
  end
  else begin
  else begin
    clrSOFReq <= 1'b0;
    clrSOFReq <= 1'b0;
    clrConnEvtReq <= 1'b0;
    clrConnEvtReq <= 1'b0;
    clrResInReq <= 1'b0;
    clrResInReq <= 1'b0;
    clrTransDoneReq <= 1'b0;
    clrTransDoneReq <= 1'b0;
    setTransReq <= 1'b0;
    setTransReq <= 1'b0;
    if (writeEn == 1'b1 && strobe_i == 1'b1 && hostControlSelect == 1'b1)
    if (writeEn == 1'b1 && strobe_i == 1'b1 && hostControlSelect == 1'b1)
    begin
    begin
      case (address)
      case (address)
        `TX_CONTROL_REG : begin
        `TX_CONTROL_REG : begin
          isoEnSTB <= dataIn[`ISO_ENABLE_BIT];
          isoEnSTB <= dataIn[`ISO_ENABLE_BIT];
          preambleEnSTB <= dataIn[`PREAMBLE_ENABLE_BIT];
          preambleEnSTB <= dataIn[`PREAMBLE_ENABLE_BIT];
          SOFSyncSTB <= dataIn[`SOF_SYNC_BIT];
          SOFSyncSTB <= dataIn[`SOF_SYNC_BIT];
          setTransReq <= dataIn[`TRANS_REQ_BIT];
          setTransReq <= dataIn[`TRANS_REQ_BIT];
        end
        end
        `TX_TRANS_TYPE_REG : TxTransTypeRegSTB <= dataIn[1:0];
        `TX_TRANS_TYPE_REG : TxTransTypeRegSTB <= dataIn[1:0];
        `TX_LINE_CONTROL_REG : TxLineControlReg <= dataIn[4:0];
        `TX_LINE_CONTROL_REG : TxLineControlReg <= dataIn[4:0];
        `TX_SOF_ENABLE_REG : TxSOFEnableRegSTB <= dataIn[`SOF_EN_BIT];
        `TX_SOF_ENABLE_REG : TxSOFEnableRegSTB <= dataIn[`SOF_EN_BIT];
        `TX_ADDR_REG : TxAddrRegSTB <= dataIn[6:0];
        `TX_ADDR_REG : TxAddrRegSTB <= dataIn[6:0];
        `TX_ENDP_REG : TxEndPRegSTB <= dataIn[3:0];
        `TX_ENDP_REG : TxEndPRegSTB <= dataIn[3:0];
        `INTERRUPT_STATUS_REG :  begin
        `INTERRUPT_STATUS_REG :  begin
          clrSOFReq <= dataIn[`SOF_SENT_BIT];
          clrSOFReq <= dataIn[`SOF_SENT_BIT];
          clrConnEvtReq <= dataIn[`CONNECTION_EVENT_BIT];
          clrConnEvtReq <= dataIn[`CONNECTION_EVENT_BIT];
          clrResInReq <= dataIn[`RESUME_INT_BIT];
          clrResInReq <= dataIn[`RESUME_INT_BIT];
          clrTransDoneReq <= dataIn[`TRANS_DONE_BIT];
          clrTransDoneReq <= dataIn[`TRANS_DONE_BIT];
        end
        end
        `INTERRUPT_MASK_REG  : interruptMaskReg <= dataIn[3:0];
        `INTERRUPT_MASK_REG  : interruptMaskReg <= dataIn[3:0];
      endcase
      endcase
    end
    end
  end
  end
end
end
 
 
//interrupt control
//interrupt control
always @(posedge busClk)
always @(posedge busClk)
begin
begin
  if (rstSyncToBusClk == 1'b1) begin
  if (rstSyncToBusClk == 1'b1) begin
    SOFSentInt <= 1'b0;
    SOFSentInt <= 1'b0;
    connEventInt <= 1'b0;
    connEventInt <= 1'b0;
    resumeInt <= 1'b0;
    resumeInt <= 1'b0;
    transDoneInt <= 1'b0;
    transDoneInt <= 1'b0;
  end
  end
  else begin
  else begin
    if (SOFSentInSTB == 1'b1)
    if (SOFSentInSTB == 1'b1)
      SOFSentInt <= 1'b1;
      SOFSentInt <= 1'b1;
    else if (clrSOFReq == 1'b1)
    else if (clrSOFReq == 1'b1)
      SOFSentInt <= 1'b0;
      SOFSentInt <= 1'b0;
 
 
    if (connEventInSTB == 1'b1)
    if (connEventInSTB == 1'b1)
      connEventInt <= 1'b1;
      connEventInt <= 1'b1;
    else if (clrConnEvtReq == 1'b1)
    else if (clrConnEvtReq == 1'b1)
      connEventInt <= 1'b0;
      connEventInt <= 1'b0;
 
 
    if (resumeIntInSTB == 1'b1)
    if (resumeIntInSTB == 1'b1)
      resumeInt <= 1'b1;
      resumeInt <= 1'b1;
    else if (clrResInReq == 1'b1)
    else if (clrResInReq == 1'b1)
      resumeInt <= 1'b0;
      resumeInt <= 1'b0;
 
 
    if (transDoneInSTB == 1'b1)
    if (transDoneInSTB == 1'b1)
      transDoneInt <= 1'b1;
      transDoneInt <= 1'b1;
    else if (clrTransDoneReq == 1'b1)
    else if (clrTransDoneReq == 1'b1)
      transDoneInt <= 1'b0;
      transDoneInt <= 1'b0;
  end
  end
end
end
 
 
//mask interrupts
//mask interrupts
always @(interruptMaskReg or transDoneInt or resumeInt or connEventInt or SOFSentInt) begin
always @(interruptMaskReg or transDoneInt or resumeInt or connEventInt or SOFSentInt) begin
  transDoneIntOut <= transDoneInt & interruptMaskReg[`TRANS_DONE_BIT];
  transDoneIntOut <= transDoneInt & interruptMaskReg[`TRANS_DONE_BIT];
  resumeIntOut <= resumeInt & interruptMaskReg[`RESUME_INT_BIT];
  resumeIntOut <= resumeInt & interruptMaskReg[`RESUME_INT_BIT];
  connEventIntOut <= connEventInt & interruptMaskReg[`CONNECTION_EVENT_BIT];
  connEventIntOut <= connEventInt & interruptMaskReg[`CONNECTION_EVENT_BIT];
  SOFSentIntOut <= SOFSentInt & interruptMaskReg[`SOF_SENT_BIT];
  SOFSentIntOut <= SOFSentInt & interruptMaskReg[`SOF_SENT_BIT];
end
end
 
 
//transaction request set/clear
//transaction request set/clear
//Since 'busClk' can be a higher freq than 'usbClk',
//Since 'busClk' can be a higher freq than 'usbClk',
//'setTransReq' must be delayed with respect to other control signals, thus
//'setTransReq' must be delayed with respect to other control signals, thus
//ensuring that control signals have been clocked through to 'usbClk' clock
//ensuring that control signals have been clocked through to 'usbClk' clock
//domain before the transaction request is asserted.
//domain before the transaction request is asserted.
//Not sure this is required because there is at least two 'usbClk' ticks between
//Not sure this is required because there is at least two 'usbClk' ticks between
//detection of 'transReq' and sampling of related control signals.always @(posedge busClk)
//detection of 'transReq' and sampling of related control signals.always @(posedge busClk)
always @(posedge busClk)
always @(posedge busClk)
begin
begin
  if (rstSyncToBusClk == 1'b1) begin
  if (rstSyncToBusClk == 1'b1) begin
    transReqSTB <= 1'b0;
    transReqSTB <= 1'b0;
  end
  end
  else begin
  else begin
    if (setTransReq == 1'b1)
    if (setTransReq == 1'b1)
      transReqSTB <= 1'b1;
      transReqSTB <= 1'b1;
    else if (clrTransReqSTB == 1'b1)
    else if (clrTransReqSTB == 1'b1)
      transReqSTB <= 1'b0;
      transReqSTB <= 1'b0;
  end
  end
end
end
 
 
//break out control signals
//break out control signals
always @(TxControlReg or TxLineControlReg) begin
always @(TxControlReg or TxLineControlReg) begin
  TxLineStateSTB <= TxLineControlReg[`TX_LINE_STATE_MSBIT:`TX_LINE_STATE_LSBIT];
  TxLineStateSTB <= TxLineControlReg[`TX_LINE_STATE_MSBIT:`TX_LINE_STATE_LSBIT];
  LineDirectControlEnSTB <= TxLineControlReg[`DIRECT_CONTROL_BIT];
  LineDirectControlEnSTB <= TxLineControlReg[`DIRECT_CONTROL_BIT];
  fullSpeedPolSTB <= TxLineControlReg[`FULL_SPEED_LINE_POLARITY_BIT];
  fullSpeedPolSTB <= TxLineControlReg[`FULL_SPEED_LINE_POLARITY_BIT];
  fullSpeedRateSTB <= TxLineControlReg[`FULL_SPEED_LINE_RATE_BIT];
  fullSpeedRateSTB <= TxLineControlReg[`FULL_SPEED_LINE_RATE_BIT];
end
end
 
 
// async read mux
// async read mux
always @(address or
always @(address or
  TxControlReg or TxTransTypeRegSTB or TxLineControlReg or TxSOFEnableRegSTB or
  TxControlReg or TxTransTypeRegSTB or TxLineControlReg or TxSOFEnableRegSTB or
  TxAddrRegSTB or TxEndPRegSTB or frameNumInSTB or
  TxAddrRegSTB or TxEndPRegSTB or frameNumInSTB or
  SOFSentInt or connEventInt or resumeInt or transDoneInt or
  SOFSentInt or connEventInt or resumeInt or transDoneInt or
  interruptMaskReg or RxPktStatusInSTB or RxPIDInSTB or connectStateInSTB or
  interruptMaskReg or RxPktStatusInSTB or RxPIDInSTB or connectStateInSTB or
  preambleEnSTB or SOFSyncSTB or transReqSTB or isoEnSTB or SOFTimer)
  preambleEnSTB or SOFSyncSTB or transReqSTB or isoEnSTB or SOFTimerSTB)
begin
begin
  case (address)
  case (address)
      `TX_CONTROL_REG : dataOut <= {4'b0000, isoEnSTB, preambleEnSTB, SOFSyncSTB, transReqSTB} ;
      `TX_CONTROL_REG : dataOut <= {4'b0000, isoEnSTB, preambleEnSTB, SOFSyncSTB, transReqSTB} ;
      `TX_TRANS_TYPE_REG : dataOut <= {6'b000000, TxTransTypeRegSTB};
      `TX_TRANS_TYPE_REG : dataOut <= {6'b000000, TxTransTypeRegSTB};
      `TX_LINE_CONTROL_REG : dataOut <= {3'b000, TxLineControlReg};
      `TX_LINE_CONTROL_REG : dataOut <= {3'b000, TxLineControlReg};
      `TX_SOF_ENABLE_REG : dataOut <= {7'b0000000, TxSOFEnableRegSTB};
      `TX_SOF_ENABLE_REG : dataOut <= {7'b0000000, TxSOFEnableRegSTB};
      `TX_ADDR_REG : dataOut <= {1'b0, TxAddrRegSTB};
      `TX_ADDR_REG : dataOut <= {1'b0, TxAddrRegSTB};
      `TX_ENDP_REG : dataOut <= {4'h0, TxEndPRegSTB};
      `TX_ENDP_REG : dataOut <= {4'h0, TxEndPRegSTB};
      `FRAME_NUM_MSB_REG : dataOut <= {5'b00000, frameNumInSTB[10:8]};
      `FRAME_NUM_MSB_REG : dataOut <= {5'b00000, frameNumInSTB[10:8]};
      `FRAME_NUM_LSB_REG : dataOut <= frameNumInSTB[7:0];
      `FRAME_NUM_LSB_REG : dataOut <= frameNumInSTB[7:0];
      `INTERRUPT_STATUS_REG :  dataOut <= {4'h0, SOFSentInt, connEventInt, resumeInt, transDoneInt};
      `INTERRUPT_STATUS_REG :  dataOut <= {4'h0, SOFSentInt, connEventInt, resumeInt, transDoneInt};
      `INTERRUPT_MASK_REG  : dataOut <= {4'h0, interruptMaskReg};
      `INTERRUPT_MASK_REG  : dataOut <= {4'h0, interruptMaskReg};
      `RX_STATUS_REG  : dataOut <= RxPktStatusInSTB;
      `RX_STATUS_REG  : dataOut <= RxPktStatusInSTB;
      `RX_PID_REG  : dataOut <= {4'b0000, RxPIDInSTB};
      `RX_PID_REG  : dataOut <= {4'b0000, RxPIDInSTB};
      `RX_CONNECT_STATE_REG : dataOut <= {6'b000000, connectStateInSTB};
      `RX_CONNECT_STATE_REG : dataOut <= {6'b000000, connectStateInSTB};
      `HOST_SOF_TIMER_MSB_REG : dataOut <= SOFTimer[15:8];
      `HOST_SOF_TIMER_MSB_REG : dataOut <= SOFTimerSTB[15:8];
      default: dataOut <= 8'h00;
      default: dataOut <= 8'h00;
  endcase
  endcase
end
end
 
 
//re-sync from busClk to usbClk. 
//re-sync from busClk to usbClk. 
always @(posedge usbClk) begin
always @(posedge usbClk) begin
  if (rstSyncToUsbClk == 1'b1) begin
  if (rstSyncToUsbClk == 1'b1) begin
    isoEn <= 1'b0;
    isoEn <= 1'b0;
    preambleEn <= 1'b0;
    preambleEn <= 1'b0;
    SOFSync <= 1'b0;
    SOFSync <= 1'b0;
    TxTransTypeReg <= 2'b00;
    TxTransTypeReg <= 2'b00;
    TxSOFEnableReg <= 1'b0;
    TxSOFEnableReg <= 1'b0;
    TxAddrReg <= 7'h00;
    TxAddrReg <= 7'h00;
    TxEndPReg <= 4'h0;
    TxEndPReg <= 4'h0;
    TxLineState <= 2'b00;
    TxLineState <= 2'b00;
    LineDirectControlEn <= 1'b0;
    LineDirectControlEn <= 1'b0;
    fullSpeedPol <= 1'b0;
    fullSpeedPol <= 1'b0;
    fullSpeedRate <= 1'b0;
    fullSpeedRate <= 1'b0;
    transReq <= 1'b0;
    transReq <= 1'b0;
  end
  end
  else begin
  else begin
    isoEn <= isoEnSTB;
    isoEn <= isoEnSTB;
    preambleEn <= preambleEnSTB;
    preambleEn <= preambleEnSTB;
    SOFSync <= SOFSyncSTB;
    SOFSync <= SOFSyncSTB;
    TxTransTypeReg <= TxTransTypeRegSTB;
    TxTransTypeReg <= TxTransTypeRegSTB;
    TxSOFEnableReg <= TxSOFEnableRegSTB;
    TxSOFEnableReg <= TxSOFEnableRegSTB;
    TxAddrReg <= TxAddrRegSTB;
    TxAddrReg <= TxAddrRegSTB;
    TxEndPReg <= TxEndPRegSTB;
    TxEndPReg <= TxEndPRegSTB;
    TxLineState <= TxLineStateSTB;
    TxLineState <= TxLineStateSTB;
    LineDirectControlEn <= LineDirectControlEnSTB;
    LineDirectControlEn <= LineDirectControlEnSTB;
    fullSpeedPol <= fullSpeedPolSTB;
    fullSpeedPol <= fullSpeedPolSTB;
    fullSpeedRate <= fullSpeedRateSTB;
    fullSpeedRate <= fullSpeedRateSTB;
    transReq <= transReqSTB;
    transReq <= transReqSTB;
  end
  end
end
end
 
 
//re-sync from usbClk to busClk. Since 'clrTransReq', 'transDoneIn' etc are only asserted 
//re-sync from usbClk to busClk. Since 'clrTransReq', 'transDoneIn' etc are only asserted 
//for one 'usbClk' tick, busClk freq must be greater than or equal to usbClk freq
//for one 'usbClk' tick, busClk freq must be greater than or equal to usbClk freq
always @(posedge busClk) begin
always @(posedge busClk) begin
  frameNumInSTB <= frameNumIn;
  frameNumInSTB <= frameNumIn;
  RxPktStatusInSTB <= RxPktStatusIn;
  RxPktStatusInSTB <= RxPktStatusIn;
  RxPIDInSTB <= RxPIDIn;
  RxPIDInSTB <= RxPIDIn;
  connectStateInSTB <= connectStateIn;
  connectStateInSTB <= connectStateIn;
  SOFSentInSTB <= SOFSentIn;
  SOFSentInSTB <= SOFSentIn;
  connEventInSTB <= connEventIn;
  connEventInSTB <= connEventIn;
  resumeIntInSTB <= resumeIntIn;
  resumeIntInSTB <= resumeIntIn;
  transDoneInSTB <= transDoneIn;
  transDoneInSTB <= transDoneIn;
  clrTransReqSTB <= clrTransReq;
  clrTransReqSTB <= clrTransReq;
 
  //FIXME. It is not safe to pass 'SOFTimer' multi-bit signal between clock domains this way
 
  //All the other multi-bit signals will be static at the time that they are
 
  //read, but 'SOFTimer' will not be static.
  SOFTimerSTB <= SOFTimer;
  SOFTimerSTB <= SOFTimer;
end
end
 
 
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.