??這篇文章我們講一下Virtex7上DDR3的測(cè)試?yán)?,Vivado也提供了一個(gè)DDR的example,但卻是純Verilog代碼,比較復(fù)雜,這里我們把DDR3的MIG的IP Core掛在Microblaze下,用很簡(jiǎn)單的程序就可以進(jìn)行DDR3的測(cè)試。
ddr1-
在bd文件中加入Mircoblaze。
-
點(diǎn)擊Run Block Automation
-
按照默認(rèn)配置,確定即可。
-
出現(xiàn)下面的界面。
-
添加MIG的IP Core
-
開(kāi)始配置DDR,選擇Create Design.
-
這一步是選擇Pin腳兼容的FPGA,我們不做選擇,直接Next。
-
選擇DDR3.
-
①選擇DDR的工作頻率,我們這里讓DDR3的頻率為1600MHz,所以時(shí)鐘頻率是800MHz;
②選擇器件,根據(jù)實(shí)際情況來(lái)選擇即可;
③數(shù)據(jù)位寬,也是根據(jù)板卡上的實(shí)際位寬進(jìn)行選擇;
④默認(rèn)即可。
-
選擇AXI總線的位寬,這里我們選擇512.
-
①選擇輸入時(shí)鐘頻率,雖然DDR的工作時(shí)鐘是800MHz(在第10步中選擇),但我們可以輸入一個(gè)低頻時(shí)鐘,然后MIG的IP Core中會(huì)倍頻到所需頻率。
②MIG的IP Core默認(rèn)會(huì)輸出一個(gè)200MHz的時(shí)鐘,如果還需要其他的時(shí)鐘輸出,可以在這里選擇。其他選擇默認(rèn)即可。
-
①選擇輸入時(shí)鐘的方式,這里的輸入時(shí)鐘就是我們上一個(gè)頁(yè)面中的設(shè)置的200MHz的輸入時(shí)鐘,如果選擇差分或單端,則輸入通過(guò)FPGA的管腳輸入200MHz時(shí)鐘到MIG的IP Core;如果選擇No Buffer,則可以通過(guò)FPGA內(nèi)部的MMCM輸出一個(gè)200MHz時(shí)鐘到MIG;這里我選擇了No Buffer;
②選擇參考時(shí)鐘的方式,參考時(shí)鐘頻率固定是200MHz,如果選擇如果選擇差分或單端,則輸入通過(guò)FPGA的管腳輸入200MHz時(shí)鐘到MIG的IP Core;如果選擇No Buffer,則可以通過(guò)FPGA內(nèi)部的MMCM輸出一個(gè)200MHz時(shí)鐘到MIG;如果在前一個(gè)頁(yè)面中選擇了輸入時(shí)鐘頻率是200MHz,則這邊會(huì)出現(xiàn)一個(gè)Use System Clock的選項(xiàng),因?yàn)榇藭r(shí)兩個(gè)時(shí)鐘頻率是相同的嘛。這里我選擇了Use System Clock;
③設(shè)置輸入復(fù)位信號(hào)的極性,這個(gè)要特別注意,盡量選擇高有效,因?yàn)闊o(wú)論我們選擇高復(fù)位還是低復(fù)位,它的端口名都叫sys_rst,會(huì)讓人直觀就覺(jué)得是高復(fù)位。我第一次使用時(shí),就沒(méi)注意到這個(gè)選項(xiàng),默認(rèn)為低,但在MIG的端口上看到sys_rst這個(gè)名字我以為是高有效,結(jié)果DDR一直不通。
(備注:對(duì)于絕大多數(shù)的Xilinx的IP,如果是低有效的復(fù)位,端口名字中肯定是有N這個(gè)標(biāo)志的)
-
這個(gè)頁(yè)面不需要操作。
-
下面開(kāi)始分配管腳,我比較習(xí)慣于選第二個(gè),無(wú)論是第一次分配還是后面再重新分配。
-
在這一頁(yè),可以根據(jù)原理圖一一分配管腳;如果有現(xiàn)成的xdc/ucf文件,可以直接通過(guò)Read XDC/UCF讀入,然后再選擇Validate驗(yàn)證管腳分配是否正確。
如果Validate成功,則會(huì)提示下面的界面。
ddr17-
如果在第13步中,選擇了差分或單端輸入,則這里會(huì)出現(xiàn)下面第一個(gè)圖;如果選擇了No buffer,則這里會(huì)出現(xiàn)第二個(gè)圖。很容易理解,如果選擇了通過(guò)外部管腳輸入時(shí)鐘,那這里就是讓選擇具體的管腳。并不是所有的MRCC或者SRCC管腳都可以選的,只能選擇跟DDR管腳同一片區(qū)域的(比如DDR放在了Bank31 32 33,那么這里的時(shí)鐘輸入管腳就不能選擇Bank15)。
如果不選擇復(fù)位信號(hào)管腳,就可以通過(guò)FPGA內(nèi)部邏輯來(lái)輸入復(fù)位。
ddr19后面一路Next就完成了MIG IP Core的配置了。
-
在bd文件中,加入AXI Interconnect、UARTLite和Interrupt(如果不加中斷模塊,Microblaze的程序跑不起來(lái)),串口用來(lái)打印信息。然后再添加各輸入輸出端口,把內(nèi)部的線連接起來(lái),如下圖所示。
但這個(gè)圖里的線太多,看著不直觀,我們把Microblaze模塊、mdm_1、rst_clk_wiz和local_memory模塊(上圖中紅框中的4個(gè)模塊)放到一個(gè)子模塊中,取名mb_min_sys,如下圖。
ddr21-
創(chuàng)建頂層的top文件,并在top文件中例化bd文件。可以把init_calib_complete和mmcm_locked這兩個(gè)信號(hào)抓出來(lái),在下載程序后,這兩個(gè)信號(hào)必須都是高,不然DDR就工作不正常,肯定是中間某個(gè)環(huán)節(jié)配置有問(wèn)題。具體top.v文件內(nèi)容見(jiàn)附錄
-
將工程綜合、實(shí)現(xiàn)、生成bit文件,并導(dǎo)出Hardware。
再選擇模板為HelloWorld,最后Finish。
ddr25-
修改helloworld.c,見(jiàn)附錄,重新編譯,如果提示overflowed則把lscript.ld文件中的size改大。
運(yùn)行程序后,可以看到串口打印信息如下:
ddr27附錄
//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
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602978 -
DDR3
+關(guān)注
關(guān)注
2文章
276瀏覽量
42242 -
MicroBlaze
+關(guān)注
關(guān)注
3文章
68瀏覽量
21548
原文標(biāo)題:Virtex7 Microblaze下DDR3測(cè)試
文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論