IP 配置


Basic

1000
1000

选项 说明
// Mode and Interface
Controller/PHY Mode 选择例化类型
AXI4 Interface 使用 AXI4 接口作为控制器的读写接口,默认:Native接口
// Clocking
Memory Device Interface Speed I/O 采样时钟频率,对应 DDR 数据传输速率的一半
PHY to Controller clock frequency ratio PHY 时钟与控制器时钟频率比
Reference Input Clock Speed 提供给 DDR4 控制器的参考时钟
// Controller Options
Enable Custom Parts Data File 如果 IP 提供的 Memory Part 没有当前使用的型号,则勾选后可自定义 DDR 参数
Custom Parts Data File 添加自定义的 CSV 配置文件
Configuration 内存类型,如市场上常见的 DDR 类型是 DIMM
Memory Part DDR 型号
Slot
IO Memory Voltage 供电电压
Data Width DDR 的数据位宽
Data Mask and DBI
Memory Address Map 逻辑地址与物理地址的映射关系,具体描述见 PG150 — 119页
Ordering
// Memory Options
Burst Length 与所选的DDR器件相关
Cas Latency 同上
Cas Write Latency 同上
Clamshell Topology 同上

AXI Options

1000

选项 说明
Data Width AXI 接口的数据位宽
Arbitration Scheme 读写仲裁调度
ID Width
Address Width AXI 地址位宽
AXI Narrow Burst

Advanced Clocking

1000

  • Reference Input Clock Configuration:选择输入参考时钟的类型,如差分时钟输入
  • Additional Clock Outputs:可额外生成4个时钟输出,具体用途还不清楚

Advanced Options

1000

选项 说明
Debug Signals for control 生成 Debug 信号
Microblaze MCS ECC
Simulation Mode

Native接口

实例化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
DDR4_MIG                             U_DDR4_MIG (
.c0_sys_clk_p ( c0_sys_clk_p ),
.c0_sys_clk_n ( c0_sys_clk_n ),
.sys_rst ( sys_rst ),
.c0_init_calib_complete ( c0_init_calib_complete ),
.dbg_clk ( dbg_clk ),
.dbg_bus ( dbg_bus ),
//----------------------- DDR4-Pin ---------------------------
.c0_ddr4_adr ( c0_ddr4_adr ),
.c0_ddr4_ba ( c0_ddr4_ba ),
.c0_ddr4_cke ( c0_ddr4_cke ),
.c0_ddr4_cs_n ( c0_ddr4_cs_n ),
.c0_ddr4_dm_dbi_n ( c0_ddr4_dm_dbi_n ),
.c0_ddr4_dq ( c0_ddr4_dq ),
.c0_ddr4_dqs_c ( c0_ddr4_dqs_c ),
.c0_ddr4_dqs_t ( c0_ddr4_dqs_t ),
.c0_ddr4_odt ( c0_ddr4_odt ),
.c0_ddr4_bg ( c0_ddr4_bg ),
.c0_ddr4_reset_n ( c0_ddr4_reset_n ),
.c0_ddr4_act_n ( c0_ddr4_act_n ),
.c0_ddr4_ck_c ( c0_ddr4_ck_c ),
.c0_ddr4_ck_t ( c0_ddr4_ck_t ),
.c0_ddr4_ui_clk ( c0_ddr4_ui_clk ),
.c0_ddr4_ui_clk_sync_rst ( c0_ddr4_ui_clk_sync_rst ),
//----------------- Native User Interface --------------------
.c0_ddr4_app_en ( c0_ddr4_app_en ),
.c0_ddr4_app_hi_pri ( c0_ddr4_app_hi_pri ),
.c0_ddr4_app_wdf_end ( c0_ddr4_app_wdf_end ),
.c0_ddr4_app_wdf_wren ( c0_ddr4_app_wdf_wren ),
.c0_ddr4_app_rd_data_end ( c0_ddr4_app_rd_data_end ),
.c0_ddr4_app_rd_data_valid ( c0_ddr4_app_rd_data_valid ),
.c0_ddr4_app_rdy ( c0_ddr4_app_rdy ),
.c0_ddr4_app_wdf_rdy ( c0_ddr4_app_wdf_rdy ),
.c0_ddr4_app_addr ( c0_ddr4_app_addr ),
.c0_ddr4_app_cmd ( c0_ddr4_app_cmd ),
.c0_ddr4_app_wdf_data ( c0_ddr4_app_wdf_data ),
.c0_ddr4_app_wdf_mask ( c0_ddr4_app_wdf_mask ),
.c0_ddr4_app_rd_data ( c0_ddr4_app_rd_data )
);
信号 方向 说明
// 命令通道
c0_ddr_app_rdy 输出 命令就绪
c0_ddr_app_en 输入 命令有效,高电平有效
c0_ddr_app_cmd 输入 命令 write:000、read:001、wr_bytes:011
c0_ddr_app_addr 输入 命令地址
// 写数据通道
c0_ddr_app_wdf_rdy 输出 写数据就绪
c0_ddr_app_wdf_wren 输入 写数据使能
c0_ddr_app_wdf_end 输入 写数据结束
c0_ddr_app_wdf_mask 输入 写数据掩码。对字节进行操作,高电平数据无效
c0_ddr_app_wdf_data 输入 写数据
// 读数据通道
c0_ddr_app_rd_data_vld 输出 读数据有效
c0_ddr_app_rd_data_end 输出 读数据结束
c0_ddr_app_rd_data 输出 读数据

写时序

800

读时序

800

地址位宽计算
16GB的DDR,64bit的数据位宽
那么因为8n的预取技术,他能做到512bit的数据位宽
那么只需要 16GB / 64bit = 231
只需要31bit的地址

那么实际上,addr[31:3]才是512bit的写入地址,addr[2:0]是组成512bit的8个64bit的地址
使用地址时,每次 + 8

AXI-full 接口

实例化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
DDR4_MIG                             U_DDR4_MIG (
.c0_sys_clk_p ( c0_sys_clk_p ),
.c0_sys_clk_n ( c0_sys_clk_n ),
.sys_rst ( sys_rst ),
.c0_init_calib_complete ( c0_init_calib_complete ),
.dbg_clk ( dbg_clk ),
.dbg_bus ( dbg_bus ),
//----------------------- DDR4-Pin ---------------------------
.c0_ddr4_adr ( c0_ddr4_adr ),
.c0_ddr4_ba ( c0_ddr4_ba ),
.c0_ddr4_cke ( c0_ddr4_cke ),
.c0_ddr4_cs_n ( c0_ddr4_cs_n ),
.c0_ddr4_dm_dbi_n ( c0_ddr4_dm_dbi_n ),
.c0_ddr4_dq ( c0_ddr4_dq ),
.c0_ddr4_dqs_c ( c0_ddr4_dqs_c ),
.c0_ddr4_dqs_t ( c0_ddr4_dqs_t ),
.c0_ddr4_odt ( c0_ddr4_odt ),
.c0_ddr4_bg ( c0_ddr4_bg ),
.c0_ddr4_reset_n ( c0_ddr4_reset_n ),
.c0_ddr4_act_n ( c0_ddr4_act_n ),
.c0_ddr4_ck_c ( c0_ddr4_ck_c ),
.c0_ddr4_ck_t ( c0_ddr4_ck_t ),
.c0_ddr4_ui_clk ( c0_ddr4_ui_clk ),
.c0_ddr4_ui_clk_sync_rst ( c0_ddr4_ui_clk_sync_rst ),
//---------------- AXI4-Full User Interface ------------------
.c0_ddr4_aresetn ( c0_ddr4_aresetn ),
//Write Address Channel
.c0_ddr4_s_axi_awid ( c0_ddr4_s_axi_awid ),
.c0_ddr4_s_axi_awaddr ( c0_ddr4_s_axi_awaddr ),
.c0_ddr4_s_axi_awlen ( c0_ddr4_s_axi_awlen ),
.c0_ddr4_s_axi_awsize ( c0_ddr4_s_axi_awsize ),
.c0_ddr4_s_axi_awburst ( c0_ddr4_s_axi_awburst ),
.c0_ddr4_s_axi_awlock ( c0_ddr4_s_axi_awlock ),
.c0_ddr4_s_axi_awcache ( c0_ddr4_s_axi_awcache ),
.c0_ddr4_s_axi_awprot ( c0_ddr4_s_axi_awprot ),
.c0_ddr4_s_axi_awqos ( c0_ddr4_s_axi_awqos ),
.c0_ddr4_s_axi_awvalid ( c0_ddr4_s_axi_awvalid ),
.c0_ddr4_s_axi_awready ( c0_ddr4_s_axi_awready ),
//Write Data Channel
.c0_ddr4_s_axi_wdata ( c0_ddr4_s_axi_wdata ),
.c0_ddr4_s_axi_wstrb ( c0_ddr4_s_axi_wstrb ),
.c0_ddr4_s_axi_wlast ( c0_ddr4_s_axi_wlast ),
.c0_ddr4_s_axi_wvalid ( c0_ddr4_s_axi_wvalid ),
.c0_ddr4_s_axi_wready ( c0_ddr4_s_axi_wready ),
//Write Respond Channel
.c0_ddr4_s_axi_bready ( c0_ddr4_s_axi_bready ),
.c0_ddr4_s_axi_bid ( c0_ddr4_s_axi_bid ),
.c0_ddr4_s_axi_bresp ( c0_ddr4_s_axi_bresp ),
.c0_ddr4_s_axi_bvalid ( c0_ddr4_s_axi_bvalid ),
//Read Address Channel
.c0_ddr4_s_axi_arid ( c0_ddr4_s_axi_arid ),
.c0_ddr4_s_axi_araddr ( c0_ddr4_s_axi_araddr ),
.c0_ddr4_s_axi_arlen ( c0_ddr4_s_axi_arlen ),
.c0_ddr4_s_axi_arsize ( c0_ddr4_s_axi_arsize ),
.c0_ddr4_s_axi_arburst ( c0_ddr4_s_axi_arburst ),
.c0_ddr4_s_axi_arlock ( c0_ddr4_s_axi_arlock ),
.c0_ddr4_s_axi_arcache ( c0_ddr4_s_axi_arcache ),
.c0_ddr4_s_axi_arprot ( c0_ddr4_s_axi_arprot ),
.c0_ddr4_s_axi_arqos ( c0_ddr4_s_axi_arqos ),
.c0_ddr4_s_axi_arvalid ( c0_ddr4_s_axi_arvalid ),
.c0_ddr4_s_axi_arready ( c0_ddr4_s_axi_arready ),
//Read Data Channel
.c0_ddr4_s_axi_rready ( c0_ddr4_s_axi_rready ),
.c0_ddr4_s_axi_rlast ( c0_ddr4_s_axi_rlast ),
.c0_ddr4_s_axi_rvalid ( c0_ddr4_s_axi_rvalid ),
.c0_ddr4_s_axi_rresp ( c0_ddr4_s_axi_rresp ),
.c0_ddr4_s_axi_rid ( c0_ddr4_s_axi_rid ),
.c0_ddr4_s_axi_rdata ( c0_ddr4_s_axi_rdata )
);
信号 方向 说明
// 写地址通道
axi_awid 输入 写地址 ID
axi_awaddr 输入 写地址
axi_awlen 输入 写地址突发长度 传输多少个周期
axi_awsize 输入 写地址突发传输大小 每次传输的字节数
axi_awburst 输入 写地址突发类型 00:Fix、01:Incr、02:Wrap(到达地址上限后回到最低地址)
axi_awlock 输入
axi_awcache 输入
axi_awport 输入
axi_awqos 输入
axi_awregion 输入
axi_awuser 输入 用户自定义信号
axi_awvalid 输入 写地址有效
axi_awready 输出 写地址就绪
// 写数据通道
axi_wdata 输入 写数据
axi_wstrb 输入 写数据选通 对字节进行操作,低电平数据无效
axi_wlast 输入 写数据结束
axi_wuser 输入 写数据用户信号 自定义
axi_wvalid 输入 写数据有效
axi_wready 输出 写数据就绪
// 写响应通道
axi_bid 输出 写响应 ID
axi_bresp 输出 写响应
axi_buser 输出 用户自定义信号
axi_bvalid 输出 写响应有效
axi_bready 输入 写响应就绪
// 读地址通道
axi_arid 输入 读地址 ID
axi_araddr 输入 读地址
axi_arlen 输入 读地址突发长度 传输多少个周期
axi_arsize 输入 读地址突发传输大小 每次传输多少 Byte
axi_arburst 输入 读地址突发类型 Fix、Incr、Wrap(到达地址上限后回到最低地址)
axi_arlock 输入
axi_arcache 输入
axi_arprot 输入
axi_arqos 输入
axi_arregion 输入
axi_aruser 输入 用户自定义信号
axi_arvalid 输入 读地址有效
axi_arready 输出 读地址就绪
// 读数据通道
axi_rid 输出 读数据 ID
axi_rdata 输出 读数据
axi_rresp 输出
axi_rlast 输出 读数据结束
axi_ruser 输出 用户自定义信号
axi_rvalid 输出 读数据有效
axi_rready 输入 读数据就绪

588

读事务

800

写事务

800

参考文档


  1. UltraScale Architecture-Based FPGAs Memory IP v1.4