ZYNQ 7020 FPGA DDR3 | 您所在的位置:网站首页 › fpga如何增加阻抗约束 › ZYNQ 7020 FPGA DDR3 |
ZYNQ 7020 FPGA DDR3
ZYNQ是FPGA+双核ARM的架构
ZYNQ是FPGA+双核ARM的架构
最近我需要用到ZYNQ来做东西,但是网上看见到的开发板在FPGA部分没有没有挂DDR3,只能结合自己以前的经验和现有的资料,摸索一下。本文分为两部分: 1. zynq的FPGA部分怎么加上两片ddr3,引脚分配,时钟等。 2. 如何测试,验证PCB效果。 注意下面的FPGA Part和速度等级,确保选择的是自己使用的芯片,之后选择下一步。 下一步。 这里有三个注意: 3.1我使用的是XC7Z020CLG484-2,最大支持DDR3时钟是400Mhz。 3.2我用的DDR3型号mt41k256m16tw-107it:p,找不到,只能选择相近的型号,但是都是兼容的。 3.3我是两片ddr3,共计32bit,我见有些人用一片,那这里就是16。 4.重点来了,这里的选择卡了我很久,因为ZYNQ7020的时钟是50Mhz,我不知道这里是填200Mhz还是选择50Mhz,最后看到米联客的讲解,我用一个PLL,50Mhz转200Mhz做MIG的时钟输入不久行了嘛,所以此处果断填200Mhz.(另外如果此处不填200Mhz,图6中的system clock选项没有use system clock选项,见图7) ![]() ![]() 7.选择Fixed Pin Out,让MIG向导帮助我们实现DDR3引脚的一些分配。 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,每个都对应着一些脚,供大家选择。 10.下面的一些脚分配,方法雷同,请各位大胆摸索,大不了重建个MIG(啊,我建了多少个,自己都忘了) 下一步。 做了一个总结,有兴趣自己看吧。下一步。 15.当然是接收啦。下一步。 ![]() 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; clk_wiz_0 clk_wiz_inst( // 这里就是我的PLL的实例 .clk_out1(clk_200m), .reset(sys_rst), .locked(locked), .clk_in1(sysclk_i) ); localparam ADDR_WIDTH = 29; // 这几个参数要根据实际的DDR3情况来选择 localparam DATA_WIDTH = 32; // 两片ddr3 32bit localparam PAYLOAD_WIDTH = DATA_WIDTH; localparam BURST_LENGTH = 8; localparam APP_DATA_WIDTH = 256; localparam APP_MASK_WIDTH = APP_DATA_WIDTH / 8; wire [ADDR_WIDTH-1:0] app_addr; wire [2:0] app_cmd; wire app_en; wire app_rdy; wire [APP_DATA_WIDTH-1:0] app_rd_data; wire app_rd_data_end; wire app_rd_data_valid; wire [APP_DATA_WIDTH-1:0] app_wdf_data; wire app_wdf_end; wire app_wdf_rdy; wire app_sr_active; wire app_ref_ack; wire app_zq_ack; wire app_wdf_wren; wire [11:0] device_temp; wire ui_clk; wire ui_rst; localparam [1:0]IDLE =2'd0; localparam [1:0]WRITE =2'd1; localparam [1:0]WAIT =2'd2; localparam [1:0]READ =2'd3; localparam [2:0]CMD_WRITE =3'd0; localparam [2:0]CMD_READ =3'd1; localparam TEST_DATA_RANGE =24'd16777210;//部分测试 我选择了这个 //localparam TEST_DATA_RANGE =24'd1000;//部分测试 (*mark_debug = "true"*) reg [1 :0]state=0; reg [23:0] Count_64=0;// 128M*2*16/256 reg [ADDR_WIDTH-1:0] app_addr_begin=0; (*mark_debug = "true"*) wire tg_compare_error; assign app_wdf_end =app_wdf_wren;//两个相等即可 assign app_en =(state==WRITE) ? (app_rdy&&app_wdf_rdy) : ((state==READ)&&app_rdy); assign app_wdf_wren =(state==WRITE) ? (app_rdy&&app_wdf_rdy) : 1'b0; assign app_cmd =(state==WRITE) ? CMD_WRITE : CMD_READ; assign app_addr =app_addr_begin; assign app_wdf_data ={ Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0], Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0], Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0], Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0],Count_64[7:0] };//写入的数据是计数器 always@(posedge ui_clk)begin if(ui_rst&!init_calib_complete) begin state |
CopyRight 2018-2019 实验室设备网 版权所有 |