基於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地址開始;

仲裁模塊用來控制本次該執行哪種操作,避免讀寫沖突;

具體的功能將在下一節中進行介紹,有點寫累了,先去喝一杯茶.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM