📄 slavecontroller.v
字号:
NextState_slvCntrl <= `PID_ERROR;
`PID_ERROR:
NextState_slvCntrl <= `WAIT_RX1;
`CHK_RDY:
if (USBEndPControlRegCopy [`ENDPOINT_READY_BIT] == 1'b1)
begin
NextState_slvCntrl <= `FIN_SC;
next_transDone <= 1'b1;
next_clrEPRdy <= 1'b1;
next_USBEndPTransTypeReg <= tempUSBEndPTransTypeReg;
next_endPMuxErrorsWEn <= 1'b1;
end
else if (NAKSent == 1'b1)
begin
NextState_slvCntrl <= `FIN_SC;
next_USBEndPNakTransTypeReg <= tempUSBEndPTransTypeReg;
next_endPMuxErrorsWEn <= 1'b1;
end
else
NextState_slvCntrl <= `FIN_SC;
`SETUP_OUT_CHK:
if (USBEndPControlRegCopy [`ENDPOINT_READY_BIT] == 1'b0)
begin
NextState_slvCntrl <= `SETUP_OUT_SEND;
next_sendPacketWEn <= 1'b1;
next_sendPacketPID <= `NAK;
next_NAKSent <= 1'b1;
end
else if (USBEndPControlRegCopy [`ENDPOINT_SEND_STALL_BIT] == 1'b1)
begin
NextState_slvCntrl <= `SETUP_OUT_SEND;
next_sendPacketWEn <= 1'b1;
next_sendPacketPID <= `STALL;
next_stallSent <= 1'b1;
end
else
begin
NextState_slvCntrl <= `SETUP_OUT_SEND;
next_sendPacketWEn <= 1'b1;
next_sendPacketPID <= `ACK;
end
`SETUP_OUT_SEND:
begin
next_sendPacketWEn <= 1'b0;
if (sendPacketRdy == 1'b1)
NextState_slvCntrl <= `CHK_RDY;
end
`SETUP_OUT_GET_PKT:
begin
next_getPacketREn <= 1'b0;
if ((getPacketRdy == 1'b1) && (USBEndPControlRegCopy [`ENDPOINT_ISO_ENABLE_BIT] == 1'b1))
NextState_slvCntrl <= `CHK_RDY;
else if ((getPacketRdy == 1'b1) && (CRCError == 1'b0 &&
bitStuffError == 1'b0 &&
RxOverflow == 1'b0 &&
RxTimeOut == 1'b0))
NextState_slvCntrl <= `SETUP_OUT_CHK;
else if (getPacketRdy == 1'b1)
NextState_slvCntrl <= `CHK_RDY;
end
`IN_NAK_STALL:
begin
next_sendPacketWEn <= 1'b0;
if (sendPacketRdy == 1'b1)
NextState_slvCntrl <= `CHK_RDY;
end
`IN_CHK_RDY:
if (USBEndPControlRegCopy [`ENDPOINT_READY_BIT] == 1'b0)
begin
NextState_slvCntrl <= `IN_NAK_STALL;
next_sendPacketWEn <= 1'b1;
next_sendPacketPID <= `NAK;
next_NAKSent <= 1'b1;
end
else if (USBEndPControlRegCopy [`ENDPOINT_SEND_STALL_BIT] == 1'b1)
begin
NextState_slvCntrl <= `IN_NAK_STALL;
next_sendPacketWEn <= 1'b1;
next_sendPacketPID <= `STALL;
next_stallSent <= 1'b1;
end
else if (USBEndPControlRegCopy [`ENDPOINT_OUTDATA_SEQUENCE_BIT] == 1'b0)
begin
NextState_slvCntrl <= `IN_RESP_DATA;
next_sendPacketWEn <= 1'b1;
next_sendPacketPID <= `DATA0;
end
else
begin
NextState_slvCntrl <= `IN_RESP_DATA;
next_sendPacketWEn <= 1'b1;
next_sendPacketPID <= `DATA1;
end
`IN_RESP_GET_RESP:
begin
next_getPacketREn <= 1'b0;
if (getPacketRdy == 1'b1)
NextState_slvCntrl <= `CHK_RDY;
end
`IN_RESP_DATA:
begin
next_sendPacketWEn <= 1'b0;
if (sendPacketRdy == 1'b1)
NextState_slvCntrl <= `IN_RESP_CHK_ISO;
end
`IN_RESP_CHK_ISO:
if (USBEndPControlRegCopy [`ENDPOINT_ISO_ENABLE_BIT] == 1'b1)
NextState_slvCntrl <= `CHK_RDY;
else
begin
NextState_slvCntrl <= `IN_RESP_GET_RESP;
next_getPacketREn <= 1'b1;
end
`START_S1:
NextState_slvCntrl <= `WAIT_RX1;
`GET_TOKEN_WAIT_CRC:
if (RxDataWEn == 1'b1 &&
RxStatus == `RX_PACKET_STREAM)
begin
NextState_slvCntrl <= `GET_TOKEN_WAIT_STOP;
next_endpCRCTemp <= RxByte;
end
else if (RxDataWEn == 1'b1 &&
RxStatus != `RX_PACKET_STREAM)
NextState_slvCntrl <= `WAIT_RX1;
`GET_TOKEN_WAIT_ADDR:
if (RxDataWEn == 1'b1 &&
RxStatus == `RX_PACKET_STREAM)
begin
NextState_slvCntrl <= `GET_TOKEN_WAIT_CRC;
next_addrEndPTemp <= RxByte;
end
else if (RxDataWEn == 1'b1 &&
RxStatus != `RX_PACKET_STREAM)
NextState_slvCntrl <= `WAIT_RX1;
`GET_TOKEN_WAIT_STOP:
if ((RxDataWEn == 1'b1) && (RxByte[`CRC_ERROR_BIT] == 1'b0 &&
RxByte[`BIT_STUFF_ERROR_BIT] == 1'b0 &&
RxByte [`RX_OVERFLOW_BIT] == 1'b0))
NextState_slvCntrl <= `GET_TOKEN_CHK_SOF;
else if (RxDataWEn == 1'b1)
NextState_slvCntrl <= `WAIT_RX1;
`GET_TOKEN_CHK_SOF:
if (PIDByte[3:0] == `SOF)
begin
NextState_slvCntrl <= `WAIT_RX1;
next_frameNum <= {endpCRCTemp[2:0],addrEndPTemp};
next_SOFRxed <= 1'b1;
end
else
begin
NextState_slvCntrl <= `GET_TOKEN_DELAY;
next_USBAddress <= addrEndPTemp[6:0];
next_USBEndP <= { endpCRCTemp[2:0], addrEndPTemp[7]};
end
`GET_TOKEN_DELAY: // Insert delay to allow USBEndP etc to update
NextState_slvCntrl <= `GET_TOKEN_CHK_ADDR;
`GET_TOKEN_CHK_ADDR:
if (USBEndP < `NUM_OF_ENDPOINTS &&
USBAddress == USBTgtAddress &&
SCGlobalEn == 1'b1 &&
USBEndPControlReg[`ENDPOINT_ENABLE_BIT] == 1'b1)
begin
NextState_slvCntrl <= `CHK_PID;
next_USBEndPControlRegCopy <= USBEndPControlReg;
next_endPointReadyToGetPkt <= USBEndPControlReg [`ENDPOINT_READY_BIT];
end
else
NextState_slvCntrl <= `WAIT_RX1;
endcase
end
//----------------------------------
// Current State Logic (sequential)
//----------------------------------
always @ (posedge clk)
begin : slvCntrl_CurrentState
if (rst)
CurrState_slvCntrl <= `START_S1;
else
CurrState_slvCntrl <= NextState_slvCntrl;
end
//----------------------------------
// Registered outputs logic
//----------------------------------
always @ (posedge clk)
begin : slvCntrl_RegOutput
if (rst)
begin
tempUSBEndPTransTypeReg <= 2'b00;
addrEndPTemp <= 8'h00;
endpCRCTemp <= 8'h00;
USBAddress <= 7'b0000000;
PIDByte <= 8'h00;
USBEndPControlRegCopy <= 5'b00000;
transDone <= 1'b0;
getPacketREn <= 1'b0;
sendPacketPID <= 4'b0;
sendPacketWEn <= 1'b0;
clrEPRdy <= 1'b0;
USBEndPTransTypeReg <= 2'b00;
USBEndPNakTransTypeReg <= 2'b00;
NAKSent <= 1'b0;
stallSent <= 1'b0;
SOFRxed <= 1'b0;
endPMuxErrorsWEn <= 1'b0;
frameNum <= 11'b00000000000;
USBEndP <= 4'h0;
endPointReadyToGetPkt <= 1'b0;
end
else
begin
tempUSBEndPTransTypeReg <= next_tempUSBEndPTransTypeReg;
addrEndPTemp <= next_addrEndPTemp;
endpCRCTemp <= next_endpCRCTemp;
USBAddress <= next_USBAddress;
PIDByte <= next_PIDByte;
USBEndPControlRegCopy <= next_USBEndPControlRegCopy;
transDone <= next_transDone;
getPacketREn <= next_getPacketREn;
sendPacketPID <= next_sendPacketPID;
sendPacketWEn <= next_sendPacketWEn;
clrEPRdy <= next_clrEPRdy;
USBEndPTransTypeReg <= next_USBEndPTransTypeReg;
USBEndPNakTransTypeReg <= next_USBEndPNakTransTypeReg;
NAKSent <= next_NAKSent;
stallSent <= next_stallSent;
SOFRxed <= next_SOFRxed;
endPMuxErrorsWEn <= next_endPMuxErrorsWEn;
frameNum <= next_frameNum;
USBEndP <= next_USBEndP;
endPointReadyToGetPkt <= next_endPointReadyToGetPkt;
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -