基于Qsys的DDR2内存驱动
目錄
?
基于Qsys的DDR2內(nèi)存驅(qū)動(dòng)
1、建立Qsys系統(tǒng)
1.1、時(shí)鐘
1.2、NIOS II
1.3、系統(tǒng)ID
1.4、片上RAM
1.5、JTAG調(diào)試器
1.6、DDR2控制器
1.7、連接
2.2、頂層代碼
2.3、引腳分配
2.4、NIOS程序編寫(xiě)測(cè)試
基于Qsys的DDR2內(nèi)存驅(qū)動(dòng)
按照正常步驟建立Quartus工程,新建一個(gè)頂層的Verilog文件用于調(diào)用Qsys系統(tǒng)。
此處有一個(gè)疑問(wèn):板卡上的芯片型號(hào)為EP4CGX75CF23I7,但參考板卡給的例程,發(fā)現(xiàn)其選用的芯片型號(hào)為EP4CGX75CF23C8,所以此程序也使用C8型號(hào)的芯片。
1、建立Qsys系統(tǒng)
了解DDR的基本知識(shí),參考的是小梅哥電子的AC6102開(kāi)發(fā)板的視頻及PDF文檔教程。建立Qsys的系統(tǒng)參考的是小梅哥AC6102和黑金電子的AX530教程。
1.1、時(shí)鐘
設(shè)置輸入時(shí)鐘為100MHz。
1.2、NIOS II
選擇NIOS II/f類型的軟核,設(shè)置復(fù)位向量地址(程序代碼存放的位置)和異常向量地址(程序運(yùn)行的地址),因?yàn)镈DR2存儲(chǔ)器上電工作前需要對(duì)前幾個(gè)地址的進(jìn)行反復(fù)的數(shù)據(jù)讀寫(xiě)操作,用來(lái)協(xié)商一個(gè)最佳的數(shù)據(jù)傳輸速率,所有需要設(shè)置一段偏移地址,設(shè)置地址偏移的大小參考Intel官方的文檔,此處設(shè)置為0x100,同樣異常地址的偏移量為0x120。
經(jīng)過(guò)實(shí)際測(cè)試,發(fā)現(xiàn)不額外設(shè)置那0x100的偏移量,系統(tǒng)照樣可以正常運(yùn)行。
設(shè)置系統(tǒng)的Cache大小,可以使用默認(rèn)大小,最下面的紅框應(yīng)取消勾選,因?yàn)槭褂玫腄DR2的位寬為128bits(64bits+雙速率數(shù)據(jù)接口),所以需要“使處理器中的最高有效地址位繞過(guò)數(shù)據(jù)緩存”。
其余的部分均采用默認(rèn)設(shè)置。
1.3、系統(tǒng)ID
此模塊是用來(lái)給當(dāng)前的Qsys系統(tǒng)一個(gè)唯一的編號(hào),因?yàn)橛行㏒OPC系統(tǒng)中可能會(huì)出現(xiàn)多個(gè)NIOS II處理器的情況。此處隨意設(shè)置一個(gè)數(shù)值即可。
1.4、片上RAM
此處需要片上RAM,為了在系統(tǒng)建立初期驗(yàn)證,排除系統(tǒng)中除去DDR2控制器之外的錯(cuò)誤給系統(tǒng)造成影響。
1.5、JTAG調(diào)試器
直接采用默認(rèn)設(shè)置即可
1.6、DDR2控制器
設(shè)置部分與第一章中的配置界面相同,按照同樣的參數(shù)設(shè)置。需要改變的是輸入時(shí)鐘為clk的100MHz。
應(yīng)該注意復(fù)位信號(hào)的連接。
1.7、連接
參考下圖中的連接,重新分配基地址,分配中斷號(hào)。
2.2、頂層代碼
頂層代碼代碼,用于調(diào)用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 );endmodule2.3、引腳分配
此次使用的PCIE板卡上有兩個(gè)晶振,一個(gè)為100MHz,一個(gè)為25Mhz,注意引腳分配的時(shí)候注意不要分配錯(cuò)。
在給DDR2信號(hào)分配引腳的時(shí)候,不僅要分配引腳的號(hào),還要選擇引腳的電平標(biāo)準(zhǔn),電流大小。還需要設(shè)置輸出信號(hào)的分組,否則會(huì)在編譯時(shí)出現(xiàn)錯(cuò)誤。最好的方式是一次配置完成后export出一個(gè)tcl腳本文件,以后配置起來(lái)就方便很多了。
2.4、NIOS程序編寫(xiě)測(cè)試
打開(kāi)Eclipse的NIOS開(kāi)發(fā)環(huán)境,選擇正確的sopcinfo文件,新建一個(gè)基于memtest_small模板的工程,直接編譯,無(wú)需更改任何代碼,然后下載運(yùn)行。
此時(shí)程序已經(jīng)成功運(yùn)行起來(lái)了,按照提示的步驟進(jìn)行測(cè)試。
可以看到測(cè)試均通過(guò),說(shuō)明DDR2已經(jīng)成功得被驅(qū)動(dòng)了。
總結(jié)
以上是生活随笔為你收集整理的基于Qsys的DDR2内存驱动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java实现伪造邮件发信人
- 下一篇: 信用卡欺诈检测