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)
点击ok后自动完成mb的调用和连线。到此,一个mb的小系统基本形成了
第3步,调出mig出来,配置页有点多。关键的配置点其实就是时钟,如下
这个是内部phy工作时钟,是内部pll的输出
这是接口时钟,也就是pll的输入时钟。这个可以随意选,这里选择200MHz,也可以选择100MHz(最低100MHz)。这个时钟由clock_wizard提供。
由于sys_clk(就是前面的pll的输入时钟),我们是由内部的clock_wizard提供,属于是内部提供,因此不需要buffer。(如果是直接由IO提供,那么需要buffer)
这里有个reference clock,是用作DELYCTRL的校准时钟。它固定为200MHz,由于sys_clk设置为200MHz,于是这里可以选择直接使用sys_clk。这样symbol就没有ref_clk这个pin。
不使用XADC监测
引脚分配,这里选择直接read XDF文件,之后点击Validate
第4步,连接mig相关的信号,点击Run Connection Automation
先让其连总线,注意只勾选mig的AXI_S,mig时钟选择clock_wizard的200MHz
接着,继续点Run Connection Automation,处理时钟复位问题。先生成clk和rst_n的pin
接着,继续点Run Connection Automation,继续处理时钟复位问题。选择合适的时钟和复位源
第5步,检查数据流的连接,以及时钟和复位的分配是否正确
可以看到系统有1个AXI Interconnect, 1个SMC
- 复位引脚给POR_100MHz和MIG使用
- clkout1给mb系统使用,以及smc的aclk1使用(注意smc的时钟和复位的使用情况!)
- clkout2给mig的sys_clk使用
- mig输出的ui_clk和ui_clk_sync_rst用于给POR_200MHz和SMC的aclk使用。
- 因此smc的aclk与aclk1是2个不同的时钟。其中aclk对应DC,aclk1对应IC
第6步,引出和修改必要的引脚
包括ddr,一些状态信号等
生成bistream
- 编译时间比较久,其中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后,可能把程序的关键东西改写了,程序异常了。
程序固化之一(运行在ILMB中)
接下来我们可以把程序固化到qspi flash。
首先生成download.bit。注意这一步,如果程序是允许在ddr3中,那么这一步执行会报错,提示需要bootloader才可以将程序放在0x80000000。
因此,这里我们修改ld文件,将程序放在ILMB中,如下所示。
将程序烧入到qspi flash中,按电源键复位,可见程序开始执行。
程序固化之二(运行在DDR3中)
这种方式,需要调用AXI QuadSPI这个IP,需要修改设计,并重新编译。