基於MIG IP核的DDR3控制器(一)
最近學習了DDR3控制器的使用,也用著DDR完成了一些簡單工作,想著以後一段可能只用封裝過後的IP核,可能會忘記DDR3控制器的一些內容,想著把這個DDR控制器的編寫過程記錄下來,便於我自己以後檢視吧,哈哈哈,閒話少說開始工作。這個DDR3控制器分兩節內容吧,第一節就是MIGIP核的簡單介紹和生成這個IP核再介紹一下自己封裝這個IP的整體架構,第二節就來介紹一下各個模組的內容。
1.1 MIG IP 核介紹
1) MIG IP核架構
通過查閱ug586_7Series_MIS,我們可以看到MIG這個IP核的架構如下,直觀可以看出,MIG主要有面向用戶埠和麵向DDR埠,使用者通過使用MIG能夠通過使用者埠的訊號,來完成對DDR SDRAM的訪問,達到簡化操作的目的。
我們重點要關注的就是使用者埠的這些訊號,在這裡我們主要介紹一下我們將使用到的訊號,具體訊號的含義,可以去datasheet中檢視具體訊號的作用。
2) cmd path signals(命令通道訊號)
首先我們需要了解與使用者命令相關的訊號,並且瞭解命令能夠被正確接收的時序。在下面的介面列表中訊號的I/O方向均是相對MIG IP核而言的。
埠名稱 |
I/O |
位寬 |
備註 |
app_cmd |
I |
3 |
命令匯流排,3’b000表示寫命令,3’b001表示讀命令 |
app_addr |
I |
29 |
將要訪問的DDR記憶體地址,具體位寬與使用者生成IP核時的設定有關 |
app_rdy |
I |
1 |
空閒訊號,指示當前IP核的工作狀態,只有該訊號為高時,IP核才能正確的想用使用者給出的命令 |
app_en |
I |
1 |
命令使能訊號,該訊號有效且app_rdy有效時,命令才能 |
下圖是一張使用者命令正確被IP核接收的時序圖,可以看到,只有在app_en 和app_rdy均為有效的時候,命令才能正確得被接收到MIG IP核中。
3) 使用者讀埠相關訊號
埠名稱 |
I/O |
位寬 |
備註 |
app_rd_data |
O |
256 |
從DDR中讀出得資料,一個時鐘週期突發讀出8個32bit資料(位寬根據IP核設定會有不同) |
app_rd_data_valid |
O |
1 |
讀出資料有效訊號,該訊號為高時表示從IP核中讀出的資料有效 |
app_rd_data_end |
O |
1 |
指示當前資料時突發讀寫的最後一個週期的資料,這個訊號與設定的使用者時鐘和DDR時鐘的比例有關 |
下面的時序圖顯示了從MIG IP中讀出資料的使用者操作時序,當用戶的讀資料命令被IP核接收後,在幾個時鐘週期後會將讀出的資料輸出到資料匯流排上。
4) 使用者寫埠相關訊號
埠名稱 |
I/O |
位寬 |
備註 |
app_wdf_wren |
I |
1 |
寫資料有效訊號,當app_wdf_rdy也為有效時,IP核才會接收到使用者端傳送的app_wdf_data |
app_wdf_rdy |
I |
1 |
寫空閒訊號,IP核內部的寫FIFO能夠接收使用者資料的標誌 |
app_wdf_data |
I |
256 |
使用者寫入IP核的256bit資料 |
app_wdf_end |
I |
1 |
該訊號有效時,表示當前是一次DDR寫突發的最後一個數據 |
app_wdf_mask |
I |
32 |
32bit資料掩碼,每一位對應app_wdf_data的一個8bit資料 |
下面是一張MIG控制器的寫時序圖和官方對這幾種寫操作的解釋,通過官方文件的介紹我們可以知道寫入的資料可以在寫命令給出之前,之時或者之後給出,但是在寫命令之後給出的寫資料不能超過兩個時鐘週期。在寫命令之前給出寫資料則沒有這些限制。
之所以能過這樣操作,是因為在IP核內部有寫入資料的FIFO能夠對資料實現緩衝。
在瞭解了MIG控制器的相關使用者埠的訊號後,我們就可以著手來自己寫一個控制器來簡化使用者操作,更加簡單地對DDR進行操作。接下來我們首先根據開發板所有的資源生成一個對應MIG控制器的IP。
1.2 建立工程並生成DDR控制器IP核MIG
1) 生成DDR控制器IP核
首先點選右側 IP Catalog 在收索頁面輸入MIG選擇Memory Interface Generator,雙擊彈出IP核配置介面。
在最開始的彈出介面中,主要是介紹了我們的FPGA核心晶片的相關資訊,點選next
在這一個頁面中,我們選擇建立一個設計,並將IP核名稱更改為ddr3,選擇生成一個DDR控制器,點選Next。
在接下來的頁面中選擇可以同種型別的FPGA晶片,在這裡我們不勾選,點選next。
在這一介面中選擇的是儲存的種類,因為我們核心板上有兩粒鎂光的MT41K256MXX-107的DDR3記憶體晶片,所以這裡選擇DDR3 SDRAM
在接下來的這一頁中要選擇DDR3的工作頻率,這裡我們選擇400MHz,若是FPGA晶片的速率等級不同,選擇的工作頻率有可能不同。
然後選擇DDR晶片的訊號,這裡根據核心板上的兩粒鎂光的DDR記憶體晶片選擇具體的型號,這裡為MT41K256MXX-107;
接下來是電壓的工作,選擇1.5V;
接下來是資料位寬,因為開發板上兩粒DDR3晶片的位寬為16bit所以在這裡選擇位寬為32bit;
工作模式選擇normal;
這裡解釋一下,為什麼DDR控制器的工作頻率要選擇400MHz:在這裡選擇400M的工作時鐘,是為了便於我們後面在進行突發讀寫資料時提供便利,400M的時鐘在雙沿傳輸資料,此時我們可以看到下面的PHY to Controller Clock Ratio 固定為4:1,這樣,在一個時鐘週期內,就可以一次突發傳輸8個數據,這與DDR3採用8位預取計數是相關的。而且,設定時鐘為400MHz,也簡化了我們在之後對於app_wdf_end和app_rd_end這兩個訊號理解與設計。
DDR3控制器的頻寬計算:
在本設定下,傳輸資料的理論頻寬可以看作400M*2*32bit=25.6Gbps,其中400M是工作時鐘,2是雙沿進行資料傳輸,32bit是記憶體的每一個地址的容量。
在接下來的頁面中選擇輸入IP核的時鐘為5000ps(200MHz),選擇突發型別,和確定地址的組合方式為bank-row-col的組合方式。
在這一頁中,我們選擇系統時鐘型別為No Buffer,參考時鐘型別為 Use System Clock,系統復位選擇為低復位。
在這一頁面中,選擇阻抗為50歐姆,這是由核心板的硬體設計決定的
接下來的頁面中,是對DDR控制器進行管腳分配,在這裡我們選擇 Fixed Pine Out,通過讀取UCF檔案中的引腳分配給DDR3分配引腳。在這一介面中,選擇 Read XDC/UCF檔案為控制器分配引腳,在彈出介面選擇我們為使用者提供的引腳分配的UCF檔案,點選OK;
讀取完UCF檔案後,點選Validate就可以驗證管腳分配是否合理;若管腳分配合理,點選OK後,方可點選Next;接下來一路點選OK就可以了。
到這裡就生成了本次實驗的IP核,我們可以開啟例化模板看看該IP核的各個訊號。
至此生成了IP核,下面簡單介紹一下剛剛沒有提到的幾個訊號:
以ddr開頭的這寫訊號是該IP核與DDR3晶片連線的訊號,我們不必太關心。
app_sr_req,app_ref_req,app_zq_req這個三個訊號再這裡我們先暫時不應管,在簡單的應用中也用不上。
ui_clk:是MIG IP核提供給使用者使用的一個100MHz時鐘;
ui_clk_sync_rst:是ui_clk的復位訊號,當該訊號拉低的時候表示ui_clk已經復位完成;
sys_clk_i:是輸入到該IP 核的系統時鐘,前面我們選擇的是NO BUFFER和use system clock所以這裡有一個單端的輸入時鐘介面;
sys_rst:是IP核覆位訊號,前面設定的是低有效;
init_cail_complete:是DDR初始化完成訊號,在本設定下,一般情況下DDR在復位後108us時完成初始化;
3、基於MIG 設計一個DDR讀寫控制器
1)整體架構
整體的架構如下圖所示:主要有一下幾個模組,分別是讀控制模組,寫控制模組仲裁模組在下一節中將介紹這幾個模組,在本節中簡單介紹一下這個整體模組的功能:
外界想要寫入到DDR中的資料通過寫控制模組寫入DDR中,寫入的地址從0地址開始增加;
外界想要從DDR中讀出資料通過讀控制模組,讀出的資料從0地址開始;
仲裁模組用來控制本次該執行哪種操作,避免讀寫衝突;
具體的功能將在下一節中進行介紹,有點寫累了,先去喝一杯茶.
相關推薦
基於MIG IP核的DDR3控制器(一)
最近學習了DDR3控制器的使用,也用著DDR完成了一些簡單工作,想著以後一段可能只用封裝過後的IP核,可能會忘記DDR3控制器的一些內容,想著把這個DDR控制器的編寫過程記錄下來,便於我自己以後檢視吧,哈哈哈,閒話少說開始工作。這個DDR3控制器分兩節內容吧,第一節就是MIGIP核的簡單介紹和生成這個IP核再
使用Xilinx FIFO IP核的總結(一)
FIFO IP核的總結(一) 第一次使用Vivado中的FIFO generator,同步FIFO的常用埠也就10個左右: CLK
學習《selenium2自動化測試基於python》遇到的問題(一)
pypi tools bsp sel dir python 解決方案 打不開 什麽 問題一: 通過cmd,用Python安裝setuptools時,報錯no module named ‘six‘等類似情況時,解決方案: 翻譯過來就是缺少SIX的模塊,直接到官網打開,下載
C#基於LibUsbDotNet實現USB通信(一)
cti sha esc log gist ces pos 簡單 src 網上C#USB通信的資料比較少, 基本上都是基於LibUsbDotNet 和 CyUsb, 關於打印機設備的還有一個OPOS。 本篇文章基於LibUsbDotNet。 1. 下載並安裝 L
基於Java語言構建區塊鏈(一)—— 基本原型
java 分布式 程序員 後端引言 區塊鏈技術是一項比人工智能更具革命性的技術,人工智能只是提高了人類的生產力,而區塊鏈則將改變人類社會的生產關系,它將會顛覆我們人類社會現有的協作方式。了解和掌握區塊鏈相關知識和技術,是我們每位開發人員必須要去做的事情,這樣我們才能把握住這波時代趨勢的紅利。 本文將基於Jav
Linux內核設計基礎(一)之中斷處理
family ng- 內存 irq strong 睡眠 sign 技術 struct 假設讓內核定期對設備進行輪詢。以便處理設備,那會做非常多無用功,假設能讓設備在
TCP/IP詳解V2(一)之UDP協議
listen point reflect con 協議 提取 高級數據結構 don size UDP UDP是一個面向數據報的簡單運輸層協議。 數據結構 struct udphdr { u_short uh_sport; //源端口 u_shor
基於H5的混合開發介紹(一)WebView
轉自: https://www.cnblogs.com/sanchang/p/9261461.html 一 WebView到底是什麼 1 WebView是一種控制元件,它基於webkit引擎,因此具備渲染Web頁面的功能。 2 基於Webview的混合開發
【Python-GPU加速】基於Numba的GPU計算加速(一)基本
Numba是一個可以利用GPU/CPU和CUDA 對python函式進行動態編譯,大幅提高執行速度的加速工具包。 利用修飾器@jit,@cuda.jit,@vectorize等對函式進行編譯 JIT:即時編譯,提高執行速度 基於特定資料型別
TCP/IP網路程式設計學習(一)
前言:學校開的課比價不合理,這學期才剛剛接觸計算機網路,可是本學期很多課卻又是以計算機網路為基礎的。沒辦法,只能先自己學習一些計算機網路方面的知識。學習這個網路程式設計主要是為了做我的一個程式設計的實驗
基於JWT的Token認證機制(一)
簡介 JSON Web Token(JWT)是一個非常輕巧的規範,這個規範允許我們使用JWT在使用者和伺服器之間傳遞安全可靠的資訊。它是基於RFC 7519標準定義的一種可以安全傳
MFC 基於VLC的視訊播放器(一)---簡介
大家好,我是一名大四學生,今年的科研訓練題目是做一個播放器,從以前就很想試著做一下,大概花了四五天寫完程式碼,這幾天來寫總結。 先看一下執行的效果: 主介面: 執行介面: 涉及到的知識:1、MFC上播放gif動畫 2、MFC的
基於STM32的ESP8266使用教程(一)
關於為什麼要寫這篇文章,因為之前在做一個專案的時候需要使用WIFI模組。X寶搜WIFI模組的時候推薦ESP8266這個模組,說是價格便宜、使用方便。但是在使用的過程中發現的確使用方便(因為是基於AT指令的,就是AT+...這種固定格式的指令,如AT+RST就是復位指令),但
Windows下基於Caffe的SSD網路學習(一)配置加生成自己的資料集
最近準備要做畢業設計了,所以從頭又配了一遍Caffe,學了一遍SSD,看了Caffe的原始碼,準備對SSD網路做一些改進。由於這已經是第n遍配置Caffe了,但是還是費了不少時間,所以意識到,總結還是很重要的,所以寫下部落格記錄這一路如何走來,同時也希望可以給有需
基於Axis2開發WebService的HelloWorld(一)
1.HelloWorld做了些什麼? HelloWorld功能非常簡單,在客戶端輸入你的姓名,本例中為Leo。引數傳遞到伺服器端後,經過處理將返回name+"HelloWorld!",本例中為Leo HelloWorld! 2.伺服器端檔案HelloWorld.java package sample;
如何開發一個基於 Vue 的 ui 元件庫(一)
開發模式 預覽 demo 在開發一個 ui 元件庫時,肯定需要一邊預覽 demo,一邊修改程式碼。 常見的解決方案是像開發一般專案一樣使用 webpack-dev-server 預覽元件,比如通過 vue-cli 初始化專案,或者自己配置指令碼。 文藝一點兒地可能會用到 parcel 來簡化 demo
docker swarm 和compose部署服務,解決跨主機網路問題和ip不固定問題(一)
一 要求: docker版本13以上;compose版本11以上;關閉防火牆和selinux二 composev3版本加入了很多功能,現在我肯可以很方便的結合docker swarm 和compose來完成不同主機之間的通訊問題三 準別2臺虛機,安裝docker ,配置d
基於詞彙樹的影象檢索(一):詞彙樹
從今天起準備把我的畢設的實現細節寫到部落格裡面,一方面寫一遍加深記憶,另一方面如果哪天忘記了查起來也方便 畢設題目是基於詞彙樹的無序影象集檢索和支撐結構生成,其實提出詞彙樹那篇文章(Scalable Recognition with a Vocabulary Tree[1
基於深度學習的視訊檢測(一)
一、簡介 影象目標檢測任務在過去幾年深度學習的發展背景下取得了巨大的進展,檢測效能得到明顯提升。但在視訊監控、車輛輔助駕駛等領域,基於視訊的目標檢測有著更為廣泛的需求。由於視訊中存在運動模糊,遮擋,形態變化多樣性,光照變化多樣性等問題,僅利用影象目標檢測技術檢
【原創】IP攝像頭技術縱覽(一)---linux 核心編譯,USB攝像頭裝置識別
IP攝像頭技術縱覽(一)— linux 核心編譯,USB攝像頭裝置識別 開始正文之前先來認識一下我的開發環境: 系統:ubuntu 10.04 開發板:AT91SAM9260 + Linux-2.6.30 USB攝像頭:UVC無驅攝像頭(著手開發時只