diff --git a/src/main/scala/backBoard/BackBoardMst.scala b/src/main/scala/backBoard/BackBoardMst.scala index 37cd5c5..fd50589 100644 --- a/src/main/scala/backBoard/BackBoardMst.scala +++ b/src/main/scala/backBoard/BackBoardMst.scala @@ -109,13 +109,13 @@ class BackBoardMstBase extends Module{ //10M trait BackBoardMstFSMC{ this: BackBoardMstBase => - val isRegRefleshFlip = withClockAndReset( io.ides_pclk.asClock, reset ){ RegInit(false.B) } - val wrRegAddr = withClockAndReset( io.ides_pclk.asClock, reset ){ Reg(UInt(10.W)) } - val wrRegData = withClockAndReset( io.ides_pclk.asClock, reset ){ Reg(UInt(16.W)) } + val isRegRefleshFlip = withClockAndReset( io.ides_pclk.asClock, reset ){ RegInit(false.B) } //100M + val wrRegAddr = withClockAndReset( io.ides_pclk.asClock, reset ){ Reg(UInt(10.W)) } //100M + val wrRegData = withClockAndReset( io.ides_pclk.asClock, reset ){ Reg(UInt(16.W)) } //100M withClockAndReset( io.ides_pclk.asClock, reset ){//100M - mirrorDown.io.clockw := io.ides_pclk.asBool - mirrorUp.io.clockr := io.ides_pclk.asBool + mirrorDown.io.clockw := io.ides_pclk.asBool //100M + mirrorUp.io.clockr := io.ides_pclk.asBool //100M val fsmcCSSync = ShiftRegisters( io.FSMC.cs, 3, false.B, true.B ) val fsmcRDSync = ShiftRegisters( io.FSMC.rd, 3, false.B, true.B ) @@ -137,6 +137,7 @@ trait BackBoardMstFSMC{ this: BackBoardMstBase => + mirrorDown.io.enw := isAccessSRAM & ~fsmcCSWRSync(2) & fsmcCSWRSync(1) mirrorDown.io.addrw := activeAddr mirrorDown.io.dataw := io.FSMC.ADIn @@ -188,9 +189,9 @@ trait BackBoardMstFSMC{ this: BackBoardMstBase => val isChkRegReflesh = RegInit(false.B) when( isChkRegReflesh =/= isRegRefleshFlip ){ - when( wrRegAddr === 1.U ){ - ctrlTransmit := wrRegData.extract(5) + isChkRegReflesh := ~isChkRegReflesh + when( wrRegAddr === 0.U ){ when( wrRegData.extract(4) ){ statusCDRErr := false.B } @@ -200,9 +201,22 @@ trait BackBoardMstFSMC{ this: BackBoardMstBase => when( wrRegData.extract(2) ){ statusLinkErr := false.B } + } + + + when( wrRegAddr === 1.U ){ + ctrlTransmit := wrRegData.extract(5) + + ctrlSynch := wrRegData.extract(1) - ctrlInit := wrRegData.extract(0) + + when( wrRegData.extract(0) ){ + ctrlInit := true.B + statusSynch := false.B + statusInit := false.B + } + } } @@ -476,18 +490,14 @@ trait BackBoardMstLVDSError{ this: BackBoardMstLVDSBase => when( lvdsMst.io.closed_loop_err ){ slvOffLine := lvdsMst.io.link_err_location(5,0) statusLinkErr := true.B - statusSynch := false.B - statusInit := false.B } when( lvdsMst.io.upstream_cdr_err ){ statusCDRErr := true.B - ctrlTransmit := false.B } when( lvdsMst.io.upstream_crc_valid & lvdsMst.io.upstream_crc_err ){ statusCRCErr := true.B - ctrlTransmit := false.B } } diff --git a/src/main/scala/backBoard/Readme.md b/src/main/scala/backBoard/Readme.md index c0378ac..9395349 100644 --- a/src/main/scala/backBoard/Readme.md +++ b/src/main/scala/backBoard/Readme.md @@ -2,22 +2,35 @@ ## 用户接口 -* 地址线 addr 10比特位宽 -* 数据线 data 16比特位宽 -* 读使能 OEN 负逻辑 -* 写使能 WEN 负逻辑 -* 片选 CEN 负逻辑 -使用要求:在保持其它信号稳定后,最后改变CEN为低,在至少20ns以后将CEN置高,之后方可改变其它信号 +* 数据地址线 AD 16比特位宽 + +* 地址锁存 ADV 正逻辑 +* 读使能 WR 正逻辑 +* 写使能 WR 正逻辑 +* 片选 CS 正逻辑 + + +使用要求:地址锁存时ADV保持高至少30ns, 写入时CS,WR保持高至少30ns,读出时CS,RD保持高至少30ns方可读取数据线上数据 -------------------------------------- ### 内存空间映射 -* 总线上最多允许挂载32个从站,每个从站有8bits*16个下行寄存器(只写),8bits*16个上行寄存器(只读) -* 当地址线第10比特为低时,FSMC访问(只读或者只写)从站镜像寄存器(以8比特形式组织),理论上地址空间支持64个从站,当前要求只访问前32个从站 - - 通过16比特写用户接口 0x00 ~ 0x07, 可以将数据同步写入到从站0的16个下行寄存器(只写)中,后续从站地址按序分配 - - 通过16比特读用户接口 0x00 ~ 0x07, 可以将数据同步写入到从站0的16个上行寄存器(只读)中,后续从站地址按序分配 -* 当地址线第10比特为高时,FSMC通过地址9到0比特访问(可读可写)主站寄存器全部定义为16比特 - - 0x00 控制状态,预留 - - 0x01 配置从栈数量,允许配置(0~31)对应1~32个从站 +* 总线上最多允许挂载64个从站,每个从站有8bits*32个下行寄存器(只写),8bits*32个上行寄存器(只读) +* 当地址线第11比特(AD[10])为低时,FSMC访问(只读或者只写)从站镜像寄存器(以8比特形式组织), + - 通过16比特写用户接口 0x00 ~ 0x1F, 可以将数据同步写入到从站0的16个下行寄存器(只写)中,后续从站地址按序分配 + - 通过16比特读用户接口 0x00 ~ 0x1F, 可以将数据同步写入到从站0的16个上行寄存器(只读)中,后续从站地址按序分配 +* 当地址线第11比特(AD[10])为高时,FSMC通过地址9到0比特访问(可读可写)主站寄存器全部定义为16比特 + - 0x00 控制状态, + + statusCDRErr: 第4比特,表示LVDS总线发生CDR解析错误,写1清零 + + statusCRCErr: 第3比特,表示LVDS总线发生传输CRC错误,写1清零 + + statusLinkErr: 第2比特,表示LVDS总线发生从站掉线,写1清零 + + statusSynch: 第1比特,表示LVDS总线各个从站已经同步,初始化完成时且ctrlSynch为高自动置高,手动将ctrlInit置高时自动置低 + + statusInit: 第0比特,表示LVDS总线已经初始化,初始化完成时自动置高,手动将ctrlInit置高时自动置低 + - 0x01 操作寄存器 + + ctrlTransmit: 第5比特,手动写入1将触发LVDS总线传输,传输完成将自动清零 + + ctrlSynch: 第1比特,手动写入1表示初始化的同时同步所有从站 + + ctrlInit: 第0比特,手动写入1将触发LVDS总线初始化,初始化完成将自动清零 + - 0x02 配置从栈数量(减一): 从站数量当前无法手动配置,初始化过程中将自动检测在线从站数量,并以该数量进行初始化,从站数量将自动写入该寄存器 + - 0x03 离线位置: 当发生从站掉线,该寄存器可读出掉线从站编号 diff --git a/src/main/verilog/backBoardMstTop.v b/src/main/verilog/backBoardMstTop.v index 124ef52..ac65ca0 100644 --- a/src/main/verilog/backBoardMstTop.v +++ b/src/main/verilog/backBoardMstTop.v @@ -12,19 +12,18 @@ module master_top( output lvds_down_dout_p, output lvds_down_dout_n, - input [15:0] io_FSMC_dataIn, - output [15:0] io_FSMC_dataOut, - output io_FSMC_dataOEn, - input io_FSMC_ce, - input io_FSMC_oe, - input io_FSMC_we, - input io_FSMC_adv, + inout [15:0] io_FSMC_AD, - output cdrErr , - output crcErr , - output linkErr + input io_FSMC_cs, + input io_FSMC_rd, + input io_FSMC_wr, + input io_FSMC_adv ); +wire [15:0] io_FSMC_ADIn; +wire [15:0] io_FSMC_ADOut; +wire io_FSMC_ADOEn; + wire clk_400m; wire clk_400m_a; wire clk_100m; @@ -125,12 +124,12 @@ CLKDIV Inst5_CLKDIVC( BackBoardMst i_BackBoardMst( - .io_FSMC_dataIn(io_FSMC_dataIn), - .io_FSMC_dataOut(io_FSMC_dataOut), - .io_FSMC_dataOEn(io_FSMC_dataOEn), - .io_FSMC_ce(io_FSMC_ce), - .io_FSMC_oe(io_FSMC_oe), - .io_FSMC_we(io_FSMC_we), + .io_FSMC_ADIn (io_FSMC_ADIn), + .io_FSMC_ADOut(io_FSMC_ADOut), + .io_FSMC_ADOEn(io_FSMC_ADOEn), + .io_FSMC_cs(io_FSMC_cs), + .io_FSMC_rd(io_FSMC_rd), + .io_FSMC_wr(io_FSMC_wr), .io_FSMC_adv(io_FSMC_adv), .reset(~rst_n), @@ -142,16 +141,21 @@ BackBoardMst i_BackBoardMst( .io_ides_fclk(clk_400m_a), .io_lvds_down_dout(lvds_down_dout), - .io_lvds_up_din(lvds_up_din), - - .io_cdrErr (cdrErr), - .io_crcErr (crcErr), - .io_linkErr(linkErr) + .io_lvds_up_din(lvds_up_din) ); - + generate + for( genvar i = 0; i < 16; i = i + 1 ) begin + IOBUF uut( + .O(io_FSMC_ADIn[i]), + .IO(io_FSMC_AD[i]), + .I(io_FSMC_ADOut[i]), + .OEN(~io_FSMC_ADOEn) + ); + end + endgenerate endmodule