2025-05-08 17:43:10 +08:00
|
|
|
package BACK
|
2025-04-02 16:40:25 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
import chisel3._
|
|
|
|
|
import chisel3.util._
|
2025-04-02 16:40:25 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
class CommonRegisterBundle extends Bundle{
|
2025-05-09 16:11:18 +08:00
|
|
|
val mstOrSlv = UInt(2.W)
|
2025-05-15 14:57:58 +08:00
|
|
|
def modeSel:Bool = mstOrSlv === "h1".U
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
val hwVersion = UInt(8.W)
|
|
|
|
|
val hwSerial = UInt(48.W)
|
2025-05-16 20:17:02 +08:00
|
|
|
val busRate = UInt(8.W)
|
2025-04-02 16:40:25 +08:00
|
|
|
|
2025-05-16 20:17:02 +08:00
|
|
|
val spiSel = UInt(2.W)
|
2025-04-02 16:40:25 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
val encryptKey = UInt(128.W)
|
2025-05-22 16:53:42 +08:00
|
|
|
val isEncrypt = Bool()
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
// val upRecErrorCnt = UInt(32.W)
|
|
|
|
|
// val downRecErrorCnt = UInt(32.W)
|
|
|
|
|
// val upForwardErrorCnt = UInt(32.W)
|
|
|
|
|
// val downForwardErrorCnt = UInt(32.W)
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
// val qspiErrorCnt = UInt(32.W)
|
|
|
|
|
// val forwardCnt = UInt(32.W)
|
|
|
|
|
// val recByteCnt = UInt(32.W)
|
|
|
|
|
// val forwardByteCnt = UInt(32.W)
|
2025-04-23 17:57:38 +08:00
|
|
|
|
|
|
|
|
|
2025-05-16 18:56:49 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
// val wdtStatus = UInt(16.W)
|
|
|
|
|
// val wdtOverflow = UInt(8.W)
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
val timeStamp = UInt(64.W)
|
2025-05-15 14:57:58 +08:00
|
|
|
val mstDeltaTime = UInt(32.W)
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
val syncPoint = UInt(64.W)
|
|
|
|
|
val syncPeroid = UInt(32.W)
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-20 11:44:22 +08:00
|
|
|
val custom = Vec( 128, UInt(8.W) )
|
|
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-20 11:32:03 +08:00
|
|
|
// val smEnqAddr = Vec(8, UInt(11.W)) //触发SM切换缓冲区的地址 (或读或写)
|
|
|
|
|
// val smDeqAddr = Vec(8, UInt(11.W)) //触发SM切换缓冲区的地址 (或读或写)
|
|
|
|
|
val smTrigLen = Vec(8, UInt(11.W)) //触发SM切换缓冲区的地址 (或读或写)
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
class MasterRegisterBundle extends Bundle{
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
val txSM = UInt(2.W)
|
2025-05-09 17:44:54 +08:00
|
|
|
val rxSM = UInt(2.W)
|
2025-05-20 11:32:03 +08:00
|
|
|
// val txLength = UInt(12.W)
|
2025-05-09 17:44:54 +08:00
|
|
|
// val txStatus = UInt(16.W)
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-15 14:57:58 +08:00
|
|
|
val rplTimeStampTx = UInt(16.W)
|
|
|
|
|
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
// val intEnable = UInt(8.W)
|
|
|
|
|
// val intMask = UInt(8.W)
|
|
|
|
|
// val intStatus = UInt(8.W)
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-24 16:18:33 +08:00
|
|
|
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
class SlaveRegisterBundle extends Bundle{
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
// val RAMSize = UInt(8.W)
|
|
|
|
|
// val MMUNum = UInt(8.W)
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
// val nodeSeqAddr = UInt(16.W)
|
|
|
|
|
// val nodeSetAddr = UInt(16.W)
|
2025-04-24 16:18:33 +08:00
|
|
|
|
|
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
// val ebmmu = Vec(8, new Bundle{
|
|
|
|
|
// val logicAddr = UInt(32.W)
|
|
|
|
|
// val length = UInt(16.W)
|
|
|
|
|
// val phyAddr = UInt(32.W)
|
|
|
|
|
// val op = UInt(2.W)
|
|
|
|
|
// val enable = Bool()
|
|
|
|
|
// })
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
// val intStatus = UInt(16.W)
|
|
|
|
|
// val mb = Vec(8, new Bundle{
|
|
|
|
|
// val ctrl = UInt(8.W)
|
|
|
|
|
// val status = UInt(8.W)
|
|
|
|
|
// })
|
2025-04-24 16:18:33 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
|
|
|
|
|
|
2025-05-16 20:17:02 +08:00
|
|
|
val localDevIndex = UInt(16.W)
|
|
|
|
|
|
2025-05-16 18:56:49 +08:00
|
|
|
//链路寄存器组
|
2025-05-21 16:04:39 +08:00
|
|
|
|
2025-05-21 16:50:20 +08:00
|
|
|
// val isDevOnLeftModify = Bool()
|
|
|
|
|
// val indexOfLeftDev = UInt(14.W)
|
2025-05-16 18:56:49 +08:00
|
|
|
val isDevOnRight = UInt(2.W)
|
|
|
|
|
val isDevOnRightModify = Bool()
|
|
|
|
|
val indexOfRightDev = UInt(14.W)
|
2025-05-15 18:40:01 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
val slvDeltaTime = UInt(32.W) //从站时间戳差值
|
|
|
|
|
val deltaFinal = UInt(32.W) //当前时间戳与主站时间差
|
|
|
|
|
val recoTimeStamp = UInt(64.W) //时钟补偿寄存器
|
|
|
|
|
|
|
|
|
|
val syncCfg = UInt(8.W)
|
|
|
|
|
val syncWidth = Vec(4, UInt(16.W) )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val syncOffset = Vec(4, UInt(32.W))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-24 16:18:33 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
class InterfaceIO extends Bundle{
|
2025-05-13 18:03:22 +08:00
|
|
|
val ospi = new SSPIInterfaceIO
|
|
|
|
|
val oqspi = new QSPIInterfaceIO
|
2025-05-16 16:05:38 +08:00
|
|
|
val iqspi = new QSPIInterfaceIO
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-05-16 16:05:38 +08:00
|
|
|
val lvds = Flipped(new RegAccessInterfaceIO)
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-15 14:57:58 +08:00
|
|
|
// val modeSel = Output(Bool())
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
val txReq = Valid(new Bundle{
|
|
|
|
|
val txSM = UInt(2.W)
|
|
|
|
|
val rxSM = UInt(2.W)
|
2025-05-20 11:32:03 +08:00
|
|
|
// val txLength = UInt(12.W)
|
2025-05-09 16:11:18 +08:00
|
|
|
}) //发送请求和SM代号
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val dSMdeq = Output( Vec(4, Bool()) )
|
|
|
|
|
val uSMenq = Output( Vec(4, Bool()) )
|
|
|
|
|
|
|
|
|
|
val sram_w = Flipped(Vec( 4, new SRAM2kWRIO)) //QSPI
|
|
|
|
|
val sram_r = Flipped(Vec( 4, new SRAM2kRDIO)) //QSPI
|
|
|
|
|
|
2025-05-15 14:57:58 +08:00
|
|
|
val cReg = Output(new CommonRegisterBundle)
|
|
|
|
|
val mReg = Output(new MasterRegisterBundle)
|
2025-05-15 18:40:01 +08:00
|
|
|
val sReg = Output(new SlaveRegisterBundle)
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-16 20:17:02 +08:00
|
|
|
val localDevIndex = Input(UInt(16.W))
|
|
|
|
|
|
2025-05-16 18:56:49 +08:00
|
|
|
// val isDevOnLeft = Input(UInt(2.W))
|
2025-05-21 16:50:20 +08:00
|
|
|
// val isDevOnLeftModify = Input(Bool())
|
|
|
|
|
// val indexOfLeftDev = Input(UInt(14.W))
|
2025-05-16 18:56:49 +08:00
|
|
|
|
|
|
|
|
val isDevOnRight = Input(UInt(2.W))
|
|
|
|
|
val isDevOnRightModify = Input(Bool())
|
|
|
|
|
val indexOfRightDev = Input(UInt(14.W))
|
|
|
|
|
|
|
|
|
|
|
2025-05-15 14:57:58 +08:00
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
val slvDeltaTime = Input(UInt(32.W)) //从站时间戳差值
|
|
|
|
|
val mstDeltaTime = Input(UInt(32.W))
|
|
|
|
|
val deltaFinal = Input(UInt(32.W))
|
|
|
|
|
|
|
|
|
|
val sync = Output(Vec(4, Bool()))
|
2025-05-21 16:04:39 +08:00
|
|
|
|
2025-05-22 16:53:42 +08:00
|
|
|
val initEncryptor = Valid(UInt(128.W))
|
|
|
|
|
|
2025-05-21 16:04:39 +08:00
|
|
|
val isSoftReset = Output(Bool())
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
abstract class InterfaceBase extends Module{
|
|
|
|
|
val io: InterfaceIO = IO(new InterfaceIO)
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-05-13 18:03:22 +08:00
|
|
|
val oSpi = Module(new SSpiInterface)
|
|
|
|
|
val oQSpi = Module(new QSpiInterface)
|
|
|
|
|
val iQSpi = Module(new QSpiInterface)
|
|
|
|
|
|
|
|
|
|
io.ospi <> oSpi.spi
|
|
|
|
|
io.oqspi <> oQSpi.qspi
|
|
|
|
|
io.iqspi <> iQSpi.qspi
|
2025-04-02 16:40:25 +08:00
|
|
|
|
2025-05-15 14:57:58 +08:00
|
|
|
val cReg = Wire(new CommonRegisterBundle); io.cReg := cReg
|
|
|
|
|
val mReg = Wire(new MasterRegisterBundle); io.mReg := mReg
|
2025-05-16 16:05:38 +08:00
|
|
|
val sReg = Wire(new SlaveRegisterBundle); io.sReg := sReg
|
2025-05-15 18:40:01 +08:00
|
|
|
|
|
|
|
|
val syncCfg = RegInit(0.U(8.W)); sReg.syncCfg := syncCfg
|
|
|
|
|
|
|
|
|
|
val syncWidth = for( i <- 0 until 4 ) yield { RegInit(0.U(16.W)) }
|
|
|
|
|
for( i <- 0 until 4 ) {
|
|
|
|
|
sReg.syncWidth(i) := syncWidth(i)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val syncPoint = RegInit(0.U(64.W)); cReg.syncPoint := syncPoint
|
|
|
|
|
val syncPeroid = RegInit(0.U(32.W)); cReg.syncPeroid := syncPeroid
|
|
|
|
|
|
|
|
|
|
val syncOffset = for( i <- 0 until 4 ) yield { RegInit(0.U(32.W)) } //空开0
|
|
|
|
|
for( i <- 0 until 4 ) {
|
|
|
|
|
sReg.syncOffset(i) := syncOffset(i)
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-02 16:40:25 +08:00
|
|
|
|
2025-05-15 14:57:58 +08:00
|
|
|
|
|
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
val isSysInit = cReg.mstOrSlv =/= 0.U
|
2025-05-09 17:44:54 +08:00
|
|
|
val isMstMode = cReg.mstOrSlv === "h1".U
|
|
|
|
|
val isSlvMode = cReg.mstOrSlv === "h2".U
|
2025-04-02 16:40:25 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
def AcquireReg(addr: UInt): UInt = {
|
|
|
|
|
Mux1H(
|
|
|
|
|
Seq(
|
|
|
|
|
(addr === "h0".U) -> cReg.mstOrSlv,
|
|
|
|
|
(addr === "h1".U) -> cReg.hwVersion,
|
|
|
|
|
) ++
|
|
|
|
|
|
|
|
|
|
((0 until 6).map{ i =>
|
2025-05-09 17:44:54 +08:00
|
|
|
(addr === ("h2".U + i.U) ) -> cReg.hwSerial( 8*i+7,8*i+0 )
|
2025-05-09 16:11:18 +08:00
|
|
|
}) ++
|
|
|
|
|
|
|
|
|
|
Seq(
|
2025-05-16 20:17:02 +08:00
|
|
|
(addr === "h8".U ) -> cReg.busRate( 7,0 ),
|
|
|
|
|
(addr === "h9".U ) -> cReg.spiSel,
|
2025-05-19 14:13:47 +08:00
|
|
|
(addr === "ha".U & isSlvMode) -> sReg.localDevIndex(7,0),
|
|
|
|
|
(addr === "hb".U & isSlvMode) -> sReg.localDevIndex(15,8),
|
2025-05-16 20:17:02 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
|
|
|
|
|
(addr === "h20".U & isMstMode) -> Cat(mReg.rxSM, mReg.txSM, 0.U(1.W) ),
|
2025-05-20 11:32:03 +08:00
|
|
|
//(addr === "h21".U & isMstMode) -> mReg.txLength,
|
2025-05-09 17:44:54 +08:00
|
|
|
|
2025-05-16 20:17:49 +08:00
|
|
|
(addr === "h24".U & isMstMode) -> mReg.rplTimeStampTx(7,0),
|
|
|
|
|
(addr === "h25".U & isMstMode) -> mReg.rplTimeStampTx(15,8),
|
2025-05-15 14:57:58 +08:00
|
|
|
|
2025-05-16 20:17:02 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
) ++
|
|
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
|
|
|
|
|
|
2025-05-22 16:53:42 +08:00
|
|
|
|
|
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
((0 until 16).map{ i =>
|
2025-05-16 20:17:02 +08:00
|
|
|
(addr === ("h50".U + i.U) ) -> cReg.encryptKey( 8*i+7,8*i+0 )
|
2025-05-09 16:11:18 +08:00
|
|
|
}) ++
|
|
|
|
|
|
2025-05-16 18:56:49 +08:00
|
|
|
Seq(
|
2025-05-22 16:53:42 +08:00
|
|
|
(addr === "h60".U ) -> cReg.isEncrypt,
|
2025-05-21 16:50:20 +08:00
|
|
|
(addr === "hc0".U ) -> Cat( sReg.isDevOnRightModify, sReg.isDevOnRight, 0.U(3.W) ),
|
2025-05-16 18:56:49 +08:00
|
|
|
(addr === "hc2".U ) -> sReg.indexOfRightDev(7,0),
|
|
|
|
|
(addr === "hc3".U ) -> sReg.indexOfRightDev(13,8),
|
2025-05-21 16:50:20 +08:00
|
|
|
// (addr === "hc4".U ) -> sReg.indexOfLeftDev(7,0),
|
|
|
|
|
// (addr === "hc5".U ) -> sReg.indexOfLeftDev(13,8),
|
2025-05-16 18:56:49 +08:00
|
|
|
) ++
|
|
|
|
|
|
2025-05-15 14:57:58 +08:00
|
|
|
Seq(
|
2025-05-15 18:40:01 +08:00
|
|
|
//本地时钟
|
|
|
|
|
(addr === "h100".U ) -> cReg.timeStamp(7,0),
|
|
|
|
|
(addr === "h101".U ) -> cReg.timeStamp(15,8),
|
|
|
|
|
(addr === "h102".U ) -> cReg.timeStamp(23,16),
|
|
|
|
|
(addr === "h103".U ) -> cReg.timeStamp(31,24),
|
|
|
|
|
(addr === "h104".U ) -> cReg.timeStamp(39,32),
|
|
|
|
|
(addr === "h105".U ) -> cReg.timeStamp(47,40),
|
|
|
|
|
(addr === "h106".U ) -> cReg.timeStamp(55,48),
|
|
|
|
|
(addr === "h107".U ) -> cReg.timeStamp(63,56),
|
|
|
|
|
|
|
|
|
|
//参考主站时钟
|
|
|
|
|
(addr === "h108".U & isSlvMode) -> sReg.deltaFinal(7,0),
|
|
|
|
|
(addr === "h109".U & isSlvMode) -> sReg.deltaFinal(15,8),
|
|
|
|
|
(addr === "h10a".U & isSlvMode) -> sReg.deltaFinal(23,16),
|
|
|
|
|
(addr === "h10b".U & isSlvMode) -> sReg.deltaFinal(31,24),
|
|
|
|
|
// (addr === "h10c".U & isSlvMode) -> sReg.deltaFinal(39,32),
|
|
|
|
|
// (addr === "h10d".U & isSlvMode) -> sReg.deltaFinal(47,40),
|
|
|
|
|
// (addr === "h10e".U & isSlvMode) -> sReg.deltaFinal(55,48),
|
|
|
|
|
// (addr === "h10f".U & isSlvMode) -> sReg.deltaFinal(63,56),
|
|
|
|
|
|
|
|
|
|
//主站发送接收时间差
|
|
|
|
|
(addr === "h110".U ) -> cReg.mstDeltaTime(7,0),
|
|
|
|
|
(addr === "h111".U ) -> cReg.mstDeltaTime(15,8),
|
|
|
|
|
(addr === "h112".U ) -> cReg.mstDeltaTime(23,16),
|
|
|
|
|
(addr === "h113".U ) -> cReg.mstDeltaTime(31,24),
|
|
|
|
|
|
|
|
|
|
//从站发送接收时间差
|
|
|
|
|
(addr === "h114".U & isSlvMode) -> sReg.slvDeltaTime(7,0),
|
|
|
|
|
(addr === "h115".U & isSlvMode) -> sReg.slvDeltaTime(15,8),
|
|
|
|
|
(addr === "h116".U & isSlvMode) -> sReg.slvDeltaTime(23,16),
|
|
|
|
|
(addr === "h117".U & isSlvMode) -> sReg.slvDeltaTime(31,24),
|
|
|
|
|
|
|
|
|
|
//校准后的时钟
|
|
|
|
|
(addr === "h118".U & isSlvMode) -> sReg.recoTimeStamp(7,0),
|
|
|
|
|
(addr === "h119".U & isSlvMode) -> sReg.recoTimeStamp(15,8),
|
|
|
|
|
(addr === "h11a".U & isSlvMode) -> sReg.recoTimeStamp(23,16),
|
|
|
|
|
(addr === "h11b".U & isSlvMode) -> sReg.recoTimeStamp(31,24),
|
|
|
|
|
(addr === "h11c".U & isSlvMode) -> sReg.recoTimeStamp(39,32),
|
|
|
|
|
(addr === "h11d".U & isSlvMode) -> sReg.recoTimeStamp(47,40),
|
|
|
|
|
(addr === "h11e".U & isSlvMode) -> sReg.recoTimeStamp(55,48),
|
|
|
|
|
(addr === "h11f".U & isSlvMode) -> sReg.recoTimeStamp(63,56),
|
|
|
|
|
|
|
|
|
|
(addr === "h120".U & isSlvMode) -> sReg.syncCfg,
|
|
|
|
|
|
|
|
|
|
(addr === "h122".U & isSlvMode) -> sReg.syncWidth(0)(7,0),
|
|
|
|
|
(addr === "h123".U & isSlvMode) -> sReg.syncWidth(0)(15,8),
|
|
|
|
|
|
|
|
|
|
(addr === "h124".U & isSlvMode) -> sReg.syncWidth(1)(7,0),
|
|
|
|
|
(addr === "h125".U & isSlvMode) -> sReg.syncWidth(1)(15,8),
|
|
|
|
|
|
|
|
|
|
(addr === "h126".U & isSlvMode) -> sReg.syncWidth(2)(7,0),
|
|
|
|
|
(addr === "h127".U & isSlvMode) -> sReg.syncWidth(2)(15,8),
|
|
|
|
|
|
|
|
|
|
(addr === "h128".U & isSlvMode) -> sReg.syncWidth(3)(7,0),
|
|
|
|
|
(addr === "h129".U & isSlvMode) -> sReg.syncWidth(3)(15,8),
|
|
|
|
|
|
|
|
|
|
(addr === "h130".U ) -> cReg.syncPoint(7,0),
|
|
|
|
|
(addr === "h131".U ) -> cReg.syncPoint(15,8),
|
|
|
|
|
(addr === "h132".U ) -> cReg.syncPoint(23,16),
|
|
|
|
|
(addr === "h133".U ) -> cReg.syncPoint(31,24),
|
|
|
|
|
(addr === "h134".U ) -> cReg.syncPoint(39,32),
|
|
|
|
|
(addr === "h135".U ) -> cReg.syncPoint(47,40),
|
|
|
|
|
(addr === "h136".U ) -> cReg.syncPoint(55,48),
|
|
|
|
|
(addr === "h137".U ) -> cReg.syncPoint(63,56),
|
|
|
|
|
|
|
|
|
|
(addr === "h138".U ) -> cReg.syncPeroid(7,0),
|
|
|
|
|
(addr === "h139".U ) -> cReg.syncPeroid(15,8),
|
|
|
|
|
(addr === "h13a".U ) -> cReg.syncPeroid(23,16),
|
|
|
|
|
(addr === "h13b".U ) -> cReg.syncPeroid(31,24),
|
|
|
|
|
|
|
|
|
|
(addr === "h13c".U & isSlvMode) -> sReg.syncOffset(1)(7,0),
|
|
|
|
|
(addr === "h13d".U & isSlvMode) -> sReg.syncOffset(1)(15,8),
|
|
|
|
|
(addr === "h13e".U & isSlvMode) -> sReg.syncOffset(1)(23,16),
|
|
|
|
|
(addr === "h13f".U & isSlvMode) -> sReg.syncOffset(1)(31,24),
|
|
|
|
|
|
|
|
|
|
(addr === "h140".U & isSlvMode) -> sReg.syncOffset(2)(7,0),
|
|
|
|
|
(addr === "h141".U & isSlvMode) -> sReg.syncOffset(2)(15,8),
|
|
|
|
|
(addr === "h142".U & isSlvMode) -> sReg.syncOffset(2)(23,16),
|
|
|
|
|
(addr === "h143".U & isSlvMode) -> sReg.syncOffset(2)(31,24),
|
|
|
|
|
|
|
|
|
|
(addr === "h144".U & isSlvMode) -> sReg.syncOffset(3)(7,0),
|
|
|
|
|
(addr === "h145".U & isSlvMode) -> sReg.syncOffset(3)(15,8),
|
|
|
|
|
(addr === "h146".U & isSlvMode) -> sReg.syncOffset(3)(23,16),
|
|
|
|
|
(addr === "h147".U & isSlvMode) -> sReg.syncOffset(3)(31,24),
|
2025-05-20 11:32:03 +08:00
|
|
|
) ++
|
2025-05-20 11:44:22 +08:00
|
|
|
( 0 until 128 ).map{ i =>
|
|
|
|
|
( addr === ("h180".U + i.U ) ) -> cReg.custom(i)
|
|
|
|
|
} ++
|
2025-05-20 11:32:03 +08:00
|
|
|
( 0 until 8 ).map{ i =>
|
|
|
|
|
( addr === ("h302".U + (i*4).U) ) -> cReg.smTrigLen(i)(7,0)
|
|
|
|
|
} ++
|
|
|
|
|
( 0 until 8 ).map{ i =>
|
|
|
|
|
( addr === ("h303".U + (i*4).U) ) -> cReg.smTrigLen(i)(10,8)
|
|
|
|
|
} ++
|
|
|
|
|
Seq()
|
2025-05-09 16:11:18 +08:00
|
|
|
)
|
2025-05-20 11:32:03 +08:00
|
|
|
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-02 16:40:25 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
//spi信号
|
2025-05-21 10:28:36 +08:00
|
|
|
val addrr = Wire(UInt(16.W))
|
|
|
|
|
val addrw = Wire(UInt(16.W))
|
2025-05-15 18:40:01 +08:00
|
|
|
val dataw = Wire( UInt(8.W) )
|
|
|
|
|
val datar = Wire( UInt(8.W) )
|
|
|
|
|
val isEnW = Wire(Bool())
|
|
|
|
|
val isEnR = Wire(Bool())
|
2025-04-23 17:57:38 +08:00
|
|
|
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
trait InterfaceMCUop{ this: InterfaceBase =>
|
2025-04-24 16:18:33 +08:00
|
|
|
|
2025-04-23 17:57:38 +08:00
|
|
|
|
2025-04-16 16:49:42 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
|
2025-05-13 18:03:22 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
isEnW := Mux1H(Seq(
|
2025-05-13 18:03:22 +08:00
|
|
|
( cReg.spiSel === 0.U ) -> iQSpi.io.isEnW,
|
|
|
|
|
( cReg.spiSel === 1.U ) -> oSpi.io.isEnW,
|
|
|
|
|
( cReg.spiSel === 2.U ) -> oQSpi.io.isEnW,
|
|
|
|
|
))
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
addrr := Mux1H(Seq(
|
|
|
|
|
( cReg.spiSel === 0.U ) -> iQSpi.io.addrr,
|
|
|
|
|
( cReg.spiSel === 1.U ) -> oSpi.io.addrr,
|
|
|
|
|
( cReg.spiSel === 2.U ) -> oQSpi.io.addrr,
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
addrw := Mux1H(Seq(
|
|
|
|
|
( cReg.spiSel === 0.U ) -> iQSpi.io.addrw,
|
|
|
|
|
( cReg.spiSel === 1.U ) -> oSpi.io.addrw,
|
|
|
|
|
( cReg.spiSel === 2.U ) -> oQSpi.io.addrw,
|
2025-05-13 18:03:22 +08:00
|
|
|
))
|
|
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
dataw := Mux1H(Seq(
|
2025-05-13 18:03:22 +08:00
|
|
|
( cReg.spiSel === 0.U ) -> iQSpi.io.dataw,
|
|
|
|
|
( cReg.spiSel === 1.U ) -> oSpi.io.dataw,
|
|
|
|
|
( cReg.spiSel === 2.U ) -> oQSpi.io.dataw,
|
|
|
|
|
))
|
|
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
isEnR := Mux1H(Seq(
|
2025-05-13 18:03:22 +08:00
|
|
|
( cReg.spiSel === 0.U ) -> iQSpi.io.isEnR,
|
|
|
|
|
( cReg.spiSel === 1.U ) -> oSpi.io.isEnR,
|
|
|
|
|
( cReg.spiSel === 2.U ) -> oQSpi.io.isEnR,
|
|
|
|
|
))
|
|
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
datar := MuxCase( 0.U, Array(
|
2025-05-22 10:16:00 +08:00
|
|
|
((addrr & "hF800".U) === "h0000".U) -> RegEnable( AcquireReg(addr = addrr), isEnR ),
|
2025-05-21 10:48:22 +08:00
|
|
|
((addrr & "hF800".U) === "h0800".U) -> io.sram_r(0).datar,
|
|
|
|
|
((addrr & "hF800".U) === "h1000".U) -> 0.U,
|
|
|
|
|
((addrr & "hF800".U) === "h1800".U) -> io.sram_r(1).datar,
|
|
|
|
|
((addrr & "hF800".U) === "h2000".U) -> 0.U,
|
|
|
|
|
((addrr & "hF800".U) === "h2800".U) -> io.sram_r(2).datar,
|
|
|
|
|
((addrr & "hF800".U) === "h3000".U) -> 0.U,
|
|
|
|
|
((addrr & "hF800".U) === "h3800".U) -> io.sram_r(3).datar,
|
|
|
|
|
((addrr & "hF800".U) === "h4000".U) -> 0.U,
|
2025-05-09 16:11:18 +08:00
|
|
|
))
|
|
|
|
|
|
2025-05-13 18:03:22 +08:00
|
|
|
iQSpi.io.datar := Mux(cReg.spiSel === 0.U, datar, 0.U)
|
|
|
|
|
oSpi.io.datar := Mux(cReg.spiSel === 1.U, datar, 0.U)
|
|
|
|
|
oQSpi.io.datar := Mux(cReg.spiSel === 2.U, datar, 0.U)
|
|
|
|
|
|
2025-05-14 16:26:20 +08:00
|
|
|
when( isEnW ){
|
2025-05-21 10:28:36 +08:00
|
|
|
printf(s"SPI/QSPI Write 0x%x, @0x%x\n", dataw, addrw)
|
2025-05-14 16:26:20 +08:00
|
|
|
}
|
|
|
|
|
when( isEnR ){
|
2025-05-21 10:28:36 +08:00
|
|
|
printf(s"SPI/QSPI Readout 0x%x, @0x%x\n", datar, addrr)
|
2025-05-14 16:26:20 +08:00
|
|
|
}
|
2025-05-13 18:03:22 +08:00
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
cReg.mstOrSlv := RegEnable( dataw(1,0), 0.U, isEnW & addrw === "h0".U & cReg.mstOrSlv === 0.U )
|
2025-05-22 19:45:07 +08:00
|
|
|
cReg.hwVersion := RegEnable( dataw , "hF0".U, isEnW & addrw === "h1".U & cReg.mstOrSlv === 0.U )
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
cReg.hwSerial :=
|
|
|
|
|
Cat(
|
|
|
|
|
(0 until 6).map{ i =>
|
2025-05-22 19:45:07 +08:00
|
|
|
RegEnable( dataw, "haa".U, isEnW & addrw === ("h2".U + i.U) & cReg.mstOrSlv === 0.U )
|
2025-05-09 16:11:18 +08:00
|
|
|
}.reverse
|
|
|
|
|
)
|
2025-05-08 17:43:10 +08:00
|
|
|
|
2025-05-22 19:45:07 +08:00
|
|
|
cReg.busRate := RegEnable( dataw, "h55".U, isEnW & addrw === "h8".U & cReg.mstOrSlv === 0.U )
|
2025-05-21 10:28:36 +08:00
|
|
|
cReg.spiSel := RegEnable( dataw(1,0), 0.U, isEnW & addrw === "h9".U & cReg.mstOrSlv === 0.U )
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
cReg.encryptKey :=
|
|
|
|
|
Cat(
|
|
|
|
|
(0 until 16).map{ i =>
|
2025-05-21 10:28:36 +08:00
|
|
|
RegEnable( dataw, 0.U, isEnW & addrw === ("h50".U + i.U) & cReg.mstOrSlv === 0.U )
|
2025-05-09 17:44:54 +08:00
|
|
|
}.reverse
|
2025-05-09 16:11:18 +08:00
|
|
|
)
|
|
|
|
|
|
2025-05-22 16:53:42 +08:00
|
|
|
cReg.isEncrypt := RegEnable( dataw.extract(0), 0.U, isEnW & addrw === "h60".U & cReg.mstOrSlv === 0.U )
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
mReg.txSM := RegEnable( dataw(2,1), 0.U, isEnW & addrw === "h20".U )
|
|
|
|
|
mReg.rxSM := RegEnable( dataw(4,3), 0.U, isEnW & addrw === "h20".U )
|
|
|
|
|
// mReg.txLength := Cat( RegEnable( dataw, 0.U, isEnW & addrw === "h22".U ), RegEnable( dataw, 0.U, isEnW & addrw === "h21".U ) )
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-20 11:44:22 +08:00
|
|
|
( 0 until 128 ).map{ i =>
|
2025-05-21 10:28:36 +08:00
|
|
|
cReg.custom(i) := RegEnable( dataw, 0.U, isEnW & (addrw === ("h180".U + i.U)) )
|
2025-05-20 11:44:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-15 14:57:58 +08:00
|
|
|
mReg.rplTimeStampTx :=
|
|
|
|
|
Cat(
|
2025-05-21 10:28:36 +08:00
|
|
|
RegEnable( dataw, 0.U, isEnW & addrw === "h25".U ),
|
|
|
|
|
RegEnable( dataw, 0.U, isEnW & addrw === "h24".U )
|
2025-05-15 14:57:58 +08:00
|
|
|
)
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
when( isEnW & isSlvMode ){
|
2025-05-21 10:28:36 +08:00
|
|
|
when( addrw === "h120".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncCfg := dataw
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( i <- 0 until 4 ){
|
2025-05-21 10:28:36 +08:00
|
|
|
when( io.lvds.addrw === ("h122".U + (2*i).U)){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncWidth(i) := Cat( syncWidth(i)(15,8), io.lvds.dataw )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === ("h123".U + (2*i).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncWidth(i) := Cat( io.lvds.dataw, syncWidth(i)(7,0) )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
when( addrw === "h130".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,8), dataw )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h131".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,16), dataw, syncPoint(7,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h132".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,24), dataw, syncPoint(15,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h133".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,32), dataw, syncPoint(23,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h134".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,40), dataw, syncPoint(31,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h135".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,48), dataw, syncPoint(39,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h136".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,56), dataw, syncPoint(47,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h137".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( dataw, syncPoint(55,0) )
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
.elsewhen( addrw === "h138".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPeroid := Cat( syncPeroid(31,8), dataw )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h139".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPeroid := Cat( syncPeroid(31,16), dataw, syncPeroid(7,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h13a".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPeroid := Cat( syncPeroid(31,24), dataw, syncPeroid(15,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === "h13b".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPeroid := Cat( dataw, syncPeroid(23,0) )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( i <- 1 until 4 ){
|
2025-05-21 10:28:36 +08:00
|
|
|
when( addrw === ("h13c".U + (4*(i-1)).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffset(i) := Cat( syncOffset(i)(31,8), dataw )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === ("h13d".U + (4*(i-1)).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffset(i) := Cat( syncOffset(i)(31,16), dataw, syncOffset(i)(7,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === ("h13e".U + (4*(i-1)).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffset(i) := Cat( syncOffset(i)(31,24), dataw, syncOffset(i)(15,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( addrw === ("h13f".U + (4*(i-1)).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffset(i) := Cat( dataw, syncOffset(i)(23,0) )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-16 16:49:42 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
trait InterfaceCheckSM{ this: InterfaceBase =>
|
2025-05-09 17:44:54 +08:00
|
|
|
val isEnW: Bool
|
2025-05-21 10:28:36 +08:00
|
|
|
val addrw: UInt
|
2025-05-09 17:44:54 +08:00
|
|
|
val dataw: UInt
|
|
|
|
|
val isEnR: Bool
|
|
|
|
|
|
2025-05-22 19:42:09 +08:00
|
|
|
|
|
|
|
|
val smTrigLen_H = for( i <- 0 until 8 ) yield { RegInit(0.U(8.W)) }
|
|
|
|
|
val smTrigLen_L = for( i <- 0 until 8 ) yield { RegInit(0.U(8.W)) }
|
|
|
|
|
|
|
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
for( i <- 0 until 8 ){
|
2025-05-22 19:42:09 +08:00
|
|
|
cReg.smTrigLen(i) := Cat( smTrigLen_H(i), smTrigLen_L(i) )
|
|
|
|
|
|
|
|
|
|
when( isEnW & addrw === ("h303".U + (i*4).U) ){
|
|
|
|
|
smTrigLen_H(i) := dataw
|
|
|
|
|
} .elsewhen( io.lvds.isEnW & io.lvds.addrw === ("h303".U + (i*4).U)){
|
|
|
|
|
smTrigLen_H(i) := io.lvds.dataw
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
when( isEnW & addrw === ("h302".U + (i*4).U) ){
|
|
|
|
|
smTrigLen_L(i) := dataw
|
|
|
|
|
} .elsewhen( io.lvds.isEnW & io.lvds.addrw === ("h302".U + (i*4).U)){
|
|
|
|
|
smTrigLen_L(i) := io.lvds.dataw
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Cat(
|
|
|
|
|
// RegEnable( dataw, 0.U, isEnW & addrw === ("h303".U + (i*4).U) ),
|
|
|
|
|
// RegEnable( dataw, 0.U, isEnW & addrw === ("h302".U + (i*4).U) ),
|
|
|
|
|
// )
|
2025-05-20 11:32:03 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
io.sram_r(0).addrr := addrr
|
|
|
|
|
io.sram_r(1).addrr := addrr
|
|
|
|
|
io.sram_r(2).addrr := addrr
|
|
|
|
|
io.sram_r(3).addrr := addrr
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
io.sram_r(0).enr := isEnR & (( addrr & "hF800".U ) === "h0800".U)
|
|
|
|
|
io.sram_r(1).enr := isEnR & (( addrr & "hF800".U ) === "h1800".U)
|
|
|
|
|
io.sram_r(2).enr := isEnR & (( addrr & "hF800".U ) === "h2800".U)
|
|
|
|
|
io.sram_r(3).enr := isEnR & (( addrr & "hF800".U ) === "h3800".U)
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
io.sram_w(0).addrw := addrw
|
|
|
|
|
io.sram_w(1).addrw := addrw
|
|
|
|
|
io.sram_w(2).addrw := addrw
|
|
|
|
|
io.sram_w(3).addrw := addrw
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
io.sram_w(0).dataw := dataw
|
|
|
|
|
io.sram_w(1).dataw := dataw
|
|
|
|
|
io.sram_w(2).dataw := dataw
|
|
|
|
|
io.sram_w(3).dataw := dataw
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
io.sram_w(0).enw := isEnW & (( addrw & "hF800".U ) === "h1000".U)
|
|
|
|
|
io.sram_w(1).enw := isEnW & (( addrw & "hF800".U ) === "h2000".U)
|
|
|
|
|
io.sram_w(2).enw := isEnW & (( addrw & "hF800".U ) === "h3000".U)
|
|
|
|
|
io.sram_w(3).enw := isEnW & (( addrw & "hF800".U ) === "h4000".U)
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-22 19:43:49 +08:00
|
|
|
io.dSMdeq(0) := isEnR & (( addrr & "hF800".U ) === "h0800".U) & (addrr(10,0) === cReg.smTrigLen(0) - 1.U + 1.U)
|
|
|
|
|
io.dSMdeq(1) := isEnR & (( addrr & "hF800".U ) === "h1800".U) & (addrr(10,0) === cReg.smTrigLen(2) - 1.U + 1.U)
|
|
|
|
|
io.dSMdeq(2) := isEnR & (( addrr & "hF800".U ) === "h2800".U) & (addrr(10,0) === cReg.smTrigLen(4) - 1.U + 1.U)
|
|
|
|
|
io.dSMdeq(3) := isEnR & (( addrr & "hF800".U ) === "h3800".U) & (addrr(10,0) === cReg.smTrigLen(6) - 1.U + 1.U)
|
2025-05-09 16:11:18 +08:00
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
io.uSMenq(0) := isEnW & (( addrw & "hF800".U ) === "h1000".U) & (addrw(10,0) === cReg.smTrigLen(1) - 1.U)
|
|
|
|
|
io.uSMenq(1) := isEnW & (( addrw & "hF800".U ) === "h2000".U) & (addrw(10,0) === cReg.smTrigLen(3) - 1.U)
|
|
|
|
|
io.uSMenq(2) := isEnW & (( addrw & "hF800".U ) === "h3000".U) & (addrw(10,0) === cReg.smTrigLen(5) - 1.U)
|
|
|
|
|
io.uSMenq(3) := isEnW & (( addrw & "hF800".U ) === "h4000".U) & (addrw(10,0) === cReg.smTrigLen(7) - 1.U)
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-16 16:49:42 +08:00
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
trait InterfaceLVDSop{ this: InterfaceBase =>
|
2025-05-15 18:40:01 +08:00
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
io.lvds.datar := AcquireReg(addr = io.lvds.addrr)
|
2025-05-15 18:40:01 +08:00
|
|
|
|
|
|
|
|
when( io.lvds.isEnW & isSlvMode ){
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
when( io.lvds.addrw === "h120".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncCfg := io.lvds.dataw
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( i <- 0 until 4 ){
|
2025-05-21 10:28:36 +08:00
|
|
|
when( io.lvds.addrw === ("h122".U + (2*i).U)){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncWidth(i) := Cat( syncWidth(i)(15,8), io.lvds.dataw )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === ("h123".U + (2*i).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncWidth(i) := Cat( io.lvds.dataw, syncWidth(i)(7,0) )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
.elsewhen( io.lvds.addrw === "h130".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,8), io.lvds.dataw )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h131".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,16), io.lvds.dataw, syncPoint(7,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h132".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,24), io.lvds.dataw, syncPoint(15,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h133".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,32), io.lvds.dataw, syncPoint(23,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h134".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,40), io.lvds.dataw, syncPoint(31,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h135".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,48), io.lvds.dataw, syncPoint(39,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h136".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( syncPoint(63,56), io.lvds.dataw, syncPoint(47,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h137".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPoint := Cat( io.lvds.dataw, syncPoint(55,0) )
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-21 10:28:36 +08:00
|
|
|
.elsewhen( io.lvds.addrw === "h138".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPeroid := Cat( syncPeroid(31,8), io.lvds.dataw )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h139".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPeroid := Cat( syncPeroid(31,16), io.lvds.dataw, syncPeroid(7,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h13a".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPeroid := Cat( syncPeroid(31,24), io.lvds.dataw, syncPeroid(15,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === "h13b".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncPeroid := Cat( io.lvds.dataw, syncPeroid(23,0) )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( i <- 1 until 4 ){
|
2025-05-21 10:28:36 +08:00
|
|
|
when( io.lvds.addrw === ("h13c".U + (4*(i-1)).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffset(i) := Cat( syncOffset(i)(31,8), io.lvds.dataw )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === ("h13d".U + (4*(i-1)).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffset(i) := Cat( syncOffset(i)(31,16), io.lvds.dataw, syncOffset(i)(7,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === ("h13e".U + (4*(i-1)).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffset(i) := Cat( syncOffset(i)(31,24), io.lvds.dataw, syncOffset(i)(15,0) )
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( io.lvds.addrw === ("h13f".U + (4*(i-1)).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffset(i) := Cat( io.lvds.dataw, syncOffset(i)(23,0) )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|
2025-04-16 16:49:42 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
trait InterfaceSync{ this: InterfaceBase =>
|
|
|
|
|
cReg.timeStamp := RegNext( cReg.timeStamp + 1.U, 0.U )
|
2025-04-16 16:49:42 +08:00
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
cReg.mstDeltaTime := io.mstDeltaTime
|
2025-05-21 16:04:39 +08:00
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
|
|
|
|
|
// sReg.mstTimeStamp := io.mstTimeStamp
|
|
|
|
|
sReg.deltaFinal := io.deltaFinal
|
|
|
|
|
sReg.recoTimeStamp := RegNext( cReg.timeStamp + Cat( Fill(32, sReg.deltaFinal.extract(31)), sReg.deltaFinal ) )
|
|
|
|
|
sReg.slvDeltaTime := io.slvDeltaTime
|
|
|
|
|
|
|
|
|
|
val syncSign = for( i <- 0 until 4 ) yield { RegInit(false.B) }
|
|
|
|
|
val syncOffsetCnt = for( i <- 0 until 4 ) yield { RegInit("hFFFFFFFF".U(32.W)) } //空开第0位
|
|
|
|
|
val syncResetCnt = for( i <- 0 until 4 ) yield { RegInit(0.U(16.W)) } //空开第0位
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
when( cReg.syncPoint === sReg.recoTimeStamp ){ //时间到达sync0时间点
|
|
|
|
|
syncSign(0) := true.B
|
2025-05-16 16:05:38 +08:00
|
|
|
syncPoint := syncPoint + cReg.syncPeroid
|
2025-05-15 18:40:01 +08:00
|
|
|
} .elsewhen( ~sReg.syncCfg(4+0) & syncResetCnt(0) === sReg.syncWidth(0) ){
|
|
|
|
|
syncSign(0) := false.B
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( sReg.syncCfg(4+0) & isEnW & addrw === "h122".U ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncSign(0) := false.B
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( i <- 1 until 4 ) {
|
|
|
|
|
|
|
|
|
|
when( cReg.syncPoint === sReg.recoTimeStamp ){ //时间到达sync0时间点
|
|
|
|
|
syncOffsetCnt(i) := 0.U
|
2025-05-16 16:05:38 +08:00
|
|
|
} .elsewhen( syncOffsetCnt(i) <= sReg.syncOffset(i) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncOffsetCnt(i) := syncOffsetCnt(i) + 1.U
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
when( syncOffsetCnt(i) === sReg.syncOffset(i) ){
|
|
|
|
|
syncSign(i) := true.B
|
|
|
|
|
} .elsewhen( ~sReg.syncCfg(4+i) & syncResetCnt(i) === sReg.syncWidth(i) ){
|
|
|
|
|
syncSign(i) := false.B
|
2025-05-21 10:28:36 +08:00
|
|
|
} .elsewhen( sReg.syncCfg(4+i) & isEnW & addrw === ("h122".U + (2*i).U) ){
|
2025-05-15 18:40:01 +08:00
|
|
|
syncSign(i) := false.B
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( i <- 0 until 4 ){
|
2025-05-16 16:05:38 +08:00
|
|
|
when( ~sReg.syncCfg(4+i) ){
|
|
|
|
|
when( syncSign(i) ){
|
|
|
|
|
syncResetCnt(i) := syncResetCnt(i) + 1.U
|
|
|
|
|
} .otherwise{
|
|
|
|
|
syncResetCnt(i) := 0.U
|
|
|
|
|
}
|
2025-05-15 18:40:01 +08:00
|
|
|
}
|
2025-05-16 16:05:38 +08:00
|
|
|
|
2025-05-15 18:40:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
io.sync(0) := sReg.syncCfg.extract(0) & syncSign(0) & isSlvMode
|
|
|
|
|
io.sync(1) := sReg.syncCfg.extract(1) & syncSign(1) & isSlvMode
|
|
|
|
|
io.sync(2) := sReg.syncCfg.extract(2) & syncSign(2) & isSlvMode
|
|
|
|
|
io.sync(3) := sReg.syncCfg.extract(3) & syncSign(3) & isSlvMode
|
|
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
}
|
2025-04-16 16:49:42 +08:00
|
|
|
|
2025-05-21 16:04:39 +08:00
|
|
|
trait InterfaceSystem{ this: InterfaceBase =>
|
|
|
|
|
io.isSoftReset := ShiftRegister( isEnW & addrw === "h40".U, 16, false.B, true.B )
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
class Interface extends InterfaceBase
|
|
|
|
|
with InterfaceMCUop
|
2025-05-09 17:44:54 +08:00
|
|
|
with InterfaceCheckSM
|
|
|
|
|
with InterfaceLVDSop
|
|
|
|
|
with InterfaceSync
|
2025-05-21 16:04:39 +08:00
|
|
|
with InterfaceSystem
|
2025-05-08 17:43:10 +08:00
|
|
|
{
|
|
|
|
|
|
2025-05-09 16:11:18 +08:00
|
|
|
|
|
|
|
|
io.txReq.bits.txSM := mReg.txSM
|
|
|
|
|
io.txReq.bits.rxSM := mReg.rxSM
|
2025-05-20 11:32:03 +08:00
|
|
|
// io.txReq.bits.txLength := //mReg.txLength
|
2025-05-21 10:28:36 +08:00
|
|
|
io.txReq.valid := isEnW & addrw === "h20".U & dataw.extract(0) === "b1".U //& mReg.txLength =/= 0.U
|
2025-05-09 17:44:54 +08:00
|
|
|
|
2025-05-20 11:32:03 +08:00
|
|
|
|
2025-05-09 17:44:54 +08:00
|
|
|
|
2025-05-16 20:17:02 +08:00
|
|
|
|
|
|
|
|
sReg.localDevIndex := io.localDevIndex
|
|
|
|
|
|
2025-05-16 18:56:49 +08:00
|
|
|
// sReg.isDevOnLeft := io.isDevOnLeft
|
2025-05-21 16:50:20 +08:00
|
|
|
// sReg.isDevOnLeftModify := io.isDevOnLeftModify
|
|
|
|
|
// sReg.indexOfLeftDev := io.indexOfLeftDev
|
2025-05-16 18:56:49 +08:00
|
|
|
sReg.isDevOnRight := io.isDevOnRight
|
|
|
|
|
sReg.isDevOnRightModify := io.isDevOnRightModify
|
|
|
|
|
sReg.indexOfRightDev := io.indexOfRightDev
|
2025-05-15 18:40:01 +08:00
|
|
|
|
2025-05-22 16:53:42 +08:00
|
|
|
io.initEncryptor.valid := dataw.extract(0) & isEnW & addrw === "h60".U & cReg.mstOrSlv === 0.U //cReg.isEncrypt
|
|
|
|
|
io.initEncryptor.bits := cReg.encryptKey
|
2025-05-15 18:40:01 +08:00
|
|
|
|
|
|
|
|
|
2025-05-08 17:43:10 +08:00
|
|
|
}
|