天天看點

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

大家好,又見面了,我是你們的朋友全棧君。

目錄

前言

1、關于重新整理

2、關于資料中心對齊

3、SDRAM晶片手冊介紹

3.1SDRAM晶片的管腳

3.2 SDRAM指令集

3.3 模式寄存器

3.4 關于SDRAM上電初始化和裝載模式寄存器

3.5 SDRAM重新整理時序

3.6 關于寫通路

3.7 關于突發通路

4、FPGA工程設計

4.1狀态機設計

5、仿真測試

5.1仿真模型

5.2仿真項目

5.2testbench

前言

工作中使用過SDRAM晶片,型号:IS42/45R86400D/16320D/32160D

對SDRAM使用中需要注意的一些事項進行整理。

在SDRAM設計中,需要注意三點:(1)若狀态機使用clk時鐘,則采用多少相位的時鐘給SDRAM晶片管腳/采用多少相位的時鐘采樣SDRAM晶片傳回的回讀資料?(2)關于重新整理的處理方式。(3)狀态轉移的設計,如何響應讀寫和重新整理請求,沖裁機制是怎樣的?

若仔細思考過上面三個問題,剩下的就按SDRAM晶片手冊時序圖寫代碼即可實作該控制器。

再進一步提高,就是思考如何對代碼、對時序優化、提高速度的問題。

1、關于重新整理

關于SDR SDRAM的重新整理機制,有一點值得說明一下:64ms重新整理8K次;或類似的重新整理要求吧

這一點,是指64ms内,需要進行8K次自重新整理,但是它并沒有要求這8K次平均分布在64ms的時間區域内。

也就是說,你可以在64ms裡的第一個ms内,直接做完8K次重新整理;在省下的63ms内,你可以不進行重新整理操作。

讀者會疑問,這樣的重新整理操作 與 8K次重新整理均勻分布在64ms區間的差别在哪????

若你第1ms就執行完8K次重新整理,則你省下的63ms就可以上SDRAM去做讀寫操作!

換個意思就是說,在不需要進行SDRAM讀寫通路的時候,就讓它多做一些重新整理;這樣就能為讀寫操作提供大量完整的時間,而不被重新整理操作打斷!

2、關于資料中心對齊

需要注意信号的跨時鐘域處理,信号從一個時鐘域出來,如何在另一個時鐘域進行準确的采樣接收。

若sys_clk用于狀态機發送指令cmd[3:0]、位址address[12:0],可以采用sys_clk_180相移180度的時鐘來驅動SDRAM晶片的時鐘管腳。

在資料寫入SDRAM時,SDRAM晶片用sys_clk_180時鐘來對cmd、address、DQ進行資料采樣;

在讀通路SDRAM資料時,狀态機在sys_clk時鐘驅動下發送讀指令cmd[3:0]、讀位址address[12:0],然後使用sys_clk_180時鐘采樣SDRAM傳回的讀資料。

上述紅色字型格外需要注意,因為若采用sys_clk時鐘采樣SDRAM傳回的讀資料的話,可能就采樣不到資料,modelsim仿真也會顯示無法采樣三态門IO端口回讀到的資料。比如,下圖仿真遇到的問題。

I端口向IO端口寫資料:在EN_SEL_N_DLY=0時,三态門将I端口資料送到IO端口。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

EN_SEL_N_DLY=1時,O端口從IO端口回讀資料:但O端口的數值在仿真中顯示無法指派給寄存器r_APP_RD_DATA??

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

實際調試中,可能會遇到的問題:

舉個栗子,提個問題:如果SDRAM在上電初始化的時候,沒有進行load MODE register,請問其CAS潛伏期會是多少?

舉個栗子,提個問題:如何保證送到SDRAM晶片管腳的CMD、addr、DQ與采樣時鐘是中心對齊的?如何采樣SDRAM送出的DQ資料,保證采樣的準确性?如何提高SDRAM控制器的工作頻率?

3、SDRAM晶片手冊介紹

SDR SDRAM晶片型号:IS42/45R86400D/16320D/32160D

3.1SDRAM晶片的管腳

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

3.2 SDRAM指令集

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

3.3 模式寄存器

通過配置模式寄存器,可以配置SDRAM晶片工作的狀态。

通過配置模式寄存器,來配置SDRAM的:突發長度(burst length,BL)、突發類型、潛伏期(CAS Latency, CL)、操作模式、寫突發模式。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試
SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

3.4 關于SDRAM上電初始化和裝載模式寄存器

按照晶片手冊裡的時序圖配置即可,如下圖所示。

需要注意的是,在SDRAM上電開始時刻,需要等待至少100us的時間,之後才開始給SDRAM配置下面的控制時序。

等待100us的時間,是為了等待PLL輸出的時鐘穩定;待PLL時鐘穩定後,才開始初始化SDRAM、以及配置模式寄存器。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

下圖是手繪的上電和加載模式寄存器時序圖。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

初始化流程如下:

  1. 在複位結束、有時鐘clk信号開始後,計時T1、即經曆100us後,發送nop指令碼;
  2. 所有bank預充電。在T1的下一個clk上升沿來臨時、即在T2時刻,發送Precharge指令碼,Sdr_a[10]=1拉高。。
  3. 第一次自動預充電。在T2之後,計時TRP的時間長度。在T3=T2+TRP到來時,發送REF指令碼,執行第一次自動預充電。TRP最小是15ns,如果是100M時鐘的話,TRP取兩個clk周期即可。
  4. 第二次自動預充電。在T3之後,計時TRC,也即TRFC的時間長度。在T4=T3+TRFC到來時,發送REF指令碼,執行第二次自動預充電。TRFC取個最大的下限是66ns,如果是100M時鐘的話,TRFC取7個clk周期即可。
  5. 模式寄存器裝入指令。在T5=T4+TRFC到來時,發送LMR指令碼,即load mode register指令碼,同時發送Sdr_a[12:0]=13’b0_0010_0010_0000(突發長度為1,潛伏期為2)和Sdr_ba=0,即選擇bank0。TRFC取個最大的下限是66ns,如果是100M時鐘的話,TRFC取7個clk周期即可。
  6. 輸出初始化完成标志。 在T5之後,計時TRMD的時間長度。在T6=T5+TRMD到來時,發送初始化完成标志init_done。TRMD取個最大的下限是14ns,如果是100M時鐘的話,TRMD取2個clk周期即可。

3.5 SDRAM重新整理時序

下圖中第一個指令Precharge,其作用是關閉目前行/所有行,即是在目前行/所有行關閉的情況下,才能執行重新整理AutoRefresh操作。

如果在目前行/所有行沒有關閉的情況下,進行重新整理操作,會導緻SDRAM中存儲的資料丢失、或資料錯誤。

若每次讀寫結束就執行Precharge操作,則在進行重新整理AutoRefresh操作時,是不需要在開始的時候發Precharge指令。

下圖是執行了兩次連續重新整理操作,隻進行一次重新整理也是可以的。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

3.6 關于寫通路

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試
SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

在BL突發模式設定為1的情況下,可以按下面的時序,實作連續的寫通路(必須是在SDRAM的同一行(同一頁)通路)。

讀通路,在BL=1的情況下,也可以實作類似的靈活通路。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

3.7 關于突發通路

突發(Burst)是指在同一行中相鄰的存儲單元連續進行資料傳輸的方式,不能在一次突發通路中、出現SDRAM跨行的情況。舉例,如BL=8,若起始位址=1023,當發下寫指令後,SDRAM實際是對位址空間1023/0/1/2/3/4/5/6進行burst 寫通路,而不是對位址空間1023/1024/1025…./1030進行burst寫通路。

連續傳輸的周期數就是突發長度(Burst Lengths,簡稱BL)。

SDRAM晶片支援突發長度為1/2/4/8/全頁。需要注意,突發通路,不能跨行(又稱為跨頁)通路。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試
SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

當BL=2,一次寫突發通路控制時序示例如下:

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

4、FPGA工程設計

(1)設計SDDRAM_CTRL控制器的輸入輸出端口,并繪制子產品框圖。

(2)确定SDDRAM_CTRL控制器的潛伏期CL、突發長度BL、模式寄存器配置。

(3)分析設計SDDRAM_CTRL控制器的時鐘域,并繪制資料流圖,注意資料的跨時鐘域處理。

這點格外重要!比如,狀态機的驅動時鐘是clk,則SDRAM晶片管腳的驅動時鐘相位是多少?用多少相位的時鐘采樣SDRAM信号範圍的讀資料?

(4)設計SDRAM_CTRL控制器的狀态轉移圖。

(5)設計SDRAM_CTRL控制器的測試檔案。

(6)按照設計好的文檔進行Verilog代碼編寫。

(7)對SDRAM_CTRL控制器進行時序仿真。

(8)下闆測試。

(9)多塊闆卡測試。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試
SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

4.1狀态機設計

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

SDRAM晶片手冊裡的狀态轉移

由上圖可知,關鍵狀态有:

  • INIT狀态 :系統上電後、等待CLK穩定後(100us),在該狀态配置模式寄存器等相關資訊。該狀态僅在系統上電且CLK穩定後執行一次。以後狀态機複位也僅進入IDLE狀态,不再進入INIT狀态。
  • IDLE狀态 :即空閑狀态,在該狀态對讀請求/寫請求/重新整理請求進行仲裁判斷。
  • ACT_ROW狀态 :激活行,之後跳轉下一狀态(WR_RD)。
  • WR_RD狀态 :在該狀态,根據讀寫請求标志,發讀寫指令、讀寫位址、寫資料等相關資訊。
  • CLOS_ROW狀态:在該狀态,關閉行。之後,跳轉對應狀态。

上述幾個狀态的靈活應用,即可實作SDRAM的靈活通路。

5、仿真測試

5.1仿真模型

下面是仿真過程中遇到的仿真模型報告的問題,提升一個時間違規。

SDR SDRAM控制器設計[通俗易懂]前言1、關于重新整理2、關于資料中心對齊3、SDRAM晶片手冊介紹4、FPGA工程設計5、仿真測試

補充概念:

下文來自文獻1:SDRAM 控制器的解析

1.Precharge與Refresh的差別?

兩者都是對存儲單元的電容進行充電、回寫。但差異在于:

Precharge是對(一個或所有Bank)的所有工作行(active row)操作,并且是随機的,被操作工作行的位址在各Bank中不一相同。

Refresh是對所有行依次操作,且是有固定周期的,被操作行在各Bank中均相同。

2.AutoRefresh與SelfRefresh的差別?

AutoRefresh是user依照指定周期發給晶片的重新整理指令

SelfRefresh是晶片内部邏輯發給自己的重新整理指令

無論何種Refresh均不需要提供位址,它是晶片内部的自動操作。

3.R/W帶與不帶Auto Precharge的差別?

帶AutoPrecharge時:在R時,晶片自動在(最後一個有效輸出資料)前(CL-1)個時鐘時産生Precharge指令。在W時,晶片自動在(最後一個有效輸出資料)後(Twr)時間産生Precharge指令。

不帶AutoPrecharge時,需要user在上述時刻自己産生Precharge指令。

4.CL參數隻有效于Read操作。

5. 每個Bank中隻能有一個Row處于active狀态,且可以進行R/W。

如果想操作同Bank中的另外一個Row,必須使用Precharge關閉目前工作Row,然後再active目的Row,這樣才能R/W

6. 每個Bank均active一個Row,依次在各個Bank間操作Row,這樣避免R/W時消耗的多餘時鐘周期,可以提高資料傳輸帶寬

7.正常Read時的Precharge

Auto_Precharge和手動Precharge都在最後一個有效資料(LVD)前CL-1個時鐘上升沿發出

8. 手動Precharge終結Read

手動Precharge在最後一個有效資料(LVD)前CL-1個時鐘上升沿發出

9.手動Burst Terminate終結Read

Burst Terminate在最後一個有效資料(LVD)前CL-1個時鐘上升沿發出

10.正常Write時的Precharge

Auto_Precharge和手動Precharge都在最後一個有效資料(LVD)後tWR/tDPL時間的時鐘上升沿發出

11. 手動Precharge終結Write

手動Precharge在最後一個有效資料(LVD)後tWR/tDP時間的時鐘上升沿發出,或者在Precharge同時使能DQM屏蔽掉同時刻寫入的資料。

12.手動Burst Terminate終結Write

Burst Terminate在最後一個有效資料(LVD)後1個時鐘上升沿發出

13.Burst Terminate與手動Precharge在終結Read/Write中的差別?

帶AutoPrecharge的R/W過程中,禁止使用BT和手動Precharge指令。

Burst Terminate适用于 全頁R/W、不帶AutoPrecharge的突發R/W

>>點選這裡傳回導航頁<<

參考

作者 博文
1、 清霜一夢 SDRAM 控制器的解析

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/160069.html原文連結:https://javaforall.cn