# SDRAM controller 設計 ### synchronous Dynamic RandomAcess Memory 1. synchronous->只有一個clk進行運算 2. dynamic -> 不斷的刷新(因為要刷新,操作clk比較多) 3. Bank -> each bank 獨立大小相同(主要由2條addr control 4. burst(一次性讀取好幾筆資料,不需要逐一讀取) ## SRAM 架構圖 ![11111](https://hackmd.io/_uploads/ryD4J4iP6.png) 1. CKE : clk enable 2. CS_N : disable other input, except "CLK" "CKE" "DQM" 3. CAS_N: A[8:0] 列address 4. RAS_N: A[12:0] 行address 5. WE_N : write_enable 6. BA[1:0]: 總共4個BLANK 7. A[12:0]: address(不同命令定義不同) 8. DQ[15:0]:data register input/output ## COMMAND DECODE - {CS_N,RANS_N,CAS_N,WE_N} ### 1. 4'b1XXX: Command Inhibit new command no normal write in ### 2. 4'b0111: No-operation 命令給被選中的SDRAM 晶片傳遞一個空操作信息,目的是為了防止SDRAM 處於空閒或等待狀態時,其他命令被寫入,此命令對正在執行的命令無影響 ### 3. 4'b0000: Load Mode Register(LMR) 所有L-Bank 皆處於空閒狀態時才可寫入,而且在執行此指令後,SDRAM 必須等待對應的回應時間tRSC(Register Set Cycle),模式暫存器配置週期)後,才可寫入新的指令 在寫入此指令對SDRAM 進行模式暫存器配置時,A[12:0] control register mode setting ### 4. 4'b0010: Precharge 關閉**指定L-Bank** 或**ALL L-Bank** 中啟動的**行**,Precharge執行後,必須等待時間tRP(Precharge command Period預充電指令週期),相對應的L-Bank 將可以被重新操作 控制訊號A[10] BA[1:0] ![555](https://hackmd.io/_uploads/ryFg0q9va.png) ### 6. 4'b0001: Refresh SDRAM透過週期性刷新操作保證資料的可靠性 國際公認的標準刷新速度就是:64ms/行數,4096 Refresh Cycles/64ms 或8192 Refresh Cycles/64ms(4096 與8192 就代表SDRAM 晶片中單一L-Bank 的行數),當單一L-Bank 為4096 行時,刷新間隔最大為15.625μs 刷新指令(Refresh)分為兩種:Auto Refresh 和 Self Refresh CKE->1,START Auto-Refresh (在執行Auto-Refresh指令前,必須先要執行預充電指令,將所有L-Bank 關閉) SDRAM 內部刷新計數器會依序自動產生行位址,刷新是針對一行中的所有儲存單元,所以無需列尋址,由於刷新涉及所有L-Bank,因此在刷新過程中,所有L-Bank 都停止工作,而每次刷新需要等待對應的時脈週期,之後就可進入正常的工作狀態,在此期間,所有工作指令只能等待而無法執行。64ms 之後則再次對同一行進行刷新,如此周而復始進行循環刷新。 CKE->0,START self-Refresh self-Refresh主要用於休眠模式低功耗狀態下的資料保存,在發出刷新命令時,將CKE 置於無效狀態,就進入了自刷新模式,此時不再依靠系統時鐘工作,而是根據內部的時鐘進行刷新操作。在此期間除了CKE 之外的所有外部訊號都是無效的,只有**Enable CKE again** 才能退出self-Refresh模式並進入正常操作狀態 ### 7. 4'b0011: Bank Active 只有SDRAM 處於空閒狀態下才會被回應 ![666](https://hackmd.io/_uploads/Sk73Qi9D6.png) ### 8. 4'b0100: Write ### 9. 4'b0101: Read ### 10. 4'b0110: Burst Terminate SDRAM 處於讀/寫操作過程中可寫入,Burst Terminate被用來截斷固定長度或整頁長度的突發,執行Burst Terminate後,最近執行的資料讀取/寫入操作終止,此指令操作不會透過Precharge關閉目前啟動行,需透過Precharge操作關閉被激活行 ## 參數配置圖 - A[12:0] ![4efd45591e4741b98ed898d17be86da5](https://hackmd.io/_uploads/HJ92vP9v6.png) ## Burst Length - A[2:0] **Burst Length Controller (1、2、4、8 or all-page)** 同一行中相鄰的儲存單元連續進行資料傳輸的方式,連續傳輸所涉及到儲存單元(列)的數量就是突發長度(Burst Length,簡稱BL) #### case1: No Burst Length > burst length= 1bit,每次讀/寫時,都要對儲存單元進行尋址,如果要實現連續的讀/寫操作,就要不斷地發送列位址和讀/寫指令,這種方法控制資源佔用極大,效率較低 ![1111](https://hackmd.io/_uploads/r1sk2u5wT.png) #### case2: Burst Continue > 只要指定起始列位址和突發長度,記憶體就會依序自動對後面相應數量的儲存單元進行讀取/寫入操作而不再需要控制器連續地提供列位址,這樣,除了第一筆資料傳輸需要若干個週期外,其後的**每個資料只要一個週期**即可取得。突發的資料長度一般是4 或8,如果傳輸時實際需要的資料長度小於設定的BL 值,則呼叫「突發停止」指令結束傳輸 > ![2222](https://hackmd.io/_uploads/HyiAnO9PT.png) ## Burst Type - A[3] > 突發類型設定為兩類,**順序**和**隔行** ![3333](https://hackmd.io/_uploads/BJ1ulK9wa.png) ## CAS Latency - A[6:4] > read command save "data register" 到出現第一個 DQ 之間的時脈週期間隔(CL) > EX:A[6:4}=3'b010 CAS(CL) => 2 個時脈週期 > EX:A[6:4}=3'b011 CAS(CL) => 3 個時脈週期 ![4444](https://hackmd.io/_uploads/HkpVQFcP6.png) ## Operating Mode - A[8:7] 不用特別設定 ## Write Mode - A[9] > A9 -> 1,SDRAM Read is Burst Length,Write is "0" > A9 -> 0,SDRAM READ&WRITE MODE is Burst Length ## Precharge Control - A[10] > A10 -> 1,all L-BANK Precharge > A10 -> 0,ONLY Precharge BA[1:0]指定的L-BANK ## 參考網址出處 https://blog.csdn.net/qq_43254508/article/details/129942372?utm_medium=distribute.pc_relevant.none-task-blog-2