基于vivado2019的FDMA及DDR3仿真(AXI接口)
前言
之前每次调试内存的代码都要直接下板调试,随着工程越来越大,综合时间太长,十分影响工程进度,所以希望搭建一个能够直接仿真的DDR平台。 用VIVADO自带的MIG 的 example案例来修改,完成了米联客的FDMA的仿真平台。一、VIVADO自带example建立
首先按照各自开发板上的DDR建立对应的MIG核,这里以米联客的XC7K325tffg900为例。
- 在建立MIG核的时候需要注意,对应的memory type要选对,否则例化的MIG、DDR
modle和后续顶层将无法对应。 - 目前网上博客中大部分mig案例都是APP用户模式,而在工程中常用axi接口的模式,资料并不多,所以博主选择axi接口的mig核。
- 生成MIG核后,右键IP,选择open IP Example Design后即可自动生成官方的MIG控制DDR3 model的工程。我们后续只需要在上面进行修改即可。
二、FDMA介绍
- 这里可能很多初学者会有疑问,为什么有MIG核来控制DDR3,还需要FDMA来在外面包一层。因为用户直接操作AXI接口将很麻烦,如果能够只操作少量的信号就能完成AXI接口层的读写操作,那么将大大减少用户的工作量,所以FDMA就显的十分有必要。
- 下面是各关键信号波形变化,和具体表述
信号 | 作用 | 备注 |
---|---|---|
w_fdma_locked | 表示开始一个package写时的状态 | 这里指发送1024个数据之间 |
axi_awvalid | 表示主机允许刷新地址线上的地址 | 这里只保持一个周期的脉冲 |
w_cycle_flag | 表示axi在进行写的时候 | 这里除去了last信号拉高的时间 |
axi_awaddr | 表示写地址 | —— |
axi_wvalid | 表示写数据有效 | 只在w_cycle_flag高且last为低时有效 |
w_word_cnt | 以一次突发长度为最大值记写数据个数 | —— |
wr_data_cnt | 以一个package为最大值记写数据个数 | —— |
axi_wlast | 表示每一个突发结束的最后一个数据 | —— |
w_next | 代表能成功读写的时候 | —— |
三、顶层文件的替换及仿真
- 有了FDMA的顶层和官网实例模板后就可以开始移植了,只需要将example_top换成FDMA的顶层即可,这里需要注意FDMA的复位信号需要从MIG核的ui_clk_sync_rst端口出来,其表示ui_clk稳定状态,否则会影响FDMA一直无法正常工作。
- 除此之外,还需要注意每个MIG核对应的tb的顶层是一一对应的,两者需要同步修改。