??這篇文章我們講一下Virtex7上DDR3的測試例程,Vivado也提供了一個DDR的example,但卻是純Verilog代碼,比較復雜,這里我們把DDR3的MIG的IP Core掛在Microblaze下,用很簡單的程序就可以進行DDR3的測試。

-
在bd文件中加入Mircoblaze。

-
點擊Run Block Automation

-
按照默認配置,確定即可。

-
出現下面的界面。

-
添加MIG的IP Core

-
開始配置DDR,選擇Create Design.

-
這一步是選擇Pin腳兼容的FPGA,我們不做選擇,直接Next。

-
選擇DDR3.

-
①選擇DDR的工作頻率,我們這里讓DDR3的頻率為1600MHz,所以時鐘頻率是800MHz;
②選擇器件,根據實際情況來選擇即可;
③數據位寬,也是根據板卡上的實際位寬進行選擇;
④默認即可。

-
選擇AXI總線的位寬,這里我們選擇512.

-
①選擇輸入時鐘頻率,雖然DDR的工作時鐘是800MHz(在第10步中選擇),但我們可以輸入一個低頻時鐘,然后MIG的IP Core中會倍頻到所需頻率。
②MIG的IP Core默認會輸出一個200MHz的時鐘,如果還需要其他的時鐘輸出,可以在這里選擇。其他選擇默認即可。

-
①選擇輸入時鐘的方式,這里的輸入時鐘就是我們上一個頁面中的設置的200MHz的輸入時鐘,如果選擇差分或單端,則輸入通過FPGA的管腳輸入200MHz時鐘到MIG的IP Core;如果選擇No Buffer,則可以通過FPGA內部的MMCM輸出一個200MHz時鐘到MIG;這里我選擇了No Buffer;
②選擇參考時鐘的方式,參考時鐘頻率固定是200MHz,如果選擇如果選擇差分或單端,則輸入通過FPGA的管腳輸入200MHz時鐘到MIG的IP Core;如果選擇No Buffer,則可以通過FPGA內部的MMCM輸出一個200MHz時鐘到MIG;如果在前一個頁面中選擇了輸入時鐘頻率是200MHz,則這邊會出現一個Use System Clock的選項,因為此時兩個時鐘頻率是相同的嘛。這里我選擇了Use System Clock;
③設置輸入復位信號的極性,這個要特別注意,盡量選擇高有效,因為無論我們選擇高復位還是低復位,它的端口名都叫sys_rst,會讓人直觀就覺得是高復位。我第一次使用時,就沒注意到這個選項,默認為低,但在MIG的端口上看到sys_rst這個名字我以為是高有效,結果DDR一直不通。
(備注:對于絕大多數的Xilinx的IP,如果是低有效的復位,端口名字中肯定是有N這個標志的)

-
這個頁面不需要操作。

-
下面開始分配管腳,我比較習慣于選第二個,無論是第一次分配還是后面再重新分配。
-
在這一頁,可以根據原理圖一一分配管腳;如果有現成的xdc/ucf文件,可以直接通過Read XDC/UCF讀入,然后再選擇Validate驗證管腳分配是否正確。

如果Validate成功,則會提示下面的界面。

-
如果在第13步中,選擇了差分或單端輸入,則這里會出現下面第一個圖;如果選擇了No buffer,則這里會出現第二個圖。很容易理解,如果選擇了通過外部管腳輸入時鐘,那這里就是讓選擇具體的管腳。并不是所有的MRCC或者SRCC管腳都可以選的,只能選擇跟DDR管腳同一片區域的(比如DDR放在了Bank31 32 33,那么這里的時鐘輸入管腳就不能選擇Bank15)。

如果不選擇復位信號管腳,就可以通過FPGA內部邏輯來輸入復位。

后面一路Next就完成了MIG IP Core的配置了。
-
在bd文件中,加入AXI Interconnect、UARTLite和Interrupt(如果不加中斷模塊,Microblaze的程序跑不起來),串口用來打印信息。然后再添加各輸入輸出端口,把內部的線連接起來,如下圖所示。

但這個圖里的線太多,看著不直觀,我們把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。

-
打開sdk,新建Application Project,并按下面的步驟依次操作。


再選擇模板為HelloWorld,最后Finish。

-
修改helloworld.c,見附錄,重新編譯,如果提示overflowed則把lscript.ld文件中的size改大。

運行程序后,可以看到串口打印信息如下:

附錄
//top.v
`timescale1ns/1ps
moduletop
(
inputclk_n,
inputclk_p,
inputUART_rxd,
outputUART_txd,
output[15:0]ddr3_addr,
output[2:0]ddr3_ba,
outputddr3_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,
outputddr3_ras_n,
outputddr3_reset_n,
outputddr3_we_n
);
wireaxi4_clk;
wireaxil_clk;
regaxi4_rstn;
wireaxil_rstn;
wireinit_calib_complete;
wiremmcm_locked;
wireddr_rst;
always@(posedgeaxi4_clk)
begin
axi4_rstn<=?axil_rstn;
??end?
??reg?[8:0]?cnt;
??always?@?(?posedge?axil_clk?)
??begin
??????if(~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
#include"platform.h"
#include"xil_printf.h"
intmain()
{
init_platform();
print("-------ddr3test----------------------
");
unsignedint*DDR_MEM=(unsignedint*)XPAR_MIG_7SERIES_0_BASEADDR;
//writedatatoddr3
*DDR_MEM=0x12345678;
//readback
unsignedintvalue=*(unsignedint*)XPAR_MIG_7SERIES_0_BASEADDR;
xil_printf("value=0x%x
",value);
cleanup_platform();
return0;
}
-
FPGA
+關注
關注
1640文章
21903瀏覽量
611456 -
DDR3
+關注
關注
2文章
279瀏覽量
42808 -
MicroBlaze
+關注
關注
3文章
68瀏覽量
21796
原文標題:Virtex7 Microblaze下DDR3測試
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
DDR3 SDRAM配置教程

Xilinx DDR3 資料
DDR3控制器和SSTL15_T_DCI在同一個bank中
LVDS發送器IP可用于Virtex6和Virtex7 FPGA嗎
ddr4和ddr3內存的區別,可以通用嗎
基于FPGA的DDR3 SDRAM控制器用戶接口設計

基于FPGA的DDR3用戶接口設計技術詳解

評論