Xilinx 2020.1 MIG核读写DDR3内存,新建工程时配置MIG核的完整步骤

本文以XC7A35TFGG484-2这款芯片为例,采用米联客FPGA开发板,用MIG核驱动DDR3内存。FPGA外接的晶振大小为50MHz,DDR3内存的驱动频率(ddr3_ck_p和ddr3_ck_n)为400MHz。选用的DDR3内存型号为MT41K128M16,内存容量为256MB。

首先用Clocking Wizard配置时钟,由50MHz倍频到200MHz,作为MIG的系统时钟(sys_clk_i)和参考时钟(clk_ref_i)。

用MMCM倍频,输入的时钟为50MHz:

输出的时钟为200MHz:

点击OK,产生IP核,方式选择默认的Out of context per IP即可:

然后选择添加MIG核:

这些保持默认。代码中我们用的是默认的接口,不使用AXI4接口,不需要勾选AXI4 Interface:

这个也不用管:

选择驱动的是DDR3内存:

Clock Period设为2500ps,这样DDR3内存的驱动频率就是400MHz。后面还要选择DDR3内存的型号和位宽。
MIG核最关键的配置就是时钟的配置。这里的4:1表示DDR3内存的驱动频率,和用户程序代码运行的时钟频率之比为4:1,DDR3运行于400MHz,那么用户程序就运行于100MHz。

MIG内部PLL倍频器的输入时钟为200MHz:

(为了方便期间,MIG PLL输入时钟、系统时钟和参考时钟全部采用Clocking Wizard产生的200MHz时钟)

系统时钟和参考时钟要选择No Buffer。

这个保持默认:

从外部ucf文件读DDR3内存的引脚配置:

导入UCF文件,然后Validate,OK:

MA703-35T_MIG.ucf文件的内容如下:

NET "ddr3_dq[0]"                             LOC = "P6"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[1]"                             LOC = "R1"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[2]"                             LOC = "M5"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[3]"                             LOC = "N4"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[4]"                             LOC = "N5"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[5]"                             LOC = "N2"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[6]"                             LOC = "M6"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[7]"                             LOC = "P1"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[8]"                             LOC = "L3"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[9]"                             LOC = "J4"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[10]"                            LOC = "M3"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[11]"                            LOC = "K4"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[12]"                            LOC = "M2"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[13]"                            LOC = "K3"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[14]"                            LOC = "L4"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dq[15]"                            LOC = "L5"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dm[0]"                             LOC = "P2"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dm[1]"                             LOC = "J6"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_dqs_p[0]"                          LOC = "P5"      |   IOSTANDARD = DIFF_SSTL15           ;                                 
NET "ddr3_dqs_n[0]"                          LOC = "P4"      |   IOSTANDARD = DIFF_SSTL15           ;                                 
NET "ddr3_dqs_p[1]"                          LOC = "M1"      |   IOSTANDARD = DIFF_SSTL15           ;                                 
NET "ddr3_dqs_n[1]"                          LOC = "L1"      |   IOSTANDARD = DIFF_SSTL15           ;                                 
NET "ddr3_addr[13]"                          LOC = "W5"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[12]"                          LOC = "AA5"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[11]"                          LOC = "AB7"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[10]"                          LOC = "Y9"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[9]"                           LOC = "Y4"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[8]"                           LOC = "AA8"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[7]"                           LOC = "AA4"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[6]"                           LOC = "Y7"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[5]"                           LOC = "AA3"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[4]"                           LOC = "AB6"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[3]"                           LOC = "Y2"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[2]"                           LOC = "Y3"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[1]"                           LOC = "AA6"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_addr[0]"                           LOC = "AB3"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_ba[2]"                             LOC = "W2"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_ba[1]"                             LOC = "AB5"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_ba[0]"                             LOC = "AB2"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_ck_p[0]"                           LOC = "T5"      |   IOSTANDARD = DIFF_SSTL15           ;                                 
NET "ddr3_ck_n[0]"                           LOC = "U5"      |   IOSTANDARD = DIFF_SSTL15           ;                                 
NET "ddr3_ras_n"                             LOC = "V2"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_cas_n"                             LOC = "AA1"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_we_n"                              LOC = "W1"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_reset_n"                           LOC = "W4"      |   IOSTANDARD = LVCMOS15              ;                                 
NET "ddr3_cke[0]"                            LOC = "Y6"      |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_odt[0]"                            LOC = "AB1"     |   IOSTANDARD = SSTL15                ;                                 
NET "ddr3_cs_n[0]"                           LOC = "Y1"      |   IOSTANDARD = SSTL15                ;                                 

这些保持默认:

同意完所有的协议后,生成MIG IP核,综合选项仍然选择Out of context per IP:

生成IP核后,可以在IP核里面的mig_7series_0.v里面看到这个IP核究竟有哪些引脚:

每个引脚的格式一目了然。

最后,在综合完自己的代码后,进入Schematic一看,可以看到DDR3的引脚早已配置好了,我们只需要配置其他的引脚就可以了。

也就是说,保存的pins.xdc里面是不包含DDR3引脚的配置的。DDR3引脚配置是专门在MIG IP核的文件夹里面有一个xdc文件。

 

工程建好了,IP核也配置好了,接下来就是编写代码了:https://blog.csdn.net/ZLK1214/article/details/111085879

MIG核自带的那个example工程很复杂,里面参数也很多,阅读起来很难懂。我们不用那个example工程,自己写代码调用IP核,简单易懂。

最后编译代码产生bit文件的时候,是没有报任何错误的,直接成功:


 

  • 3
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Xilinx FPGA平台DDR3设计保姆式教程(3)是关于使用MIG IP及DDR读写序的教程。 首先,MIG(Memory Interface Generator)是Xilinx提供的IP,用于简化DDR3控制器接口的设计。在使用MIG IP前,需要根据DDR3芯片的规格参数,使用MIG生成一个适用于特定器件的IP文件。生成IP文件后,可以将其添加到设计中。 使用MIG IP,需要正确设置IP的参数,以满足设计需求。这些参数包括钟频率、数据宽度、序参数等。为了正确设置这些参数,可以参考DDR3芯片的数据手册和Xilinx提供的MIG IP使用手册。 在DDR3读写序中,有多个重要的信号需要注意。首先是钟信号,它用于同步数据的传输。钟信号的频率应根据DDR3规格进行设置,通常为DDR3规格中指定的频率(比如900MHz)的一半。然后是地址信号,它用于指定要读写的存储单元的位置。地址信号的宽度应根据DDR3规格进行设置,通常为规定的位数(比如13位)。接下来是控制信号,包括读使能信号和写使能信号,用于控制读写操作的进行。最后是数据信号,用于实际的数据传输。数据信号的宽度应根据DDR3规格和设计需求进行设置。 在设计中,需要根据DDR3芯片的序要求,来设置合适的读写延迟和序参数。这些参数可以通过MIG IP配置界面进行设置。此外,还需要根据DDR3芯片要求,使用适当的芯片选择信号和刷新操作,以确保DDR3的正常工作。 综上所述,使用Xilinx FPGA平台进行DDR3设计,可以使用MIG IP来简化接口设计,并根据DDR3规格和序要求来设置相关参数。合理设置这些参数,可以保证DDR3的正常读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨大八爪鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值