前言
近期完成了 FPGA DDR4 内存读写控制开发,本文总结基础内容,重点讲解 DDR4 控制 IP 核 MIG 的控制信号。
主要参考文档:Xilinx PG150 Ultrascale Memory IP User Guide.
MIG IP 核控制信号
IP 核创建界面
MIG IP 核(Memory Interface Generator)是用户与 DDR4 进行沟通的桥梁。直接编写 DDR4 代码复杂度极高且性能难以保证。以 Xilinx 提供的 MIG IP 核为例,综合布线后约使用 7500 个 LUT 和 9000 个 Register 资源。普通用户只需操作 MIG 提供的用户接口即可。


需特别注意 Burst Length 参数。在固定 Burst Length=8 的 DDR4 芯片中,给定地址 ADDR 并启动传输后,DDR4 会同时将 Burst Length * Data Width 大小的数据传送到数据总线。实际传输地址范围为 ADDR ~ ADDR + Burst Length - 1。例如地址 ADDR=0,读指令发出后,在 8*16=128 位的数据总线上得到 0~7 这些地址单元的数据。因此顺序读写时,每次给控制器的地址均以 8 为步进。
IP 核控制信号
PG150 文档给出了用户接口的所有控制信号。


图中标黄信号分为四类:全局接口、命令接口、写接口、读接口。
全局接口

三个全局接口分别代表用户时钟、校准完成指示、与用户时钟同步的复位信号。所有用户接口逻辑必须等到校准完成信号拉高后才能进行。
命令接口
命令接口用于指示 DDR 接受读取或写入命令及类型。

以读命令为例:将 app_cmd 设为 3'b001,等待 app_rdy 拉高表示 DDR 就绪,然后拉高 app_en 并给出地址 app_addr。若干周期后,数据连同有效信号出现。

一次成功的命令传输时序如下:

注意只有三个周期的最后一个周期命令才被写入 IP 核,此时 app_rdy 才拉高。app_autoprecharge 信号通常不操作,除非在 IP 核设置中额外启用以提高同一 Bank 内读写效率。
写接口

- app_wdf_data:写数据总线。
- app_wdf_rdy:写操作的就绪信号。仅当 app_rdy 和 app_wdf_rdy 同时为高时,写命令有效。
- app_wdf_wren:拉高表示当前数据总线数据为待写入数据。
- app_wdf_mask:屏蔽位。被写入为 1 的字节不会被写入 DDR。对于位宽 16、Burst Length 8 的 DDR,一次传输 128 位(16 字节),mask 大小为 16bit。
- app_wdf_end:表示当前时钟周期是写入数据的最后一周期。若分频比为 1:4,每个用户时钟周期进行一次完整 Burst 传输,则 app_wdf_end 与 app_wdf_wren 一起拉高。
写数据时序有两种:
- 非背靠背(单次写入):给出写命令的前一个到后两个周期给出写控制信号及数据。app_wdf_wren 和 app_wdf_en 一同拉高时,该周期数据总线上的数据才会被写入;app_en 拉高的周期地址和控制命令才会被写入。

- 背靠背写入:与非背靠背相比仅在连续性上不同。app_en 信号和 app_wdf_wren 以及 app_wdf_end 信号对其。在 app_rdy 以及 app_wdf_rdy 为高时一起拉高即可实现写入。

读接口

读接口无需额外控制,操作命令接口即可。DDR 读数据延迟较大,给出读指令后需多个时钟周期数据和有效标识才会出现。data_valid 会和有效的读出数据一起出现。
两种读操作时序如下:

除上述四组接口外,还有部分_ref 或_req 信号未使用。需注意 app_hi_pri 信号,PG150 中描述保留且置为 0。
总结
通过上述时序分析,MIG 操作时序并不复杂,但代码编写注意点较多。MIG IP 核用户逻辑工作在高时钟下,例如 DDR 工作时钟 1200MHz,用户时钟 300MHz。若对 ADC 进行数据采集并存入 DDR,FIFO 是必不可少的。跨时钟域数据传输中,FIFO 的复杂操作是主要难点。


