FSMC跑测试
This commit is contained in:
@@ -109,13 +109,13 @@ class BackBoardMstBase extends Module{ //10M
|
|||||||
|
|
||||||
trait BackBoardMstFSMC{ this: BackBoardMstBase =>
|
trait BackBoardMstFSMC{ this: BackBoardMstBase =>
|
||||||
|
|
||||||
val isRegRefleshFlip = withClockAndReset( io.ides_pclk.asClock, reset ){ RegInit(false.B) }
|
val isRegRefleshFlip = withClockAndReset( io.ides_pclk.asClock, reset ){ RegInit(false.B) } //100M
|
||||||
val wrRegAddr = withClockAndReset( io.ides_pclk.asClock, reset ){ Reg(UInt(10.W)) }
|
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)) }
|
val wrRegData = withClockAndReset( io.ides_pclk.asClock, reset ){ Reg(UInt(16.W)) } //100M
|
||||||
|
|
||||||
withClockAndReset( io.ides_pclk.asClock, reset ){//100M
|
withClockAndReset( io.ides_pclk.asClock, reset ){//100M
|
||||||
mirrorDown.io.clockw := io.ides_pclk.asBool
|
mirrorDown.io.clockw := io.ides_pclk.asBool //100M
|
||||||
mirrorUp.io.clockr := io.ides_pclk.asBool
|
mirrorUp.io.clockr := io.ides_pclk.asBool //100M
|
||||||
|
|
||||||
val fsmcCSSync = ShiftRegisters( io.FSMC.cs, 3, false.B, true.B )
|
val fsmcCSSync = ShiftRegisters( io.FSMC.cs, 3, false.B, true.B )
|
||||||
val fsmcRDSync = ShiftRegisters( io.FSMC.rd, 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.enw := isAccessSRAM & ~fsmcCSWRSync(2) & fsmcCSWRSync(1)
|
||||||
mirrorDown.io.addrw := activeAddr
|
mirrorDown.io.addrw := activeAddr
|
||||||
mirrorDown.io.dataw := io.FSMC.ADIn
|
mirrorDown.io.dataw := io.FSMC.ADIn
|
||||||
@@ -188,9 +189,9 @@ trait BackBoardMstFSMC{ this: BackBoardMstBase =>
|
|||||||
val isChkRegReflesh = RegInit(false.B)
|
val isChkRegReflesh = RegInit(false.B)
|
||||||
|
|
||||||
when( isChkRegReflesh =/= isRegRefleshFlip ){
|
when( isChkRegReflesh =/= isRegRefleshFlip ){
|
||||||
when( wrRegAddr === 1.U ){
|
isChkRegReflesh := ~isChkRegReflesh
|
||||||
ctrlTransmit := wrRegData.extract(5)
|
|
||||||
|
|
||||||
|
when( wrRegAddr === 0.U ){
|
||||||
when( wrRegData.extract(4) ){
|
when( wrRegData.extract(4) ){
|
||||||
statusCDRErr := false.B
|
statusCDRErr := false.B
|
||||||
}
|
}
|
||||||
@@ -200,9 +201,22 @@ trait BackBoardMstFSMC{ this: BackBoardMstBase =>
|
|||||||
when( wrRegData.extract(2) ){
|
when( wrRegData.extract(2) ){
|
||||||
statusLinkErr := false.B
|
statusLinkErr := false.B
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
when( wrRegAddr === 1.U ){
|
||||||
|
ctrlTransmit := wrRegData.extract(5)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctrlSynch := wrRegData.extract(1)
|
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 ){
|
when( lvdsMst.io.closed_loop_err ){
|
||||||
slvOffLine := lvdsMst.io.link_err_location(5,0)
|
slvOffLine := lvdsMst.io.link_err_location(5,0)
|
||||||
statusLinkErr := true.B
|
statusLinkErr := true.B
|
||||||
statusSynch := false.B
|
|
||||||
statusInit := false.B
|
|
||||||
}
|
}
|
||||||
|
|
||||||
when( lvdsMst.io.upstream_cdr_err ){
|
when( lvdsMst.io.upstream_cdr_err ){
|
||||||
statusCDRErr := true.B
|
statusCDRErr := true.B
|
||||||
ctrlTransmit := false.B
|
|
||||||
}
|
}
|
||||||
|
|
||||||
when( lvdsMst.io.upstream_crc_valid & lvdsMst.io.upstream_crc_err ){
|
when( lvdsMst.io.upstream_crc_valid & lvdsMst.io.upstream_crc_err ){
|
||||||
statusCRCErr := true.B
|
statusCRCErr := true.B
|
||||||
ctrlTransmit := false.B
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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个上行寄存器(只读)
|
* 总线上最多允许挂载64个从站,每个从站有8bits*32个下行寄存器(只写),8bits*32个上行寄存器(只读)
|
||||||
* 当地址线第10比特为低时,FSMC访问(只读或者只写)从站镜像寄存器(以8比特形式组织),理论上地址空间支持64个从站,当前要求只访问前32个从站
|
* 当地址线第11比特(AD[10])为低时,FSMC访问(只读或者只写)从站镜像寄存器(以8比特形式组织),
|
||||||
- 通过16比特写用户接口 0x00 ~ 0x07, 可以将数据同步写入到从站0的16个下行寄存器(只写)中,后续从站地址按序分配
|
- 通过16比特写用户接口 0x00 ~ 0x1F, 可以将数据同步写入到从站0的16个下行寄存器(只写)中,后续从站地址按序分配
|
||||||
- 通过16比特读用户接口 0x00 ~ 0x07, 可以将数据同步写入到从站0的16个上行寄存器(只读)中,后续从站地址按序分配
|
- 通过16比特读用户接口 0x00 ~ 0x1F, 可以将数据同步写入到从站0的16个上行寄存器(只读)中,后续从站地址按序分配
|
||||||
* 当地址线第10比特为高时,FSMC通过地址9到0比特访问(可读可写)主站寄存器全部定义为16比特
|
* 当地址线第11比特(AD[10])为高时,FSMC通过地址9到0比特访问(可读可写)主站寄存器全部定义为16比特
|
||||||
- 0x00 控制状态,预留
|
- 0x00 控制状态,
|
||||||
- 0x01 配置从栈数量,允许配置(0~31)对应1~32个从站
|
+ 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 离线位置: 当发生从站掉线,该寄存器可读出掉线从站编号
|
||||||
|
|||||||
@@ -12,19 +12,18 @@ module master_top(
|
|||||||
output lvds_down_dout_p,
|
output lvds_down_dout_p,
|
||||||
output lvds_down_dout_n,
|
output lvds_down_dout_n,
|
||||||
|
|
||||||
input [15:0] io_FSMC_dataIn,
|
inout [15:0] io_FSMC_AD,
|
||||||
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,
|
|
||||||
|
|
||||||
output cdrErr ,
|
input io_FSMC_cs,
|
||||||
output crcErr ,
|
input io_FSMC_rd,
|
||||||
output linkErr
|
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;
|
||||||
wire clk_400m_a;
|
wire clk_400m_a;
|
||||||
wire clk_100m;
|
wire clk_100m;
|
||||||
@@ -125,12 +124,12 @@ CLKDIV Inst5_CLKDIVC(
|
|||||||
|
|
||||||
|
|
||||||
BackBoardMst i_BackBoardMst(
|
BackBoardMst i_BackBoardMst(
|
||||||
.io_FSMC_dataIn(io_FSMC_dataIn),
|
.io_FSMC_ADIn (io_FSMC_ADIn),
|
||||||
.io_FSMC_dataOut(io_FSMC_dataOut),
|
.io_FSMC_ADOut(io_FSMC_ADOut),
|
||||||
.io_FSMC_dataOEn(io_FSMC_dataOEn),
|
.io_FSMC_ADOEn(io_FSMC_ADOEn),
|
||||||
.io_FSMC_ce(io_FSMC_ce),
|
.io_FSMC_cs(io_FSMC_cs),
|
||||||
.io_FSMC_oe(io_FSMC_oe),
|
.io_FSMC_rd(io_FSMC_rd),
|
||||||
.io_FSMC_we(io_FSMC_we),
|
.io_FSMC_wr(io_FSMC_wr),
|
||||||
.io_FSMC_adv(io_FSMC_adv),
|
.io_FSMC_adv(io_FSMC_adv),
|
||||||
|
|
||||||
.reset(~rst_n),
|
.reset(~rst_n),
|
||||||
@@ -142,16 +141,21 @@ BackBoardMst i_BackBoardMst(
|
|||||||
.io_ides_fclk(clk_400m_a),
|
.io_ides_fclk(clk_400m_a),
|
||||||
|
|
||||||
.io_lvds_down_dout(lvds_down_dout),
|
.io_lvds_down_dout(lvds_down_dout),
|
||||||
.io_lvds_up_din(lvds_up_din),
|
.io_lvds_up_din(lvds_up_din)
|
||||||
|
|
||||||
.io_cdrErr (cdrErr),
|
|
||||||
.io_crcErr (crcErr),
|
|
||||||
.io_linkErr(linkErr)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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
|
endmodule
|
||||||
|
|||||||
Reference in New Issue
Block a user