實驗所用板子為altera DE2板子,FPGA為Cyclone II:EP2C35F672C6,quartus版本為13.0
[11:0]DRAM_ADDR : address
DRAM_BA_0 : bank address 0
DRAM_BA_1 : bank address 1
DRAM_CAS_N : column address strobe
DRAM_CKE : clock enable
DRAM_CLK : clock
DRAM_CS_N : chip select
[15:0]DRAM_DQ : Data
DRAM_LDQM :lower byte data mask
DRAM_UDQM : upper byte data mask
DRAM_RAS_N : row address strobe
DRAM_WE_N : write enable
1)建立工程
2)建立初始頂層文件
module work ( CLOCK_50, // On Board 50 MHz KEY, // Pushbutton[3:0] SW, // Toggle Switch[17:0] LEDR, // LED Red[17:0] DRAM_DQ, // SDRAM Data bus 16 Bits DRAM_ADDR, // SDRAM Address bus 12 Bits DRAM_LDQM, // SDRAM Low-byte Data Mask DRAM_UDQM, // SDRAM High-byte Data Mask DRAM_WE_N, // SDRAM Write Enable DRAM_CAS_N, // SDRAM Column Address Strobe DRAM_RAS_N, // SDRAM Row Address Strobe DRAM_CS_N, // SDRAM Chip Select DRAM_BA_0, // SDRAM Bank Address 0 DRAM_BA_1, // SDRAM Bank Address 1 DRAM_CLK, // SDRAM Clock DRAM_CKE // SDRAM Clock Enable);input CLOCK_50; // On Board 50 MHzinput [3:0] KEY; // Pushbutton[3:0]input [17:0] SW; // Toggle Switch[17:0]output [17:0] LEDR; // LED Red[17:0]inout [15:0] DRAM_DQ; // SDRAM Data bus 16 Bitsoutput [11:0] DRAM_ADDR; // SDRAM Address bus 12 Bitsoutput DRAM_LDQM; // SDRAM Low-byte Data Mask output DRAM_UDQM; // SDRAM High-byte Data Maskoutput DRAM_WE_N; // SDRAM Write Enableoutput DRAM_CAS_N; // SDRAM Column Address Strobeoutput DRAM_RAS_N; // SDRAM Row Address Strobeoutput DRAM_CS_N; // SDRAM Chip Selectoutput output DRAM_BA_0; // SDRAM Bank Address 0output DRAM_BA_1; // SDRAM Bank Address 0output DRAM_CLK; // SDRAM Clockoutput DRAM_CKE; // SDRAM Clock Enableassign LEDR = SW;endmodule3)編譯并導入管腳信息
4)建立Qsys
CPU: NiOS II/e
ram: total memory size 12288bytes
jtag_uart: default
sdram_controller: DE2板子上的SDRAM大小為8M
接線圖
修改CPU reset位置,自動生成地址,generate
將nios_ii.qsys文件添加入工程中
5)生成pll始終分頻,將輸入SDRAM的始終延時3ns(延時?前移?)
加入pll ip核,只需修改這兩處
6)完成硬件代碼
module work ( CLOCK_50, // On Board 50 MHz KEY, // Pushbutton[3:0] SW, // Toggle Switch[17:0] LEDR, // LED Red[17:0] DRAM_DQ, // SDRAM Data bus 16 Bits DRAM_ADDR, // SDRAM Address bus 12 Bits DRAM_LDQM, // SDRAM Low-byte Data Mask DRAM_UDQM, // SDRAM High-byte Data Mask DRAM_WE_N, // SDRAM Write Enable DRAM_CAS_N, // SDRAM Column Address Strobe DRAM_RAS_N, // SDRAM Row Address Strobe DRAM_CS_N, // SDRAM Chip Select DRAM_BA_0, // SDRAM Bank Address 0 DRAM_BA_1, // SDRAM Bank Address 1 DRAM_CLK, // SDRAM Clock DRAM_CKE // SDRAM Clock Enable);input CLOCK_50; // On Board 50 MHzinput [3:0] KEY; // Pushbutton[3:0]input [17:0] SW; // Toggle Switch[17:0]output [17:0] LEDR; // LED Red[17:0]inout [15:0] DRAM_DQ; // SDRAM Data bus 16 Bitsoutput [11:0] DRAM_ADDR; // SDRAM Address bus 12 Bitsoutput DRAM_LDQM; // SDRAM Low-byte Data Mask output DRAM_UDQM; // SDRAM High-byte Data Maskoutput DRAM_WE_N; // SDRAM Write Enableoutput DRAM_CAS_N; // SDRAM Column Address Strobeoutput DRAM_RAS_N; // SDRAM Row Address Strobeoutput DRAM_CS_N; // SDRAM Chip Selectoutput output DRAM_BA_0; // SDRAM Bank Address 0output DRAM_BA_1; // SDRAM Bank Address 0output DRAM_CLK; // SDRAM Clockoutput DRAM_CKE; // SDRAM Clock Enableassign LEDR = SW;pll pll_u ( .inclk0(CLOCK_50), .c0(DRAM_CLK) ); nios_ii u0 ( .clk_clk (CLOCK_50), // clk.clk .reset_reset_n (KEY[3]), // reset.reset_n .sdram_addr (DRAM_ADDR), // sdram.addr .sdram_ba ({DRAM_BA_1,DRAM_BA_0}), // .ba .sdram_cas_n (DRAM_CAS_N), // .cas_n .sdram_cke (DRAM_CKE), // .cke .sdram_cs_n (DRAM_CS_N), // .cs_n .sdram_dq (DRAM_DQ), // .dq .sdram_dqm ({DRAM_UDQM,DRAM_LDQM}), // .dqm .sdram_ras_n (DRAM_RAS_N), // .ras_n .sdram_we_n (DRAM_WE_N) // .we_n );endmodule8)編譯硬件代碼,并燒錄9)打開nios II software編寫軟件代碼
10)軟件代碼
軟件代碼里,地址信息跳變嘗試了每次+1、+2、+4,在+4的情況下得到了正確數據。
推測這一情況與軟核為32位系統,SDRAM存儲空間為8位空間有關?
有待進一步探究
#include <stdio.h>#include"system.h"#include"io.h"int main(){ unsigned int i, j, k; k = 236; //隨便寫的一個數 PRintf("Hello from Nios II!/n"); for(i = 0; i<40; i = i + 4){ IOWR(SDRAM_BASE+i, 0, k); printf("SDRAM_BASE+i = %d/t",SDRAM_BASE+i); printf("k = %d/n",k); k++; } for(i = 0; i<40; i = i + 4){ j = IORD(SDRAM_BASE+i, 0); printf("data_%d = %d/n", SDRAM_BASE+i, j); } return 0;}11)edit BSP -> bulid project -> run as NIOS II hardware燒錄軟件
3.讀寫結果
地址跳變每次 i = i +1; 數據讀寫與想象不同
地址跳變每次 i = i +2; 數據讀寫與想象不同
;
地址跳變每次 i = i +4; 忽略出現的奇怪的顯示,數據讀寫無誤
解決:SDRAM的數據一般占據4個地址,或者8個地址,存在對其的問題,因此地址為應該+4或者4的倍數。
新聞熱點
疑難解答