天天看點

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

目錄

基于Qsys的DDR2記憶體驅動

1、建立Qsys系統

1.1、時鐘

1.2、NIOS II

1.3、系統ID

1.4、片上RAM

1.5、JTAG調試器

1.6、DDR2控制器

1.7、連接配接

2.2、頂層代碼

2.3、引腳配置設定

2.4、NIOS程式編寫測試

基于Qsys的DDR2記憶體驅動

按照正常步驟建立Quartus工程,建立一個頂層的Verilog檔案用于調用Qsys系統。

此處有一個疑問:闆卡上的晶片型号為EP4CGX75CF23I7,但參考闆卡給的例程,發現其選用的晶片型号為EP4CGX75CF23C8,是以此程式也使用C8型号的晶片。

1、建立Qsys系統

了解DDR的基本知識,參考的是小梅哥電子的AC6102開發闆的視訊及PDF文檔教程。建立Qsys的系統參考的是小梅哥AC6102和黑金電子的AX530教程。

1.1、時鐘

設定輸入時鐘為100MHz。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

1.2、NIOS II

選擇NIOS II/f類型的軟核,設定複位向量位址(程式代碼存放的位置)和異常向量位址(程式運作的位址),因為DDR2存儲器上電工作前需要對前幾個位址的進行反複的資料讀寫操作,用來協商一個最佳的資料傳輸速率,所有需要設定一段偏移位址,設定位址偏移的大小參考Intel官方的文檔,此處設定為0x100,同樣異常位址的偏移量為0x120。

經過實際測試,發現不額外設定那0x100的偏移量,系統照樣可以正常運作。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

設定系統的Cache大小,可以使用預設大小,最下面的紅框應取消勾選,因為使用的DDR2的位寬為128bits(64bits+雙速率資料接口),是以需要“使處理器中的最高有效位址位繞過資料緩存”。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

其餘的部分均采用預設設定。

1.3、系統ID

此子產品是用來給目前的Qsys系統一個唯一的編号,因為有些SOPC系統中可能會出現多個NIOS II處理器的情況。此處随意設定一個數值即可。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

1.4、片上RAM

此處需要片上RAM,為了在系統建立初期驗證,排除系統中除去DDR2控制器之外的錯誤給系統造成影響。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

1.5、JTAG調試器

直接采用預設設定即可

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

1.6、DDR2控制器

設定部分與第一章中的配置界面相同,按照同樣的參數設定。需要改變的是輸入時鐘為clk的100MHz。

應該注意複位信号的連接配接。

1.7、連接配接

參考下圖中的連接配接,重新配置設定基位址,配置設定中斷号。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

2.2、頂層代碼

頂層代碼代碼,用于調用Qsys核

module DDR2_Systems
(
	clk, 	rst_n,	key_in,
	
	mem_odt,	mem_clk,	mem_clk_n,
	mem_cs_n,	mem_cke,	mem_addr,
	mem_ba,	    mem_ras_n,	mem_cas_n,
	mem_we_n,	mem_dq,	    mem_dqs,
	mem_dm,
	
	led
);

input			clk;
input 		rst_n;
input 		key_in;

output reg [3:0] led;

output	[1:0]	mem_odt;
inout	[1:0]	mem_clk;
inout	[1:0]	mem_clk_n;
output	[1:0]	mem_cs_n;
output	[1:0]	mem_cke;
output	[13:0]	mem_addr;
output	[1:0]	mem_ba;
output		mem_ras_n;
output		mem_cas_n;
output		mem_we_n;
inout	[63:0]	mem_dq;
inout	[7:0]	mem_dqs;
output	[7:0]	mem_dm;

nios_ddr2 u0 (
	.clk_clk                (clk),                //   clk.clk
	.ddr2_local_refresh_ack (), //  ddr2.local_refresh_ack
	.ddr2_local_init_done   (),   //      .local_init_done
	.ddr2_reset_phy_clk_n   (),   //      .reset_phy_clk_n
	
	.mem_mem_odt            (mem_odt),            //   mem.mem_odt
	.mem_mem_clk            (mem_clk),            //      .mem_clk
	.mem_mem_clk_n          (mem_clk_n),          //      .mem_clk_n
	.mem_mem_cs_n           (mem_cs_n),           //      .mem_cs_n
	.mem_mem_cke            (mem_cke),            //      .mem_cke
	.mem_mem_addr           (mem_addr),           //      .mem_addr
	.mem_mem_ba             (mem_ba),             //      .mem_ba
	.mem_mem_ras_n          (mem_ras_n),          //      .mem_ras_n
	.mem_mem_cas_n          (mem_cas_n),          //      .mem_cas_n
	.mem_mem_we_n           (mem_we_n),           //      .mem_we_n
	.mem_mem_dq             (mem_dq),             //      .mem_dq
	.mem_mem_dqs            (mem_dqs),            //      .mem_dqs
	.mem_mem_dm             (mem_dm),             //      .mem_dm
	
	.rst_n_reset_n          (rst_n)           // rst_n.reset_n
);

endmodule
           

2.3、引腳配置設定

此次使用的PCIE闆卡上有兩個晶振,一個為100MHz,一個為25Mhz,注意引腳配置設定的時候注意不要配置設定錯。

在給DDR2信号配置設定引腳的時候,不僅要配置設定引腳的号,還要選擇引腳的電平标準,電流大小。還需要設定輸出信号的分組,否則會在編譯時出現錯誤。最好的方式是一次配置完成後export出一個tcl腳本檔案,以後配置起來就友善很多了。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

2.4、NIOS程式編寫測試

打開Eclipse的NIOS開發環境,選擇正确的sopcinfo檔案,建立一個基于memtest_small模闆的工程,直接編譯,無需更改任何代碼,然後下載下傳運作。

此時程式已經成功運作起來了,按照提示的步驟進行測試。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動

可以看到測試均通過,說明DDR2已經成功得被驅動了。

基于Qsys的DDR2記憶體驅動基于Qsys的DDR2記憶體驅動