基于FPGA的DDR SDRAM的控制器設計
出處:劉 瑰 朱鴻宇 發(fā)布于:2011-08-29 15:28:56
FPGA(Field-Programmable Gate Array),即現場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎上進一步發(fā)展的產物。它是作為專用集成電路(ASIC)領域中的一種半定制電路而出現的,既解決了定制電路的不足,又克服了原有可編程器件門電路數有限的缺點。
FPGA工作原理
FPGA采用了邏輯單元陣列LCA(Logic Cell Array)這樣一個概念,內部包括可配置邏輯模塊CLB(Configurable Logic Block)、輸出輸入模塊IOB(Input Output Block)和內部連線(Interconnect)三個部分。 現場可編程門陣列(FPGA)是可編程器件。與傳統(tǒng)邏輯電路和門陣列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的結構,FPGA利用小型查找表(16×1RAM)來實現組合邏輯,每個查找表連接到一個D觸發(fā)器的輸入端,觸發(fā)器再來驅動其他邏輯電路或驅動I/O,由此構成了即可實現組合邏輯功能又可實現時序邏輯功能的基本邏輯單元模塊,這些模塊間利用金屬連線互相連接或連接到I/O模塊。FPGA的邏輯是通過向內部靜態(tài)存儲單元加載編程數據來實現的,存儲在存儲器單元中的值決定了邏輯單元的邏輯功能以及個模塊之間或模塊與I/O間的連接方式,并終決定了邏輯單元的邏輯功能以及各模塊之間或模塊與I/O間的聯接方式,并終決定了FPGA所能實現的功能, FPGA允許無限次的編程。
SDRAM是具有同步接口的高速動態(tài)隨機訪問存儲器。它由于具有大容量、讀寫速度較快、支持突發(fā)式讀寫及價格低廉而得到了廣泛的應用。但是近幾年來,市面上出現了一種從SDRAM技術發(fā)展而來的DDR(Double Data Rate)SDRAM新型存儲器。該存儲器除了具有SDRAM的所有優(yōu)點外,還由于采用了雙時鐘差分信號等技術,使其在時鐘觸發(fā)沿的上、下沿都能進行數據傳輸(傳輸速率是普通SDRAM的2倍),且在價格上也低于SDRAM。但由于它在時鐘的上升沿和下降沿均能讀取數據,這就使得DDR SDRAM控制器較普通的SDRAM控制器更難于設計。為此,本文給出了一種通用DDR SDRAM控制器的一般設計方法,并利用數字鎖相環(huán)技術解決了DDR SDRAM特有的讀寫方式難于控制的問題。
1 DDR SDRAM的基本操作和命令
掌握DDR SDRAM(以下簡稱DDR)的操作是成功設計一個DDR SDRAM控制器的前提條件。
DDR支持的常用命令有:空操作(Nop)、激活操作(Active)、突發(fā)讀(Burst Read)、突發(fā)寫(Burst Write)、自動刷新(Autorefresh)、預充電(Precharge)、模式寄存器配置(Mode Register Set)等。所有的操作命令都通過信號線RAS_N、CAS_N、WE_N共同控制。
在進行讀、寫操作之前必須激活DDR存儲體。一旦一個存儲體被激活,它就必須在此存儲體的下一個激活命令發(fā)出之前進行預充電。當對一個存儲體讀或寫訪問后,如果下要訪問的行和當前訪問的行不是同一行,則需要結束當前的存儲體并重新打開它。預充電就是用來結束已激活的存儲體的。
訪問DDR的基本命令是讀和寫操作。當讀命令發(fā)出時,地址總線上出現的就是要讀的起始地址,1~3個時鐘周期后要讀的數據將會出現在數據總線上;當寫命令發(fā)出時,起始地址和數據就分別出現在地址總線和數據總線上。在做讀操作時,數據出現在數據總線上的周期數是由CAS延遲(CAS Latency,CL)決定的。CL依賴于DDR的速度和存儲器時鐘的頻率。一般而言,時鐘頻率越快CL就越大。在BR或者BW命令初始化后,就會進行突發(fā)讀或突發(fā)寫,直到完成當前的突發(fā)長度(Burst length,BL)或突發(fā)結束(Burst Terminate,BT)命令發(fā)出才結束該操作。DDR存儲器支持突發(fā)的長度為2、4或8個數據周期。
由于DDR是利用電容存儲電荷的原理來保存信息的,而電容會逐漸放電。因此為了保證每個存儲單元數據的正確性,DDR SDRAM控制器必須周期性地發(fā)出自動刷新命令,用戶無需干預。在自動刷新命令發(fā)出之前,所有存儲體都必須經過預充電并已經處于空閑狀態(tài)。一旦刷新開始,由于內部有地址計數器,所以不需要外部地址的控制。
DDR中有模式寄存器,它的各種操作模式是:CAS延遲、地址模式、突發(fā)長度、突發(fā)類型、測試模式等。通過模式寄存器配置(MRS)命令將值寫入到模式寄存器中。
2 DDR SDRAM 控制器的設計
2.1 DDR SDRAM控制器簡介
本文討論的DDR SDRAM控制器(簡稱DDR控制器)一方與MCU等控制器接口,另一方與DDR接口。同MCU等控制器的接口主要有地址總線(ADDR)、數據總線(DATA)、3位的命令總線(CMD[2:0])以及命令回答(CMDACK)等。地址總線和數據總線的位數取決于DDR的總線位數。DDR控制器接收從MCU發(fā)來的命令及數據,對命令進行譯碼,并向DDR發(fā)出相應的操作及數據。與DDR接口的一方主要是RAS_N、CAS_N、WE_N等控制信號線以及數據總線DDRDATA、地址總線DDRADDR等。整個DDR控制器由3個模塊構成:控制接口模塊、命令模塊和數據通路模塊。控制接口模塊接收從MCU來的命令和相關存儲器地址,對命令進行譯碼并將請求發(fā)送給命令模塊;命令模塊接收從控制接口模塊譯碼后的命令和地址,產生相應的命令給DDR;數據通路模塊在讀命令READA和寫命令WRITEA期間處理數據交換。
2.2 DDR控制器的命令
DDR控制器共完成8種操作:NOP、READA、WRITEA、REFRESH、PRECHARGE、LOAD_MODE、LOAD_REG1、LOAD_REG2,其控制命令如表2所示。
這8種操作都是由MCU在命令總線CMD[2:0]上向DDR控制器發(fā)出的,DDR控制器在接收到諸如READA、WRITEA、REFRESH、PRECHARGE、LOAD_MODE等命令時將會向MCU發(fā)回答命令CMDACK。當MCU收到CMDACK命令后會在1個時鐘周期后向DDR控制器發(fā)NOP命令。DDR控制器在發(fā)CMDACK命令的同時也會向DDR發(fā)相應的操作,也就是將DDR的RAS_N、CAS_N、WE_N置成相應的高位或低位。如果命令是READA或WRITEA,則需要重新從數據總線上讀出數據或寫入數據。各命令的功能如下。 (1)NOP空操作命令。在MCU接收到CMDACK命令后,MCU就會在一個時鐘周期后向DDR控制器發(fā)出NOP命令。
?。?)READA命令是帶有預充電的突發(fā)讀操作。MCU向DDR控制器發(fā)出READA命令的同時在地址總線ADDR上發(fā)出要讀的地址;DDR控制器接收到后將向DDR發(fā)出激活(Active)命令,并向MCU發(fā)出CMDACK命令;幾個時鐘周期后,要讀的DDR中的突發(fā)數據會由DDR控制器通過數據總線傳送給MCU。
?。?)WRITEA命令是帶有預充電的突發(fā)寫操作。其過程和READA的過程類似,也是在DDR控制器接收到MCU發(fā)出的WRITEA命令期間,在地址總線ADDR上接收要寫入的地址,然后DDR控制器向DDR發(fā)出激活(Active)命令,并向MCU發(fā)出CMDACK命令。只是在WRITEA命令有效期間,要寫入DDR的個突發(fā)數據就已經出現在數據總線上了。
?。?)REFRESH命令是DDR控制器指示DDR完成自動刷新的命令。
?。?)PRECHARGE命令是控制器指示DDR完成存儲體預充電的命令。
(6)LOAD_MODE是用來配置DDR中的模式寄存器的,其值就是在MCU向DDR控制器發(fā)出LOAD_
MODE命令的同時在ADDR總線上傳送的數值。當DDR控制器向DDR發(fā)出模式寄存器配置(MRS)命令時,ADDR總線上的值就會直接映射到DDR的地址總線上。
?。?)LOAD_REG1和LOAD_REG2是配置DDR控制器內部2個寄存器的命令。
2.3 DDR控制器的內部寄存器
DDR控制器內部有2個16位的配置寄存器:REG1和REG2,其值分別由命令LOAD_REG1和LOAD_REG2命令寫入。
REG1中包含了CAS延遲CL(REG1[1:0])、RAS到CAS延遲的時鐘數RC(REG[3:2])、REFERSH命令持續(xù)時間的時鐘數RRD(REG1[7:4])及突發(fā)長度BL(REG1[12:9])。
REG2是一個16位的寄存器,存儲的是DDR控制器向DDR發(fā)出刷新命令的間隔時間。
2.4 各功能模塊設計
2.4.1 控制接口模塊
控制接口模塊包含1個命令譯碼器和1個16位的刷新減計數器及相應的控制電路。命令譯碼器譯碼并寄存從MCU來的命令,將譯碼后的NOP、WRITEA、READA、REFRESH、PRECHARGE和LOAD_MODE等命令及相應的地址轉送給命令模塊。減計數器和相應的控制電路用來產生刷新命令給命令模塊,其值就是由LOAD_REG2命令寫入到REG2中的值。當計數器減到0時,控制接口模塊就向命令模塊發(fā)REFRESH_REQ并一直保持到命令模塊發(fā)REFRESH_ACK來響應該請求。一旦控制接口模塊接收到REFRESH_ACK,減計數器就會重新寫入REG2中的值。
2.4.2 命令模塊
命令模塊由1個簡單的仲裁器、命令發(fā)生器及命令時序器組成。它接收從控制接口模塊來的譯碼后的命令,接收刷新控制邏輯發(fā)來的刷新請求命令并產生正確的命令給DDR。仲裁器在控制接口發(fā)來的命令(也就是MCU通過控制接口譯碼后的命令)和刷新控制邏輯發(fā)來的刷新請求命令之間進行仲裁。刷新請求命令的優(yōu)先級高于控制接口來的命令。如果控制接口來的命令和刷新請求命令同時到達,或者同在一個刷新操作期間,則仲裁器就會拖延向MCU發(fā)CMDACK命令的時間直到刷新操作完成。如果刷新命令正在進行操作期間發(fā)出,則要一直等待到操作全部完成。
在仲裁器收到MCU發(fā)來的命令后,該命令就傳送到命令發(fā)生器,命令時序器即用3個移位寄存器產生正確的命令時序后發(fā)給DDR。1個移位寄存器用來控制激活命令時序,1個用來控制READA和WRITEA命令,1個用來計時操作命令的持續(xù)時間,為仲裁器確定的請求操作是否完成。
2.4.3 數據通路模塊
數據通路模塊提供了DDR到MCU的數據通路。MCU從DDR設備讀出的數據和MCU向DDR設備寫入的數據都要經過數據通路模塊。在MCU向DDR控制器發(fā)WRITEA命令時,數據總線DATA上要寫入DDR的數據;在MCU向DDR控制器發(fā)READA命令時,數據總線DATA則從DDR讀出數據。
數據通路模塊在和DDR接口的一方完成了2個轉換:一是將DDR過來的數據總線寬度翻倍,二是將DDR在時鐘上、下沿送出的數據用200MHz的時鐘頻率接收。數據通路模塊在和MCU接口的一方也相應地做了2個轉換:一是將MCU過來的數據寬度減半送給DDR,二是將MCU工作在100MHz頻率下的數據以200MHz的頻率送給DDR。
DDR送來的數據是在100MHz的時鐘頻率的上升和下降沿被讀出的,而到了數據通路模塊則將時鐘頻率倍頻到200MHz,因此只需在時鐘的上升沿讀出數據即可。其中的時鐘倍頻可采用數字鎖相環(huán)技術將輸入時鐘升頻。某些FPGA內部包含了鎖相環(huán)電路,可以直接調用。
2.5 初始化過程
在MCU與DDR之間通信必須通過DDR控制器對DDR進行初始化:置DDR的突發(fā)長度、CL、突發(fā)類型以及操作模式等。在初始化完DDR后,MCU也必須對DDR控制器的2個內部寄存器進行設置,由MCU發(fā)LOAD_REG2和LOAD_REG1命令分別完成。整個DDR和DDR控制器的初始化過程為:(1)完成預充電PRECHARGE命令。(2)發(fā)LOAD_MODE命令。(3)發(fā)LOAD_REG2命令。(4)發(fā)LOAD_REG1命令。
3 結束語
本文給出的通用DDR控制器的設計方法,可以很好地解決DDR在時鐘上升和下降沿都能讀取數據而不好控制的問題,而且可以直接利用FPGA內部提供的數字鎖相環(huán)電路,避免了在設計中增加復雜的模擬電路。此外,開發(fā)者還可以根據自己的實際需要對該設計方法進行修改,以形成自己專用的DDR控制器。
參考文獻:
[1]. CPLD datasheet http://m.58mhw.cn/datasheet/CPLD_1136600.html.
版權與免責聲明
凡本網注明“出處:維庫電子市場網”的所有作品,版權均屬于維庫電子市場網,轉載請必須注明維庫電子市場網,http://m.58mhw.cn,違反者本網將追究相關法律責任。
本網轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網站或個人從本網轉載時,必須保留本網注明的作品出處,并自負版權等法律責任。
如涉及作品內容、版權等問題,請在作品發(fā)表之日起一周內與本網聯系,否則視為放棄相關權利。
- 什么是氫氧燃料電池,氫氧燃料電池的知識介紹2025/8/29 16:58:56
- SQL核心知識點總結2025/8/11 16:51:36
- 等電位端子箱是什么_等電位端子箱的作用2025/8/1 11:36:41
- 基于PID控制和重復控制的復合控制策略2025/7/29 16:58:24
- 什么是樹莓派?一文快速了解樹莓派基礎知識2025/6/18 16:30:52









