赞
踩
前面学习了使用Xilinx自带的DDR3示例工程进行DDR3读写测试,利用这个工程又按照应用层和接口层进行了拆分,相对于之前的示例工程来说,有一些难度,经过仿真调试后,实现了读写测试。后面找到一块电路板,上面有一片FPGA芯片和2片DDR3,准备对DDR3进行全地址测试。
本文就对如何实现电路板上DDR3测试进行讲解,电路板资源可以根据自己手上的资源进行FPGA型号,DDR3型号进行调整,DDR3管脚信号等根据自己手上资源进行匹配。
在此感谢我的朋友们对我的指点和帮助。因作者水平有限,工程中和文档中难免会有疏漏之处,欢迎读者批评指正。
目录
a):FPGA器件型号:xc7z100ffg900-2;
b):DDR3器件型号:MT41K512M16XX-125 (2片);
a):开发环境:Vivado 2018.2
b):开发语言:Verilog
a):工程文件结构图:
b):创建一个新的工程,添加下图所示IP核:
clk_wiz_0:产生时钟,输入25MHz时钟,输出200MHz时钟;
ila_0:通过仿真器抓取观察信号;
vio:下发启动测试信号;
mig_7series_pl:DDR3IP核(创建方式按照上一期文章中示例);
c):在工程中添加文件,如下图所示:
a):首先在TOP模块中写入对应输入输出端口,这部分内容按照硬件原理图上定义的管脚信息编写,一一对应;
- module TOP(
- input CLK_25MHZ_FPGA_PL_REF2,
- //---------------------------DDR3-----------------------------------------------------
- inout [ 31 : 0 ] FPGA_PL_C0_DDR3_D,
- inout [ 3 : 0 ] FPGA_PL_C0_DDR3_DQS_P,
- inout [ 3 : 0 ] FPGA_PL_C0_DDR3_DQS_N,
- output [ 15 : 0 ] FPGA_PL_C0_DDR3_A,
- output [ 2 : 0 ] FPGA_PL_C0_DDR3_BA,
- output FPGA_PL_C0_DDR3_RASZ,
- output FPGA_PL_C0_DDR3_CASZ,
- output FPGA_PL_C0_DDR3_WEZ,
- output FPGA_PL_C0_DDR3_RESETZ,
- output FPGA_PL_C0_DDR3_CLK_P,
- output FPGA_PL_C0_DDR3_CLK_N,
- output FPGA_PL_C0_DDR3_CKE,
- output FPGA_PL_C0_DDR3_CSZ,
- output [ 3 : 0 ] FPGA_PL_C0_DDR3_DQM,
- output FPGA_PL_C0_DDR3_ODT
- );
这些接口对应到ddr3_module模块中DDR3-IP核的Memory interface ports部分,如下所示:
- ddr3_module # (
- .ADDR_WIDTH ( 30 ),
- .APP_DATA_WIDTH ( 256 )
- ) u_ddr3_module(
- .sys_clk_i ( sys_clk ),
- .sys_rst_i ( sys_rst ),
- .ddr3_addr ( FPGA_PL_C0_DDR3_A ),
- .ddr3_ba ( FPGA_PL_C0_DDR3_BA ),
- .ddr3_cas_n ( FPGA_PL_C0_DDR3_CASZ ),
- .ddr3_ck_n ( FPGA_PL_C0_DDR3_CLK_N ),
- .ddr3_ck_p ( FPGA_PL_C0_DDR3_CLK_P ),
- .ddr3_cke ( FPGA_PL_C0_DDR3_CKE ),
- .ddr3_ras_n ( FPGA_PL_C0_DDR3_RASZ ),
- .ddr3_reset_n ( FPGA_PL_C0_DDR3_RESETZ ),
- .ddr3_we_n ( FPGA_PL_C0_DDR3_WEZ ),
- .ddr3_dq ( FPGA_PL_C0_DDR3_D ),
- .ddr3_dqs_n ( FPGA_PL_C0_DDR3_DQS_N ),
- .ddr3_dqs_p ( FPGA_PL_C0_DDR3_DQS_P ),
- .init_calib_complete ( init_calib_complete ),
- .ddr3_cs_n ( FPGA_PL_C0_DDR3_CSZ ),
- .ddr3_dm ( FPGA_PL_C0_DDR3_DQM ),
- .ddr3_odt ( FPGA_PL_C0_DDR3_ODT )
- );
b):在ddr3_module模块中分为2个部分,一部分是连接DDR3-IP核Memory interface ports,一部分是连接Application interface ports部分。IP核的定义部分可以查看IP核生成文件中veo文件,如图所示:
- mig_7series_pl u_mig_7series_pl (
-
- // Memory interface ports
- .ddr3_addr (ddr3_addr), // output [15:0] ddr3_addr
- .ddr3_ba (ddr3_ba), // output [2:0] ddr3_ba
- .ddr3_cas_n (ddr3_cas_n), // output ddr3_cas_n
- .ddr3_ck_n (ddr3_ck_n), // output [0:0] ddr3_ck_n
- .ddr3_ck_p (ddr3_ck_p), // output [0:0] ddr3_ck_p
- .ddr3_cke (ddr3_cke), // output [0:0] ddr3_cke
- .ddr3_ras_n (ddr3_ras_n), // output ddr3_ras_n
- .ddr3_reset_n (ddr3_reset_n), // output ddr3_reset_n
- .ddr3_we_n (ddr3_we_n), // output ddr3_we_n
- .ddr3_dq (ddr3_dq), // inout [31:0] ddr3_dq
- .ddr3_dqs_n (ddr3_dqs_n), // inout [3:0] ddr3_dqs_n
- .ddr3_dqs_p (ddr3_dqs_p), // inout [3:0] ddr3_dqs_p
- .init_calib_complete (init_calib_complete), // output init_calib_complete
-
- .ddr3_cs_n (ddr3_cs_n), // output [0:0] ddr3_cs_n
- .ddr3_dm (ddr3_dm), // output [3:0] ddr3_dm
- .ddr3_odt (ddr3_odt), // output [0:0] ddr3_odt
- // Application interface ports
- .app_addr (app_addr), // input [29:0] app_addr
- .app_cmd (app_cmd), // input [2:0] app_cmd
- .app_en (app_en), // input app_en
- .app_wdf_data (app_wdf_data), // input [255:0] app_wdf_data
- .app_wdf_end (app_wdf_end), // input app_wdf_end
- .app_wdf_wren (app_wdf_wren), // input app_wdf_wren
- .app_rd_data (app_rd_data), // output [255:0] app_rd_data
- .app_rd_data_end (app_rd_data_end), // output app_rd_data_end
- .app_rd_data_valid (app_rd_data_valid), // output app_rd_data_valid
- .app_rdy (app_rdy), // output app_rdy
- .app_wdf_rdy (app_wdf_rdy), // output app_wdf_rdy
- .app_sr_req (app_sr_req), // input app_sr_req
- .app_ref_req (app_ref_req), // input app_ref_req
- .app_zq_req (app_zq_req), // input app_zq_req
- .app_sr_active (app_sr_active), // output app_sr_active
- .app_ref_ack (app_ref_ack), // output app_ref_ack
- .app_zq_ack (app_zq_ack), // output app_zq_ack
- .ui_clk (ui_clk), // output ui_clk
- .ui_clk_sync_rst (ui_clk_sync_rst), // output ui_clk_sync_rst
- .app_wdf_mask (app_wdf_mask), // input [31:0] app_wdf_mask
- // System Clock Ports
- .sys_clk_i (sys_clk_i),
- .sys_rst (sys_rst) // input sys_rst
- );
c):Memory interface ports部分向上层连接TOP层的信号,Application interface ports连接应用层,就是我们自己实现数据读写功能,数据读写功能和上一篇文章中实现的读写功能相似,在ddr3_control模块中及包含的ddr3_interface_control、ddr3_app_control两个模块中都是实现应用层功能,下发启动测试命令后进行读写,写入数据会读出进行数据校验,如出现错误会记录错误,可以监测测试完成后的错误计数。
d):在ddr3_interface_control模块中添加了一个ila监测模块和一个命令下发模块vio,配置如下:
vio:只设置一个输出信号;
ila:设置2个监测端口,深度为8192;
这里probeo0设置为trigger模式(触发器),probeo1设置为data模式(监测数据)。
e):在ddr3_interface_control模块中vio和ila实例模块中添加需要监测的信号:
- vio_0 u_vio_0 (
- .clk ( i_sys_clk ), // input wire clk
- .probe_out0 ( test ) // output wire [0 : 0] probe_out0
- );
- ila_0 u_ila_0 (
- .clk ( i_sys_clk ), // input wire clk
-
-
- .probe0 ( {init_calib_complete,sync_rst,cp_erro, // input wire [1023:0] probe0
- frist_start,ddr3_wr_done,ddr3_rd_done,i_wr_rddata_en}),
- .probe1 ( {read_data,cp_erro_cnt,o_write_addr,i_read_data}) // input wire [511:0] probe1
- );
文章讲述的内容下载到硬件上测试,DDR3全地址测试正常,错误计数器为0。 实现流程到这里讲解结束,跨度可能比较大,主要是不想一步一步贴代码,后面附免费下载工程文件的接,可以下载结合本文进行查看。
工程文件下载链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。