概述
具体的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核的仿真
把这些.v文件和.vh文件加进去就可以了。
最后
以上就是无辜月饼为你收集整理的DDR3的配置及仿真教程的全部内容,希望文章能够帮你解决DDR3的配置及仿真教程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复