这篇文章我们讲一下Virtex7上DDR3的测试例程,Vivado也提供了一个DDR的example,但却是纯Verilog代码,比较复杂,这里我们把DDR3的MIG的IP Core挂在Microblaze下,用很简单的程序就可以进行DDR3的测试。
如果Validate成功,则会提示下面的界面。
如果不选择复位信号管脚,就可以通过FPGA内部逻辑来输入复位。
后面一路Next就完成了MIG IP Core的配置了。
但这个图里的线太多,看着不直观,我们把Microblaze模块、mdm_1、rst_clk_wiz和local_memory模块(上图中红框中的4个模块)放到一个子模块中,取名mb_min_sys,如下图。
创建顶层的top文件,并在top文件中例化bd文件。可以把init_calib_complete和mmcm_locked这两个信号抓出来,在下载程序后,这两个信号必须都是高,不然DDR就工作不正常,肯定是中间某个环节配置有问题。具体top.v文件内容见附录
将工程综合、实现、生成bit文件,并导出Hardware。
再选择模板为HelloWorld,最后Finish。
运行程序后,可以看到串口打印信息如下:
附录
// top.v
`timescale 1ns / 1psmodule top(input clk_n,input clk_p,input UART_rxd,output UART_txd,output [15:0]ddr3_addr,output [2:0]ddr3_ba,output ddr3_cas_n,output [0:0]ddr3_ck_n,output [0:0]ddr3_ck_p,output [0:0]ddr3_cke,output [0:0]ddr3_cs_n,output [7:0]ddr3_dm,inout [63:0]ddr3_dq,inout [7:0]ddr3_dqs_n,inout [7:0]ddr3_dqs_p,output [0:0]ddr3_odt,output ddr3_ras_n,output ddr3_reset_n,output ddr3_we_n);wire axi4_clk;wire axil_clk;reg axi4_rstn;wire axil_rstn;wire init_calib_complete;wire mmcm_locked;wire ddr_rst;always @ ( posedge axi4_clk )beginaxi4_rstn <= axil_rstn;end reg [8:0] cnt;always @ ( posedge axil_clk )beginif(~axil_rstn)cnt <= 'd0;else if(cnt=='d256)cnt <= cnt ;else cnt <= cnt + 1'b1;end assign ddr_rst = (cnt=='d256)?1'b0:1'b1;MicroBlaze_DDR3 MicroBlaze_DDR3_i(.UART_rxd (UART_rxd ),.UART_txd (UART_txd ),.axil_clk (axil_clk ),.axi4_clk (axi4_clk ),.axi4_rstn (axi4_rstn ),.clk_in_clk_n (clk_n ),.clk_in_clk_p (clk_p ),.ddr3_addr (ddr3_addr ),.ddr3_ba (ddr3_ba ),.ddr3_cas_n (ddr3_cas_n ),.ddr3_ck_n (ddr3_ck_n ),.ddr3_ck_p (ddr3_ck_p ),.ddr3_cke (ddr3_cke ),.ddr3_cs_n (ddr3_cs_n ),.ddr3_dm (ddr3_dm ),.ddr3_dq (ddr3_dq ),.ddr3_dqs_n (ddr3_dqs_n ),.ddr3_dqs_p (ddr3_dqs_p ),.ddr3_odt (ddr3_odt ),.ddr3_ras_n (ddr3_ras_n ),.ddr3_reset_n (ddr3_reset_n ),.ddr3_we_n (ddr3_we_n ),.ddr_rst (ddr_rst ),.init_calib_complete (init_calib_complete ),.mmcm_locked (mmcm_locked ),.reset (1'b0 ),.axil_rstn (axil_rstn ));
endmodule
// helloworld.c
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"int main()
{init_platform();print("-------ddr3 test----------------------nr");unsigned int *DDR_MEM = (unsigned int*) XPAR_MIG_7SERIES_0_BASEADDR;// write data to ddr3*DDR_MEM = 0x12345678;// read backunsigned int value = *(unsigned int *) XPAR_MIG_7SERIES_0_BASEADDR;xil_printf("value = 0x%xn", value);cleanup_platform();return 0;
}
欢迎关注:
个人主页:
微信公众号:Quant_Times
Reading_Times
本文发布于:2024-02-01 21:36:12,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170679457139565.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |