ZYNQ 7020 FPGA DDR3
ZYNQ是FPGA+双核ARM的架构
最近我需要用到ZYNQ来做东西,但是网上看见到的开发板在FPGA部分没有没有挂DDR3,只能结合自己以前的经验和现有的资料,摸索一下。本文分为两部分:
1. zynq的FPGA部分怎么加上两片ddr3,引脚分配,时钟等。
2. 如何测试,验证PCB效果。
-
注意下面的FPGA Part和速度等级,确保选择的是自己使用的芯片,之后选择下一步。

|:------------------------------------😐 图1 -
下一步。

|:------------------------------------😐 图2 -
这里有三个注意:
3.1我使用的是XC7Z020CLG484-2,最大支持DDR3时钟是400Mhz。
3.2我用的DDR3型号mt41k256m16tw-107it:p,找不到,只能选择相近的型号,但是都是兼容的。3.3我是两片ddr3,共计32bit,我见有些人用一片,那这里就是16。

|:------------------------------------😐 图3
4.重点来了,这里的选择卡了我很久,因为ZYNQ7020的时钟是50Mhz,我不知道这里是填200Mhz还是选择50Mhz,最后看到米联客的讲解,我用一个PLL,50Mhz转200Mhz做MIG的时钟输入不久行了嘛,所以此处果断填200Mhz.(另外如果此处不填200Mhz,图6中的system clock选项没有use system clock选项,见图7)

|:------------------------------------😐 图5
- 这里的system clock选择no buffer,reference clock选择use system clock。

|:------------------------------------😐 图6 - 下面这个图就是因为前面图5没有选择200Mhz时钟时,才会没有use system clock的选项。

|:------------------------------------😐 图7
7.选择Fixed Pin Out,让MIG向导帮助我们实现DDR3引脚的一些分配。

|:------------------------------------😐 图8
8.最左侧是两片DDR3需要的所有信号脚的名称。其中32个数据脚是8bit为一组,那就拿ddr3_dq[7:0]举例,可以见下图,我分了bank35给DDR3使用。ByteNumber选择了T2,Pin Number是因为选择了T2,MIG给了我一个范围(见图10),我在这些范围里面选择了上面的脚,我在PCB lyout时,发现选的不好,又来回调整过几回。
8.1 一开始考虑过一个问题,ZYNQ的FPGA一个bank够不够给两片ddr3用,最后发现不管是那个bank都是不够的,差一个脚。此时真心想…
8.2 T0~T3,每个都对应着一些脚,供大家选择。

|:------------------------------------😐 图9
9. 可以看见Pin Number选框下面对应着很多的脚,每选择一个脚,对应就会出现一道杠,表示这个脚被用了。

|:------------------------------------😐 图10
10.下面的一些脚分配,方法雷同,请各位大胆摸索,大不了重建个MIG(啊,我建了多少个,自己都忘了)

|:------------------------------------😐 图11
11.MIG支持你之前做好的引脚分配,选择read XDC/UCF按钮,就可以将之前做好的引脚分配文件导入。

|:------------------------------------😐 图12
12. 当你的引脚分配完毕之后,要用validate按钮验证一下,如果验证成功之后,next按钮才可以点击,否则是点不动的,不能进行下一步操作。当然,如果你验证成功之后,记得点击Save Pin Out,将你自己分配好的引脚做一下保存,否则当你重新打开MIG之后,你会发现,卧槽,刚刚分配好的咋没有了。这种感受你最好别体验,真难受。

|:------------------------------------😐 图13
-
下一步。

|:------------------------------------😐 图14 -
做了一个总结,有兴趣自己看吧。下一步。

|:------------------------------------😐 图15
15.当然是接收啦。下一步。

|:------------------------------------😐 图16
- 点击generate。恭喜你,或许你的ddr3引脚分配完成啦。导入到自己的原理图里面吧。

|:------------------------------------😐 图17
17.在你的工程里面会生成一个MIG 的IP核。

下面就是验证用的代码部分,代码的来源是米联客的DDR3教程,感谢米联客的团队。
我根据自己的情况做了一些修改:
1.例化PLL,实现50Mhz转200Mhz。
2.例程上面说的是一片DDR3,但是我用的是两片,代码里面有些参数是需要更改的。
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/07/12 16:14:13
// Design Name:
// Module Name: mig_ddr_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mig_ddr_test
(
inout [31:0] ddr3_dq, // 我的ddr3是32bit
inout [3:0] ddr3_dqs_n, // 对应四个数据选通
inout [3:0] ddr3_dqs_p, // 上面信号的差分
output [14:0] ddr3_addr, // 我的地址一共是14bit
output [2:0] ddr3_ba,
output ddr3_ras_n,
output ddr3_cas_n,
output ddr3_we_n,
output ddr3_reset_n,
output [0:0] ddr3_ck_p,
output [0:0] ddr3_ck_n,
output [0:0] ddr3_cke,
output [0:0] ddr3_cs_n,
output [3:0] ddr3_dm, // 这里4bit的数据屏蔽位
output [0:0] ddr3_odt,
input sysclk_i, // 这里就是我上面说的200Mh时钟输入
// 我用了一个PLL,50Mhz转200Mhz
output tg_compare_error,
// output breath_light,
output init_calib_complete
);
wire sys_rst = 1'b0;
wire clk_200m,locked

最低0.47元/天 解锁文章
3567





