简介
框架图
本章节主要针对MIG读写做详细介绍,首先创建BLOCK DESIGN,工程连接如下图所示:
MIG IP介绍
DATAMOVER的配置这里不再做介绍,结合上篇文章讲到DATAMOVER对BRAM进行读写操作,这里通过AXI桥再加一个MIG模块,MIG模块的配置和说明如下:
1、Clock Period:设置DDR3的IO时钟频率,根据开发板上实际DDR3支持的最大时钟频率进行设置,MT41K256M16TW-107IT最大支持933MHz的接口时钟,本次设计设置为400MHz的数据时钟。
2、PHY to Controller Clock Ratlo:FPGA给DDR3芯片提供的时钟频率为Clock Period,但是FPGA内部其余模块的时钟一般是运行不到Clock Period这么高的时钟频率的,所以需要给FPGA内部提供一个较低的时钟,这个参数就是用来设置DDR3接口时钟与MIG IP提供给FPGA内部其他模块的时钟(ui_clk)频率比值。本次设计的比值固定为4:1。由于ui_clk与DDR3接口时钟频率比值为1:4,ui_clk时钟为100MHz,可以作为系统时钟工作。
3、Vccaux_io:设置bank的供电电压,一般都是锁死的,会根据DDR3时钟频率变化而变化。
4、Memory Type:一般选择Components即可,其余几种可能与内存条有关。
5、Memory Part:选择DDR3的型号,芯片类型不同会涉及具体的DDR3时序参数不同以及地址线和数据线的位数不同。
6、Memory Voltage:选择芯片引脚的电平标准,DDR3一般只有1.5V和1.35V两种,根据原理图选择支持的电平的类型即可。本次设计选用1.35V。
7、Data Width:DDR3读写数据位宽,根据原理图选择DDR3位宽。本次设计将位宽设置为64。
8、ECC:数据线多余72为才能使用的功能。
9、Data Mask:启用之后,可以通过一个掩膜信号去控制DDR3写入数据,本质就是去控制DDR3的DM引脚,一般也不会使用此功能。
10、Number of Bank Machies:选择bank数量,DDR3虽然有8个bank,但是如果不需要全部使用时,可以只选择部分bank,降低功耗,节约资源,默认使用4个bank。
11、ORDERING:DDR控制器调度命令的顺序的配置,当选择strict时,严格按照命令先后顺序执行;选择normal时,为了得到更高的效率,可能对命令重排序。
Data Width:表示axi_full接口读写数据的位宽。
Arbitration Scheme:仲裁机制,由于DDR3芯片只有一组数据,而axi_full的读、写接口支持同时传输数据。当选用“TDM”时,读、写操作同时到达时,将交替进行。由于MIG IP自带仲裁机制,用户侧就不需要再考虑读写仲裁问题。
Narrow Burst设置位0即可。
1.Input Clock Period:MIG IP 核的系统输入时钟周期,该时钟一般由晶振直接提供,本设计输入200MHz差分时钟信号;
2.Read Burst Type and Length:突发类型选择,突发类型有顺序突发和交叉突发两种,选择顺序突发(Sequential),其突发长度固定为 8。
3.Output Driver Impdance Control:输出阻抗控制。选择 RZQ/7。
4.RTT:终结电阻,可进行动态控制。选择 RZQ/4。
5.Controller Chip Select Pin:片选管脚引出使能。选择 enable,表示把片选信号 cs#引出来,由外部控制
6.BANK_ROW_COLUMN:寻址方式选择。BRC这种映射方式,用的最多。其优点是,功耗低;
RBC的优点是适合数据流方式去访问数据,性能好。
System Clock
选择时钟类型(Single-Ended, Differential, 或 No Buffer)sys_clk信号对。这里选择外部时钟输入。
Reference Clock
此选项选择时钟类型(Single-Ended, Differential, No Buffer 或 Use System Clock)的clk_ref信号对。
Use System Clock选项只在当系统时钟为199MHz~201MHz时可选。参考时钟频率基于数据速率,IP核添加了一个MMCM来创建高于1,333 Mb/s的ref_clk频率。当选择No Buffer选项时,IBUF原语不会在RTL代码中实例化,也不会为参考时钟分配引脚。
System Reset Polarity
选择复位信号的有效极性。
Debug Signals Contorl
选择此选项将使校准状态和用户端口信号被端口映射到example_top模块中的ILA和VIO。这有助于使用Vivado Design Suite调试特性监控用户界面端口上的数据流。
可选可不选。
Sample Data Depth
该选项为Vivado调试逻辑中使用的ILA模块选择Sample Data深度。当存储器控制器的调试信号选项为ON时,可以选择此选项。
Internal Vref
内部VREF可以用于数据组字节,以允许使用VREF引脚进行正常的I/O使用。内部VREF应该只用于800Mb/s或以下的数据速率。所以我们勾选不了。
IO Power Reduction
该选项通过在控制器处于空闲状态时自动禁用DQ和DQS ibuf来降低平均I/O功耗。
XADC Instantiation
当启用时,该选项指示MIG核心实例化XADC和温度轮询电路的温度监视器功能。如果已经在设计的其他地方使用了XADC,则可以禁用此选项。在这种情况下,必须定期采样设备温度,并将其驱动到存储器接口顶级用户设计模块中的device_temp_i总线上。如果device_temp_i信号未连接,则实例化XADC。否则将不实例化XADC。
设置DDR3的引脚信息,这里不做详细描述。
选择输入时钟的引脚,一般DDR3输入引脚是有要求的。
到这里DDR3 MIG设置基本完毕。
地址映射
以上BD连接完后需要做地址映射,当前映射设置如下:
代码驱动
MIG产生系统时钟输出,基于上一章节DATAMOVER驱动做再做简单更改,更改完毕后驱动可以完成对BRAM/MIG的读写功能,激励代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/10/09 11:44:57
// Design Name:
// Module Name: ddr_rw_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module ddr_rw_test(
input sys_clk,
input sys_rst_n,
output reg[22:0] w_data_length,
output reg[31:0] w_bram_addr,
output reg [127:0]s_axis_tdata,
output reg s_axis_tvalid,
input s_axis_tready,
output reg s_axis_tlast,
(* MARK_DEBUG="true" *)input init_calib_complete,
output reg[31:0] rd_bram_addr,
output reg[22:0] rd_data_length,
(* MARK_DEBUG="true" *)output reg rd_bram_en
);
reg[31:0] delay_cnt;
endmodule
w_bram_addr/rd_bram_addr地址设置可实现BRAM/MIG的读写操作。
例如对BRAM做读写仿真,更改ddr_rw_test代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/10/09 11:44:57
// Design Name:
// Module Name: ddr_rw_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module ddr_rw_test(
input sys_clk,
input sys_rst_n,
output reg[22:0] w_data_length,
output reg[31:0] w_bram_addr,
output reg [127:0]s_axis_tdata,
output reg s_axis_tvalid,
input s_axis_tready,
output reg s_axis_tlast,
(* MARK_DEBUG="true" *)input init_calib_complete,
output reg[31:0] rd_bram_addr,
output reg[22:0] rd_data_length,
(* MARK_DEBUG="true" *)output reg rd_bram_en
);
reg[31:0] delay_cnt;
endmodule
仿真
仿真结果如下:
DATAMOVER输出;
以上是AXI4写操作;
DATAMOVER返回值如下:
MIG的访问和BRAM一样,只需对映射地址做修改即可,这里不做详细介绍。
如需代码和问题可以联系我