Spartan6 FPGA DDR3 IP核調試及程序示例

Spartan6 FPGA芯片中集成了MCB硬核,它可以支持到DDR3。在ISE中提供了MIG IP核,可以用它來生成 DDR3 控制器,並通過 MIG 的 GUI 圖形界面完成相關配置。可以參照其官方datasheet查看其用法--UG388
MCB模塊信號和架構框圖如圖3所示,瞭解內部框圖有助於梳理IP核的邏輯架構,更好的完成用戶端的邏輯設計。IP核將Memory的控制已經做好並封裝起來,提供了FIFO接口給用戶端控制,用戶只要完成指令FIFO和數據FIFO的讀寫操作,就能順利完成對DDR3物理芯片的控制,非常方便。 

                                                                  圖3 MCB信號和內部架構框圖 


二、IP核生成步驟 
圖4-圖17是在ISE14.7環境下生成DDR3 IP核的步驟,按照圖中設置一步一步點到最後即可生成: 


                                                                圖4 選擇MIG 



                                                                圖5 MIG初始界面 


                                                                圖6 IP核命名 



                                                                圖7 兼容型號選擇 



                                                                圖8 存儲器類型選擇 



                                                                圖9 存儲器型號參數設置 


                                                                圖10 終端匹配設置 



                                                                圖11 用戶端口設置 



                                                                圖12 用戶端口操作順序設置 


                                                                圖13 時鐘類型、終端電阻設置 



                                                                圖14 已設置信息 



                                                                圖15 仿真模型選擇 



                                                                圖16 PCB設計參考文檔推薦 


                                                                圖17 生成IP核 


點擊生成後會在相應的路徑下產生三個新的文件夾如圖18所示,其中docs爲MCB的使用指南文檔,example_design是IP核做好的測試範例,生成隨機數寫入到DDR3裏面再讀回來比較是否正確,可以用來測試DDR3是否工作正常,也有仿真激勵,方便用戶學習IP核相關信號的時序。user_design就是用戶設計使用的邏輯代碼,用戶可根據IP核提供的用戶端口信號時序進行寫、讀數據,完成對DDR3的操作。 
 
圖18 生成的IP核文件夾 


user_design包含的文件夾如圖19,包括自動生成的ucf文件,rtl代碼及仿真文件等。 
 
                                           圖19 user_design內容介紹 


三、MCB時序分析 
DDR3 IP核提供了端口給用戶操作,以FIFO的形式與MCB交互數據,時序簡單容易操作。在生成IP核時有一步是選擇用戶端口模式,提供了5種端口模式供用戶選擇,不同模式僅與端口個數和位寬有關,操作時序和流程都是一致的,我們所要了解的就是根據時序按照流程完成對端口的操作,如圖20所示: 
(1)模式1:兩路雙向32位端口,四路單向32位端口(可配置爲讀或寫,需讀和寫爲一組)。 
(2)模式2:四路雙向32位端口。 
(3)模式3:一路64位雙向端口,兩路32位雙向端口。 
(4)模式4:兩路64位雙向端口。 
(5)模式5:一路128位雙向端口。 


 
                                                                圖20 用戶端口模式 


每一路端口都有一組FIFO,包括指令FIFO,寫數據FIFO和讀數據FIFO,具體定義如下。 
(1)指令FIFO,時序如圖21所示。 

 
                                                                圖21 指令FIFO時序

pX_cmd_clk:指令FIFO同步時鐘; 
pX_cmd_en:MCB指令使能信號,高電平有效; 
pX_cmd_instr[2:0]:MCB控制指令,一般爲讀或者寫指令; 
pX_cmd_bl[5:0]: MCB讀或寫一次的深度,最大爲64; 
pX_cmd_byte_addr[29:0]:DDR3的地址空間; 
pX_cmd_empty:指令FIFO空標誌,該FIFO最多可以緩衝3個指令; 
pX_cmd_full:指令FIFO滿標誌,緩衝3個指令即滿, 
上圖爲指令FIFO的時序,以pX_cmd_clk爲同步時鐘,當pX_cmd_en(p0_cmd_en代表p0端口的指令使能信號,本文中設置使用一個端口p0,並且選擇128bit的最大位寬)高電平有效一個pX_cmd_clk時鐘週期,就能進行一條寫或讀指令。指令的具體形式是通過pX_cmd_instr來設置,一般常用的是讀和寫指令。當指令有效後,MCB就可以和DDR3物理芯片進行數據的交互。pX_cmd_bl是當前一次讀寫的深度,若pX_cmd_bl=63,此時MCB的位寬設置爲128bit,那麼每發送一條讀或寫指令,可以從DDR3中讀或往DDR3中寫128bitX64=1KB大小的數據。pX_cmd_byte_addr爲此次數據的讀或寫的起始地址,完成一次操作後地址會自動增加。比如一次寫128bitX64的數據,並且本次操作的起始地址 pX_cmd_byte_addr爲0,那麼讀或寫完後,結束地址則爲1023,下次的讀或寫地址應當從 1024開始,可以看出地址空間是以Byte(8bit)的形式來計算的。pX_cmd_empty和pX_cmd_full則是指令FIFO的空和滿的狀態指示信號,最多可以緩衝3條指令。 
(2)寫數據FIFO,時序如圖22所示。 

 
                                                                圖22 寫數據FIFO時序 


pX_wr_clk:寫數據FIFO同步時鐘; 
pX_wr_en:寫使能信號,高電平有效期間,每一個時鐘的上升沿寫入一個數據到FIFO; 
pX_wr_mask[3:0]:數據屏蔽; 


pX_wr_empy: FIFO空指示; 
pX_wr_full:FIFO滿指示; 
pX_wr_underrun:FIFO溢出指示; 
pX_wr_count[6:0]:寫入FIFO的數據個數,計數器爲異步信號,不準確,只能做參考。 
通過MCB操作DDR3芯片,數據並不是直接發送給DDR3,我們先要把數據寫入MCB的寫數據FIFO中,然後DDR3的控制器再將數據從FIFO中讀出,依照DDR3的指令寫入到DDR3物理芯片中。 
在pX_wr_en高電平期間,每個pX_wr_clk的上升沿寫入一個數據到寫數據FIFO中。當FIFO沒有數據的時候,pX_wr_empy爲高電平,當FIFO滿的時候則pX_wr_full爲高電平,在實際應用中應該避免 pX_wr_full信號有效,當pX_wr_underrun有效時就說明FIFO已經溢出了。pX_wr_count指示當前寫入到FIFO的數據個數,由於pX_wr_count也是異步操作,並不能真實反映當前寫入的數據個數,但可以作大概評估。比如當我們設置一次寫入FIFO數據爲64時,並不需要等FIFO寫滿才發送寫指令,可以在pX_wr_count爲32的時候就發寫指令,能夠提高內存的使用效率。 
(3)讀數據FIFO,時序如圖23所示。 

 
                                                                圖23 讀數據FIFO時序 


pX_rd_clk:讀數據FIFO同步時鐘。 
pX_rd_en:讀使能信號,高電平有效期間,每一個時鐘的上升沿從FIFO中讀一個數據。 
pX_rd_empy:FIFO空指示。 
pX_rd_full:FIFO滿指示。 
pX_rd_underrun:FIFO空時仍然讀的溢出指示信號。 
pX_rd_count[6:0]:FIFO中可供讀取的數據個數,不準確,只能做參考。 
同樣,如果需要從DDR3芯片中讀取數據,也不能直接讀取到,必須經過MCB的讀數據FIFO。讀取FIFO的數據之前,先要進行通過指令FIFO發送一次讀 DDR3的指令,由MCB將數據從DDR3物理芯片搬運到讀數據 FIFO中,用戶再從FIFO中將數據讀走。 
當 pX_rd_empy 爲低電平的時候,表示FIFO非空,則此時可以從FIFO中讀取數據,當pX_rd_empy爲高電平,表示FIFO爲空,此時不能讀FIFO。pX_rd_en高電平時,每一個pX_rd_clk的上升沿,可以從FIFO中讀取一個數據。pX_rd_full表示FIFO數據滿。pX_rd_underrun表示FIFO沒有數據時還讀出數據的錯誤指示。pX_rd_count也是異步操作信號,可用來大致評估FIFO中數據個數,當檢測到 pX_rd_count大於32的時候,開始從FIFO中讀取數據,便於提高利用效率。 
四、應用實例 
對MCB核有了一定的瞭解後,下一步就是進行實踐操作了。本次工程設計了一個單端口128位模式下,對DDR3全地址空間寫數據再讀回來對比的測試,按照用戶端口的操作流程,先寫一個128bit數據到寫數據FIFO中,再將寫指令寫到指令FIFO中,寫指令發送完成後將數據和地址遞增,直到寫滿整個地址空間。寫完成後開始進行讀數據操作,先發送讀指令到指令FIFO中,然後等待讀數據FIFO非空時將數據讀走,將地址遞增,直到讀完整個地址空間。每讀一個數據對比一次,如果不對,則將error信號置爲1。 
邏輯設計完後,將生成的位流文件燒寫到板上驗證,並且使用chipscope觀測信號波形是否與時序一致,可以看到寫操作波形如圖24所示: 


                                                                圖24 寫數據操作波形 


用chipscope觀測到的讀操作波形如圖25所示: 



                                                                圖25 讀數據操作波形

以上操作完畢後開始修改代碼

1. 首先打開上面生成的user_design文件夾裏的par文件夾,找到裏面的UCF文件,因爲我的VCC AUX電壓是2.5V所以不用修改,要是用的3.3就要修改爲3.3V

2. 把39行的NET "c?_pll_lock" TIG註釋掉,這句不用

3. 修改系統時鐘輸入的週期爲 20ns,  這需要跟你板子上的輸入時鐘頻率一致,如果DDR的輸入時鐘是FPGA上PLL產生的就把下面這兩句屏蔽了就行

4. 如下兩個信號的電平標準及引腳約束根據情況設置,如果DDR的輸入時鐘是FPGA上PLL產生的就把下面這四句屏蔽了就行5. 

5. 下面的這些狀態信號的電平標準需要修改,我沒有用他們,直接屏蔽也行

打開上面生成的user_design文件夾裏的rtl文件夾,打開主程序ddr3_demo.v(這個是你新建IP時命名的DDR3的名字),做如下修改

1. 首先設置復位信號是高電平復位還是低電平復位,根據板子情況修改

2. 由於板上的時鐘輸入爲 50Mhz,  因爲 DDR3 是上下沿採樣,這樣 FPGA 內部的 DDR3控制器的時鐘需要625MHz ,所以這裏需要倍頻25,再分頻2,得到625Mhz的CLKOUT0和 CLKOUT1,再分頻 8 分別得到 user interface 的時鐘CLKOUT2和 calibration 的時鐘 CLKOUT3都設置爲78.125Mhz。當然CLKOUT2可以設置爲其他的時鐘頻率,但是calibration 的時鐘 CLKOUT3一般設置爲50M-100M之間,

設置完畢,下面是具體的讀寫例程,有時間再補上

………………………………………………

參考鏈接:https://blog.csdn.net/zhyl558/article/details/82018271

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章