xc7k325t microblaze驱动ddr3的过程 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

第1步,调1个clock_wizard出来

  • 输入50MHz,clk1输出100MHz,clk2输出200MHz,复位选择LOW_ACTIVE
  • 100MHz给mb使用,200MHz给mig使用

第2步,调出mb来

点击初始化向导(Run block Automation),设置如下(注意preset=None)

image image

点击ok后自动完成mb的调用和连线。到此,一个mb的小系统基本形成了

image

第3步,调出mig出来,配置页有点多。关键的配置点其实就是时钟,如下

image 这个是内部phy工作时钟,是内部pll的输出

image 这是接口时钟,也就是pll的输入时钟。这个可以随意选,这里选择200MHz,也可以选择100MHz(最低100MHz)。这个时钟由clock_wizard提供。

image

image 由于sys_clk(就是前面的pll的输入时钟),我们是由内部的clock_wizard提供,属于是内部提供,因此不需要buffer。(如果是直接由IO提供,那么需要buffer) 这里有个reference clock,是用作DELYCTRL的校准时钟。它固定为200MHz,由于sys_clk设置为200MHz,于是这里可以选择直接使用sys_clk。这样symbol就没有ref_clk这个pin。 不使用XADC监测

image 引脚分配,这里选择直接read XDF文件,之后点击Validate

第4步,连接mig相关的信号,点击Run Connection Automation

先让其连总线,注意只勾选mig的AXI_S,mig时钟选择clock_wizard的200MHz

image image image

接着,继续点Run Connection Automation,处理时钟复位问题。先生成clk和rst_n的pin

image image

接着,继续点Run Connection Automation,继续处理时钟复位问题。选择合适的时钟和复位源

image image image

第5步,检查数据流的连接,以及时钟和复位的分配是否正确

image 可以看到系统有1个AXI Interconnect, 1个SMC

image

  • 复位引脚给POR_100MHz和MIG使用
  • clkout1给mb系统使用,以及smc的aclk1使用(注意smc的时钟和复位的使用情况!)
  • clkout2给mig的sys_clk使用

image

  • mig输出的ui_clk和ui_clk_sync_rst用于给POR_200MHz和SMC的aclk使用。
  • 因此smc的aclk与aclk1是2个不同的时钟。其中aclk对应DC,aclk1对应IC

第6步,引出和修改必要的引脚

包括ddr,一些状态信号等

生成bistream

d5099f52eb9c2f0a0823a755744b9ae5

  • 编译时间比较久,其中mig就花了11分钟,9k lut。整个系统15k lut。
  • mig还用了2个PLL

Vitis生成hello world程序

  • hello world程序正常运行,而且可以看到,默认它把程序的路径就是存放在ddr3下
  • 打开xsct,mrd/mwr读写ddr3正常。
  • 由于ddr3存放了hello的程序以及变量,当mwr 0x80000000 0x1234 256后,可能把程序的关键东西改写了,程序异常了。 image image image

程序固化之一(运行在ILMB中)

接下来我们可以把程序固化到qspi flash。 image 首先生成download.bit。注意这一步,如果程序是允许在ddr3中,那么这一步执行会报错,提示需要bootloader才可以将程序放在0x80000000。 因此,这里我们修改ld文件,将程序放在ILMB中,如下所示。

image

image image 将程序烧入到qspi flash中,按电源键复位,可见程序开始执行。

程序固化之二(运行在DDR3中)

这种方式,需要调用AXI QuadSPI这个IP,需要修改设计,并重新编译。