Xilinx 7系列DDR3&PCIe總線(待完善)

昨晚找了一下,發現DDR3讀寫在工程上多是通過例化MIG,調用生成IPcore的HDL Functional Model。我說嘛,自己哪能寫出那麼繁瑣的,不過DDR讀寫數據可以用到狀態機,後期再添磚加瓦吧,當下先對比一下網上找的一段程序和自己例化後的程序。
另外,仿真了十餘分鐘,最後的是什麼鬼?一頭霧水T.T。想着每一次要分析信號要等那麼久就難受。
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)

更重要的是分享一波關於“Xilinx平臺下DDR3設計教程”的資料。就其中的“仿真篇”而言,親測可行,還是中文版
datasheet看着親切。0.0
********************20170519更新:確定關鍵信號及學習博客********************
前天師兄確定說是利用MIG IP core進行例化,參考了幾份關於UG重點詳解:https://wenku.baidu.com/view/63e8c92d195f312b3069a5ea.html
http://blog.chinaaet.com/chinaaetwoaini/p/5100050615
更重要的是找到了“XILINX DDR3 IP核使用教程完版”http://download.csdn.net/download/kpsuwen/9374463
do sim.do仿真後加入“app_cmd、app_addr、app_en、app_rdy、app_wdf_wren、app_wdf_end、app_wdf_rdy、app_wdf_data”等用戶核心信號(下圖是UG586文檔第58頁中的“內存接口示意圖”)。我們主要關心的是左側關於寫操作的交互信號。
********************20170520更新:對用戶信號進行總結及簡單的讀寫時序********************
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
這幾個信號的分析總結在“XILINX DDR3 IP核使用教程完版”中都有所提及,我就稍微的總結一下:
1.寫操作由兩套系統:地址域和數據域。
1.1.地址域:在地址域上,app_rdy(controlled by DDR3)、app_en(controlled by user)同時拉高爲1時地址app_addr(29bit=rank 1+bank 3+row 15+ column 10)纔有效;
1.2.數據域:在數據域上,app_wdf_rdy(controlled by DDR3)、app_wdf_wren(controlled by user)同時拉高爲1時數據app_wdf_data纔有效。
1.3.app_wdf_data和app_rd_data[APP_DATA_WIDTH-1:0]信號都是數據信號,其中“2 * nCK_PER_CLK * PAYLOAD_WIDTH”,“nCK_PER_CLK=4”,“PAYLOAD_WIDTH = (ECC_TEST == "OFF") ? DATA_WIDTH : DQ_WIDTH”,“ECC_TEST == OFF”故“PAYLOAD_WIDTH =DATA_WIDTH=64”。2*4*64=512。數據位寬與BL有關,BL=8表示DDR3-SDRAM每次可以寫入8個64bit數據,512bit
1.4.地址和數據不一定需要同步,可提前或者滯後兩個時鐘,見下圖。另外下圖也可看出命令信號app_cmd和地址信號app_addr是對齊綁定的,而不和數據域綁定。
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
寫通道:
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
讀通道:
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)

  2.讀操作

寫時序仿真結果圖:
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
分析:以clk爲基礎時鐘,“app_en=1、app_rdy=1”時“app_addr”有效,四個時鐘,寫入了四個地址,另外需要強調一點的是: app_addr[ADDR_WIDTH – 1:0] 是ddr3的地址,精確到每個col地址,但是因爲實際突發長度(Burst Length)要求8所以每個數據都是第4位開始。因此第四位開始app_addr進行二進制增加。

讀時序仿真結果圖:
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
分析:暫時擱置

********************20170521更新:關於V7系列的mig例化********************
早上大致看了以下師兄給的VC709板關於mig例化仿真文檔,雙BANK,先是bank a,再是bank b,最後bank a_b,xilinx 用K7系列和V7系列例化的過程幾乎一致,只是V7的這份user guide的仿真環境是vivado,用ise應該是一樣的效果,今天中午的問題卡在了在例化過程中加入.dxc引腳文件時報錯了,見下圖:
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
鬱悶的很,大概直譯一下“對於某些端口,即使對於所選擇的配置是必需的,也不提供位置約束。 以下是提供的UCF中缺少的端口:ddr3_addr[15]”,ddr3_addr[15:0],16bit,單單最後這位的引腳配置報錯,我嘗試手動輸入這120餘個引腳信息,但是IO standard又不能強行輸入,就放棄了此想法。sublime打開xilinx官網down的dxc文件,找到ddr3_addr[15]口,見下圖:
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
對比了一下ddr3_addr[15]和ddr3_addr[14:0]之間的差別,沒發現有毛病。難道我思考方向錯了?!

花了40min中,按照dxc中的信息強行把管腳配置完畢,人工配置太累了,下圖是配置管腳後的:
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
輸入完後系統會識別IO標準:
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)
終於又可以繼續了... ...
*****20170713更新:上面遇到的問題是因爲ise不支持xdc引腳文件的緣故,vivado平臺下正常*****

Here is the Summary
Xilinx <wbr>7系列DDR3&PCIe總線(待完善)

********************20170522更新:DDR3內部核心頻率、時鐘頻率、數據傳輸頻率********************
1.核心頻率/Core Frequency/:(解釋1)內存cell陣列的工作頻率,它是內存的真實運行頻率。(解釋2)每款芯片都有其自己的極限頻率,這個極限頻率就是內存的核心頻率,或者說是它能正常工作的頻率,因此把內存的頻率稱爲內存的真實頻率。
2.時鐘頻率:(解釋1)I/O Buffer(輸入/輸出緩存)的傳輸頻率。(解釋2)內存作爲數字邏輯芯片,本身不產生頻率,頻率是主板上的頻率發生器外加給它的,主板上產生的這個頻率稱爲時鐘頻率。
3.數據傳輸頻率:內存與系統交換數據的頻率,也稱爲內存的等效頻率或者接口頻率。
*****三者在內存中的關係*****
核心頻率就是內存的工作頻率,到DDR2、DDR3纔有了時鐘頻率概念,時鐘頻率是將核心頻率通過倍頻技術得到的一個頻率。///DDR內存核心頻率和時鐘頻率相同,但在傳輸數據的時候在脈衝的上升沿和下降沿都傳輸了一次,所以數據傳輸頻率是核心頻率的2倍;DDR2內存將核心頻率倍頻2倍得到了時鐘頻率,同樣在上升沿和下降沿各傳輸一次數據,所以數據傳輸頻率就是核心頻率的4倍、時鐘頻率的兩倍;DDR3內存的時鐘頻率是核心頻率的4倍,同樣在上升沿和下降沿各傳輸一次數據,所以數據傳輸頻率就是核心頻率的8倍。
Following are three examples.
DDR2-800:核心頻率200MHz,時鐘頻率400MHz,數據傳輸頻率800MHz;
DDR3-800:核心頻率100MHz,時鐘頻率400MHz,數據傳輸頻率800MHz;
DDR3-1066:核心頻率166MHz,時鐘頻率533MHz,數據傳輸頻率1066MHz.

********************20180327更新:關於x4_gen2 PCIe總線(半年有餘)********************
後續調通最基本的DDR3讀寫邏輯後,因爲導師項目需求,將DDR3擱置,開始調試PCIe總線接口,實驗室沒有基礎,只能靠自己和師姐一步步摸索,最後選擇:基於xilinx xapp1052例程,xc7a100t芯片上用Vivado2017.02平臺進行開發,爲滿足後期性能要求,在工程里加上了數據存儲部分、中斷處理部分、讀完成包亂序處理等模塊,在DMA相關寄存器方面做小修改,已經可以做到單板數據迴環,明天測試兩個端系統之間的數據傳輸。詳情等後期文檔整理。(ps:感謝LH師兄,CC師姐,DM師兄,特別感謝EETOP的XD前輩)
關於PCIe總線開發調試總結已分享☞https://blog.csdn.net/LWF729882492/article/details/79754525  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章