Lattice DDR3 ip 注意事项
-
do ddr3_ip_eval.do 之后报错!
需要将work 的路径手动修改至当前路径下。
=>
终于!
======================== -
为什么app_cmd和datain_rdy不对齐?
难怪cmd和data是不对齐的,cmd和地址对齐。因为cmd发完之后就一直在等ipcore输出相应的使能了,和A家和X家都不一样!
如果datain_rdy拉高,则将数据延迟一拍后打进ipcore的write_data口。
如果read_data_valid拉高,则同拍的数据会被打出在read_data口。========================
-
cmd_burst_cnt为8,什么意思?为什么一次写命令发完之后,会出来16拍64bit数?
Cmd_burst_cnt为突发次数,这里ddr3 ipcore里设定的是8突发, 8(突发次数)*8(突发长度)16(ddr位宽) = 1664
所以这里是16个64bit数。
======================== -
为什么我ddr物理位宽是16位的,但实际ddr ipcore给出来的却是64bit的?
从表中可以,总带宽一定,800M*16bit/200M = 64bit。这其实就是为了降低时钟频率而采取的增加数据位宽的措施。DP ipcore也有类似的概念,dual,quad。
========================
-
可以看到ddr ip的接口是有eclk和sclk, 但是test_mem_ctrl.v 中和仿真模型连接的ddr ip的顶层却只有一个输入时钟,是100M。而公司里用的也是有两个时钟的,懵逼了!
以前公司也用的是有两个时钟的
但是在自带的仿真里边却只看到一个时钟,到底顶层是哪个呢?
其实仿真的顶层是这个文件ddr3_sdram_mem_top_wrapper_ddr3_ip.v
它的模块名字和文件名字还不一样,草!!!
===
ddr3_sdram_mem_top_wrapper_ddr3_ip.v(输入为一个时钟), 中包含ddr3_ip.v(输入为两个时钟)。
公司为什么要把它拿出来呢?
=> 拿出来之后就可以跟外部共用PLL了,不然在ddr3_sdram_mem_top_wrapper_ddr3_ip.v浪费一个PLL========================
-
自己加逻辑,说必须超过200us,才能给复位。但是它自带的测试又不是这样的。
它自带的仿真开始好像发了power相关的cmd, 我仿真是没有发的。
但实际上板不需要发,同样能读能写。========================
-
app_bridge代码中fixed固定为4,否则代码就得改。
========================
-
bridge就是在外边包一层,3家(Xilinx,altera,lattice) 的DDR ipcore 用同一个bridge 接口,那么外部的代码即可通用。
我外部只要发wrreq以及wrlen,wraddr,内部就会自动发app_en,app_cmd,app_addr等,当然还会回一个wrgnt表示当前是否处于忙的状态。
只要内部映射到关系即可。
以写为例。
========================
cmd命令
========================