SDRAM設計之初始化(一)
在我學習FPGA設計之初,就在各種各樣的學習開發闆上見到過各個廠家的SDRAM,幾乎每種開發闆上都會闆載一片甚至多片SDRAM,最近又重溫了一下SDRAM的控制過程,當然我指的是使用VerilogHDL語言搭建一個SDRAM的接口控制邏輯,當然也可以使用别人寫好的現成子產品,但是作為一個學習的過程來說,雖然設計不大,但這樣一個接口的設計還是需要很多設計技巧在裡面的,真正自己寫一遍對自己的設計能力來說還是一種磨練,比如我們如何能在SDRAM的一直重新整理中,完成大量資料無誤的寫入與讀出等等,都需要在設計之初去全面考慮。
在這篇筆記之前計劃寫一篇關于SDRAM的原理性的簡介的,但至今沒想好要寫點什麼,也是自己原理性知識儲備不夠,是以就先直奔主題,先來記錄下對SDRAM進行操作的第一個步驟------初始化。
以美光的一款SDRAM MT48LC16M16A2為例,其實大部分的SDRAM操作基本都是類似(以我淺薄的認知而言),可能就是速度不大一樣,導緻不同的SDRAM在一些細節上有一些差別。
初始化是SDRAM上電完成後必須要進行的一項步驟,否則是無法進行後面的一系列操作的,而初始化當中需要進行的一項重要操作,便是模式寄存器設定(LOAD MODE REGISTER),該寄存器通過不同的bit位設定了SDRAM各種不同的工作模式,我們先來看下整體的時序圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90TQNJTVq10bk1mYox2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyUTO3UDM1ETMzEjMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
将初始化過程總結如下:
- SDRAM上電;
- 給SDRAM提供一個穩定的時鐘CLK,同時CKE時鐘使能端需要打開;
- 等待100us,在這100us内需要給SDRAM NOP指令,NOP指令可以在這100us中的任意時間内給出,且需要持續到100us結束,且至少需要執行一次NOP指令,一般我習慣于一直執行NOP指令在這期間,畢竟使用FPGA控制這點很容易實作(指令清單将在下面給出);
- 100us結束後,執行一次PRECHARGE 指令,對所有bank進行操作;
- 至少 等待 tRP時間,在此期間需要執行NOP指令,所有的bank将會進入idle state;
- 執行一次ATUTO REFRESH 指令;
- 至少等待tRFC時間,在此期間需要執行NOP指令;
- 執行一次ATUTO REFRESH 指令;
- 至少等待tRFC時間,在此期間需要執行NOP指令;
- 模式寄存器設定:此時SDRAM已經可以進行模式寄存器的設定了,上電之後該模式寄存器處于不定狀态,是以,每次上電都需要進行模式寄存器的設定 ;
- 至少等待tMRD時間,在此期間需要執行NOP指令;
- 至此SDRAM的初始化已經完成,可以進行後續的各種指令操作。
由時序圖可以看出,模式寄存器複用了SDRAM的位址位(A0~A12),每一位含義如下圖所示:
模式寄存器都設定些什麼呢:
(1)寫突發模式(Write Burst Mode):單個寫入/可程式設計的突發寫入長度(就是執行一次寫指令可以寫入多個資料);
(2)資料潛伏周期(CAS Latency):就是在收到有效的讀指令的時候,資料會在幾個時鐘之後被放置到資料總線上;
(3)突發類型(Burst Type):Sequential/Interleaved(見下表);
(4)突發長度(Burst Length):辨別一次寫入/讀出幾個資料;
補充一個指令清單,SDRAM各種控制指令是通過控制幾個引腳配合來完成的:
SDRAM的初始化就介紹到這裡了,之後會陸續介紹關于重新整理、讀、寫等操作…