主頁 > 軟體設計 > Xilinx FPGA平臺DDR3設計保姆式教程(3)MIG IP核使用教程及DDR讀寫時序

Xilinx FPGA平臺DDR3設計保姆式教程(3)MIG IP核使用教程及DDR讀寫時序

2021-11-10 21:39:07 軟體設計

干貨來了,用DDR搬磚,只需要會用IP就好,Xilinx官方YYDS!

-----------------------------------------------------------------------------------------------------------------

匯總篇:

Xilinx平臺DDR3設計保姆式教程(匯總篇)——看這一篇就夠了

----------------------------------------------------------------------------------------------------------------

目錄

一、MIG IP核配置

二、埠信號定義

2.1全部埠的注釋詳解

2.2埠信號分類

2.2.1使用DDR只需要設計這幾個信號

2.2.2 IP核的輸出信號

2.2.3 DDR讀資料信號歸類

2.2.4 DDR寫資料信號歸類

三、時序圖

3.1 UI控制時序圖

3.2寫操作時序圖

3.3讀操作時序圖

四、參考資料


一、MIG IP核配置

工具 :VIVADO 2018.3

FPGA : XC7K325FFG900-2

DDR3 : MT41J256M16XX-125

  • 配置時鐘部分,建議詳看第二篇《DDR各時鐘頻率分析》

(1)選中“MIG”進入配置界面

(2)選擇Create Design來創建設計

①選擇Create Design來創建設計

②自定義名字

③選擇1個控制器就好

④是否使用AXI4介面,為了簡化理解,不勾選

(3)是否選擇兼容其他器件(不需要,直接NEXT)

(4)存盤器選擇,還用說嗎,DDR3走起

(5)重點來了,時鐘配置、DDR選型

①Clock Period,即DDR芯片物理側的IO時鐘頻率,稱之為核心頻率

②物理側到控制器時鐘的比例,可選4:1或2:1;決定了ui_clk的頻率;

如圖配置的話,ui_clk = 800M /4 =200Mhz

③選擇DDR3的型別,Components指的是DDR3的型號是元件類,筆記本那種的插條類是SODIMMs,

④選擇DDR3的型號

⑤資料位寬,由DDR型號決定,但是當FPGA掛了多片DDR時,位寬相應增加;

(6)配置系統時鐘

系統時鐘輸入,建議200M,后面參考時鐘可以直接使用系統時鐘,

(7)參考時鐘、復位

①系統時鐘選擇NO BUFFER,因為系統時鐘為200M,所以參考時鐘直接使用系統時鐘就好, 參考時鐘必須是200Mhz!

②復位是高電平有效還是低電平有效,筆者第一次玩DDR,仿真的時候初始化一直不成功,就是復位信號搞反了 = =||

③是否使用XADC,會輸出器件的溫度,如果其他模塊要用XADC,那么這里就不使能,

(8)下一頁,50歐電阻,根據硬體而定,不用管,直接NEXT

(9)新設計 or 管腳已固定?

如果硬體已經定了,那么就選下面管腳已固定,然后讀取約束檔案,設定管腳就好,

①管腳讀取配置好了,點②確定再next進入下一頁,

但是,我們這里只是為了講解DDR應用,沒有硬體,選第一種新設計模式,

(10)后面依次NEXT就好了,最后生成,

(11)IP核生成完畢,打開veo檔案查看例化檔案,

(12)所有不會使用的IP,我們都打開Example Design來了解使用,

IP核配置完成,讀寫測驗下篇再講,下面重點講解各埠信號,

二、埠信號定義

對于mig與DDR3的讀寫原理我們不需要了解太多,交給mig就可以了,我們需要做的是控制好用戶介面,寫出正確的用戶邏輯,控制好讀寫時序,想要寫好User logic,我們就必須清楚每一個用戶控制介面的含義:

信號名稱

信號方向

描述

app_addr

輸入

地址總線, UI聚合外部SDRAM的所有地址欄位,并提供平面地址空間(Rank,bank,row,colum),

讀寫地址總線復用,

根據突發長度BL=8,所以地址每次+8;

app_en

輸入

命令使能信號,為高時,app_cmd才有效

app_cmd

輸入

命令信號:

3’b000 : 寫命令

3’b001 :讀命令

app_wdf_data

輸入

輸入資料總線,表示需要寫入的資料

app_wdf_wren

輸入

寫使能信號

app_wdf_end

輸入

指示當前周期中app_wdf_data []總線上的資料是當前請求的最后一個資料,

app_wdf_mask

輸入

1:屏蔽資料; 0:有效資料

每1bit對應一個輸入資料位元組;

app_wdf_rdy

輸出

此輸出表示寫資料FIFO已準備好接收資料

app_rdy

輸出

此輸出表示DDR已準備好

app_rd_data

輸出

讀資料,

app_rd_data_valid

輸出

輸出有效信號

app_rd_data_end

輸出

此輸出表示當前周期中app_rd_data []總線上的資料是當前請求的最后一個資料,

ui_clk

輸出

用戶邏輯使用的時鐘,取決于在GUI中選擇的核心頻率以及2:1或4:1模式;

ui_clk_sync_rst

輸出

reset信號來自于UI,與ui_clk同步,

init_calib_complete

輸出

表示DDR初始化完成,資料才能寫入讀出

app_ref_req

輸入

置1時,此高電平有效輸入請求記憶體控制器向DRAM發送重繪命令, 它必須在一個周期內進行脈沖以發出請求,直到app_ref_ack信號被置位以確認請求并指示它已被發送,然后置為無效,一般置0

app_ref_ack

輸出

此高電平有效輸入確認重繪請求,并指示該命令已從存盤器控制器發送到PHY

app_zq_req

輸入

置1時,此高電平有效輸入請求存盤器控制器向DRAM發送ZQ校準命令, 它必須在一個周期內進行脈沖以發出請求,直到app_zq_ack信號被置位以確認請求并指示它已被發送,然后取消置位,一般置0

app_zq_ack

輸出

此高電平有效輸入確認ZQ校準請求,并指示該命令已從存盤器控制器發送到PHY,

app_sr_req

輸入

保留功能信號,一般置0

app_sr_active

輸出

保留功能回應,不用管

2.1全部埠的注釋詳解

2.2埠信號分類

2.2.1使用DDR只需要設計這幾個信號

  1. app_cmd (你總要先確認你想要寫還是想要讀吧)

操作命令,其實你只需要用到3'b000(寫入)和3'b001(讀出)

要和操作地址同時出現才有效,

2. app_addr (往哪兒寫,從哪兒讀?)

操作地址,按照結構從高位到低位是 rank + bank + row + column

3. app_en (確認地址線上的地址有效,不能初始值都一直有效吧)

操作地址app_addr的使能,只有它拉高的時候,對應的app_addr才是有效的

4. app_wdf_data (要寫的話,你得有料不是)

寫入的資料介面

5. app_wdf_wren (那也不能什么料都往里倒不是)

寫入的資料介面app_wdf_data的使能,

只有它拉高的時候,對應的app_wdf_data才是有效的

6. app_wdf_end 要你作甚,一句app_wdf_end = app_wdf_wren 搞定)

理論上應該有點用,但是實際你只要讓它跟app_wdf_wren一樣就行了

emm...大神這段解釋很傳神,我直接copy過來了

2.2.2 IP核的輸出信號

  1. app_rdy (想要DDR幫你干活,也得讓人家準備好了不是?)

app_rdy表示UI已經準備好接收命令了,意思就是說必須要等app_rdy信號拉高了之后,app_en和app_cmd等才能開工干活= =

而且,這個不受你控制,等著吧

2. app_wdf_rdy (想要往DDR寫資料?不好意思,等我準備好了再說)

app_wdy_rdy信號表示寫資料FIFO已經準備好接收資料了,資料在app_wdf_rdy = 1’b1且 app_wdf_wren = 1’b1時被寫入,

同理,這個rdy不也受你控制,等著吧

3. init_calib_complete(DDR讀寫不對?先檢查初始化成功了沒好吧)

init_calib_complete拉高表明DDR已經校準成功初始化完成了!

拿去搬磚吧!

4. ui_clk(看好了,邏輯使用的時鐘擱這輸出呢)

在第二篇《DDR的時鐘分析》里我們也講過,ui_clk就是邏輯使用的時鐘;由配置界面“Clock Period”與“4:1 / 2:1模式”確定的;如:核心頻率為400M;選擇了4:1模式,那么ui_clk = 400 / 4 =100 M;

記住,你的邏輯代碼作業在ui_clk這個時鐘域!

emm...模仿一下大神的語氣

2.2.3 DDR讀資料信號歸類

再來對DDR的信號規個類吧,哎,這寫的真是羅里吧嗦= =

  1. app_rdy
  2. app_en
  3. app_cmd
  4. app_addr

在app_rdy為高 且 app_en 為高時,讓app_cmd = 3’b001,同時我們給出讀資料的地址app_addr,那么等段時間延遲后,我們就能讀出想要的資料了:(結合后文時序圖更容易理解

  1. app_rd_data
  2. app_rd_data_valid

這就是我們讀出的資料了,

2.2.4 DDR寫資料信號歸類

①前提條件

  1. app_rdy
  2. app_wdf_rdy
  3. app_en

②地址和命令

  1. app_cmd
  2. app_addr

③寫資料

  1. app_wdf_wren
  2. app_wdf_data
  3. app_wdf_end
  1. app_wdf_mask :一般不用,直接置0

想要寫資料到DDR?必須在①前提條件全部為高時,給出②地址和命令(app_cmd = 3’b000),然后給出③寫資料的信號,就成功寫入資料到DDR了;

注意:①②時序嚴格對齊!③相對①②可以提前1拍,或最多延遲2拍,但是最好跟①②對齊,不容易出錯,(結合后文時序圖更容易理解

三、時序圖

玩介面嘛,大部分根據時序圖來就是了,挺簡單的

3.1 UI控制時序圖

如圖所示:

必須要app_rdy拉高時,你所給的(使能app_en、命令app_cmd、地址app_addr)才會被接受,

★app_rdy :前提條件,不管是讀還是寫,都必須在app_rdy為高的時候進行操作,

3.2寫操作時序圖

正如前文信號歸類所說:

寫入DDR必須在前提條件(app_rdy & app_wdf_rdy)全部為高時,給出地址和命令(app_cmd = 3’b000),然后給出寫資料的信號(使能與資料),就成功寫入資料到DDR了;

注意:地址和命令必須時序嚴格對齊!寫資料信號相對來說有三種情況:①嚴格對齊;②可以提前1拍;③最多延遲2拍;但是最好全部時序對齊,不容易出錯,

3.3讀操作時序圖

讀操作就簡單了,在前提條件app_rdy為高時,給出命令(app_cmd = 3’b001)與地址(app_addr),等段時間延遲,資料就讀出來了,以valid信號表示資料有效,

下一篇我們就開始用DDR來搬磚了,測驗下讀寫,初步掌握使用~

四、參考資料

  1. 《UG586》 官方檔案不多說,YYDS!
  2. 《Xilinx平臺DDR3設計教程之仿真篇》 一系列文章,筆者就是看過后才初步熟悉了DDR3的使用,推薦給大家,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355135.html

標籤:其他

上一篇:Nginx學習之ngx_cycle_s中的四維指標

下一篇:通過ReLU激活過度擬合小資料集

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more