Line 83... |
Line 83... |
wire fullSpeedRate;
|
wire fullSpeedRate;
|
wire rst;
|
wire rst;
|
reg TxWireActiveDrive;
|
reg TxWireActiveDrive;
|
|
|
// local registers
|
// local registers
|
reg [2:0]buffer0;
|
reg [3:0]buffer0;
|
reg [2:0]buffer1;
|
reg [3:0]buffer1;
|
reg [2:0]buffer2;
|
reg [3:0]buffer2;
|
reg [2:0]buffer3;
|
reg [3: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]i;
|
reg incBufferCnt;
|
reg incBufferCnt;
|
reg fullSpeedTick;
|
reg fullSpeedTick;
|
reg lowSpeedTick;
|
reg lowSpeedTick;
|
|
reg fullSpeedRate_reg;
|
|
|
// buffer in state machine state codes:
|
// buffer in state machine state codes:
|
`define WAIT_BUFFER_NOT_FULL 2'b00
|
`define WAIT_BUFFER_NOT_FULL 2'b00
|
`define WAIT_WRITE_REQ 2'b01
|
`define WAIT_WRITE_REQ 2'b01
|
`define CLR_INC_BUFFER_CNT 2'b10
|
`define CLR_INC_BUFFER_CNT 2'b10
|
Line 131... |
Line 132... |
//buffer input state machine
|
//buffer input state machine
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
if (rst == 1'b1) begin
|
if (rst == 1'b1) begin
|
incBufferCnt <= 1'b0;
|
incBufferCnt <= 1'b0;
|
bufferInIndex <= 2'b00;
|
bufferInIndex <= 2'b00;
|
buffer0 <= 3'b000;
|
buffer0 <= 4'b0000;
|
buffer1 <= 3'b000;
|
buffer1 <= 4'b0000;
|
buffer2 <= 3'b000;
|
buffer2 <= 4'b0000;
|
buffer3 <= 3'b000;
|
buffer3 <= 4'b0000;
|
USBWireRdy <= 1'b0;
|
USBWireRdy <= 1'b0;
|
bufferInStMachCurrState <= `WAIT_BUFFER_NOT_FULL;
|
bufferInStMachCurrState <= `WAIT_BUFFER_NOT_FULL;
|
end
|
end
|
else begin
|
else begin
|
case (bufferInStMachCurrState)
|
case (bufferInStMachCurrState)
|
Line 156... |
Line 157... |
begin
|
begin
|
incBufferCnt <= 1'b1;
|
incBufferCnt <= 1'b1;
|
USBWireRdy <= 1'b0;
|
USBWireRdy <= 1'b0;
|
bufferInIndex <= bufferInIndex + 1'b1;
|
bufferInIndex <= bufferInIndex + 1'b1;
|
case (bufferInIndex)
|
case (bufferInIndex)
|
2'b00 : buffer0 <= {TxBitsIn, TxCtrlIn};
|
2'b00 : buffer0 <= {fullSpeedRate, TxBitsIn, TxCtrlIn};
|
2'b01 : buffer1 <= {TxBitsIn, TxCtrlIn};
|
2'b01 : buffer1 <= {fullSpeedRate, TxBitsIn, TxCtrlIn};
|
2'b10 : buffer2 <= {TxBitsIn, TxCtrlIn};
|
2'b10 : buffer2 <= {fullSpeedRate, TxBitsIn, TxCtrlIn};
|
2'b11 : buffer3 <= {TxBitsIn, TxCtrlIn};
|
2'b11 : buffer3 <= {fullSpeedRate, TxBitsIn, TxCtrlIn};
|
endcase
|
endcase
|
bufferInStMachCurrState <= `CLR_INC_BUFFER_CNT;
|
bufferInStMachCurrState <= `CLR_INC_BUFFER_CNT;
|
end
|
end
|
end
|
end
|
`CLR_INC_BUFFER_CNT:
|
`CLR_INC_BUFFER_CNT:
|
Line 215... |
Line 216... |
decBufferCnt <= 1'b0;
|
decBufferCnt <= 1'b0;
|
TxBitsOut <= 2'b00;
|
TxBitsOut <= 2'b00;
|
TxCtrlOut <= `TRI_STATE;
|
TxCtrlOut <= `TRI_STATE;
|
TxDataOutTick <= 1'b0;
|
TxDataOutTick <= 1'b0;
|
bufferOutStMachCurrState <= `WAIT_LINE_WRITE;
|
bufferOutStMachCurrState <= `WAIT_LINE_WRITE;
|
|
fullSpeedRate_reg <= 1'b0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
|
case (bufferOutIndex)
|
|
2'b00: fullSpeedRate_reg <= buffer0[3];
|
|
2'b01: fullSpeedRate_reg <= buffer1[3];
|
|
2'b10: fullSpeedRate_reg <= buffer2[3];
|
|
2'b11: fullSpeedRate_reg <= buffer3[3];
|
|
endcase
|
case (bufferOutStMachCurrState)
|
case (bufferOutStMachCurrState)
|
`WAIT_LINE_WRITE:
|
`WAIT_LINE_WRITE:
|
begin
|
begin
|
if ((fullSpeedRate == 1'b1 && fullSpeedTick == 1'b1) || (fullSpeedRate == 1'b0 && lowSpeedTick == 1'b1) )
|
if ((fullSpeedRate_reg == 1'b1 && fullSpeedTick == 1'b1) || (fullSpeedRate_reg == 1'b0 && lowSpeedTick == 1'b1) )
|
begin
|
begin
|
TxDataOutTick <= !TxDataOutTick;
|
TxDataOutTick <= !TxDataOutTick;
|
if (bufferCnt == 0) begin
|
if (bufferCnt == 0) begin
|
TxBitsOut <= 2'b00;
|
TxBitsOut <= 2'b00;
|
TxCtrlOut <= `TRI_STATE;
|
TxCtrlOut <= `TRI_STATE;
|