?
7.6??典型實例13:SDRAM讀寫控制的實現(xiàn)與Modelsim仿真
7.6.1??實例的內(nèi)容及目標
1.實例的主要內(nèi)容
本節(jié)旨在通過分析SDRAM控制器,介紹了SDRAM的基本工作模式。最后使用Modelsim對讀寫控制器進行仿真,幫助讀者進一步了解一個真實的器件模塊是如何進行Modelsim仿真的。
2.實例目標
通過本實例,讀者應達到下面的目標。
·??了解SDRAM存儲器的工作模式。
·??熟悉Modelsim仿真的基本流程。
·??可獨立使用Modelsim仿真新工程。
7.6.2??SDRAM簡介
在高速實時或者非實時信號處理系統(tǒng)當中,常常使用大容量存儲器實現(xiàn)數(shù)據(jù)緩存。而大容量存儲器的控制與使用是整個系統(tǒng)實現(xiàn)過程中的重點和難點之一。
SDRAM(同步動態(tài)隨即訪問存儲器)具有價格低廉、精密度高、讀寫速度快等優(yōu)點,從而成為數(shù)據(jù)緩存器的首選存儲介質(zhì)。但是SDRAM的結(jié)構(gòu)與SRAM有很大的差異,其控制時序和機制也比較復雜,這就限制了SDRAM的使用范圍。
下面我們首先對SDRAM進行簡單介紹。
1.SDRAM信號
SDRAM器件的信號可以分為控制、地址和數(shù)據(jù)信號3類,具體定義如表7.2所示。
表7.2 SDRAM信號
信??號??名 |
信?號?類?型 |
信?號?描?述 |
CS |
輸入 |
Chip?Enable,使能 |
CLK |
輸入 |
Clock,時鐘 |
CKE |
輸入 |
Clock?Enable,時鐘使能 |
RAS |
輸入 |
Row?Address?Strobe,行地址選通 |
續(xù)表
信??號??名 |
信?號?類?型 |
信?號?描?述 |
CAS |
輸入 |
Column?Address?Strobe,列地址選通 |
WE |
輸入 |
Write?Enable,寫使能 |
DQML、DQMH |
輸入 |
Data?Mask?for?Lower,Upper?Bytes,高低字節(jié)屏蔽 |
BA |
輸入 |
Bank?Address,Bank地址 |
A[0:10] |
輸入 |
Address,地址 |
DQ[0:15] |
雙向 |
Data,數(shù)據(jù) |
2.SDRAM工作特性
通常一個SDRAM?中包含幾個Bank,每個Bank的存儲單元是按行和列尋址的。由于這種特殊的存儲結(jié)構(gòu),SDRAM有以下幾個工作特性。
(1)SDRAM?的初始化。
SDRAM?在上電100~200μs?后,必須由一個初始化進程來配置SDRAM的模式寄存器,模式寄存器的值決定著SDRAM?的工作模式。
(2)訪問存儲單元。
為減少I/O?引腳數(shù)量,SDRAM?復用了地址線。所以在讀寫SDRAM?時,先由ACTIVE?命令激活要讀寫的Bank,并鎖存行地址,然后在讀寫指令有效時鎖存列地址。一旦Bank被激活后只有執(zhí)行一次預充命令后才能再次激活同一Bank。
(3)刷新和預充。
為了提高存儲密度,?SDRAM?采用硅片電容存儲數(shù)據(jù),電容總是傾向于放電,因此必須有定時的刷新周期以避免數(shù)據(jù)丟失。刷新周期可由(最小刷新周期÷時鐘周期)計算獲得。對Bank預充電或者關(guān)閉已激活的Bank,可預充特定Bank?也可同時作用于所有Bank,A10、BA0和BA1用于選擇Bank。
?
(4)操作控制。
SDRAM?的具體控制命令由一些專用控制引腳和地址線輔助完成。CS、RAS、CAS?和WR?在時鐘上升沿的狀態(tài)決定具體操作動作,地址線和Bank選擇控制線在部分操作動作中作為輔助參數(shù)輸入。
由于特殊的存儲結(jié)構(gòu),SDRAM?操作指令比較多,不像SRAM?一樣只有簡單的讀寫,具體操作指令如表7.3所示。
表7.3 SDRAM命令真值表
功????能 |
命??令??字 |
CS |
RAS |
CAS |
WE |
BA |
A10 |
A[0:9] |
取消器件選擇 |
DSEL |
H |
X |
X |
X |
X |
X |
X |
無操作 |
NOP |
L |
H |
H |
H |
X |
X |
X |
讀操作 |
READ |
L |
H |
L |
H |
V |
L |
V |
讀等待/自動預充電 |
READAP |
L |
H |
L |
H |
V |
H |
V |
續(xù)表
功????能 |
命??令??字 |
CS |
RAS |
CAS |
WE |
BA |
A10 |
A[0:9] |
寫操作 |
WRITE |
L |
H |
L |
L |
V |
L |
V |
寫等待/自動預充電 |
WRITEAP |
L |
H |
L |
L |
V |
H |
V |
Bank激活 |
ACT |
L |
L |
H |
H |
V |
V |
V |
對指定Bank預充電 |
PRE |
L |
L |
H |
L |
V |
L |
X |
對所有Bank預充電 |
PALL |
L |
L |
H |
L |
X |
H |
X |
自動刷新 |
CBR |
L |
L |
L |
H |
X |
X |
X |
加載模式寄存器 |
MRS |
L |
L |
L |
L |
V |
V |
V |
由表7.3可以看到,雖然SDRAM的容量大、速度快,但是存在存儲操作困難的問題。一般的解決方案有兩種,一是直接控制SDRAM的讀寫時序?qū)崿F(xiàn)數(shù)據(jù)的存儲和讀取,二是編寫一個SDRAM的讀寫控制器,將SDRAM的讀寫簡化成SRAM形式,通過幾個命令完成SDRAM的讀寫。
3.SDRAM讀寫控制器
Xilinx、Altera、Lattice等較大的FPGA制造廠商都編寫了自己的SDRAM接口控制器。讀者可以到官方網(wǎng)站去申請相關(guān)的控制器源代碼。下面簡單介紹其中一種,如圖7.33所示是該SDRAM控制器總體設(shè)計框圖和外部接口信號。
?
在圖7.33中,控制器右端接口信號均為直接與SDRAM?對應管腳相連的信號,在表7.2中已做介紹,不再重復。
控制器左端的接口信號為與FPGA?相連的系統(tǒng)控制接口信號,定義如下。
·??CLK:系統(tǒng)時鐘信號。
·??ADDR:系統(tǒng)給出的SDRAM?地址信號。
·??DATAIN:系統(tǒng)用于寫入SDRAM?的數(shù)據(jù)信號。
·??DATAOUT:系統(tǒng)用于從SDRAM讀出的數(shù)據(jù)信號。
·??CMD[1:0]、CMDACK:系統(tǒng)和控制器的命令交互信號,參見表7.3。
·??DM:數(shù)據(jù)Mask信號。
一般來說,SDRAM的讀寫控制時序可以分為初始化、寫寄存器、自動刷新、突發(fā)模式讀、突發(fā)模式寫、整頁讀以及整頁寫等主要操作。具體的時序圖可以查閱相關(guān)的器件數(shù)據(jù)手冊,這里不再列出。
SDRAM的讀寫控制也可以由如圖7.34所示的讀寫狀態(tài)機表示。
在FPGA中,實現(xiàn)如圖7.34所示的狀態(tài)機,再利用已有的SDR?SDRAM控制器即可實現(xiàn)對SDRAM器件的控制。
圖7.34??SDRAM讀寫狀態(tài)機
?
7.6.3??SDRAM控制器的Modelsim仿真
(1)打開ModelSim軟件。
(2)創(chuàng)建工程。
如圖7.35所示,在Modelsim中創(chuàng)建新工程,并設(shè)置工程的相關(guān)屬性。
圖7.35??創(chuàng)建工程
?
(3)添加設(shè)計輸入。
若要創(chuàng)建新的文件就選擇【Create?New?File】圖標,若要添加已經(jīng)存在的文件就選擇【Add?Existing?File】圖標,如圖7.36所示。本實例中使用已經(jīng)存在的SDRAM控制器源文件作為設(shè)計輸入,添加后,在Workspace瀏覽器中可以看到如圖7.37的設(shè)計輸入列表。
圖7.36??添加設(shè)計輸入????????????? 圖7.37??SDRAM設(shè)計輸入列表
?
(4)編譯設(shè)計輸入。
如圖7.38所示,在任意一個源文件上單擊右鍵,選擇“Compile”/“Compile?All”,對所有的源文件進行編譯。
編譯后,若有錯誤,Modelsim會在信息欄中顯示出來。這時只要雙擊該錯誤,ModelSim就會自動打開該錯誤所在的文件,并定位到出現(xiàn)錯誤所在的位置附近。若編譯正確通過,源文件后面的藍色問號就替換成為綠色的對號,如圖7.39所示。
?
(5)仿真。
在Workspace瀏覽器中選擇“Library”復選頁,單擊Work左邊的小加號。在彈出的子菜單里面找到仿真模塊“sdram_test_tb”。雙擊或右鍵選擇“Simulate”選項,ModelSim就會自動運行仿真,如圖7.40所示。
圖7.39??編譯正確通過??????????????????? 圖7.40??仿真
?
(6)觀察波形。
在Workspace瀏覽器中選擇“Sim”復選頁,可以看到仿真模塊的實例列表,如圖7.41所示。
圖7.41??仿真模塊實例列表
?
如圖7.42所示,右鍵單擊頂層測試模塊,選擇“Add”/“Add?to?Wave”選項,將該仿真模塊的所有實例添加至波形觀察器中。
添加后,ModelSim將會自動打開一個波形觀察器,并將頂層測試模塊的所有寄存器和接口添加進去。回到ModelSim的界面,在命令輸入窗口中鍵入“run?20us”,開始執(zhí)行仿真,如圖7.43所示。
圖7.42??添加實例至波形觀察器????????????? 圖7.43??執(zhí)行仿真
執(zhí)行仿真后,經(jīng)過相應的仿真時間,就可以在波形觀察器中看見如圖7.44所示的仿真結(jié)果。這個就是通過利用已有的SDRAM控制器及SDRAM器件模型,由用戶編寫對SDRAM控制器的狀態(tài)機控制后得到的仿真結(jié)果。
圖7.44??SDRAM控制器仿真結(jié)果
7.6.4??小結(jié)
本節(jié)對數(shù)字系統(tǒng)中常用的存儲器SDRAM做了初步的介紹,并在Modelsim中實現(xiàn)了對SDRAM控制器的仿真。通過這個實例,讀者能夠掌握分立器件是如何與FPGA邏輯實現(xiàn)Modelsim聯(lián)合仿真的。
在大型的系統(tǒng)設(shè)計中,在系統(tǒng)硬件實現(xiàn)前對系統(tǒng)進行仿真是非常必要的。而這個仿真又不僅僅局限在FPGA等可編程邏輯器件內(nèi)部,與之相關(guān)的分立器件也是系統(tǒng)仿真的重要組成部分。因此掌握分立器件的聯(lián)合仿真是一個非常重要的技能。