Line 1... |
Line 1... |
|
|
|
// File : ../RTL/hostController/sendpacket.v
|
|
// Generated : 10/06/06 19:35:25
|
|
// From : ../RTL/hostController/sendpacket.asf
|
|
// By : FSM2VHDL ver. 5.0.0.9
|
|
|
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// sendPacket
|
//// sendPacket
|
//// ////
|
//// ////
|
//// This file is part of the usbhostslave opencores effort.
|
//// This file is part of the usbhostslave opencores effort.
|
Line 40... |
Line 45... |
//// 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 "usbSerialInterfaceEngine_h.v"
|
`include "usbSerialInterfaceEngine_h.v"
|
`include "usbConstants_h.v"
|
`include "usbConstants_h.v"
|
|
|
|
|
|
|
module sendPacket (clk, fifoData, fifoEmpty, fifoReadEn, frameNum, fullSpeedPolarity, HCTxPortCntl, HCTxPortData, HCTxPortGnt, HCTxPortRdy, HCTxPortReq, HCTxPortWEn, PID, rst, sendPacketRdy, sendPacketWEn, TxAddr, TxEndP);
|
module sendPacket (HCTxPortCntl, HCTxPortData, HCTxPortGnt, HCTxPortRdy, HCTxPortReq, HCTxPortWEn, PID, TxAddr, TxEndP, clk, fifoData, fifoEmpty, fifoReadEn, frameNum, fullSpeedPolarity, rst, sendPacketRdy, sendPacketWEn);
|
|
input HCTxPortGnt;
|
|
input HCTxPortRdy;
|
|
input [3:0] PID;
|
|
input [6:0] TxAddr;
|
|
input [3:0] TxEndP;
|
input clk;
|
input clk;
|
input [7:0]fifoData;
|
input [7:0]fifoData;
|
input fifoEmpty;
|
input fifoEmpty;
|
input fullSpeedPolarity;
|
input fullSpeedPolarity;
|
input HCTxPortGnt;
|
|
input HCTxPortRdy;
|
|
input [3:0]PID;
|
|
input rst;
|
input rst;
|
input sendPacketWEn;
|
input sendPacketWEn;
|
input [6:0]TxAddr;
|
|
input [3:0]TxEndP;
|
|
output fifoReadEn;
|
|
output [10:0]frameNum;
|
|
output [7:0]HCTxPortCntl;
|
output [7:0]HCTxPortCntl;
|
output [7:0]HCTxPortData;
|
output [7:0]HCTxPortData;
|
output HCTxPortReq;
|
output HCTxPortReq;
|
output HCTxPortWEn;
|
output HCTxPortWEn;
|
|
output fifoReadEn;
|
|
output [10:0] frameNum;
|
output sendPacketRdy;
|
output sendPacketRdy;
|
|
|
wire clk;
|
|
wire [7:0]fifoData;
|
|
wire fifoEmpty;
|
|
reg fifoReadEn, next_fifoReadEn;
|
|
reg [10:0]frameNum, next_frameNum;
|
|
wire fullSpeedPolarity;
|
|
reg [7:0]HCTxPortCntl, next_HCTxPortCntl;
|
reg [7:0]HCTxPortCntl, next_HCTxPortCntl;
|
reg [7:0]HCTxPortData, next_HCTxPortData;
|
reg [7:0]HCTxPortData, next_HCTxPortData;
|
wire HCTxPortGnt;
|
wire HCTxPortGnt;
|
wire HCTxPortRdy;
|
wire HCTxPortRdy;
|
reg HCTxPortReq, next_HCTxPortReq;
|
reg HCTxPortReq, next_HCTxPortReq;
|
reg HCTxPortWEn, next_HCTxPortWEn;
|
reg HCTxPortWEn, next_HCTxPortWEn;
|
wire [3:0]PID;
|
wire [3:0]PID;
|
|
wire [6:0] TxAddr;
|
|
wire [3:0] TxEndP;
|
|
wire clk;
|
|
wire [7:0] fifoData;
|
|
wire fifoEmpty;
|
|
reg fifoReadEn, next_fifoReadEn;
|
|
reg [10:0] frameNum, next_frameNum;
|
|
wire fullSpeedPolarity;
|
wire rst;
|
wire rst;
|
reg sendPacketRdy, next_sendPacketRdy;
|
reg sendPacketRdy, next_sendPacketRdy;
|
wire sendPacketWEn;
|
wire sendPacketWEn;
|
wire [6:0]TxAddr;
|
|
wire [3:0]TxEndP;
|
|
|
|
// diagram signals declarations
|
// diagram signals declarations
|
reg [7:0]PIDNotPID;
|
reg [7:0]PIDNotPID;
|
|
|
// BINARY ENCODED state machine: sndPkt
|
// BINARY ENCODED state machine: sndPkt
|
Line 114... |
Line 119... |
`define DATA0_DATA1_CLR_WEN 5'b10011
|
`define DATA0_DATA1_CLR_WEN 5'b10011
|
`define DATA0_DATA1_CLR_REN 5'b10100
|
`define DATA0_DATA1_CLR_REN 5'b10100
|
`define LS_EOP_WAIT_RDY 5'b10101
|
`define LS_EOP_WAIT_RDY 5'b10101
|
`define LS_EOP_FIN 5'b10110
|
`define LS_EOP_FIN 5'b10110
|
|
|
reg [4:0]CurrState_sndPkt, NextState_sndPkt;
|
reg [4:0] CurrState_sndPkt;
|
|
reg [4:0] NextState_sndPkt;
|
|
|
// Diagram actions (continuous assignments allowed only: assign ...)
|
// Diagram actions (continuous assignments allowed only: assign ...)
|
|
|
always @(PID)
|
always @(PID)
|
begin
|
begin
|
PIDNotPID <= { (PID ^ 4'hf), PID };
|
PIDNotPID <= { (PID ^ 4'hf), PID };
|
end
|
end
|
|
|
|
//--------------------------------------------------------------------
|
// Machine: sndPkt
|
// Machine: sndPkt
|
|
//--------------------------------------------------------------------
|
// NextState logic (combinatorial)
|
//----------------------------------
|
always @ (sendPacketWEn or HCTxPortGnt or fullSpeedPolarity or HCTxPortRdy or PIDNotPID or PID or TxEndP or TxAddr or frameNum or fifoData or fifoEmpty or sendPacketRdy or fifoReadEn or HCTxPortData or HCTxPortCntl or HCTxPortWEn or HCTxPortReq or CurrState_sndPkt)
|
// Next State Logic (combinatorial)
|
begin
|
//----------------------------------
|
|
always @ (PIDNotPID or TxEndP or TxAddr or frameNum or fifoData or sendPacketWEn or HCTxPortGnt or PID or fullSpeedPolarity or HCTxPortRdy or fifoEmpty or sendPacketRdy or HCTxPortReq or HCTxPortWEn or HCTxPortData or HCTxPortCntl or fifoReadEn or CurrState_sndPkt)
|
|
begin : sndPkt_NextState
|
NextState_sndPkt <= CurrState_sndPkt;
|
NextState_sndPkt <= CurrState_sndPkt;
|
// Set default values for outputs and signals
|
// Set default values for outputs and signals
|
next_sendPacketRdy <= sendPacketRdy;
|
next_sendPacketRdy <= sendPacketRdy;
|
next_fifoReadEn <= fifoReadEn;
|
next_HCTxPortReq <= HCTxPortReq;
|
|
next_HCTxPortWEn <= HCTxPortWEn;
|
next_HCTxPortData <= HCTxPortData;
|
next_HCTxPortData <= HCTxPortData;
|
next_HCTxPortCntl <= HCTxPortCntl;
|
next_HCTxPortCntl <= HCTxPortCntl;
|
next_HCTxPortWEn <= HCTxPortWEn;
|
|
next_HCTxPortReq <= HCTxPortReq;
|
|
next_frameNum <= frameNum;
|
next_frameNum <= frameNum;
|
case (CurrState_sndPkt) // synopsys parallel_case full_case
|
next_fifoReadEn <= fifoReadEn;
|
|
case (CurrState_sndPkt)
|
`START_SP:
|
`START_SP:
|
begin
|
|
NextState_sndPkt <= `WAIT_ENABLE;
|
NextState_sndPkt <= `WAIT_ENABLE;
|
end
|
|
`WAIT_ENABLE:
|
`WAIT_ENABLE:
|
begin
|
|
if (sendPacketWEn == 1'b1)
|
if (sendPacketWEn == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `SP_WAIT_GNT;
|
NextState_sndPkt <= `SP_WAIT_GNT;
|
next_sendPacketRdy <= 1'b0;
|
next_sendPacketRdy <= 1'b0;
|
next_HCTxPortReq <= 1'b1;
|
next_HCTxPortReq <= 1'b1;
|
end
|
end
|
end
|
|
`SP_WAIT_GNT:
|
`SP_WAIT_GNT:
|
begin
|
|
if ((HCTxPortGnt == 1'b1) && (PID == `SOF && fullSpeedPolarity == 1'b0))
|
if ((HCTxPortGnt == 1'b1) && (PID == `SOF && fullSpeedPolarity == 1'b0))
|
begin
|
|
NextState_sndPkt <= `LS_EOP_WAIT_RDY;
|
NextState_sndPkt <= `LS_EOP_WAIT_RDY;
|
end
|
|
else if (HCTxPortGnt == 1'b1)
|
else if (HCTxPortGnt == 1'b1)
|
begin
|
|
NextState_sndPkt <= `SEND_PID_WAIT_RDY;
|
NextState_sndPkt <= `SEND_PID_WAIT_RDY;
|
end
|
|
end
|
|
`FIN_SP:
|
`FIN_SP:
|
begin
|
begin
|
NextState_sndPkt <= `WAIT_ENABLE;
|
NextState_sndPkt <= `WAIT_ENABLE;
|
next_sendPacketRdy <= 1'b1;
|
next_sendPacketRdy <= 1'b1;
|
next_HCTxPortReq <= 1'b0;
|
next_HCTxPortReq <= 1'b0;
|
end
|
end
|
`SEND_PID_WAIT_RDY:
|
`SEND_PID_WAIT_RDY:
|
begin
|
|
if (HCTxPortRdy == 1'b1)
|
if (HCTxPortRdy == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `SEND_PID_FIN;
|
NextState_sndPkt <= `SEND_PID_FIN;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortData <= PIDNotPID;
|
next_HCTxPortData <= PIDNotPID;
|
next_HCTxPortCntl <= `TX_PACKET_START;
|
next_HCTxPortCntl <= `TX_PACKET_START;
|
end
|
end
|
end
|
|
`SEND_PID_FIN:
|
`SEND_PID_FIN:
|
begin
|
begin
|
next_HCTxPortWEn <= 1'b0;
|
next_HCTxPortWEn <= 1'b0;
|
if (PID == `DATA0 || PID == `DATA1)
|
if (PID == `DATA0 || PID == `DATA1)
|
begin
|
|
NextState_sndPkt <= `DATA0_DATA1_FIFO_EMPTY;
|
NextState_sndPkt <= `DATA0_DATA1_FIFO_EMPTY;
|
end
|
|
else if (PID == `SOF)
|
else if (PID == `SOF)
|
begin
|
|
NextState_sndPkt <= `SEND_SOF_WAIT_RDY3;
|
NextState_sndPkt <= `SEND_SOF_WAIT_RDY3;
|
end
|
|
else if (PID == `OUT ||
|
else if (PID == `OUT ||
|
PID == `IN ||
|
PID == `IN ||
|
PID == `SETUP)
|
PID == `SETUP)
|
begin
|
|
NextState_sndPkt <= `OUT_IN_SETUP_WAIT_RDY1;
|
NextState_sndPkt <= `OUT_IN_SETUP_WAIT_RDY1;
|
end
|
|
else
|
else
|
begin
|
|
NextState_sndPkt <= `FIN_SP;
|
NextState_sndPkt <= `FIN_SP;
|
end
|
end
|
end
|
|
`OUT_IN_SETUP_WAIT_RDY1:
|
`OUT_IN_SETUP_WAIT_RDY1:
|
begin
|
|
if (HCTxPortRdy == 1'b1)
|
if (HCTxPortRdy == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `OUT_IN_SETUP_CLR_WEN1;
|
NextState_sndPkt <= `OUT_IN_SETUP_CLR_WEN1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortData <= {TxEndP[0], TxAddr[6:0]};
|
next_HCTxPortData <= {TxEndP[0], TxAddr[6:0]};
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
end
|
end
|
end
|
|
`OUT_IN_SETUP_WAIT_RDY2:
|
`OUT_IN_SETUP_WAIT_RDY2:
|
begin
|
|
if (HCTxPortRdy == 1'b1)
|
if (HCTxPortRdy == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `OUT_IN_SETUP_FIN;
|
NextState_sndPkt <= `OUT_IN_SETUP_FIN;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortData <= {5'b00000, TxEndP[3:1]};
|
next_HCTxPortData <= {5'b00000, TxEndP[3:1]};
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
end
|
end
|
end
|
|
`OUT_IN_SETUP_FIN:
|
`OUT_IN_SETUP_FIN:
|
begin
|
begin
|
next_HCTxPortWEn <= 1'b0;
|
next_HCTxPortWEn <= 1'b0;
|
NextState_sndPkt <= `FIN_SP;
|
NextState_sndPkt <= `FIN_SP;
|
end
|
end
|
Line 237... |
Line 222... |
next_HCTxPortWEn <= 1'b0;
|
next_HCTxPortWEn <= 1'b0;
|
next_frameNum <= frameNum + 1'b1;
|
next_frameNum <= frameNum + 1'b1;
|
NextState_sndPkt <= `FIN_SP;
|
NextState_sndPkt <= `FIN_SP;
|
end
|
end
|
`SEND_SOF_WAIT_RDY3:
|
`SEND_SOF_WAIT_RDY3:
|
begin
|
|
if (HCTxPortRdy == 1'b1)
|
if (HCTxPortRdy == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `SEND_SOF_CLR_WEN1;
|
NextState_sndPkt <= `SEND_SOF_CLR_WEN1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortData <= frameNum[7:0];
|
next_HCTxPortData <= frameNum[7:0];
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
end
|
end
|
end
|
|
`SEND_SOF_WAIT_RDY4:
|
`SEND_SOF_WAIT_RDY4:
|
begin
|
|
if (HCTxPortRdy == 1'b1)
|
if (HCTxPortRdy == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `SEND_SOF_FIN1;
|
NextState_sndPkt <= `SEND_SOF_FIN1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortData <= {5'b00000, frameNum[10:8]};
|
next_HCTxPortData <= {5'b00000, frameNum[10:8]};
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
end
|
end
|
end
|
|
`SEND_SOF_CLR_WEN1:
|
`SEND_SOF_CLR_WEN1:
|
begin
|
begin
|
next_HCTxPortWEn <= 1'b0;
|
next_HCTxPortWEn <= 1'b0;
|
NextState_sndPkt <= `SEND_SOF_WAIT_RDY4;
|
NextState_sndPkt <= `SEND_SOF_WAIT_RDY4;
|
end
|
end
|
Line 269... |
Line 250... |
next_HCTxPortData <= fifoData;
|
next_HCTxPortData <= fifoData;
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
next_HCTxPortCntl <= `TX_PACKET_STREAM;
|
NextState_sndPkt <= `DATA0_DATA1_CLR_WEN;
|
NextState_sndPkt <= `DATA0_DATA1_CLR_WEN;
|
end
|
end
|
`DATA0_DATA1_WAIT_READ_FIFO:
|
`DATA0_DATA1_WAIT_READ_FIFO:
|
begin
|
|
if (HCTxPortRdy == 1'b1)
|
if (HCTxPortRdy == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `DATA0_DATA1_CLR_REN;
|
NextState_sndPkt <= `DATA0_DATA1_CLR_REN;
|
next_fifoReadEn <= 1'b1;
|
next_fifoReadEn <= 1'b1;
|
end
|
end
|
end
|
|
`DATA0_DATA1_FIFO_EMPTY:
|
`DATA0_DATA1_FIFO_EMPTY:
|
begin
|
|
if (fifoEmpty == 1'b0)
|
if (fifoEmpty == 1'b0)
|
begin
|
|
NextState_sndPkt <= `DATA0_DATA1_WAIT_READ_FIFO;
|
NextState_sndPkt <= `DATA0_DATA1_WAIT_READ_FIFO;
|
end
|
|
else
|
else
|
begin
|
|
NextState_sndPkt <= `DATA0_DATA1_TERM_BYTE;
|
NextState_sndPkt <= `DATA0_DATA1_TERM_BYTE;
|
end
|
|
end
|
|
`DATA0_DATA1_FIN:
|
`DATA0_DATA1_FIN:
|
begin
|
begin
|
next_HCTxPortWEn <= 1'b0;
|
next_HCTxPortWEn <= 1'b0;
|
NextState_sndPkt <= `FIN_SP;
|
NextState_sndPkt <= `FIN_SP;
|
end
|
end
|
`DATA0_DATA1_TERM_BYTE:
|
`DATA0_DATA1_TERM_BYTE:
|
begin
|
|
if (HCTxPortRdy == 1'b1)
|
if (HCTxPortRdy == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `DATA0_DATA1_FIN;
|
NextState_sndPkt <= `DATA0_DATA1_FIN;
|
//Last byte is not valid data,
|
//Last byte is not valid data,
|
//but the 'TX_PACKET_STOP' flag is required
|
//but the 'TX_PACKET_STOP' flag is required
|
//by the SIE state machine to detect end of data packet
|
//by the SIE state machine to detect end of data packet
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortData <= 8'h00;
|
next_HCTxPortData <= 8'h00;
|
next_HCTxPortCntl <= `TX_PACKET_STOP;
|
next_HCTxPortCntl <= `TX_PACKET_STOP;
|
end
|
end
|
end
|
|
`DATA0_DATA1_CLR_WEN:
|
`DATA0_DATA1_CLR_WEN:
|
begin
|
begin
|
next_HCTxPortWEn <= 1'b0;
|
next_HCTxPortWEn <= 1'b0;
|
NextState_sndPkt <= `DATA0_DATA1_FIFO_EMPTY;
|
NextState_sndPkt <= `DATA0_DATA1_FIFO_EMPTY;
|
end
|
end
|
Line 316... |
Line 287... |
begin
|
begin
|
next_fifoReadEn <= 1'b0;
|
next_fifoReadEn <= 1'b0;
|
NextState_sndPkt <= `DATA0_DATA1_READ_FIFO;
|
NextState_sndPkt <= `DATA0_DATA1_READ_FIFO;
|
end
|
end
|
`LS_EOP_WAIT_RDY:
|
`LS_EOP_WAIT_RDY:
|
begin
|
|
if (HCTxPortRdy == 1'b1)
|
if (HCTxPortRdy == 1'b1)
|
begin
|
begin
|
NextState_sndPkt <= `LS_EOP_FIN;
|
NextState_sndPkt <= `LS_EOP_FIN;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortWEn <= 1'b1;
|
next_HCTxPortData <= 8'h00;
|
next_HCTxPortData <= 8'h00;
|
next_HCTxPortCntl <= `TX_LS_KEEP_ALIVE;
|
next_HCTxPortCntl <= `TX_LS_KEEP_ALIVE;
|
end
|
end
|
end
|
|
`LS_EOP_FIN:
|
`LS_EOP_FIN:
|
begin
|
begin
|
next_HCTxPortWEn <= 1'b0;
|
next_HCTxPortWEn <= 1'b0;
|
NextState_sndPkt <= `FIN_SP;
|
NextState_sndPkt <= `FIN_SP;
|
end
|
end
|
endcase
|
endcase
|
end
|
end
|
|
|
|
//----------------------------------
|
// Current State Logic (sequential)
|
// Current State Logic (sequential)
|
|
//----------------------------------
|
always @ (posedge clk)
|
always @ (posedge clk)
|
begin
|
begin : sndPkt_CurrentState
|
if (rst)
|
if (rst)
|
CurrState_sndPkt <= `START_SP;
|
CurrState_sndPkt <= `START_SP;
|
else
|
else
|
CurrState_sndPkt <= NextState_sndPkt;
|
CurrState_sndPkt <= NextState_sndPkt;
|
end
|
end
|
|
|
|
//----------------------------------
|
// Registered outputs logic
|
// Registered outputs logic
|
|
//----------------------------------
|
always @ (posedge clk)
|
always @ (posedge clk)
|
begin
|
begin : sndPkt_RegOutput
|
if (rst)
|
if (rst)
|
begin
|
begin
|
sendPacketRdy <= 1'b1;
|
sendPacketRdy <= 1'b1;
|
fifoReadEn <= 1'b0;
|
HCTxPortReq <= 1'b0;
|
|
HCTxPortWEn <= 1'b0;
|
HCTxPortData <= 8'h00;
|
HCTxPortData <= 8'h00;
|
HCTxPortCntl <= 8'h00;
|
HCTxPortCntl <= 8'h00;
|
HCTxPortWEn <= 1'b0;
|
|
HCTxPortReq <= 1'b0;
|
|
frameNum <= 11'h000;
|
frameNum <= 11'h000;
|
|
fifoReadEn <= 1'b0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
sendPacketRdy <= next_sendPacketRdy;
|
sendPacketRdy <= next_sendPacketRdy;
|
fifoReadEn <= next_fifoReadEn;
|
HCTxPortReq <= next_HCTxPortReq;
|
|
HCTxPortWEn <= next_HCTxPortWEn;
|
HCTxPortData <= next_HCTxPortData;
|
HCTxPortData <= next_HCTxPortData;
|
HCTxPortCntl <= next_HCTxPortCntl;
|
HCTxPortCntl <= next_HCTxPortCntl;
|
HCTxPortWEn <= next_HCTxPortWEn;
|
|
HCTxPortReq <= next_HCTxPortReq;
|
|
frameNum <= next_frameNum;
|
frameNum <= next_frameNum;
|
|
fifoReadEn <= next_fifoReadEn;
|
end
|
end
|
end
|
end
|
|
|
endmodule
|
endmodule
|
No newline at end of file
|
No newline at end of file
|