DDR3的配置及仿真教程

具体的DDR的内部工作情况以及一些情况,在之前的博客写过了。

这系列博客主要是调用MIG(Memory Interface Solution) IP对DDR的控制使用,MIG由三部分组成User Interface Block 、Memory controller 和Physical Layer。IP的一边是连接DDR3的接口(Physical interface)。另一半是用户逻辑控制接口(User FPGA Logic)。想要正确的控制DDR3的读写,需要正确的设置MIG和正确的用户逻辑控制接口逻辑。

DDR3的内部结构
在这里插入图片描述
接口信息:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

MIG介绍
在这里插入图片描述

MIG user interface
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

一、DDR3的用户端时序的了解以及时钟的分析

在进行创建之前,先对从用户端到MIG再到DDR3之间的时钟进行讨论分析下。
DDR3的工作时钟是由IP核产生给DDR3的CLOCK引脚的(DDR3的工作时钟)。

IP核给用户的端的时钟一般是2:1或者4:1.(用户的工作时钟)
4:1 表示在DDR3工作时钟400M情况下用户时钟为100M
2:1 表示在DDR3工作时钟400M的情况下用户时钟为200M

1:2 和1:4 区别就是用户时钟会降低 时序好过 但是对外数据接口会翻倍 浪费ram

ref_clk(参考时钟)是固定的200M,用来IO校准的,如果系统时钟恰好是200M,那么两个就可以共用了。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

里面有三个时钟:
(1)第一个时钟:是clock period,这个时钟功能是所有控制器的工作频率,频率模块受所选FPGA和器件速度等级等因素的限制,也就是对应上图的的ddr3_clk,控制器的时钟频率和用户的时钟频率,2:1会降低最大存储器接口频率,2:1比例的用户界面数据总线宽度是物理存储器接口宽度的4倍。而4:1比率的总线宽度是物理存储器接口宽度的八倍。 2:1比率具有较低的延迟。 4:1的比率是最高数据速率所必需的)4:1。
在这里插入图片描述
(2)第二个时钟,是给到MIG的时钟,就是对应的上面的syc_clk不一定是板子上的时钟因为板子上的时钟总是某个特定的值,这个值在芯片所承受的时钟范围之内,假设某款FPGA的工作频范围是100M-533M,而我板子上的晶振为100M,但是此时此处的sys_clk就还可以选择300M、400M等。当然需要通过锁相环来实现。这里最好还是采用板子上的晶振时钟,一般的都为200M。

在这里插入图片描述
(3)第三个时钟,如下图所示:此处选择的是输入到MIG的时钟类型(单端、差分或者否),只有用的官方的板子才选择NO-BUFF。第二个选项:参考时钟–该选项选择时钟类型(单端,差分,否对clk_ref信号对进行缓冲或使用系统时钟)。使用系统时钟选项当输入频率在199和201 MHz之间时(即输入时钟)出现周期介于5,025 ps(199 MHz)和4,975 ps(201 MHz)之间。参考时钟,当然当我们选择的这个参考时钟不是200M的时候(这个始终就是共MIG内部的iodelay使用的),我们要参考vivado给出的例子,看例子里面是怎么给的时钟。此处如果选的是单端或者差分,那么在生成例化文件的时候,就会多出几个参考适中的端口给你要时钟,这个时候参考例程,将输入的系统时钟通过PLL来产生相应的时钟。
在这里插入图片描述
IP核引脚说明

在这里插入图片描述在这里插入图片描述
时序分析
写时序分析
在这里插入图片描述
数据比command早一点或晚一点写入都是可以的。
因为command和data都有各自的FIFO,因此需要同步的,换句话说,如果设计对着controller的User Interface,并且和目前的机制一样,command和data都有FIFO,那么简单,会鞥见command FIFO的新命令,对于取一个data FIFO中的写入数据,不管谁先被送到各自的FIFO中。
command FIFO有命令是data FIFO取数据的先决条件。command要关注接口app_cmd、app_addr、app_en、app_rdy。这里写数据则需要关注接口app_wdf_data、app_wdf_wren、add_wdf_end、app_wdf_rdy。

先说app_wdf_end,DDR3实际读写的Burst=8,DDR3的数据位宽为16bit,Burst
为8,就是说每次对DDR3执行读写必须是连续的8*16 bit数据。那么在User Interface这段,如果逻辑时钟为DDR3时钟的4分频,且数据位宽为128bit,那么单个时钟周期就对应Burst=8的一次读写操作。如果数据位宽为64bit,那么必须执行2次是即开操作才能完成一次Burst=8的读写。对于前者,app_wdf_end始终为1就可以了。对于后者,app_wdf_end每写2个数据是在周期内,前一次拉低,后一次拉高。

余下三个信号app_wdf_data、app_wdf_wren和app_wdf_rdy,工作原理就和command时序类似。app_wdf_data有效,且app_wdf_wren拉高,必须app_wdf_rdy也为高,才表示当前数据写入DDR3控制器。
在这里插入图片描述
执行写数据command和执行写数据操作,是一一对应的,虽然控制时序可以分开实现。

读时序分析
每个数据的读操作,也需要先有读command的发起,当有效读command发起后,若干个时钟周期之后,app_rd_data_valid拉高,此时app_rd_data有效,用户逻辑据此读出数据即可。对于连续读也是一样的,User Interface可以送一堆读command,这些读command必须是有效的command,随后就等着app_rd_data_valid拉高接收app_rd_data即可。

在这里插入图片描述
发起读数据操作后,大概30个时钟周期之后,数据才连续出现。数据是pipeline方式出现的,所以尽可能读取连续地址的数据可以大大提高数据吞吐量。

Command命令时序
简单来讲,app_cmd和app_addr有效,且app_en拉高,app_rdy拉高,则该命令成功发送给DDR3控制器;若是在app_cmd、app_addr和app_en都有效时,app_rdy为低,那么必须保持app_cmd、app_addr和app_en的有效状态,直到app_rdy拉高,那么该命令才算是成功发送给DDR3控制器。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

这个clk是从MIG输出给的用户时钟(ui_clk)。

上面这些对DDR3用户端的读、写、命令时序讲述完了,以及时钟的讲述(纠结了几天终于理解了)。

二、DDR3的MIG的配置

1>点击IP Catalog ->搜索mig->双击Memory Interface Generator(MIG 7 Series)在这里插入图片描述
2>打开后可以看到一些基本信息在这里插入图片描述
3>Enter a component name in the Component Name field ->Next
Component name(组件名称):ddr3_ip
在这里插入图片描述
4>这里我们不做兼容性选择,直接下一步在这里插入图片描述
5>控制类型选择DDR3 SDRAM
在这里插入图片描述
①Clock Period:(此功能表示所有控制器的工作频率,频率模块受所选FPGA和器件速度等级等因素的限制。) 3000ps(333.33MHZ)。
②PHY to Controller Clock Ratio :(此功能确定物理层(存储器)时钟频率与控制器和用户界面时钟频率的比率。 由于FPGA逻辑时序限制,2:1比率会降低最大存储器接口频率。 2:1比率的用户界面数据总线宽度是物理存储器接口宽度宽度的四倍,而4:1比率的总线宽度是物理存储器接口宽度的八倍。 2:1比率具有较低的延迟。 4:1的比率是最高数据速率所必需的)4:1。

③Memory Type:此功能选择设计中使用的内存部件类型。

④Memory Part :此选项为设计选择内存部件。 选择可以从列表中创建或者可以创建新部件。MT41K128M16XX-15E。

⑤Memory Voltage:根据设计原理图1.35V。

⑥Data Width:(可以根据之前选择的存储器类型在此处选择数据宽度值。 该列表显示所选部件的所有支持的数据宽度。 可以选择其中一个数据宽度。 这些值通常是各个器件数据宽度的倍数。 在某些情况下,宽度可能不是精确倍数。 例如,16位是x16组件的默认数据宽度,但8位也是有效值。)16。

⑦Data Mask:(选择时,此选项会分配数据屏蔽引脚。 应取消选择此选项以释放数据屏蔽引脚并提高引脚效率。 此外,对于不支持数据掩码的内存部分禁用此功能。)勾选。
在这里插入图片描述
①Input clock Period:6000ps(166.667MHZ)。
②Read Burst Type and Length:Sequential。

③Output Driver Impedance Control:RZQ/6。

其他默认,NEXT。在这里插入图片描述
①System Clock :(此选项为sys_clk信号对选择时钟类型(单端,差分或无缓冲)。 选择No Buffer选项时,IBUF原语不会在RTL代码中实例化,并且不会为系统时钟分配引脚。 )No Buffer。
②Reference Clock :(此选项为clk_ref信号对选择时钟类型(单端,差分,无缓冲或使用系统时钟)。 当输入频率介于199和201 MHz之间时(即输入时钟周期介于5,025 ps(199 MHz)和4,975 ps(201 MHz)之间),将显示Use System Clock(使用系统时钟)选项。参考时钟频率基于数据速率 并注意添加MMCM以创建高于1,333 Mb / s的适当ref_clk频率。当选择No Buffer选项时,IBUF原语不会在RTL代码中实例化,并且引脚不会分配给参考时钟。)No Buffer。

③System Reset Polarity:(可以选择系统复位(sys_rst)的极性。 如果选项选择为低电平有效,则参数RST_ACT_LOW设置为1,如果设置为高电平 - 高,则参数RST_ACT_LOW设置为0。)ACTIVE LOW。

④Debug Signals Control:选择此选项可以将校准状态和用户端口信号端口映射到example_top模块中的ILA和VIO。 这有助于使用Vivado Design Suite调试功能监控用户界面端口上的流量。 取消选择Debug Signals Control选项会使example_top模块中的调试信号保持未连接状态,并且IP目录不会生成ILA / VIO模块。 此外,始终禁用调试端口以进行功能仿真。OFF。

⑤Sample Data Depth:此选项选择Vivado调试逻辑中使用的ILA模块的样本数据深度。 当“内存控制器的调试信号”选项为“开”时,可以选择此选项。

⑥Internal Verf:(内部VREF可用于数据组字节,以允许使用VREF引脚进行正常的I / O使用。 内部VREF仅应用于800 Mb / s或更低的数据速率。)勾选。

其他默认,NEXT。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、IP核的仿真

就是把IP核中生成的①ddr3_ip->②Open IP Example Design这个里面的
在这里插入图片描述
把这些.v文件和.vh文件加进去就可以了。

猜你喜欢

转载自blog.csdn.net/weixin_43727437/article/details/107447489