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

Subversion Repositories usbhostslave

[/] [usbhostslave/] [trunk/] [RTL/] [serialInterfaceEngine/] [readUSBWireData.v] - Diff between revs 14 and 20

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 14 Rev 20
Line 4... Line 4...
////                                                              ////
////                                                              ////
//// 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:                                          ////
 
////      This module reads data from the differential USB data lines
 
////      and writes into a 4 entry FIFO. The data is read from
 
////      the fifo and output from the module when the higher level
 
////      state machine is ready to receive the data.
 
////      This module must recover the clock phase from the incoming
 
////      USB data. 'sampleCnt' is reset to zero whenever a RX data
 
////      edge is detected. Note that due to metastability the data
 
////      at the edge may not be registered correctly, but this does
 
////      not matter. All that matters is that an edge was detected. The
 
////      data will be accurately sampled in the middle of the USB bit 
 
////      period without metastability issues. 
 
////      After the edge detect, 'sampleCnt' is incremented at every clock
 
////      tick, and when it indicates the middle of a USB bit period
 
////      the RX data is sampled and written to the input buffer.
 
////      Single clock tick adjustments to 'sampleCnt' can be made at 
 
////      every RX data edge detect without double sampling the incoming
 
////      data. However, the first RX data bit in a packet may cause 
 
////      'sampleCnt' to be adjusted by a value greater than a single 
 
////      clock tick, and this can result in double sampling of the 
 
////      first data bit a RX packet. This 
 
////      double sampled data must be rejected by the higher level module.
 
////      This is achieved by 
 
////      qualifying the outgoing data with 'RxWireActive'. Thus 
 
////      the first data bit in a RX packet may be double sampled
 
////      as the clock recovery mechanism synchronizes to 'RxBitsIn'
 
////      but the double sampled data will be rejected by the higher 
 
////      level module.
//// 
//// 
////                                                              ////
////                                                              ////
//// To Do:                                                       ////
//// To Do:                                                       ////
//// 
//// 
////                                                              ////
////                                                              ////
Line 42... Line 69...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
`timescale 1ns / 1ps
`timescale 1ns / 1ps
`include "usbSerialInterfaceEngine_h.v"
`include "usbSerialInterfaceEngine_h.v"
 
 
module readUSBWireData (RxBitsIn, RxDataInTick, RxBitsOut, SIERxRdyIn, SIERxWEn, fullSpeedRate, TxWireActiveDrive, clk, rst, noActivityTimeOut, RxWireActive);
module readUSBWireData (RxBitsIn, RxDataInTick, RxBitsOut, SIERxRdyIn, SIERxWEn, fullSpeedRate, TxWireActiveDrive, clk, rst, noActivityTimeOut, RxWireActive, noActivityTimeOutEnable);
input   [1:0] RxBitsIn;
input   [1:0] RxBitsIn;
output  RxDataInTick;
output  RxDataInTick;
input   SIERxRdyIn;
input   SIERxRdyIn;
input   clk;
input   clk;
input   fullSpeedRate;
input   fullSpeedRate;
Line 54... Line 81...
input   TxWireActiveDrive;
input   TxWireActiveDrive;
output  [1:0] RxBitsOut;
output  [1:0] RxBitsOut;
output  SIERxWEn;
output  SIERxWEn;
output noActivityTimeOut;
output noActivityTimeOut;
output RxWireActive;
output RxWireActive;
 
input  noActivityTimeOutEnable;
 
 
wire   [1:0] RxBitsIn;
wire   [1:0] RxBitsIn;
reg    RxDataInTick;
reg    RxDataInTick;
wire   SIERxRdyIn;
wire   SIERxRdyIn;
wire   clk;
wire   clk;
Line 65... Line 93...
wire   rst;
wire   rst;
reg    [1:0] RxBitsOut;
reg    [1:0] RxBitsOut;
reg    SIERxWEn;
reg    SIERxWEn;
reg    noActivityTimeOut;
reg    noActivityTimeOut;
reg    RxWireActive;
reg    RxWireActive;
 
wire   noActivityTimeOutEnable;
 
 
// local registers
// local registers
reg  [2:0]buffer0;
reg  [2:0]buffer0;
reg  [2:0]buffer1;
reg  [2:0]buffer1;
reg  [2:0]buffer2;
reg  [2:0]buffer2;
reg  [2:0]buffer3;
reg  [2:0]buffer3;
reg  [2:0]bufferCnt;
reg  [2:0]bufferCnt;
reg  [1:0]bufferInIndex;
reg  [1:0]bufferInIndex;
reg  [1:0]bufferOutIndex;
reg  [1:0]bufferOutIndex;
reg decBufferCnt;
reg decBufferCnt;
reg  [4:0]i;
reg  [4:0]sampleCnt;
reg incBufferCnt;
reg incBufferCnt;
reg  [1:0]oldRxBitsIn;
reg  [1:0]oldRxBitsIn;
reg [1:0] RxBitsInReg;
reg [1:0] RxBitsInReg;
reg [15:0] timeOutCnt;
reg [15:0] timeOutCnt;
 
reg [7:0] rxActiveCnt;
reg RxWireEdgeDetect;
reg RxWireEdgeDetect;
reg RxWireActiveReg1;
reg RxWireActiveReg;
reg RxWireActiveReg2;
reg RxWireActiveReg2;
 
 
// buffer output state machine state codes:
// buffer output state machine state codes:
`define WAIT_BUFFER_NOT_EMPTY 2'b00
`define WAIT_BUFFER_NOT_EMPTY 2'b00
`define WAIT_SIE_RX_READY 2'b01
`define WAIT_SIE_RX_READY 2'b01
Line 112... Line 142...
//Perform line rate clock recovery
//Perform line rate clock recovery
//Recover the wire data, and store data to buffer
//Recover the wire data, and store data to buffer
always @(posedge clk) begin
always @(posedge clk) begin
  if (rst == 1'b1)
  if (rst == 1'b1)
  begin
  begin
    i <= 5'b00000;
    sampleCnt <= 5'b00000;
    incBufferCnt <= 1'b0;
    incBufferCnt <= 1'b0;
    bufferInIndex <= 2'b00;
    bufferInIndex <= 2'b00;
    buffer0 <= 3'b000;
    buffer0 <= 3'b000;
    buffer1 <= 3'b000;
    buffer1 <= 3'b000;
    buffer2 <= 3'b000;
    buffer2 <= 3'b000;
    buffer3 <= 3'b000;
    buffer3 <= 3'b000;
    RxDataInTick <= 1'b0;
    RxDataInTick <= 1'b0;
    RxWireEdgeDetect <= 1'b0;
    RxWireEdgeDetect <= 1'b0;
    RxWireActiveReg1 <= 1'b0;
    RxWireActiveReg <= 1'b0;
    RxWireActiveReg2 <= 1'b0;
    RxWireActiveReg2 <= 1'b0;
  end
  end
  else begin
  else begin
    RxWireActiveReg2 <= RxWireActiveReg1; //Delay RxWireActiveReg1 until after i has been reset
    RxWireActiveReg2 <= RxWireActiveReg; //Delay 'RxWireActiveReg' until after 'sampleCnt' has been reset
    RxBitsInReg <= RxBitsIn;      //sync incoming data to local clock to avoid metastability issues
    RxBitsInReg <= RxBitsIn;
    incBufferCnt <= 1'b0;         //default value
 
    oldRxBitsIn <= RxBitsInReg;
    oldRxBitsIn <= RxBitsInReg;
    if ( (TxWireActiveDrive == 1'b0) && (oldRxBitsIn != RxBitsInReg)) begin  //if edge detected then
    incBufferCnt <= 1'b0;         //default value
      i <= 5'b00000;              //reset the counter
    if ( (TxWireActiveDrive == 1'b0) && (RxBitsIn != RxBitsInReg)) begin  //if edge detected then
 
      sampleCnt <= 5'b00000;
      RxWireEdgeDetect <= 1'b1;       // flag receive activity 
      RxWireEdgeDetect <= 1'b1;       // flag receive activity 
      RxWireActiveReg1 <= 1'b1;
      RxWireActiveReg <= 1'b1;
 
      rxActiveCnt <= 8'h00;
    end
    end
    else begin
    else begin
      i <= i + 1'b1;
      sampleCnt <= sampleCnt + 1'b1;
      RxWireEdgeDetect <= 1'b0;
      RxWireEdgeDetect <= 1'b0;
 
      rxActiveCnt <= rxActiveCnt + 1'b1;
 
      //clear 'RxWireActiveReg' if no RX transitions for RX_EDGE_DET_TOUT USB bit periods 
 
      if ( (fullSpeedRate == 1'b1 && rxActiveCnt == `RX_EDGE_DET_TOUT * `FS_OVER_SAMPLE_RATE)
 
        || (fullSpeedRate == 1'b0 && rxActiveCnt == `RX_EDGE_DET_TOUT * `LS_OVER_SAMPLE_RATE) )
 
        RxWireActiveReg <= 1'b0;
    end
    end
    if (noActivityTimeOut == 1'b1)
    if ( (fullSpeedRate == 1'b1 && sampleCnt[1:0] == 2'b10) || (fullSpeedRate == 1'b0 && sampleCnt == 5'b10000) )
      RxWireActiveReg1 <= 1'b0;
 
    if ( (fullSpeedRate == 1'b1 && i[1:0] == 2'b01) || (fullSpeedRate == 1'b0 && i == 5'b10000) )
 
    begin
    begin
      RxDataInTick <= !RxDataInTick;
      RxDataInTick <= !RxDataInTick;
      if (TxWireActiveDrive != 1'b1)  //do not read wire data when transmitter is active
      if (TxWireActiveDrive != 1'b1)  //do not read wire data when transmitter is active
      begin
      begin
        incBufferCnt <= 1'b1;
        incBufferCnt <= 1'b1;
        bufferInIndex <= bufferInIndex + 1'b1;
        bufferInIndex <= bufferInIndex + 1'b1;
        case (bufferInIndex)
        case (bufferInIndex)
          2'b00 : buffer0 <= {RxWireActiveReg2, RxBitsInReg};
          2'b00 : buffer0 <= {RxWireActiveReg2, oldRxBitsIn};
          2'b01 : buffer1 <= {RxWireActiveReg2, RxBitsInReg};
          2'b01 : buffer1 <= {RxWireActiveReg2, oldRxBitsIn};
          2'b10 : buffer2 <= {RxWireActiveReg2, RxBitsInReg};
          2'b10 : buffer2 <= {RxWireActiveReg2, oldRxBitsIn};
          2'b11 : buffer3 <= {RxWireActiveReg2, RxBitsInReg};
          2'b11 : buffer3 <= {RxWireActiveReg2, oldRxBitsIn};
        endcase
        endcase
      end
      end
    end
    end
  end
  end
end
end
Line 203... Line 237...
      end
      end
    endcase
    endcase
  end
  end
end
end
 
 
//generate time out flag if no tx or rx activity
//generate 'noActivityTimeOut' pulse if no tx or rx activity for RX_PACKET_TOUT USB bit periods
 
//'noActivityTimeOut'  pulse can only be generated when the host or slave getPacket
 
//process enables via 'noActivityTimeOutEnable' signal
 
//'noActivityTimeOut' pulse is used by host and slave getPacket processes to determine if 
 
//there has been a response time out.
always @(posedge clk) begin
always @(posedge clk) begin
  if (rst) begin
  if (rst) begin
    timeOutCnt <= 16'h0000;
    timeOutCnt <= 16'h0000;
    noActivityTimeOut <= 1'b0;
    noActivityTimeOut <= 1'b0;
  end
  end
  else begin
  else begin
    if (TxWireActiveDrive == 1'b1 || RxWireEdgeDetect == 1'b1)
    if (TxWireActiveDrive == 1'b1 || RxWireEdgeDetect == 1'b1 || noActivityTimeOutEnable == 1'b0)
      timeOutCnt <= 16'h0000;
      timeOutCnt <= 16'h0000;
    else
    else
      timeOutCnt <= timeOutCnt + 1'b1;
      timeOutCnt <= timeOutCnt + 1'b1;
    if ( (fullSpeedRate == 1'b1 && timeOutCnt == `RX_PACKET_TOUT * `FS_OVER_SAMPLE_RATE)
    if ( (fullSpeedRate == 1'b1 && timeOutCnt == `RX_PACKET_TOUT * `FS_OVER_SAMPLE_RATE)
          || (fullSpeedRate == 1'b0 && timeOutCnt == `RX_PACKET_TOUT * `LS_OVER_SAMPLE_RATE) )
          || (fullSpeedRate == 1'b0 && timeOutCnt == `RX_PACKET_TOUT * `LS_OVER_SAMPLE_RATE) )
Line 222... Line 260...
    else
    else
      noActivityTimeOut <= 1'b0;
      noActivityTimeOut <= 1'b0;
  end
  end
end
end
 
 
 
 
endmodule
endmodule
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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