Line 39... |
Line 39... |
//// 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> ////
|
//// ////
|
//// ////
|
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// $Id: readUSBWireData.v,v 1.2 2004-12-18 14:36:16 sfielding Exp $
|
|
//
|
|
// CVS Revision History
|
|
//
|
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.1.1.1 2004/10/11 04:01:01 sfielding
|
|
// Created
|
|
//
|
|
//
|
|
|
|
`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
`include "usbSerialInterfaceEngine_h.v"
|
`include "usbSerialInterfaceEngine_h.v"
|
|
|
module readUSBWireData (RxBitsIn, RxDataInTick, RxBitsOut, SIERxRdyIn, SIERxWEn, fullSpeedRate, disableWireRead, clk, rst);
|
module readUSBWireData (RxBitsIn, RxDataInTick, RxBitsOut, SIERxRdyIn, SIERxWEn, fullSpeedRate, TxWireActiveDrive, clk, rst, noActivityTimeOut);
|
input [1:0] RxBitsIn;
|
input [1:0] RxBitsIn;
|
output RxDataInTick;
|
output RxDataInTick;
|
input SIERxRdyIn;
|
input SIERxRdyIn;
|
input clk;
|
input clk;
|
input fullSpeedRate;
|
input fullSpeedRate;
|
input rst;
|
input rst;
|
input disableWireRead;
|
input TxWireActiveDrive;
|
output [1:0] RxBitsOut;
|
output [1:0] RxBitsOut;
|
output SIERxWEn;
|
output SIERxWEn;
|
|
output noActivityTimeOut;
|
|
|
wire [1:0] RxBitsIn;
|
wire [1:0] RxBitsIn;
|
reg RxDataInTick;
|
reg RxDataInTick;
|
wire SIERxRdyIn;
|
wire SIERxRdyIn;
|
wire clk;
|
wire clk;
|
wire fullSpeedRate;
|
wire fullSpeedRate;
|
wire rst;
|
wire rst;
|
reg [1:0] RxBitsOut;
|
reg [1:0] RxBitsOut;
|
reg SIERxWEn;
|
reg SIERxWEn;
|
|
reg noActivityTimeOut;
|
|
|
// local registers
|
// local registers
|
reg [1:0]buffer0;
|
reg [1:0]buffer0;
|
reg [1:0]buffer1;
|
reg [1:0]buffer1;
|
reg [1:0]buffer2;
|
reg [1:0]buffer2;
|
Line 85... |
Line 77... |
reg decBufferCnt;
|
reg decBufferCnt;
|
reg [4:0]i;
|
reg [4:0]i;
|
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 RxWireActive;
|
|
|
// 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
|
`define SIE_RX_WRITE 2'b10
|
`define SIE_RX_WRITE 2'b10
|
Line 122... |
Line 116... |
buffer0 <= 2'b00;
|
buffer0 <= 2'b00;
|
buffer1 <= 2'b00;
|
buffer1 <= 2'b00;
|
buffer2 <= 2'b00;
|
buffer2 <= 2'b00;
|
buffer3 <= 2'b00;
|
buffer3 <= 2'b00;
|
RxDataInTick <= 1'b0;
|
RxDataInTick <= 1'b0;
|
|
RxWireActive <= 1'b0;
|
end
|
end
|
else begin
|
else begin
|
RxBitsInReg <= RxBitsIn; //sync to local clock to avoid metastability issues
|
RxBitsInReg <= RxBitsIn; //sync to local clock to avoid metastability issues
|
incBufferCnt <= 1'b0; //default value
|
incBufferCnt <= 1'b0; //default value
|
oldRxBitsIn <= RxBitsInReg;
|
oldRxBitsIn <= RxBitsInReg;
|
if (oldRxBitsIn != RxBitsInReg) //if edge detected then
|
if (oldRxBitsIn != RxBitsInReg) begin //if edge detected then
|
i <= 5'b00000; //reset the counter
|
i <= 5'b00000; //reset the counter
|
else
|
RxWireActive <= 1'b1; // flag receive activity
|
|
end
|
|
else begin
|
i <= i + 1'b1;
|
i <= i + 1'b1;
|
|
RxWireActive <= 1'b0;
|
|
end
|
if ( (fullSpeedRate == 1'b1 && i[1:0] == 2'b01) || (fullSpeedRate == 1'b0 && i == 5'b10000) )
|
if ( (fullSpeedRate == 1'b1 && i[1:0] == 2'b01) || (fullSpeedRate == 1'b0 && i == 5'b10000) )
|
begin
|
begin
|
RxDataInTick <= !RxDataInTick;
|
RxDataInTick <= !RxDataInTick;
|
if (disableWireRead != 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 <= RxBitsInReg;
|
2'b00 : buffer0 <= RxBitsInReg;
|
Line 194... |
Line 193... |
end
|
end
|
endcase
|
endcase
|
end
|
end
|
end
|
end
|
|
|
|
//generate time out flag if no tx or rx activity
|
|
always @(posedge clk) begin
|
|
if (rst) begin
|
|
timeOutCnt <= 16'h0000;
|
|
noActivityTimeOut <= 1'b0;
|
|
end
|
|
else begin
|
|
if (TxWireActiveDrive == 1'b1 || RxWireActive == 1'b1)
|
|
timeOutCnt <= 16'h0000;
|
|
else
|
|
timeOutCnt <= timeOutCnt + 1'b1;
|
|
//if (timeOutCnt == `RX_PACKET_TOUT * `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) )
|
|
//if (timeOutCnt == 16'h200) //temporary hack
|
|
noActivityTimeOut <= 1'b1;
|
|
else
|
|
noActivityTimeOut <= 1'b0;
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
endmodule
|
endmodule
|
No newline at end of file
|
No newline at end of file
|