1.认识顶层文件example_top.v
打开顶层文件example_top.v
下图为各种参数设定,有bank、column、rank等参数设置(其实你不用动他们,这些都是之前选好的,不记得自己选了什么?乖乖!不如再翻翻DDR3 IP 核配置?)
下图为DDR的各种接口;
column和row地址是在ddr3_addr里面复用的,column一般是10bit宽度,row一般是14-16bit宽度;
ddr3_ba是选bank的,一般是3bit宽度,对应8个bank;
下图为各种参数配置,相互之间的关系换算等(作为设计者不要管他)
下图为各种wire定义(你有兴趣研究码?我是没兴趣!)
下图为DDR3例化实体
只需要改动下面几个参数(具体后边介绍):
.app_addr (app_addr),
.app_cmd (app_cmd),
.app_en (app_en),
.app_wdf_data (app_wdf_data),
.app_wdf_end (app_wdf_end),
.app_wdf_wren (app_wdf_wren),
下图为Traffic gen实例化和traffic gen相关参数(对设计没用,不管他)
以上就是example_top.v工程的顶层文件内容,在整个设计中,需要你改动的就只有example_top.v,而且只有以下几个port;
.app_addr (app_addr),
.app_cmd (app_cmd),
.app_en (app_en),
.app_wdf_data (app_wdf_data),
.app_wdf_end (app_wdf_end),
.app_wdf_wren (app_wdf_wren),
2.用户接口管脚
app_addr 操作地址,按照结构从高位到低位是 rank bank row column
app_cmd 操作命令,其实你只需要用到3‘b000(写入命令)和3’b001(读出命令)
app_en 操作地址app_addr的使能,只有使能拉高时,app_addr才有效
app_wdf_data 写入数据接口
app_wdf_end 实际中和app_wdf_wren一样(app_wdf_end=app_wdf_wren即可)
app_wdf_wren 写入数据接口app_wdf_wren的使能,拉高时,app_wdf_data才有效
以上6个信号就是需要你通过编写程序的用户接口信号;
3.DDR3时序分析
写数据时序图
app_rdy :在app_rdy拉高的时候拉高app_en,地址app_addr才有效;
app_wdf_rdy:在app_wdf_rdy拉高的时候拉高app_wdf_wren,写入数据app_wdf_data才有效;
所以写入数据是两系统:一是地址,二是数据
- 地址内容是app_addr,它在app_rdy(DDR控制)和app_en(设计者自己控制)同时拉高的时候才有效;
- 数据内容是app_wdf_data,它在app_wdf_rdy(DDR控制)和app_wdf_wren(设计者自己控制)同时拉高时才有效;
这两套系统在时序上对齐,就可以成功将数据写入DDR;
其实,两系统不对齐也是ok的,如下图,1是严格对齐,2和3说明早写入和晚写入也是ok的;具体可以参考:DDR3读写数据
读数据时序图
app_rd_data:读数据
app_rd_data_valid读数据使能
同样,在app_rdy和app_en拉高的时候才有效;
END