天天看點

SDRAM設計之初始化(一)

SDRAM設計之初始化(一)

       在我學習FPGA設計之初,就在各種各樣的學習開發闆上見到過各個廠家的SDRAM,幾乎每種開發闆上都會闆載一片甚至多片SDRAM,最近又重溫了一下SDRAM的控制過程,當然我指的是使用VerilogHDL語言搭建一個SDRAM的接口控制邏輯,當然也可以使用别人寫好的現成子產品,但是作為一個學習的過程來說,雖然設計不大,但這樣一個接口的設計還是需要很多設計技巧在裡面的,真正自己寫一遍對自己的設計能力來說還是一種磨練,比如我們如何能在SDRAM的一直重新整理中,完成大量資料無誤的寫入與讀出等等,都需要在設計之初去全面考慮。

       在這篇筆記之前計劃寫一篇關于SDRAM的原理性的簡介的,但至今沒想好要寫點什麼,也是自己原理性知識儲備不夠,是以就先直奔主題,先來記錄下對SDRAM進行操作的第一個步驟------初始化。

       以美光的一款SDRAM MT48LC16M16A2為例,其實大部分的SDRAM操作基本都是類似(以我淺薄的認知而言),可能就是速度不大一樣,導緻不同的SDRAM在一些細節上有一些差別。

       初始化是SDRAM上電完成後必須要進行的一項步驟,否則是無法進行後面的一系列操作的,而初始化當中需要進行的一項重要操作,便是模式寄存器設定(LOAD MODE REGISTER),該寄存器通過不同的bit位設定了SDRAM各種不同的工作模式,我們先來看下整體的時序圖:

SDRAM設計之初始化(一)

将初始化過程總結如下:

  1. SDRAM上電;
  2. 給SDRAM提供一個穩定的時鐘CLK,同時CKE時鐘使能端需要打開;
  3. 等待100us,在這100us内需要給SDRAM NOP指令,NOP指令可以在這100us中的任意時間内給出,且需要持續到100us結束,且至少需要執行一次NOP指令,一般我習慣于一直執行NOP指令在這期間,畢竟使用FPGA控制這點很容易實作(指令清單将在下面給出);
  4. 100us結束後,執行一次PRECHARGE 指令,對所有bank進行操作;
  5. 至少 等待 tRP時間,在此期間需要執行NOP指令,所有的bank将會進入idle state;
  6. 執行一次ATUTO REFRESH 指令;
  7. 至少等待tRFC時間,在此期間需要執行NOP指令;
  8. 執行一次ATUTO REFRESH 指令;
  9. 至少等待tRFC時間,在此期間需要執行NOP指令;
  10. 模式寄存器設定:此時SDRAM已經可以進行模式寄存器的設定了,上電之後該模式寄存器處于不定狀态,是以,每次上電都需要進行模式寄存器的設定 ;
  11. 至少等待tMRD時間,在此期間需要執行NOP指令;
  12. 至此SDRAM的初始化已經完成,可以進行後續的各種指令操作。

由時序圖可以看出,模式寄存器複用了SDRAM的位址位(A0~A12),每一位含義如下圖所示:

SDRAM設計之初始化(一)

模式寄存器都設定些什麼呢:

(1)寫突發模式(Write Burst Mode):單個寫入/可程式設計的突發寫入長度(就是執行一次寫指令可以寫入多個資料);

(2)資料潛伏周期(CAS Latency):就是在收到有效的讀指令的時候,資料會在幾個時鐘之後被放置到資料總線上;

SDRAM設計之初始化(一)

(3)突發類型(Burst Type):Sequential/Interleaved(見下表);

SDRAM設計之初始化(一)

(4)突發長度(Burst Length):辨別一次寫入/讀出幾個資料;

補充一個指令清單,SDRAM各種控制指令是通過控制幾個引腳配合來完成的:

SDRAM設計之初始化(一)

       SDRAM的初始化就介紹到這裡了,之後會陸續介紹關于重新整理、讀、寫等操作…