框架开始收尾,协调流水线
This commit is contained in:
@@ -12,21 +12,11 @@ class SlaveRecParserIO extends Module{
|
||||
val stateNext = Output(UInt(4.W))
|
||||
val stateCurr = Output(UInt(4.W))
|
||||
|
||||
val frameReq = Valid( new Bundle{
|
||||
val frameLenAim = Output(UInt(12.W)) //帧长度目标
|
||||
val frameStyle = Output(UInt(2.W)) //包类型
|
||||
} )
|
||||
|
||||
val subMsgReq = Valid( new Bundle{
|
||||
val subMsg_devIndex = Output(UInt(14.W)) // 子报文中设备索引
|
||||
val subMsg_style = Output(UInt(2.W)) // 子报文类型
|
||||
val subMsg_address = Output(UInt(16.W)) //子报文地址
|
||||
val subMsg_operator = Output(UInt(4.W)) //子报文命令类型
|
||||
val subMsg_length = Output(UInt(12.W)) //子报文负载长度
|
||||
val subMsg_workCnt = Output(UInt(16.W)) //子报文工作计数
|
||||
)
|
||||
|
||||
val frameReq = Valid( new FrameHeader )
|
||||
val subMsgReq = Valid( new SubMsgHeader )
|
||||
|
||||
val resp = Input(Bool())
|
||||
val isError = Output(Bool())
|
||||
|
||||
|
||||
}
|
||||
@@ -35,8 +25,6 @@ class SlaveRecParser extends Module{
|
||||
val io: SlaveRecParserIO = IO(new SlaveRecParserIO)
|
||||
|
||||
|
||||
|
||||
|
||||
val FRAME_STYLE_COMMON = 0.U
|
||||
val FRAME_STYLE_PROBE = 1.U
|
||||
|
||||
@@ -59,18 +47,17 @@ class SlaveRecParser extends Module{
|
||||
val lengthCnt = Reg(UInt(11.W)) //动态计数器
|
||||
val frameLenCnt = Reg(UInt(12.W)) //帧长度计数
|
||||
val isCrcPass: Bool
|
||||
val isTxEnd: Bool
|
||||
val isShortRx: Bool //接收长度小于预期
|
||||
|
||||
|
||||
val frameLenAim = Reg(UInt(12.W)); io.frameLenAim := frameLenAim //帧长度目标
|
||||
val frameStyle = Reg(UInt(2.W)); io.frameStyle := frameStyle //包类型
|
||||
val subMsg_devIndex = Reg(UInt(14.W)); io.subMsg_devIndex := subMsg_devIndex // 子报文中设备索引
|
||||
val subMsg_style = Reg(UInt(2.W)); io.subMsg_style := subMsg_style // 子报文类型
|
||||
val subMsg_address = Reg(UInt(16.W)); io.subMsg_address := subMsg_address //子报文地址
|
||||
val subMsg_operator = Reg(UInt(4.W)); io.subMsg_operator := subMsg_operator //子报文命令类型
|
||||
val subMsg_length = Reg(UInt(12.W)); io.subMsg_length := subMsg_length //子报文负载长度
|
||||
val subMsg_workCnt = Reg(UInt(16.W)); io.subMsg_workCnt := subMsg_workCnt //子报文工作计数
|
||||
val devIndex = Reg(UInt(14.W)); io.subMsgReq.devIndex := devIndex // 子报文中设备索引
|
||||
val style = Reg(UInt(2.W)); io.subMsgReq.style := style // 子报文类型
|
||||
val address = Reg(UInt(16.W)); io.subMsgReq.address := address //子报文地址
|
||||
val operator = Reg(UInt(4.W)); io.subMsgReq.operator := operator //子报文命令类型
|
||||
val length = Reg(UInt(12.W)); io.subMsgReq.length := length //子报文负载长度
|
||||
val workCnt = Reg(UInt(16.W)); io.subMsgReq.workCnt := workCnt //子报文工作计数
|
||||
|
||||
|
||||
when( stateCurr === STATE_HEADER & lengthCnt === 0.U ){
|
||||
@@ -81,29 +68,29 @@ class SlaveRecParser extends Module{
|
||||
}
|
||||
|
||||
when( stateCurr === STATE_PAYLOAD_INDEX_STYLE & lengthCnt === 0.U ){
|
||||
subMsg_devIndex := io.rec.bits.tdata << 6
|
||||
devIndex := io.rec.bits.tdata << 6
|
||||
} .elsewhen( stateCurr === STATE_PAYLOAD_INDEX_STYLE & lengthCnt === 1.U ){
|
||||
subMsg_devIndex := subMsg_devIndex | io.rec.bits.tdata(7,2)
|
||||
subMsg_style := io.rec.bits.tdata(1,0)
|
||||
devIndex := devIndex | io.rec.bits.tdata(7,2)
|
||||
style := io.rec.bits.tdata(1,0)
|
||||
}
|
||||
|
||||
when( stateCurr === STATE_PAYLOAD_ADDR & lengthCnt === 0.U ){
|
||||
subMsg_address := io.rec.bits.tdata << 8
|
||||
address := io.rec.bits.tdata << 8
|
||||
} .elsewhen( stateCurr === STATE_PAYLOAD_ADDR & lengthCnt === 1.U ){
|
||||
subMsg_address := subMsg_address | io.rec.bits.tdata
|
||||
address := address | io.rec.bits.tdata
|
||||
}
|
||||
|
||||
when( stateCurr === STATE_PAYLOAD_OP_LENGTH & lengthCnt === 0.U ){
|
||||
subMsg_operator := io.rec.bits.tdata(7,4)
|
||||
subMsg_length := io.rec.bits.tdata(3,0) << 8
|
||||
operator := io.rec.bits.tdata(7,4)
|
||||
length := io.rec.bits.tdata(3,0) << 8
|
||||
} .elsewhen( stateCurr === STATE_PAYLOAD_OP_LENGTH & lengthCnt === 1.U ){
|
||||
subMsg_length := subMsg_length | io.rec.bits.tdata(7,0)
|
||||
length := length | io.rec.bits.tdata(7,0)
|
||||
}
|
||||
|
||||
when( stateCurr === STATE_PAYLOAD_WORKCNT & lengthCnt === 0.U ){
|
||||
subMsg_workCnt := io.rec.bits.tdata(7,0) << 8
|
||||
workCnt := io.rec.bits.tdata(7,0) << 8
|
||||
} .elsewhen( stateCurr === STATE_PAYLOAD_WORKCNT & lengthCnt === 1.U ){
|
||||
subMsg_workCnt := subMsg_workCnt | io.rec.bits.tdata(7,0)
|
||||
workCnt := workCnt | io.rec.bits.tdata(7,0)
|
||||
}
|
||||
|
||||
|
||||
@@ -139,8 +126,8 @@ class SlaveRecParser extends Module{
|
||||
( stateCurr === STATE_CRC ) -> Mux( isShortRx, STATE_ERROR,
|
||||
Mux( lengthCnt === (4 - 1).U, Mux( isCrcPass, STATE_IDLE, STATE_ERROR), STATE_CRC )
|
||||
),
|
||||
( stateCurr === STATE_ERROR ) -> Mux( isTxEnd, STATE_IDLE, STATE_ERROR ),
|
||||
( stateCurr === STATE_WAIT ) ->
|
||||
( stateCurr === STATE_ERROR ) -> Mux( io.resp, STATE_IDLE, STATE_ERROR ),
|
||||
( stateCurr === STATE_WAIT ) -> Mux( io.resp, STATE_IDLE, STATE_ERROR )
|
||||
))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user