spi已经加入,操作必要寄存器已加入,编译通过,未开始测试

This commit is contained in:
Ruige Lee
2025-05-09 17:44:54 +08:00
parent f05b61542c
commit e079103037
3 changed files with 112 additions and 91 deletions

View File

@@ -13,7 +13,7 @@ class CommonRegisterBundle extends Bundle{
// val isSoftReset = Bool() // val isSoftReset = Bool()
val encryptKey = UInt(128.W) val encryptKey = UInt(128.W)
val isEncrypt = Bool() // val isEncrypt = Bool()
// val upRecErrorCnt = UInt(32.W) // val upRecErrorCnt = UInt(32.W)
// val downRecErrorCnt = UInt(32.W) // val downRecErrorCnt = UInt(32.W)
@@ -30,9 +30,9 @@ class CommonRegisterBundle extends Bundle{
// val wdtOverflow = UInt(8.W) // val wdtOverflow = UInt(8.W)
val timeStamp = UInt(64.W) val timeStamp = UInt(64.W)
val deltaTime = UInt(32.W) // val deltaTime = UInt(32.W)
val linkStatus = UInt(8.W) // val linkStatus = UInt(8.W)
val smEnqAddr = Vec(8, UInt(11.W)) //触发SM切换缓冲区的地址 (或读或写) val smEnqAddr = Vec(8, UInt(11.W)) //触发SM切换缓冲区的地址 (或读或写)
@@ -46,46 +46,48 @@ class MasterRegisterBundle extends Bundle{
val txSM = UInt(2.W) val txSM = UInt(2.W)
val txStatus = UInt(16.W) val rxSM = UInt(2.W)
val txLength = UInt(12.W)
// val txStatus = UInt(16.W)
val intEnable = UInt(8.W) // val intEnable = UInt(8.W)
val intMask = UInt(8.W) // val intMask = UInt(8.W)
val intStatus = UInt(8.W) // val intStatus = UInt(8.W)
} }
class SlaveRegisterBundle extends Bundle{ class SlaveRegisterBundle extends Bundle{
val RAMSize = UInt(8.W) // val RAMSize = UInt(8.W)
val MMUNum = UInt(8.W) // val MMUNum = UInt(8.W)
val nodeSeqAddr = UInt(16.W) // val nodeSeqAddr = UInt(16.W)
val nodeSetAddr = UInt(16.W) // val nodeSetAddr = UInt(16.W)
val ebmmu = Vec(8, new Bundle{ // val ebmmu = Vec(8, new Bundle{
val logicAddr = UInt(32.W) // val logicAddr = UInt(32.W)
val length = UInt(16.W) // val length = UInt(16.W)
val phyAddr = UInt(32.W) // val phyAddr = UInt(32.W)
val op = UInt(2.W) // val op = UInt(2.W)
val enable = Bool() // val enable = Bool()
}) // })
val intStatus = UInt(16.W) // val intStatus = UInt(16.W)
val mb = Vec(8, new Bundle{ // val mb = Vec(8, new Bundle{
val ctrl = UInt(8.W) // val ctrl = UInt(8.W)
val status = UInt(8.W) // val status = UInt(8.W)
}) // })
val downTimeStamp = UInt(64.W) //下行本地时间戳寄存器 // val downTimeStamp = UInt(64.W) //下行本地时间戳寄存器
val upTimeStamp = UInt(64.W) //上行本地时间戳寄存器 // val upTimeStamp = UInt(64.W) //上行本地时间戳寄存器
val mstTimeStamp = UInt(64.W) //主站时间戳 // val mstTimeStamp = UInt(64.W) //主站时间戳
val dcSyncEnable = Bool() // val dcSyncEnable = Bool()
val dcSyncWidth = UInt(16.W) // val dcSyncWidth = UInt(16.W)
} }
@@ -93,21 +95,15 @@ class SlaveRegisterBundle extends Bundle{
class InterfaceIO extends Bundle{ class InterfaceIO extends Bundle{
val ospi = new SPIInterfaceIO val ospi = new SPIInterfaceIO
// val req = Valid(new Bundle{
// val addr = UInt(16.W)
// val dataw = UInt(8.W)
// val isWRn = Bool()
// })
// val resp = Valid(new Bundle{
// datar = UInt(8.W)
// })
val modeSel = Output(Bool()) val modeSel = Output(Bool())
val txReq = Valid(new Bundle{ val txReq = Valid(new Bundle{
val txSM = UInt(2.W) val txSM = UInt(2.W)
val rxSM = UInt(2.W) val rxSM = UInt(2.W)
val txLength = UInt(12.W)
}) //发送请求和SM代号 }) //发送请求和SM代号
@@ -117,7 +113,10 @@ class InterfaceIO extends Bundle{
val sram_w = Flipped(Vec( 4, new SRAM2kWRIO)) //QSPI val sram_w = Flipped(Vec( 4, new SRAM2kWRIO)) //QSPI
val sram_r = Flipped(Vec( 4, new SRAM2kRDIO)) //QSPI val sram_r = Flipped(Vec( 4, new SRAM2kRDIO)) //QSPI
val timeStamp = Output(UInt(64.W))
val smEnqAddr = Output(Vec(8, UInt(16.W))) //触发SM切换缓冲区的地址 (或读或写)
val smDeqAddr = Output(Vec(8, UInt(16.W))) //触发SM切换缓冲区的地址 (或读或写)
} }
@@ -129,9 +128,11 @@ abstract class InterfaceBase extends Module{
val cReg = Wire(new CommonRegisterBundle) val cReg = Wire(new CommonRegisterBundle)
val mReg = Wire(new MasterRegisterBundle) val mReg = Wire(new MasterRegisterBundle)
val sReg = Wire(new SlaveRegisterBundle) // val sReg = Wire(new SlaveRegisterBundle)
val isSysInit = cReg.mstOrSlv =/= 0.U val isSysInit = cReg.mstOrSlv =/= 0.U
val isMstMode = cReg.mstOrSlv === "h1".U
val isSlvMode = cReg.mstOrSlv === "h2".U
def AcquireReg(addr: UInt): UInt = { def AcquireReg(addr: UInt): UInt = {
Mux1H( Mux1H(
@@ -141,16 +142,24 @@ abstract class InterfaceBase extends Module{
) ++ ) ++
((0 until 6).map{ i => ((0 until 6).map{ i =>
(addr === ("h2".U + i.U) ) -> cReg.hwSerial( 8*i+7,8*i+0), (addr === ("h2".U + i.U) ) -> cReg.hwSerial( 8*i+7,8*i+0 )
}) ++ }) ++
Seq( Seq(
(addr === "h8".U) -> cReg.busRate( 7,0), (addr === "h8".U ) -> cReg.busRate( 7,0),
(addr === "h9".U) -> cReg.busRate(15,8), (addr === "h9".U ) -> cReg.busRate(15,8),
(addr === "h20".U & isMstMode) -> Cat(mReg.rxSM, mReg.txSM, 0.U(1.W) ),
(addr === "h21".U & isMstMode) -> mReg.txLength,
) ++ ) ++
((0 until 16).map{ i => ((0 until 16).map{ i =>
(addr === ("h80".U + i.U) ) -> cReg.encryptKey( 8*i+7,8*i+0), (addr === ("h80".U + i.U) ) -> cReg.encryptKey( 8*i+7,8*i+0 )
}) ++ }) ++
Seq() Seq()
@@ -169,22 +178,20 @@ trait InterfaceMCUop{ this: InterfaceBase =>
oSpi.io.addrSel = Output(UInt(16.W))
oSpi.io.dataw = Output( UInt(8.W) )
oSpi.io.datar := oSpi.io.datar :=
MuxCase( 0.U, Array( MuxCase( 0.U, Array(
((oSpi.io.addrSel & "hFF00".U) === "h0000".U) -> RegEnable( AcquireReg(addr = oSpi.io.addrSel), 0.U, oSpi.io.isEnR ), ((oSpi.io.addrSel & "hFF00".U) === "h0000".U) -> RegEnable( AcquireReg(addr = oSpi.io.addrSel), 0.U, oSpi.io.isEnR ),
((oSpi.io.addrSel & "hFF00".U) === "h0800".U) -> smUnit(0).io.sram_r.datar, ((oSpi.io.addrSel & "hFF00".U) === "h0800".U) -> io.sram_r(0).datar,
((oSpi.io.addrSel & "hFF00".U) === "h1000".U) -> 0.U, ((oSpi.io.addrSel & "hFF00".U) === "h1000".U) -> 0.U,
((oSpi.io.addrSel & "hFF00".U) === "h1800".U) -> smUnit(2).io.sram_r.datar, ((oSpi.io.addrSel & "hFF00".U) === "h1800".U) -> io.sram_r(1).datar,
((oSpi.io.addrSel & "hFF00".U) === "h2000".U) -> 0.U, ((oSpi.io.addrSel & "hFF00".U) === "h2000".U) -> 0.U,
((oSpi.io.addrSel & "hFF00".U) === "h2800".U) -> smUnit(4).io.sram_r.datar, ((oSpi.io.addrSel & "hFF00".U) === "h2800".U) -> io.sram_r(2).datar,
((oSpi.io.addrSel & "hFF00".U) === "h3000".U) -> 0.U, ((oSpi.io.addrSel & "hFF00".U) === "h3000".U) -> 0.U,
((oSpi.io.addrSel & "hFF00".U) === "h3800".U) -> smUnit(6).io.sram_r.datar, ((oSpi.io.addrSel & "hFF00".U) === "h3800".U) -> io.sram_r(3).datar,
((oSpi.io.addrSel & "hFF00".U) === "h4000".U) -> 0.U, ((oSpi.io.addrSel & "hFF00".U) === "h4000".U) -> 0.U,
)) ))
oSpi.io.isEnW = Output(Bool())
val isEnW = oSpi.io.isEnW val isEnW = oSpi.io.isEnW
val addrSel = oSpi.io.addrSel val addrSel = oSpi.io.addrSel
@@ -211,12 +218,14 @@ trait InterfaceMCUop{ this: InterfaceBase =>
Cat( Cat(
(0 until 16).map{ i => (0 until 16).map{ i =>
RegEnable( dataw, 0.U, isEnW & addrSel === ("h80".U + i.U) & cReg.mstOrSlv === 0.U ) RegEnable( dataw, 0.U, isEnW & addrSel === ("h80".U + i.U) & cReg.mstOrSlv === 0.U )
}.reserve }.reverse
) )
mReg.txSM := RegEnable( dataw(2,1), 0.U, isEnW & addrSel === "h20".U )
mReg.rxSM := RegEnable( dataw(4,3), 0.U, isEnW & addrSel === "h20".U )
mReg.txLength := Cat( RegEnable( dataw, 0.U, isEnW & addrSel === "h22".U ), RegEnable( dataw, 0.U, isEnW & addrSel === "h21".U ) )
@@ -232,6 +241,12 @@ trait InterfaceMCUop{ this: InterfaceBase =>
} }
trait InterfaceCheckSM{ this: InterfaceBase => trait InterfaceCheckSM{ this: InterfaceBase =>
val isEnW: Bool
val addrSel: UInt
val dataw: UInt
val isEnR: Bool
mReg.txSM := RegEnable( dataw(2,1), 0.U, isEnW & addrSel === "h20".U ) mReg.txSM := RegEnable( dataw(2,1), 0.U, isEnW & addrSel === "h20".U )
mReg.rxSM := RegEnable( dataw(4,3), 0.U, isEnW & addrSel === "h20".U ) mReg.rxSM := RegEnable( dataw(4,3), 0.U, isEnW & addrSel === "h20".U )
@@ -274,31 +289,43 @@ trait InterfaceCheckSM{ this: InterfaceBase =>
io.sram_w(2).enw := isEnW & (( addrSel & "hF800".U ) === "h3000".U) io.sram_w(2).enw := isEnW & (( addrSel & "hF800".U ) === "h3000".U)
io.sram_w(3).enw := isEnW & (( addrSel & "hF800".U ) === "h4000".U) io.sram_w(3).enw := isEnW & (( addrSel & "hF800".U ) === "h4000".U)
io.dSMdeq(0) := isEnR & (( addrSel & "hF800".U ) === "h0800".U) & (addrSel(10,0) === smDeqAddr(0)) io.dSMdeq(0) := isEnR & (( addrSel & "hF800".U ) === "h0800".U) & (addrSel(10,0) === cReg.smDeqAddr(0))
io.dSMdeq(1) := isEnR & (( addrSel & "hF800".U ) === "h0800".U) & (addrSel(10,0) === smDeqAddr(2)) io.dSMdeq(1) := isEnR & (( addrSel & "hF800".U ) === "h0800".U) & (addrSel(10,0) === cReg.smDeqAddr(2))
io.dSMdeq(2) := isEnR & (( addrSel & "hF800".U ) === "h0800".U) & (addrSel(10,0) === smDeqAddr(4)) io.dSMdeq(2) := isEnR & (( addrSel & "hF800".U ) === "h0800".U) & (addrSel(10,0) === cReg.smDeqAddr(4))
io.dSMdeq(3) := isEnR & (( addrSel & "hF800".U ) === "h0800".U) & (addrSel(10,0) === smDeqAddr(6)) io.dSMdeq(3) := isEnR & (( addrSel & "hF800".U ) === "h0800".U) & (addrSel(10,0) === cReg.smDeqAddr(6))
io.uSMenq(0) := isEnW & (( addrSel & "hF800".U ) === "h1000".U) & (addrSel(10,0) === smEnqAddr(1)) io.uSMenq(0) := isEnW & (( addrSel & "hF800".U ) === "h1000".U) & (addrSel(10,0) === cReg.smEnqAddr(1))
io.uSMenq(1) := isEnW & (( addrSel & "hF800".U ) === "h2000".U) & (addrSel(10,0) === smEnqAddr(3)) io.uSMenq(1) := isEnW & (( addrSel & "hF800".U ) === "h2000".U) & (addrSel(10,0) === cReg.smEnqAddr(3))
io.uSMenq(2) := isEnW & (( addrSel & "hF800".U ) === "h3000".U) & (addrSel(10,0) === smEnqAddr(5)) io.uSMenq(2) := isEnW & (( addrSel & "hF800".U ) === "h3000".U) & (addrSel(10,0) === cReg.smEnqAddr(5))
io.uSMenq(3) := isEnW & (( addrSel & "hF800".U ) === "h4000".U) & (addrSel(10,0) === smEnqAddr(7)) io.uSMenq(3) := isEnW & (( addrSel & "hF800".U ) === "h4000".U) & (addrSel(10,0) === cReg.smEnqAddr(7))
} }
trait InterfaceLVDSop{ this: InterfaceBase => trait InterfaceLVDSop{ this: InterfaceBase =>
} }
trait InterfaceSync{ this: InterfaceBase =>
cReg.timeStamp := RegNext( cReg.timeStamp + 1.U, 0.U )
io.timeStamp := cReg.timeStamp
}
class Interface extends InterfaceBase class Interface extends InterfaceBase
with InterfaceMCUop with InterfaceMCUop
with InterfaceCheckSM
with InterfaceLVDSop
with InterfaceSync
{ {
io.modeSel := cReg.mstOrSlv === "h1".U io.modeSel := cReg.mstOrSlv === "h1".U
io.txReq.bits.txSM := mReg.txSM io.txReq.bits.txSM := mReg.txSM
io.txReq.bits.rxSM := mReg.rxSM io.txReq.bits.rxSM := mReg.rxSM
io.txReq.valid := isEnW & addrSel === "h20".U & dataw.extract(0) === "b1".U io.txReq.bits.txLength := mReg.txLength
io.txReq.valid := isEnW & addrSel === "h20".U & dataw.extract(0) === "b1".U //& mReg.txLength =/= 0.U
io.smEnqAddr := cReg.smEnqAddr
io.smDeqAddr := cReg.smDeqAddr
} }

View File

@@ -11,9 +11,7 @@ class MasterParserIO extends Bundle{
val sram_r = Flipped(new SRAM2kRDIO) val sram_r = Flipped(new SRAM2kRDIO)
val req = Flipped(Valid(new Bundle{ val req = Flipped(Valid(new Bundle{
val txAddr = UInt(15.W) val txLength = UInt(12.W)
val rxAddr = UInt(15.W)
val length = UInt(12.W)
})) }))
val rsp = Valid(new Bundle{ val rsp = Valid(new Bundle{
val isError = Bool() val isError = Bool()
@@ -23,8 +21,6 @@ class MasterParserIO extends Bundle{
val rxEnq = Output( Bool()) val rxEnq = Output( Bool())
val txDeq = Output( Bool()) val txDeq = Output( Bool())
// val trigAddr = Input( Vec(2, UInt(15.W)) )
val timeStamp = Input(UInt(64.W)) val timeStamp = Input(UInt(64.W))
} }
@@ -58,21 +54,21 @@ abstract class MasterParserBase extends Module{
} }
when( io.req.fire ){ when( io.req.fire ){
txLen := io.req.bits.length txLen := io.req.bits.txLength
rxLen := io.req.bits.length rxLen := io.req.bits.txLength
txCnt := 0.U txCnt := 0.U
} .elsewhen( io.downOut.fire ){ } .elsewhen( io.downOut.fire ){
txCnt := txCnt + 1.U txCnt := txCnt + 1.U
} }
when( io.req.fire ){ when( io.req.fire ){
txAddr := io.req.bits.txAddr txAddr := 0.U
} .elsewhen( io.downOut.fire ){ } .elsewhen( io.downOut.fire ){
txAddr := txAddr + 1.U txAddr := txAddr + 1.U
} }
when( io.req.fire ){ when( io.req.fire ){
rxAddr := io.req.bits.rxAddr rxAddr := 0.U
} .elsewhen( io.upIn.fire ){ } .elsewhen( io.upIn.fire ){
rxAddr := rxAddr + 1.U rxAddr := rxAddr + 1.U
} }
@@ -82,7 +78,7 @@ abstract class MasterParserBase extends Module{
io.sram_r.enr := io.sram_r.enr :=
io.req.fire | io.downOut.fire io.req.fire | io.downOut.fire
io.sram_r.addrr := Mux( io.req.fire, io.req.bits.txAddr, txAddr + 1.U ) io.sram_r.addrr := Mux( io.req.fire, 0.U, txAddr + 1.U )
io.downOut.valid := ~reqReady io.downOut.valid := ~reqReady
io.downOut.bits.tdata := Mux1H(Seq( io.downOut.bits.tdata := Mux1H(Seq(

View File

@@ -22,18 +22,18 @@ class ShinTopIO extends Bundle{
// val interrupt = Output(Bool()) // val interrupt = Output(Bool())
// val ctrl = Input(UInt(4.W)) // val ctrl = Input(UInt(4.W))
val timeStamp = Input(UInt(64.W))
val modeSel = Input(Bool())
val ospi = new SPIInterfaceIO
// val req = Flipped(Valid(new Bundle{
// val txAddr = UInt(15.W)
// val rxAddr = UInt(15.W)
// val length = UInt(12.W)
// }))
val req = Flipped(Valid(new Bundle{
val txAddr = UInt(15.W)
val rxAddr = UInt(15.W)
val length = UInt(12.W)
}))
val rsp = Valid(new Bundle{ val rsp = Valid(new Bundle{
val isError = Bool() val isError = Bool()
val length = UInt(12.W) val length = UInt(12.W)
@@ -68,12 +68,12 @@ abstract class ShinTopBase extends Module{
io.uDatOut := upCDROut.io.serDat io.uDatOut := upCDROut.io.serDat
//override //override
when( slaveParser.io.isLoop & io.modeSel === false.B){ when( slaveParser.io.isLoop & interface.io.modeSel === false.B){
upCDRIn.io.serDat := downCDROut.io.serDat upCDRIn.io.serDat := downCDROut.io.serDat
io.dDatOut := false.B io.dDatOut := false.B
} }
io.ospi <> interface.io.ospi
val sram = Seq( val sram = Seq(
@@ -215,12 +215,12 @@ abstract class ShinTopBase extends Module{
trait ShinTopMaster{ this: ShinTopBase => trait ShinTopMaster{ this: ShinTopBase =>
when(io.modeSel === true.B ){ when( interface.io.modeSel === true.B ){
masterParser.io.downOut <> downCDROut.io.axis masterParser.io.downOut <> downCDROut.io.axis
masterParser.io.upIn <> upCDRIn.io.axis masterParser.io.upIn <> upCDRIn.io.axis
} }
when( io.modeSel === true.B ){ when( interface.io.modeSel === true.B ){
when( interface.io.txReq.bits.rxSM === 0.U ){ when( interface.io.txReq.bits.rxSM === 0.U ){
smUnit(0).io.sram_w := masterParser.io.sram_w smUnit(0).io.sram_w := masterParser.io.sram_w
@@ -263,29 +263,27 @@ trait ShinTopMaster{ this: ShinTopBase =>
} }
masterParser.io.req := io.req masterParser.io.req.valid := interface.io.txReq.valid
masterParser.io.req.bits.txLength := interface.io.txReq.bits.txLength
io.rsp := masterParser.io.rsp io.rsp := masterParser.io.rsp
// masterParser.io.trigAddr(0) := "hff".U masterParser.io.timeStamp := interface.io.timeStamp
// masterParser.io.trigAddr(1) := "hff".U
masterParser.io.timeStamp := io.timeStamp
} }
trait ShinTopSlave{ this: ShinTopBase => trait ShinTopSlave{ this: ShinTopBase =>
when( io.modeSel === false.B ){ when( interface.io.modeSel === false.B ){
slaveParser.io.downIn <> downCDRIn.io.axis slaveParser.io.downIn <> downCDRIn.io.axis
downCDROut.io.axis <> slaveParser.io.downOut downCDROut.io.axis <> slaveParser.io.downOut
slaveParser.io.upIn <> upCDRIn.io.axis slaveParser.io.upIn <> upCDRIn.io.axis
upCDROut.io.axis <> slaveParser.io.upOut upCDROut.io.axis <> slaveParser.io.upOut
} }
slaveParser.io.timeStamp := io.timeStamp slaveParser.io.timeStamp := interface.io.timeStamp
val smEnqAddr = Vec(8, UInt(16.W)) //触发SM切换缓冲区的地址 (或读或写)
val smDeqAddr = Vec(8, UInt(16.W)) //触发SM切换缓冲区的地址 (或读或写)
slaveParser.io.trigAddr(0) := interface.io.smEnqAddr(0) slaveParser.io.trigAddr(0) := interface.io.smEnqAddr(0)
slaveParser.io.trigAddr(1) := interface.io.smDeqAddr(1) slaveParser.io.trigAddr(1) := interface.io.smDeqAddr(1)
@@ -300,7 +298,7 @@ trait ShinTopSlave{ this: ShinTopBase =>
when( io.modeSel === false.B ){ when( interface.io.modeSel === false.B ){
smUnit(0).io.sram_w := slaveParser.io.sram_w(0) smUnit(0).io.sram_w := slaveParser.io.sram_w(0)
smUnit(2).io.sram_w := slaveParser.io.sram_w(1) smUnit(2).io.sram_w := slaveParser.io.sram_w(1)
smUnit(4).io.sram_w := slaveParser.io.sram_w(2) smUnit(4).io.sram_w := slaveParser.io.sram_w(2)