ddr3控制器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ddr3控制器
ddr3理论带宽计算:
若最⼤时钟频率400MHZ,数据位宽是16位,也就是16根数据线,ddr是双沿传输,则理论带宽为2*400MHZ*16 = 12800Mbit/s =
1600Mbyte/s = 1.5625Gbyte/s
1:在IP核列表⾥的Memory interface generator可调⽤ddr控制器并对参数进⾏设置
2:对IP核进⾏初始化
在调取 DDR3 SDRAM 控制器之后,并不可以⽴即使⽤该 IP 核完成 DDR3SDRAM 的读和写的,⽽是要在该 IP 核初始化成功之后,才可以进⾏读和写
(1)例化IP核
⾸先建⽴⼀个顶层⽂件,复制IP核的实例化模板到顶层,观察实例化模板会发现有⼀部分信号是以 ddr3 开头的,此类的信号均为DDR3 SDRAM 芯⽚的引脚变量,因此在顶层模块需要将其设置为端⼝变量,我们需要将此类信号写⼊到顶层模块名后⾯的⼩括号内,并设定好输⼊/输出类型,以及变量的位宽。

在我们调取 IP 核之后,会在 Vivado ⼯程⽬录下⽣成⼀个 .\project_1.srcs\sources_1\ip\ddr3_ctrl(ddr3_ctrl 为调取 IP 核的名称)的路径,该路径下⽂件夹内会有三个⼦⽂件夹。

其中,docs 中为该 IP 核相关的⽂档⽂件,⽐如该 IP 核的使⽤⽅法等⽂档都在该⽂件夹中涉及;example_design ⽂件夹中为 Xilinx 官⽅提供的该 IP 核参考⽂件,假如不知道如何使⽤该 IP 核,可以参考该⽂件夹内提供的相关例程(2)仿真测试IP核
在调取 IP 核时,我们已经⽣成了 DDR3 SDRAM 控制器 IP 核的仿真模型⽂件。

打开 example_design ⽂件夹中的sim⽂件夹。

会看到⼀个 ddr3_model.sv ⽂件,该⽂件即为我们的仿真模型⽂件,将该⽂件添加到 Vivado ⼯程的 simulation sources 内,然后将仿真模型
ddr3_model.sv 实例化到 tb ⽂件。

查看 init_calib_complete 波形是否变成⾼电平,若是变成⾼电平,则 DDR3 SDRAM 控制器 IP 核初始化成功,不然则不成功
3:DDR3 Sdram写时序的实现
DDR3 SDRAM控制器IP核主要预留了两组总线,⼀组可以直接绑定到DDR3SDRAM 芯⽚端⼝,⼀组是留给⽤户端使⽤的。

中 IP 核与存储芯⽚之间的总线⼤部分以ddr 作为开头,这部分总线我们只需要在 top 模板设为端⼝即可,⽆需我们控制。

⽤户端与 IP 核之间的总线⼤部分以 app 作为开头,并且从⽤户端输出到 IP 核的信号线需要我们产⽣
如图 1 所⽰的中间部分为我们调取的 IP 核,user FPGA Logic 为⽤户端逻辑,DDR2/DDR3 SDRAM 为存储芯⽚。

其中 IP 核与存储芯⽚之间的总线⼤部分以ddr 作为开头,这部分总线我们只需要在 top 模板设为端⼝即可,⽆需我们控制。

⽤户端与 IP 核之间的总线⼤部分以app 作为开头,并且从⽤户端输出到 IP 核的信号线需要我们产⽣
⾸先通过以 app 为开头的总线实现对 IP写控制操作。

为了更好的了解相关的参数,我们可以登录 Xilinx 官⽹下载 FPGA上DDR3芯⽚的UG⼿册。

通过阅读⼿册了解各个信号的含义和作⽤,以及不同模式读写的时序,突发长度等,
在了解了写命令和写数据的时序及相应关系之后,我们画出写控制模块的框图
当 wr_cmd_start 有效时启动本次的写突发,根据由外部输⼊的 wr_cmd_bl 可以确定本次突发需要写多少数据;wr_cmd_start 有效
时,wr_cmd_addr 代表本次突发写的起始地址,由于 128bit = 8x16bit,因此每个 128bit 数据需要占⽤ 8 个DDR3 SDRAM 的地址,因此每次传⼊⼀个 128bit 的数据,该地址需要加 8;由于该模块只实现写控制,因此 wr_cmd_instr 可以⼀直保持为写状态;可以根据是否需要保持写⼊的数据有效,来调整 wr_cmd_mask 的值;当本次突发写进⾏时,当写⼊⼀个数据,则可以由 data_req 向外界请求⼀个新的输⼊本次突发的数据;
可以由 wr_end 可以告知外界模块,本次突发写结束。

4:读时序的实现
读模块的接⼝与写模块基⼀致。

当 rd_cmd_start 有效时,启动本次的读突发,根据由外部输⼊的 rd_cmd_bl可以确定本次突发需要读出多少数据;rd_cmd_start 有效时,rd_cmd_addr 代表本次突发读的起始地址,由于 128bit = 8x16bit,因此每个 128bit 数据需要读出 8 个DDR3 SDRAM 的地址内数据,因此每发送⼀次 rd_cmd_start,rd_cmd_addr 需要加 8;由于该模块只实现读控制,因此 rd_cmd_instr 可以⼀直保持为读状态;可以由 rd_end 可以告知外界模块,本次突发读结束。

5:读写仲裁模块的实现
在我们实现了 DDR3 控制器 IP 核的读、写之后会发现读和写是共⽤⼀组命令线的,因此读、写需要分时的使⽤IP 核中的命令总线,具体的解决⽅法是:
对于 wr_ctrl 和 rd_ctrl 模块的 app_addr信号,我们可以在不使⽤时将其置为 0,这样我们将 wr_ctrl 和 rd_ctrl 模块的 app_addr 进⾏按位或,结果即为 IP 核的 app_addr。

同理,IP 核的 app_en 也可以通过 wr_ctrl 和 rd_ctrl 模块的 app_en 按位或得到。

对于app_cmd信号,当读模块⼯作时即app_wr_en = 1'b1时,让app_cmd = app_wr_cmd,否则让app_cmd = app_rd_cmd。

下⾯是仲裁模块的状态机和接⼝图。

相关文档
最新文档