2025-04-07 17:39:44 +08:00
|
|
|
package BACK
|
|
|
|
|
|
|
|
|
|
import chisel3._
|
|
|
|
|
import chisel3.util._
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SubMsgTxInfo extends SubMsgHeader{
|
|
|
|
|
val source = UInt(2.W)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SlaveSendGenIO extends Bundle{
|
2025-04-11 17:57:47 +08:00
|
|
|
val data = Vec(2, Flipped( Decoupled(UInt(8.W)) ) )
|
2025-04-07 17:39:44 +08:00
|
|
|
|
2025-04-09 17:29:57 +08:00
|
|
|
|
2025-04-07 17:39:44 +08:00
|
|
|
|
2025-04-08 17:29:45 +08:00
|
|
|
val frameReq = Flipped(Decoupled( new FrameHeader ))
|
2025-06-24 10:23:46 +08:00
|
|
|
val subMsgHeadReq = Flipped(Decoupled( new SubMsgTxInfo ))
|
|
|
|
|
val subMsgTailReq = Flipped(Decoupled( new SubMsgTail ))
|
2025-04-07 17:39:44 +08:00
|
|
|
|
|
|
|
|
val send = Decoupled(new AXIS_Bundle(8))
|
|
|
|
|
|
2025-04-09 17:29:57 +08:00
|
|
|
val isError = Output(Bool())
|
2025-05-20 11:35:11 +08:00
|
|
|
val stateCurr = Output(UInt(3.W))
|
2025-04-07 17:39:44 +08:00
|
|
|
}
|
|
|
|
|
|
2025-04-11 17:57:47 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-07 17:39:44 +08:00
|
|
|
class SlaveSendGen extends Module{
|
|
|
|
|
val io: SlaveSendGenIO = IO(new SlaveSendGenIO)
|
|
|
|
|
|
|
|
|
|
|
2025-04-09 17:29:57 +08:00
|
|
|
val crc = Module(new crc32_8)
|
|
|
|
|
|
2025-04-29 17:48:57 +08:00
|
|
|
val FRAME_STYLE_COMMON = 0.U
|
|
|
|
|
val FRAME_STYLE_PROBE = 1.U
|
2025-04-11 17:57:47 +08:00
|
|
|
|
|
|
|
|
val STATE_IDLE = 0.U //空闲
|
|
|
|
|
val STATE_FRAME_HEADER = 1.U //长度/ /保留2bits //包类型
|
|
|
|
|
val STATE_SUBMSG_HEADER = 2.U
|
|
|
|
|
val STATE_SUBMSG_DATA = 3.U
|
2025-06-24 10:23:46 +08:00
|
|
|
val STATE_SUBMSG_TAIL = 4.U
|
|
|
|
|
val STATE_CRC = 5.U //CRC校验
|
2025-05-20 11:35:11 +08:00
|
|
|
val STATE_WAIT = 6.U
|
2025-04-11 17:57:47 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
val stateNext = Wire(UInt(3.W))
|
2025-05-20 11:35:11 +08:00
|
|
|
val stateCurr = RegNext(stateNext, STATE_IDLE); io.stateCurr := stateCurr
|
2025-04-11 17:57:47 +08:00
|
|
|
|
2025-05-26 11:52:40 +08:00
|
|
|
io.isError := false.B//stateCurr === STATE_ERROR
|
2025-04-11 17:57:47 +08:00
|
|
|
|
2025-05-07 18:12:01 +08:00
|
|
|
crc.io.isEnable := io.send.fire & (
|
2025-04-09 17:29:57 +08:00
|
|
|
stateCurr === STATE_FRAME_HEADER |
|
|
|
|
|
stateCurr === STATE_SUBMSG_HEADER |
|
2025-05-07 18:12:01 +08:00
|
|
|
stateCurr === STATE_SUBMSG_DATA
|
|
|
|
|
)
|
|
|
|
|
|
2025-04-09 17:29:57 +08:00
|
|
|
|
2025-04-11 17:57:47 +08:00
|
|
|
|
2025-04-09 17:29:57 +08:00
|
|
|
|
|
|
|
|
crc.reset := reset.asBool | stateCurr === STATE_IDLE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-07 17:39:44 +08:00
|
|
|
val frameInfo = Reg(new FrameHeader)
|
|
|
|
|
|
2025-06-24 10:23:46 +08:00
|
|
|
val subMsgHeadInfo = Reg(new SubMsgTxInfo)
|
|
|
|
|
val subMsgTailInfo = Reg(new SubMsgTail)
|
|
|
|
|
|
2025-04-09 17:29:57 +08:00
|
|
|
|
2025-04-07 17:39:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
when( io.frameReq.fire ){
|
|
|
|
|
frameInfo := io.frameReq.bits
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-24 10:23:46 +08:00
|
|
|
when( io.subMsgHeadReq.fire ){
|
|
|
|
|
subMsgHeadInfo := io.subMsgHeadReq.bits
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
when( io.subMsgTailReq.fire ){
|
|
|
|
|
subMsgTailInfo := io.subMsgTailReq.bits
|
2025-04-07 17:39:44 +08:00
|
|
|
}
|
|
|
|
|
|
2025-04-14 16:43:10 +08:00
|
|
|
|
2025-04-11 17:57:47 +08:00
|
|
|
|
2025-04-09 17:29:57 +08:00
|
|
|
val lengthCnt = Reg(UInt(12.W))
|
|
|
|
|
val frameLenCnt = Reg(UInt(12.W))
|
2025-04-07 17:39:44 +08:00
|
|
|
|
2025-05-07 18:12:01 +08:00
|
|
|
when( io.send.fire ){
|
|
|
|
|
when( stateCurr === STATE_FRAME_HEADER ){
|
|
|
|
|
frameLenCnt := 0.U
|
2025-06-24 10:23:46 +08:00
|
|
|
} .elsewhen( stateCurr === STATE_SUBMSG_HEADER || stateCurr === STATE_SUBMSG_DATA || stateCurr === STATE_SUBMSG_TAIL ){
|
2025-05-07 18:12:01 +08:00
|
|
|
frameLenCnt := frameLenCnt + 1.U
|
|
|
|
|
}
|
2025-04-09 17:29:57 +08:00
|
|
|
}
|
|
|
|
|
|
2025-05-07 18:12:01 +08:00
|
|
|
|
|
|
|
|
when( stateCurr =/= stateNext ){
|
2025-04-09 17:29:57 +08:00
|
|
|
lengthCnt := 0.U
|
2025-05-07 18:12:01 +08:00
|
|
|
} .elsewhen(io.send.fire){
|
2025-04-09 17:29:57 +08:00
|
|
|
lengthCnt := lengthCnt + 1.U
|
|
|
|
|
}
|
2025-04-07 17:39:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-14 16:43:10 +08:00
|
|
|
io.frameReq.ready := true.B
|
2025-06-24 10:23:46 +08:00
|
|
|
io.subMsgHeadReq.ready := stateCurr =/= STATE_SUBMSG_HEADER & stateNext === STATE_SUBMSG_HEADER
|
|
|
|
|
io.subMsgTailReq.ready := stateCurr =/= STATE_SUBMSG_TAIL & stateNext === STATE_SUBMSG_TAIL
|
2025-04-07 17:39:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
stateNext := Mux1H(Seq(
|
|
|
|
|
(stateCurr === STATE_IDLE) -> Mux( io.frameReq.fire, STATE_FRAME_HEADER, STATE_IDLE ),
|
2025-05-07 18:12:01 +08:00
|
|
|
(stateCurr === STATE_FRAME_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, Mux(
|
2025-04-29 17:48:57 +08:00
|
|
|
frameInfo.frameStyle === FRAME_STYLE_COMMON,
|
2025-06-24 10:23:46 +08:00
|
|
|
Mux(io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT),
|
2025-04-29 17:48:57 +08:00
|
|
|
STATE_CRC ),
|
2025-05-07 18:12:01 +08:00
|
|
|
STATE_FRAME_HEADER), STATE_FRAME_HEADER ),
|
2025-06-24 10:23:46 +08:00
|
|
|
(stateCurr === STATE_SUBMSG_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (6-1).U, STATE_SUBMSG_DATA, STATE_SUBMSG_HEADER), STATE_SUBMSG_HEADER),
|
|
|
|
|
|
2025-05-07 18:12:01 +08:00
|
|
|
(stateCurr === STATE_SUBMSG_DATA) -> Mux( io.send.fire,
|
2025-06-24 10:23:46 +08:00
|
|
|
Mux( lengthCnt === subMsgHeadInfo.length-1.U, STATE_SUBMSG_TAIL, STATE_SUBMSG_DATA ), //已经发送完成该子报文
|
|
|
|
|
STATE_SUBMSG_DATA ),
|
|
|
|
|
|
|
|
|
|
(stateCurr === STATE_SUBMSG_TAIL) -> Mux( io.send.fire,
|
|
|
|
|
Mux( lengthCnt === (2-1).U, //已经发送完成该子报文尾
|
2025-04-14 16:43:10 +08:00
|
|
|
Mux( frameLenCnt === frameInfo.frameLenAim -1.U, STATE_CRC, //主报文长度达到, 进CRC
|
2025-06-24 10:23:46 +08:00
|
|
|
Mux( io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT ) ), //主报文长度未到,进下一个子报文
|
|
|
|
|
STATE_SUBMSG_TAIL
|
|
|
|
|
), STATE_SUBMSG_TAIL ),
|
|
|
|
|
|
2025-05-07 18:12:01 +08:00
|
|
|
(stateCurr === STATE_CRC) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, STATE_IDLE, STATE_CRC ), STATE_CRC),
|
2025-05-26 11:52:40 +08:00
|
|
|
// (stateCurr === STATE_ERROR) -> Mux( io.send.fire, STATE_IDLE, STATE_ERROR),
|
2025-06-24 10:23:46 +08:00
|
|
|
(stateCurr === STATE_WAIT) -> Mux( io.subMsgHeadReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT),
|
2025-04-07 17:39:44 +08:00
|
|
|
))
|
|
|
|
|
|
2025-06-24 10:23:46 +08:00
|
|
|
io.data(0).ready := io.send.fire & (stateCurr === STATE_SUBMSG_DATA) & (subMsgHeadInfo.source === 0.U)
|
|
|
|
|
io.data(1).ready := io.send.fire & (stateCurr === STATE_SUBMSG_DATA) & (subMsgHeadInfo.source === 1.U)
|
2025-05-07 18:12:01 +08:00
|
|
|
|
|
|
|
|
assert( ~(io.data(0).ready & ~io.data(0).valid) )
|
|
|
|
|
assert( ~(io.data(1).ready & ~io.data(1).valid) )
|
2025-04-09 17:29:57 +08:00
|
|
|
|
|
|
|
|
|
2025-04-07 17:39:44 +08:00
|
|
|
|
|
|
|
|
io.send.valid :=
|
2025-04-09 17:29:57 +08:00
|
|
|
(stateCurr === STATE_FRAME_HEADER) |
|
2025-04-07 17:39:44 +08:00
|
|
|
(stateCurr === STATE_SUBMSG_HEADER) |
|
2025-06-24 10:23:46 +08:00
|
|
|
(stateCurr === STATE_SUBMSG_DATA & ( (io.data(0).valid & subMsgHeadInfo.source === 0.U) | (io.data(1).valid & subMsgHeadInfo.source === 1.U) )) |
|
|
|
|
|
(stateCurr === STATE_SUBMSG_TAIL) |
|
2025-04-07 17:39:44 +08:00
|
|
|
(stateCurr === STATE_CRC)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val tdata_frame_header = Mux1H(Seq(
|
2025-04-11 17:57:47 +08:00
|
|
|
(lengthCnt === 0.U) -> frameInfo.frameLenAim(11,4),
|
|
|
|
|
(lengthCnt === 1.U) -> Cat( frameInfo.frameLenAim(3,0), 0.U(2.W), frameInfo.frameStyle),
|
2025-04-28 18:01:16 +08:00
|
|
|
(lengthCnt === 2.U) -> frameInfo.frameInfo(15,8),
|
|
|
|
|
(lengthCnt === 3.U) -> frameInfo.frameInfo( 7,0),
|
2025-04-07 17:39:44 +08:00
|
|
|
))
|
|
|
|
|
|
|
|
|
|
val tdata_submsg_header = Mux1H(Seq(
|
2025-06-24 10:23:46 +08:00
|
|
|
(lengthCnt === 0.U) -> subMsgHeadInfo.devIndex(13,6),
|
|
|
|
|
(lengthCnt === 1.U) -> Cat( subMsgHeadInfo.devIndex(5,0), subMsgHeadInfo.style),
|
|
|
|
|
(lengthCnt === 2.U) -> subMsgHeadInfo.address(15,8),
|
|
|
|
|
(lengthCnt === 3.U) -> subMsgHeadInfo.address(7,0),
|
|
|
|
|
(lengthCnt === 4.U) -> Cat(subMsgHeadInfo.operator, subMsgHeadInfo.length(11,8)),
|
|
|
|
|
(lengthCnt === 5.U) -> subMsgHeadInfo.length(7,0),
|
2025-04-07 17:39:44 +08:00
|
|
|
))
|
|
|
|
|
|
|
|
|
|
val tdata_submsg_data = Mux1H(Seq(
|
2025-06-24 10:23:46 +08:00
|
|
|
(subMsgHeadInfo.source === 0.U) -> io.data(0).bits,
|
|
|
|
|
(subMsgHeadInfo.source === 1.U) -> io.data(1).bits,
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
val tdata_submsg_tail = Mux1H(Seq(
|
|
|
|
|
(lengthCnt === 0.U) -> subMsgTailInfo.workCnt(15,8),
|
|
|
|
|
(lengthCnt === 1.U) -> subMsgTailInfo.workCnt( 7,0),
|
2025-04-07 17:39:44 +08:00
|
|
|
))
|
|
|
|
|
|
2025-04-14 16:43:10 +08:00
|
|
|
crc.io.dataIn := Mux1H(Seq(
|
|
|
|
|
(stateCurr === STATE_FRAME_HEADER) -> tdata_frame_header,
|
|
|
|
|
(stateCurr === STATE_SUBMSG_HEADER) -> tdata_submsg_header,
|
|
|
|
|
(stateCurr === STATE_SUBMSG_DATA) -> tdata_submsg_data,
|
2025-06-24 10:23:46 +08:00
|
|
|
(stateCurr === STATE_SUBMSG_TAIL) -> tdata_submsg_tail,
|
2025-04-14 16:43:10 +08:00
|
|
|
))
|
2025-04-07 17:39:44 +08:00
|
|
|
|
2025-04-09 17:29:57 +08:00
|
|
|
|
|
|
|
|
val tdata_crc = Mux1H(Seq(
|
|
|
|
|
(lengthCnt === 0.U) -> crc.io.crc(31,24),
|
|
|
|
|
(lengthCnt === 1.U) -> crc.io.crc(23,16),
|
|
|
|
|
(lengthCnt === 2.U) -> crc.io.crc(15, 8),
|
|
|
|
|
(lengthCnt === 3.U) -> crc.io.crc( 7, 0),
|
2025-04-07 17:39:44 +08:00
|
|
|
))
|
|
|
|
|
|
|
|
|
|
io.send.bits.tdata := Mux1H(Seq(
|
|
|
|
|
(stateCurr === STATE_FRAME_HEADER) -> tdata_frame_header,
|
|
|
|
|
(stateCurr === STATE_SUBMSG_HEADER) -> tdata_submsg_header,
|
|
|
|
|
(stateCurr === STATE_SUBMSG_DATA) -> tdata_submsg_data,
|
2025-06-24 10:23:46 +08:00
|
|
|
(stateCurr === STATE_SUBMSG_TAIL) -> tdata_submsg_tail,
|
2025-04-07 17:39:44 +08:00
|
|
|
(stateCurr === STATE_CRC) -> tdata_crc,
|
|
|
|
|
))
|
|
|
|
|
|
2025-05-26 11:52:40 +08:00
|
|
|
io.send.bits.tuser := false.B//(stateCurr === STATE_ERROR & stateNext === STATE_IDLE)
|
|
|
|
|
io.send.bits.tlast := (stateCurr === STATE_CRC & stateNext === STATE_IDLE) //|| (stateCurr === STATE_ERROR & stateNext === STATE_IDLE)
|
2025-04-07 17:39:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|