SDRAM基本信息
儲(chǔ)存能力計(jì)算
- 4X16X4=256(Mbit),注意不是MByte
SDRAM控制
sdram包含兩個(gè)部分:sdram_ctrl、fifo_ctrl。
- sdram_ctrl:其頂層為SDRAM的控制模塊內(nèi)部實(shí)例化了5個(gè)模塊,有初始化、自刷新、寫和讀模塊,還有一個(gè)仲裁模塊對(duì)這四個(gè)不同操作進(jìn)行分配;
- fifo_ctrl:其頂層為SDRAM的數(shù)據(jù)輸入輸出,內(nèi)部實(shí)例化了兩個(gè)用于連接SDRAM輸入和輸出端的FIFO,以及控制程序
sdram_ctrl模塊內(nèi)部例化了四個(gè)模塊
初始化模塊sdram_init
-
SDRAM在上電后首先需要執(zhí)行初始化操作,才可執(zhí)行其他操作。
-
配置寄存器模式
-
潛伏期為三個(gè)周期
-
突發(fā)長(zhǎng)度為頁突發(fā)
-
突發(fā)類型為順序類型
-
寫模式為頁突發(fā)寫模式
-
信號(hào)操作:
- 正常加載時(shí)鐘信號(hào):設(shè)置CKE時(shí)鐘使能為高電平CKE = 1
- 等待Vdd和CLK信號(hào)穩(wěn)定:等待T= 200us
- 進(jìn)行預(yù)充電操作,對(duì)所有L-Bank進(jìn)行預(yù)充電:cmd = PRECHARGE,A10 = 1
- 等待預(yù)充電操作:cmd = NOP,TRP =20ns
- 自動(dòng)刷新命令:cmd = AUTO REFRESH
- 等待自動(dòng)刷新:cmd = NOP,TRFC = 70ns
- 重復(fù)多次自動(dòng)刷新操作:重復(fù)8次
- 配置模式寄存器:cmd = LOAD MODE REGISTER,address= ,A10 = ,bank = 0
- 等待配置模式寄存器完成,TMRD = 30ns
-
總體采用狀態(tài)機(jī)來設(shè)計(jì),分為以下幾個(gè)狀態(tài):
- 初始化
- 預(yù)充電
- 預(yù)充電等待
- 自動(dòng)刷新
- 自動(dòng)刷新等待
- 配置模式寄存器
- 配置模式寄存器等待
- 初始化完成
-
為了防止亞穩(wěn)態(tài)的產(chǎn)生,狀態(tài)機(jī)編碼均使用格雷碼
-
跳轉(zhuǎn)條件使用計(jì)數(shù)器進(jìn)行計(jì)數(shù)完成判斷
- cnt_clk,等待狀態(tài)的計(jì)數(shù)器
- cnt_clk_rst,負(fù)責(zé)等待計(jì)數(shù)器的清零操作
-
另外為了跳轉(zhuǎn)操作代碼簡(jiǎn)潔,聲明組合邏輯的信號(hào)完成各個(gè)狀態(tài)的跳轉(zhuǎn)
- trp_end
- trc_end
- tmrd_end
-
由于自動(dòng)刷新信號(hào)需要重復(fù)進(jìn)行,因此使用計(jì)數(shù)器完成自動(dòng)刷新操作計(jì)數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-710048.html
- cnt_init_aref,計(jì)數(shù)自動(dòng)刷新操作的重復(fù)個(gè)數(shù)
-
最終按照各個(gè)狀態(tài)完成輸出信號(hào)的幅值,注意使用的為時(shí)序邏輯,因此輸出相比狀態(tài)跳轉(zhuǎn)延遲一拍文章來源地址http://www.zghlxwxcb.cn/news/detail-710048.html
自動(dòng)刷新模塊sdram_a_ref
- SDRAM刷新有兩種操作方式:
- 自刷新:用于休眠模式可以低功耗的保存數(shù)據(jù)
- 操作:CKR信號(hào)為低電平時(shí),寫入刷新指令,進(jìn)入自刷新模式,當(dāng)CKE信號(hào)拉高時(shí),退出自刷新模式;
- 自動(dòng)刷新模式:由于SDRAM動(dòng)態(tài)特性,使用電容來保存數(shù)據(jù),因此需要不斷對(duì)電容進(jìn)行充放電,以此保證數(shù)據(jù)不丟失。本文主要討論自動(dòng)刷新。
- 自刷新:用于休眠模式可以低功耗的保存數(shù)據(jù)
- 自動(dòng)刷新操作需要不斷的循環(huán)操作,是一個(gè)周期操作,至少需要每64ms完成一次。
- 自動(dòng)刷新時(shí)間計(jì)算
- 存儲(chǔ)體中電容的數(shù)據(jù)有效保存期上限是 64ms那么使用的SDRAM的地址位寬為13位,共有2^13=8192行。
- 那么每行刷新的時(shí)間為:64ms/8192=64*1000000ns/8192=7812.5ns。
- SDRAM的時(shí)鐘為100MHz,周期為10ns,那么計(jì)數(shù)器最大值為:7812.5/10=781.25個(gè)。
- 但是由于自動(dòng)刷新操作和寫讀請(qǐng)求會(huì)產(chǎn)生沖突,會(huì)出現(xiàn)不會(huì)立即刷新的情況,因此需要保留一段時(shí)間,那么設(shè)置計(jì)數(shù)器最大值為750個(gè),要求在7500ns中完成其中一行的刷新。
- 信號(hào)操作
- 預(yù)充電操作:cmd = PRECHARGE、A10 = 1、bank = 2'b11
- 預(yù)充電等待:cmd = NOP,TRP = 20ns
- 自動(dòng)刷新:cmd = PRECHARGE
- 自動(dòng)刷新等待:cmd = NOP,TRFC = 70ns
- 自動(dòng)刷新重復(fù)兩次
- 初始化模塊為所有信號(hào)的首位,因此需要初始化信號(hào)拉高后在開始執(zhí)行
- init_end = 1時(shí),模塊開始正常工作
- 由于是一個(gè)周期信號(hào),那么需要一個(gè)計(jì)數(shù)器進(jìn)行周期計(jì)數(shù),并以此信號(hào)完成狀態(tài)機(jī)的啟動(dòng)。
- cnt_ref作為計(jì)數(shù)器,最大值經(jīng)計(jì)算為750-1,并且達(dá)到最大值后清零繼續(xù)計(jì)數(shù)
- 其余信號(hào)需要在狀態(tài)機(jī)跳轉(zhuǎn)下進(jìn)行操作:
- 初始
- 預(yù)充電
- 預(yù)充電等待
- 自動(dòng)刷新
- 自動(dòng)刷新等待
- 自動(dòng)刷新結(jié)束
- 另外自動(dòng)刷新需要和仲裁模塊進(jìn)行握手,當(dāng)仲裁模塊同意進(jìn)行刷新操作時(shí),才可進(jìn)行該操作
- 當(dāng)內(nèi)部計(jì)數(shù)器cnt_ref達(dá)到最大值時(shí),此時(shí)需要自動(dòng)刷新,拉高自動(dòng)刷洗請(qǐng)求信號(hào)aref_req = 1,仲裁模塊接受該信號(hào),進(jìn)行判斷若同意則拉高自動(dòng)刷新使能信號(hào),aref_en = 1。
- 當(dāng)自動(dòng)刷新完成,拉高自動(dòng)刷新結(jié)束信號(hào),aref_end= 1,仲裁模塊接受該信號(hào),拉低自動(dòng)刷新使能信號(hào),aref_en = 0;
寫操作模塊sdram_write
- 本模塊使用的寫操作模式為:不自動(dòng)進(jìn)行預(yù)充電的頁突發(fā)寫模式
- 信號(hào)操作
- 激活L-Bank特定行:
- cmd = ACTIVE
- address = 特定寫入行地址
- bank = 特定寫入bank地址
- 等待激活
- cmd = NOP
- 寫數(shù)據(jù)命令
- cmd = WRITE
- address = 特定寫入列地址
- DQ = 寫入第一個(gè)數(shù)據(jù)
- 寫入數(shù)據(jù)中
- cmd = NOP
- DQ = 開始寫入第二個(gè)數(shù)據(jù),每隔一個(gè)周期寫入一個(gè)數(shù)據(jù)
- 突發(fā)終止命令
- cmd = BURST TERM
- DQ = 不寫入數(shù)據(jù)
- 預(yù)充電命令
- cmd = PRECHARGE
- A10 = 1
- bank = 2'b11
- 預(yù)充電等待
- cmd = NOP
- TRP = 20ns
- 激活L-Bank特定行:
- 當(dāng)初始化模塊完成初始化后才可以SDRAM才可以正常操作
- init_end = 1,此時(shí)寫模塊才可以正常開始工作
- sdram模塊的寫操作是由SDRAM上端的fifo模塊發(fā)起請(qǐng)求,經(jīng)過sdram仲裁器同意后開始執(zhí)行寫操作的
- SDRAM仲裁器判斷可以寫入時(shí)拉高,wr_en = 1
- 當(dāng)寫數(shù)據(jù)操作執(zhí)行完畢后狀態(tài)機(jī)跳轉(zhuǎn)至寫結(jié)束狀態(tài)時(shí),通過組合邏輯賦值將寫結(jié)束信號(hào)拉高
- wr_end = 1
- 另外當(dāng)FIFO請(qǐng)求向SDRAM寫入數(shù)據(jù)時(shí),SDRAM并不能直接開始寫入,因此當(dāng)真正開始寫入數(shù)據(jù)時(shí)需要一個(gè)提前一拍的響應(yīng)信號(hào)告知fifo可以輸出數(shù)據(jù)
- wr_ack = 1
- 相比于寫數(shù)據(jù)的同步信號(hào)需要提前一拍,作為FIFO的讀出數(shù)據(jù)的讀請(qǐng)求信號(hào)
- 其余信號(hào)在狀態(tài)機(jī)下完成
- 初始狀態(tài)
- 激活命令
- 激活等待
- 寫命令
- 寫等待
- 預(yù)充電
- 預(yù)充電等待
- 寫結(jié)束
- 寫入數(shù)據(jù)的信息由外部信號(hào)傳入,具體為輸入端的FIFO傳入
- [23:0] wr_addr:寫入數(shù)據(jù)的地址,可以分割為:2bit bank地址、13bit 行地址、9bit 列地址
- [15:0] wr_data,寫入數(shù)據(jù)
- [9:0] wr_burst_len,寫入數(shù)據(jù)個(gè)數(shù)
- 除了常規(guī)控制信號(hào)輸出外還有一個(gè),控制SDRAM數(shù)據(jù)總線輸出使能信號(hào),該信號(hào)和真正寫入sdram的數(shù)據(jù)同步。
讀操作模塊 sdram_read
- SDRAM數(shù)據(jù)讀方式為:不帶自動(dòng)預(yù)充電的頁突發(fā)讀模式
- 信號(hào)操作
- 激活L-Bank的特定行
- cmd = ACTIVe
- address = Row
- bank = 2‘b11
- 等待激活
- CMD = NOP
- TRCD =
- 讀命令
- CMD = READ
- address = column
- 讀出數(shù)據(jù)
- cmd = NOP
- 潛伏期設(shè)置為3,因此在寫入讀命令后的間隔3個(gè)周期,會(huì)有讀數(shù)據(jù)的輸出
- 突發(fā)終止
- cmd = BURST TERM
- cmd = BURST TERM
- 激活L-Bank的特定行
- 讀數(shù)據(jù)操作需要在初始化操作完成后進(jìn)行
- 當(dāng)init_end = 1 時(shí),sdram_read進(jìn)入正常工作模式
- sdram讀數(shù)據(jù)操作是由外部信號(hào)發(fā)起的,具體而言是SDRAM下端FIFO發(fā)出的讀請(qǐng)求信號(hào),并且該信號(hào)需要經(jīng)過仲裁器判斷后生效,仲裁器拉高讀使能信號(hào)
- rd_en = 1,讀模塊開始進(jìn)行讀操作
- 當(dāng)sdram_read讀操作完成后,狀態(tài)機(jī)進(jìn)入結(jié)束狀態(tài),使用組合邏輯同步拉高讀結(jié)束信號(hào)
- rd_end = 1
- 由于數(shù)據(jù)需要存入下端FIFO模塊因此需要輸出一個(gè)讀模塊工作響應(yīng)信號(hào),并且需要與數(shù)據(jù)同步,作為FIFO輸入的寫請(qǐng)求信號(hào)
- rd_ack = 1,需要和輸出數(shù)據(jù)同步
- 其余信號(hào)在狀態(tài)機(jī)下完成
- 空閑狀態(tài)
- 激活
- 激活等待
- 讀命令
- 潛伏期
- 讀數(shù)據(jù)
- 預(yù)充電
- 預(yù)充電等待
- 讀結(jié)束
- 并且為了盡可能的滿足建立時(shí)間,SDRAM真正的驅(qū)動(dòng)信號(hào)相比SDRAM的控制信號(hào)有-75°的相移,因此為了將SDRAM的輸入數(shù)據(jù)納入本時(shí)鐘域,需要對(duì)SDRAM的輸出數(shù)據(jù)進(jìn)行打拍操作,因此看起來并不會(huì)有一拍的延遲,因?yàn)镾DRAM的輸出本身就是提前了一些。
- 75°相移更多的是時(shí)序上的考量,本質(zhì)上是犧牲了保持時(shí)間換取建立時(shí)間的冗余
- 最終SDRAM讀出的數(shù)據(jù)和其同步信號(hào)輸出至下端的FIFO
- rd_sdram_data
- rd_ack
仲裁模塊 sdram_arbit
- SDRAM共有四種操作模式,且有著明確的執(zhí)行 優(yōu)先級(jí)要求,其中初始化最高,次之自動(dòng)刷新,最后是寫讀操作。在實(shí)際使用中不免會(huì)遇到多個(gè)模塊同時(shí)需要執(zhí)行或者當(dāng)前執(zhí)行過程中有新的請(qǐng)求需要執(zhí)行這兩種情況,此時(shí)就需要仲裁器來保證SDRAM收到的請(qǐng)求正常被執(zhí)行。
- 同時(shí)優(yōu)先級(jí)的判斷在狀態(tài)跳轉(zhuǎn)條件處體現(xiàn),以及在各個(gè)操作模塊的使能信號(hào)判斷條件處體現(xiàn)
到了這里,關(guān)于基于FPGA 的SDRAM控制器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!