摘 要: 由于同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器SDRAM 內(nèi)部結(jié)構(gòu)原因?qū)е缕淇刂七壿嫳容^復(fù)雜?,F(xiàn)場(chǎng)可編程邏輯門陣列FPGA作為一種半定制電路具有速度快、內(nèi)部資源豐富、可重構(gòu)等優(yōu)點(diǎn)。本文設(shè)計(jì)了一種基于FPGA 的SDRAM 控制器, 在介紹控制器的邏輯結(jié)構(gòu)的基礎(chǔ)上, 對(duì)FPGA 與SDRAM 間數(shù)據(jù)通信進(jìn)行了時(shí)序分析, 實(shí)現(xiàn)SDRAM 帶有自動(dòng)預(yù)充電突發(fā)讀寫和非自動(dòng)預(yù)充電整頁讀寫。
0 引 言
SDRAM( Synchronous Dy namic Random Access Memory) 具有價(jià)格低廉、容量大、速度快等優(yōu)點(diǎn), 但是SDRAM 的控制邏輯相對(duì)復(fù)雜, 對(duì)時(shí)序要求也比較嚴(yán)格, 這就需要有一個(gè)專門的控制器。而FPGA( Field Programmable Gate Array) 具有高速率、多接口、可重構(gòu)等特點(diǎn), 基于FPGA 的SDRAM 控制器設(shè)計(jì)能夠大大縮短開發(fā)周期, 簡(jiǎn)化設(shè)計(jì)方法。以往有很多關(guān)于SDRAM 控制器設(shè)計(jì)的文章, 但很少?gòu)腇PGA 時(shí)序分析的角度考慮讀寫數(shù)據(jù)的準(zhǔn)確性, 本文應(yīng)用FPGA 構(gòu)建SDRAM 控制器, 并對(duì)FPGA 與SDRAM 構(gòu)建模型進(jìn)行時(shí)序分析, 完成功能仿真和時(shí)序仿真, 最終通過板級(jí)調(diào)試實(shí)現(xiàn)SDRAM 的正常讀寫。
1 控制器系統(tǒng)設(shè)計(jì)
1. 1 SDRAM 簡(jiǎn)介
SDRAM 的功能管腳可分為控制信號(hào)、地址信號(hào)和數(shù)據(jù)信號(hào)三類。
控制信號(hào)主要有片選信號(hào)、時(shí)鐘信號(hào)、時(shí)鐘使能信號(hào)、行列地址選擇信號(hào)、讀寫信號(hào)及數(shù)據(jù)有效信號(hào)。
地址信號(hào)分為塊地址、行地址和列地址, 其中行列地址是分時(shí)復(fù)用的。在行激活命令時(shí)鎖存行地址, 在讀寫命令時(shí)鎖存列地址。
數(shù)據(jù)信號(hào)為雙向信號(hào)以減少管腳連接, 受數(shù)據(jù)有效信號(hào)控制。
SDRAM 在正常工作前需要有初始化過程:
( 1) 上電后等待200us 使電源及時(shí)鐘信號(hào)穩(wěn)定。
( 2) 對(duì)SDRAM 所有的BANK 進(jìn)行一次預(yù)充電, 使器件中的存儲(chǔ)陣列處于準(zhǔn)備狀態(tài)。
( 3) 完成至少8 次自動(dòng)刷新操作, 使SDRAM 內(nèi)部的刷新及計(jì)數(shù)器處于正常運(yùn)行狀態(tài)。
( 4) 配置工作模式寄存器。
SDRAM 要周期性進(jìn)行自動(dòng)刷新操作以保證內(nèi)部數(shù)據(jù)不會(huì)丟失, 目前公認(rèn)的行刷新周期為64ms,既可集中刷新也可以分散刷新, SDRAM 內(nèi)部有刷新地址計(jì)數(shù)器, 每完成一次自動(dòng)刷新計(jì)數(shù)器會(huì)自動(dòng)加1。
SDRAM 的讀寫通過寄存器配置可以實(shí)現(xiàn)突發(fā)長(zhǎng)度及突發(fā)類型的設(shè)置。
突發(fā)讀寫長(zhǎng)度為1, 2, 4, 8 或整頁模式。通過在讀寫命令有效時(shí)設(shè)置地址位的第10 位可以實(shí)現(xiàn)帶預(yù)充電的突發(fā)讀寫, 預(yù)充電命令可以用來結(jié)束當(dāng)前活動(dòng)行的操作。對(duì)于正常突發(fā)讀寫在同一行操作時(shí)只需在第一次進(jìn)行行激活, 以后的若干次操作中寫入列地址即可。若要進(jìn)行不同行間的切換首先需要預(yù)充電關(guān)閉當(dāng)前活動(dòng)行, 然后在執(zhí)行行激活命令激活下一操作行。而帶有預(yù)充電的突發(fā)讀寫在每次操作完成后自動(dòng)進(jìn)行一次預(yù)充電關(guān)閉當(dāng)前活動(dòng)行, 因此在每次讀寫時(shí)首先都要進(jìn)行行激活然后再發(fā)出讀寫命令。
整頁讀寫模式可以實(shí)現(xiàn)整頁內(nèi)任意長(zhǎng)度的讀寫, 最大長(zhǎng)度為一般為256, 在每次讀寫完成后需要發(fā)出突發(fā)終止命令來結(jié)束讀寫, 若要進(jìn)行下一行操作要發(fā)出預(yù)充電命令關(guān)閉當(dāng)前行。
1. 2 SDRAM 控制器結(jié)構(gòu)
系統(tǒng)采用模塊化設(shè)計(jì), 可劃分為4 個(gè)模塊, 如圖1 所示, 包括系統(tǒng)控制接口模塊、命令解析與刷新控制模塊、操作信號(hào)生成模塊和數(shù)據(jù)通路模塊。系統(tǒng)控制接口模塊主要由狀態(tài)機(jī)完成初始化工作及生成CMD 命令; 命令解析與刷新控制模塊主要將CMD的命令解析發(fā)出命令請(qǐng)求同時(shí)根據(jù)刷新計(jì)數(shù)器發(fā)出刷新請(qǐng)求; 操作信號(hào)產(chǎn)生模塊由仲裁器仲裁請(qǐng)求生成各種命令信號(hào)送給SDRAM 器件; 數(shù)據(jù)通路模塊控制數(shù)據(jù)流的傳輸方向并產(chǎn)生有效地?cái)?shù)據(jù)輸入輸出。
1. 3 各模塊設(shè)計(jì)
1. 3. 1 系統(tǒng)控制接口模塊
該模塊通過狀態(tài)機(jī)實(shí)現(xiàn)SDRAM 初始化和控制指令產(chǎn)生功能, 圖2 為狀態(tài)機(jī)圖。SDRAM 初始化過程主要包括: 在系統(tǒng)上電后通過計(jì)數(shù)器產(chǎn)生200us 等待時(shí)間, 其次執(zhí)行一次預(yù)充電命令, 然后完成8 次自刷新操作, 最后配置寄存器。
在控制接口模塊根據(jù)接收外部命令和后端模塊響應(yīng)信號(hào)生成CMD 命令送入后端模塊進(jìn)行相應(yīng)操作, 表1 為CMD 信號(hào)真值表。
1. 3. 2 命令解析與刷新控制模塊
此模塊主要將CMD 命令進(jìn)行解碼送入下一模塊中, 同一時(shí)刻只允許一種命令請(qǐng)求輸出。在寄存器配置過程中將控制器參數(shù)配置值和刷新計(jì)數(shù)器值加載到內(nèi)部寄存器中。此時(shí)刷新控制模塊開始計(jì)數(shù), 當(dāng)達(dá)到寄存器內(nèi)預(yù)設(shè)值時(shí)發(fā)出刷新請(qǐng)求, 當(dāng)刷新響應(yīng)后計(jì)數(shù)器繼續(xù)工作, 周而復(fù)始。
1. 3. 3 操作信號(hào)生成模塊
此模塊首先接收命令請(qǐng)求和刷新請(qǐng)求, 通過仲裁器根據(jù)刷新請(qǐng)求優(yōu)先級(jí)高于命令請(qǐng)求的原則響應(yīng)請(qǐng)求同時(shí)生成SDRAM 對(duì)應(yīng)操作信號(hào)送到SDRAM中。同時(shí)此模塊生成數(shù)據(jù)使能信號(hào)OE 送到數(shù)據(jù)通路模塊控制數(shù)據(jù)流向。
由于SDRAM 地址信號(hào)是分時(shí)復(fù)用的, 控制器的地址信號(hào)ADDR 從高到低依次為SDRAM 的塊地址、行地址、列地址。在此模塊中將ADDR 中包含的塊、行、列地址寫入響應(yīng)的寄存器中, 在行激活命令時(shí)將塊地址、行地址送入SDRAM, 在讀寫命令發(fā)出時(shí)將列地址送入SDRAM。
1. 3. 4 數(shù)據(jù)通路模塊
此模塊主要在讀寫操作期間處理數(shù)據(jù)路徑的操作, OE 信號(hào)作為三態(tài)門使能端, 寫操作時(shí)其為高有效數(shù)據(jù)DATAIN 經(jīng)過SDRAM 雙向數(shù)據(jù)線DQ 寫入SDRAM; 讀操作時(shí)當(dāng)OE 為低數(shù)據(jù)從DQ 讀到FPGA 內(nèi)部DATAOU T 數(shù)據(jù)總線上。DQM 為數(shù)據(jù)掩碼, 當(dāng)DQ 為16 位時(shí), DQM 寬度為2, 通過設(shè)置DQM 不同位的值可以實(shí)現(xiàn)DQ 位高低8 位的讀寫;同時(shí)通過在不同的讀寫時(shí)刻設(shè)置DQM 的值可以實(shí)現(xiàn)SDRAM 任意地址的讀寫操作。
2 仿真驗(yàn)證
2. 1 功能仿真
在控制器設(shè)計(jì)代碼完成后首先要進(jìn)行功能邏輯仿真來檢查設(shè)計(jì)語法是否正確及設(shè)計(jì)功能是否完全實(shí)現(xiàn)。測(cè)試向量的編寫一定要具有完備性, 對(duì)SDRAM 的設(shè)計(jì)工作模式都要考慮進(jìn)內(nèi)。
圖3 為控制器的功能仿真。此時(shí)突發(fā)長(zhǎng)度為8, tRCD 延遲為3 個(gè)時(shí)鐘, tCAS 延遲為3 個(gè)時(shí)鐘。寫命令發(fā)出后, 在寫數(shù)據(jù)使能信號(hào)有效時(shí)數(shù)據(jù)被寫進(jìn)SDRAM; 讀命令發(fā)出后, 在讀數(shù)據(jù)使能信號(hào)有效時(shí)數(shù)據(jù)從SDRAM 中讀出。
2. 2 時(shí)序仿真
時(shí)序仿真是在設(shè)計(jì)完成綜合布局布線后將器件延時(shí)及布線延時(shí)反標(biāo)到仿真文件中進(jìn)行的一種仿真過程, 時(shí)序仿真更切近器件的實(shí)際行為。在時(shí)序仿真階段首先進(jìn)行時(shí)序分析, 若信號(hào)不滿足的時(shí)序要求則添加相應(yīng)時(shí)序約束, 再次仿真驗(yàn)證以保證所有信號(hào)能夠正確寫入讀出。
2. 2. 1 時(shí)序分析
由于SDRAM 的管腳信號(hào)都是在時(shí)鐘信號(hào)的上升沿有效, 通過SDRAM 數(shù)據(jù)手冊(cè)得知各個(gè)信號(hào)建立保持時(shí)間。同樣從SDRAM 進(jìn)入FPGA 的數(shù)據(jù)信號(hào)也必須滿足FPGA 的建立保持時(shí)間。
圖4 為FPGA 與SDRAM 數(shù)據(jù)傳輸模型, 其中:
T din 為數(shù)據(jù)從FPGA 的IO 口到內(nèi)部寄存器的傳輸時(shí)間;
T 0co 為數(shù)據(jù)在FPGA 內(nèi)部寄存器傳輸時(shí)間;
T out 為數(shù)據(jù)從FPGA 寄存器輸出端到IO 口的傳輸時(shí)間;
T pcb 為數(shù)據(jù)在PCB 板走線時(shí)間;
T 1co 為數(shù)據(jù)在SDRAM 內(nèi)部寄存器傳輸時(shí)間。
假定所有信號(hào)在PCB 走線延時(shí)都是相等的。外部時(shí)鐘源經(jīng)過全局時(shí)鐘網(wǎng)絡(luò)進(jìn)入FPGA, 同時(shí)從FPGA 輸出時(shí)鐘信號(hào)到SDRAM。通過時(shí)鐘管理單元DCM 的設(shè)置可以實(shí)現(xiàn)clk 與s_clk 的零相偏移。
SDRAM 作為FPGA 下游器件時(shí), 進(jìn)入SDRAM的數(shù)據(jù)信號(hào)在時(shí)鐘上升沿需滿足建立保持時(shí)間。如圖5 所示, 當(dāng)SSetup 和SHold 分別滿足SDRAM 中數(shù)據(jù)建立和保持時(shí)間時(shí), 數(shù)據(jù)將正確寫入SDRAM中, 若不滿足要求時(shí)由于T0co 根據(jù)特定的器件其值一般是固定的, 可以適當(dāng)約束Tout 時(shí)間來達(dá)到時(shí)序要求。
SDRAM 作為FPGA 上游器件時(shí), 進(jìn)入FPGA的數(shù)據(jù)信號(hào)在時(shí)鐘上升沿也必須滿足建立保持時(shí)間。若不滿足可以通過時(shí)序約束數(shù)據(jù)從FPGA 的IO 到內(nèi)部寄存器的傳輸時(shí)間Tdin 來達(dá)到時(shí)間要求。
2. 2. 2 時(shí)序仿真與驗(yàn)證
圖6 為SDRAM 控制器寫操作的時(shí)序仿真, 從波形中可以看出時(shí)鐘周期Tclk= 10000ps, SSetup=1763ps, SHold= 6799ps。查閱SDRAM 數(shù)據(jù)手冊(cè)得知滿足建立保持時(shí)間。
3 板級(jí)驗(yàn)證
在完成仿真后生成下載文件加載到FPGA 中,添加測(cè)試邏輯使SDRAM 中無法觀測(cè)的數(shù)據(jù)通過如LED 顯示確保讀寫正確。同時(shí)可以借助在線邏輯分析儀ChipScope 快速檢測(cè)和定位問題所在。
4 結(jié)論與分析
本設(shè)計(jì)開發(fā)環(huán)境為ISE12. 2, 仿真環(huán)境為Modelsim6.5。FPGA 器件為XILINX- SPARTAN3 -XC3S400, 速度等級(jí)為- 4。SDRAM 型號(hào)為HYNIX-HY57V641620FTP- 6。表2 列出了控制器的資源利用率; 在讀寫帶寬方面系統(tǒng)主頻最高能達(dá)到100MHz, 表3 為在100MHz 主頻下各種模式的讀寫有效帶寬。
由于采用帶預(yù)充電的讀寫操作在每一次操作完成后SDRAM 會(huì)自動(dòng)預(yù)充電, 相當(dāng)于關(guān)閉當(dāng)前活動(dòng)行, 在執(zhí)行下一次操作時(shí)即使是同一行操作也得先執(zhí)行行激活命令, 再執(zhí)行讀寫命令, 這在一定程度上影響了SDRAM 的有效帶寬。而整頁讀寫每次操作完一次進(jìn)行一次預(yù)充電, 隨著突發(fā)長(zhǎng)度的增加, 減少了一些命令操作和等待時(shí)間, 使帶寬大大增加。
本文按照FPGA 的開發(fā)流程設(shè)計(jì)了SDRAM 控制器, 對(duì)FPGA 與SDRAM 數(shù)據(jù)接口進(jìn)行了時(shí)序分析, 并進(jìn)行了時(shí)序仿真。通過板級(jí)驗(yàn)證保證了設(shè)計(jì)的正確性。此控制器按照參數(shù)的設(shè)定能夠在不同的模式下工作, 具有一定通用性。
評(píng)論
查看更多