SDRAM控制器的設備與VHDL實現
在高速實時或者非實時信號處理系統(tǒng)當中,使用大容量存儲器實現數據緩存是一個必不可少的環(huán)節(jié),也是系統(tǒng)實現中的重點和難點之一。sdram(同步動態(tài)隨機訪問存儲器)具有價格低廉、密度高、數據讀寫速度快的優(yōu)點,從而成為數據緩存的首選存儲介制裁。但是sdram存儲體結構與ram有較大差異,其控制時序和機制也較復雜,限制了sdram的使用。目前,雖然一些能家長微處理器提供了和sdram的透明接口,但其可擴展性和靈活性不夠,難以滿足現實系統(tǒng)的要求,限制了sdram的使用。
本文引用地址:http://www.ex-cimer.com/article/21109.htm在詳細闡讀sdram數據文檔的前提下,參考altera公司的ip core,利用可編程器件(cpld,fpga)設計了一種通用的sdram控制器。它具有很高的靈活性,可以方便地和其它數據采集分析系統(tǒng)中,如圖1所示。在該系統(tǒng)中,以sdram存儲陣列緩存中頻來的高速數據。存滿后,數據被慢速讀出至數據處理模塊。下面將對sdram控制模塊的設計進行詳細的描述。

sdram內存條由sdram內存芯片構成,根據內存條的容量大小決定內存條上內存芯片的個數?,F以micron公司生產的tim16lsdt6464a型sdram內存條為例,簡要介紹sdram的結構。
mit16lsdt6464a內存條容量為512m byte,由16片容量為32m byte的內存芯片mt46lc32m8a2構成。16片內存芯片被分為兩級,每個芯片的數據位寬為8bit。8片一組,64bit數據寬度。每個內存芯片的數據線和控制均是復用的。對內存條的讀寫操作,是以內存芯片組為單位的,通過內存條的片選信號s0、s1、s2、s3決定組號。s0、s2控制芯片組1,s1、s3控制芯片組2。
sdram內存芯片的主要信號有控制信號、控制信號、數據信號,均為工作時鐘同步輸入、輸出信號。
控制信號主要有:cs(片選信號),cke(時鐘使能信號),dqm(輸入、輸出使能信號),cas、ras、we(讀寫控制命令字)。通過cas、ras、we的各種邏輯組合,可產生各種控制命令。
地址信號有:ba0和ba1頁地址選擇信號,a0~a12地址信號,行、列地址選擇信號。通過分時復用決定地址是行地址還是列地址。在讀寫操作中,在地線上依次給出頁地址、行地址、列地址,最終確定存儲單元地址。

sdram的工作模式通過load mode register命令對工作模式寄存器進行設置來選擇。設置參量有reserved(備用的人)write burst mode(wb,寫突發(fā)模式)、operation mode(op mode,工作模式)、cas latency(cas延遲)、burst type(bt,突發(fā)類型)、burst length(突發(fā)長度)。
2 sdram的基本讀寫操作
sdram的基本讀操作需要控制線和地址線相配合地發(fā)出一系列命令來完成。先發(fā)出bank激活命令(active),并鎖存相應的bank地址(ba0、ba1給出)和行地址(a0~a12給出)。bank激活命令后必須等待大于trcd(sdram的ras到cas的延遲指標)時間后,發(fā)出讀命令字。cl(cas延遲值)個工作時鐘后,讀出數據依次出現在數據總線上。在讀操作的最后,要向sdram發(fā)出預充電(precharge)命令,以關閉已經激活的頁。等待trp時間(precharge)命令,以關閉已經激活的頁。等待trp時間(prechareg命令后,相隔trp時間,才可再次訪問該行)后,可以開始下一次的讀、寫操作。sdram的讀操作只有突發(fā)模式(burst mode),突發(fā)長度為1、2、4、8可選。
sdram的基本寫操作也需要控制線和地址線相配合地發(fā)出一系列命令來完成。先發(fā)出bank激活命令(active),并鎖存相應的bank地址(ba0、ba1給出)和行地址(a0~a12給出)。bank激活命令后必須等待大于trcd的時間后,發(fā)出寫命令字。寫命令可以立即寫入,需寫入數據依次送到dq(數據線)上。在最后一個數據寫入后延遲twr時間。發(fā)出預充電命令,關閉已經激活的頁。等待trp時間后,可以展開下一次操作。寫操作可以有突發(fā)寫和非突發(fā)寫兩種。突發(fā)長度同讀操作。
trcd、trp、twr的具體要求,詳見sdram廠家提供的數據手冊。所等待的工作時鐘個數由trcd、trp、twr的最小值和工作時鐘周期共同決定。

furite/read=工作時鐘頻率(hzhzhhdkkdk ss dkkdkdkd,,,m,mddddd)×數據寬度(bytes)×突發(fā)讀寫長度/操作所需的時鐘數
為了提高存儲密度,sdram采用硅片電容存儲信息。電容總會有漏電流流過,所以為了不使信息丟失,必須定期地給電容刷新充電。外部控制邏輯必須按要求定期向內存條發(fā)出刷新命令,保證在規(guī)定的時間內對每一個單元都進行刷新。
3 初始化操作
sdram在上電以后必須對其進行初始化操作,具體操作如下:
(1)系統(tǒng)在上電后要等待100~200μs。在待時間到了以后至少執(zhí)行一條空操作或者指令禁止操作。
(2)對所有芯片執(zhí)行precharge命令,完成預充電。
(3)向每組內存芯片發(fā)出兩條auto refresh命令,使sdram芯片內部的刷新計數器可以進入正常運行狀態(tài)。
(4)執(zhí)行l(wèi)oad mode register命令,完成對sdram工作模式的設定。
完成以上步驟后,sdram進入正常工作狀態(tài),等待控制器對其進行讀、寫和刷新等操作。
4 sdram控制器設計
4.1 功能說明
在以sdram作為緩存的系統(tǒng)中,使用可編程器件對其進行控制具有很強的靈活性。為了使設計具有模塊化和可重復使用的優(yōu)點,設計了一個簡化的sdram接口電路。這樣就屏蔽掉了sdram操作的復雜性,而其它邏輯模塊可通過接口電路對sdram進行訪問。此外,由于整個sdram控制器用vhdl語言編寫,只要對其進行簡單的修改就可以滿足不同的需求,具有很強的靈活性。
參照圖2,sdram控制器完成的主要功能是對cmd[2:0]的命令字和addr端的地址進行解析,產生相應的sdram的控制時序。

addr為輸入地址端口??刂破鲗⑵浣馕鰹閷钠x、頁以及行、列地址。以一條mit16lsdt6464a內存條為例,其大小為512mbyte(2 29 byte)。數據位寬為64bit(8byte),則地址線addr應為26根。可以這樣映射地址:addr[25]對應內存芯片組號;addr[24:23]對應頁號;addr[22:10]對應行號;addr[9:0]對應列號。
datain為寫入數據端口,64bit位寬。
dataout為讀出數據端口,64bit位寬。
rd_oe為讀出數據使能端口,當其為1時,表示從下一個時鐘起,數據將依次出現在dataout口上。
wr_oe為寫入數據使能端口,當其為1時,寫入數據應該依次出現在datain口上。
cmd[2:0]為命令輸入端口,分別表示讀、寫內存等待操作。其中,cmd=“000”表示無操作,內存條交給控制器管理,定其完成刷新工作;refresh命令由外部邏輯指定特刷新的內存芯片信號,組號由addr的低位給出;load_mode命令執(zhí)行內存條工作寄存器初始化工作,初始化值由datain的低13位決定,內存芯片組號同樣由addr的低位給出;同理,addr的低位也決定了預充電操作所對應的內存芯片組號。
cmdack為命令應答端口,表示命令已經被執(zhí)行,使外部邏輯可以向控制器發(fā)出下一個動作。
4.2 狀態(tài)機
圖3是sdram控制器的狀態(tài)轉移圖。狀態(tài)圖中的各個狀態(tài)內均包含一系列的子狀態(tài)轉移(對sdram內存條發(fā)出連續(xù)命令),每個子狀態(tài)完成一個功能操作。初始化操作包括前面介紹的內存條初始化全過程,工作寄存器的默認值在vhdl程序中指定。以后可以通過load_mode命令改變內存條的工作模式。初始化結束后,內存條進入idel狀態(tài),刷新計數器開始工作,控制器開始響應外部邏輯的操作請求。
刷新計數器操作是一個獨立的進程(process)。刷新計數器的初值由內存芯片要求、內存條個數和控制器工作頻率共同決定。例如,在本次設計中,所采用的mt48lc32m8a2內存芯片要求在64ms內夏至少刷新8196次。而mit16lsdt6464a型內存條共有兩組內存芯片,也就是要求在64ms內要發(fā)出8196×2條自刷新(auto refresh)指令。系統(tǒng)工作時鐘為46.66mhz,因此控制單條mit16lsdt6464a時,刷新計數器初值至多為(64ms/8196/2)×6、、46.66mhz,即182。開始工作后,每當刷新計數器值減為0,便依次向內存芯片組發(fā)出刷新命令,保證sdram中的數據不丟失。刷新請求是內存請求;讀和寫操作是外部請求。在idel狀態(tài)中有請求仲裁邏輯,當內部和外部請求同時出現時,優(yōu)先保證內部請求,狀態(tài)轉移至刷新操作。當刷新操作結束時,重新返回idel狀態(tài),開始響應外部請求。響應外部請求后,應答信號cmdbak出現正脈沖。它通知外部邏輯,請求已經被響應,可以撤銷請求。在刷新操作狀態(tài)中,也有許數器計數,其大小等于控制器管理的內存芯片信號。記錄并判斷此次刷新操作所對應的內存芯片的組號,產生相應的片選信號。

該sdram控制器在中頻數據海量存儲系統(tǒng)中已得到應用。數據接收邏輯將接收到的中頻采樣數據整理后(拼接成64bit),通過sdram控制器存入sdram陣列。存滿后,數據輸出邏輯將中頻數據通過sdram控制器從內存條中取出,傳輸至上位機。其vhdl代碼在atera公司的fpga——ep1c6q240中通過了quartus ii的仿真、綜合和布局、布線。占用499個logic cellk,消耗了8%的邏輯資源。留有豐富的資源可提供給其它邏輯單元使用。
上面介紹了sdram的基本工作原理和一種簡單的通用sdram控制器的實現。sdram的控制機制比較復雜,具有多種突發(fā)讀、寫方式和工作模式(詳細內容請參考sdram的數據手冊)。但是,可以根據實現應用,實現其中的一個子集(基本讀、寫、刷新操作)來滿足實際系統(tǒng)的需要。用sdram實現大容量的高速數據緩存具有明顯的優(yōu)勢,使用可編程器件實現sdram控制器則使之具有更高的靈活性,其應用前景廣闊。
評論