基於FPGA的SDRAM設計 SDRAM的初始化

2021-06-08 12:10:28 字數 2429 閱讀 8042

基於fpga的sdram設計——sdram的初始化

先引乙個圖說明一下sdram的初始化過程吧,這樣來的直觀一些:

這便是sdram在開機時的初始化過程,上電後要有200us的輸入穩定期,在這個時間內不可以對sdram的介面做任何操作;200us以後就是要對所有l-bank預充電,再往後給sdram 8次的重新整理命令;最後就是要對sdram的模式暫存器進行設定。上面的這些步驟就是sdram在上電後的全部初始化過程。在進行完了初始化過程以後就可以正常的對sdram進行讀寫了,當然了,在每隔一段時間後就要對sdram進行一次預重新整理操作以防止資料丟失。

下面就來解析下時序控制模組裡的部分關於sdram初始化的verilog程式(sdram_ctrl.v):

//上電後200us計時,計時時間到,則done_200us=1

wire done_200us;         //上電後200us輸入穩定期結束標誌位

reg[13:0] cnt_200us;

always @ (posedge clk or negedge rst_n)

if(!rst_n) cnt_200us <= 14'd0;

else if(cnt_200us < 14'd10000) cnt_200us <= cnt_200us+1'b1; //計數

//200us定時到,則done_200us=1

assign done_200us = (cnt_200us == 14'd10000);

當200us計時時間結束以後,sdram的初始化進入第二步,所有l-bank預充電狀態,如何預充電呢?在這之前我們得先把sdram的各個埠的作用搞清楚了。看下圖,k4s641632的datasheet中pin的定義。

在我的設計中,吧cke,cs_n,ras_n,cas_n,we_n這五個訊號埠打包作為sdram的命令了。如下定義:

// fpga與sdram硬體介面

output sdram_cke;           // sdram時鐘有效訊號

output sdram_cs_n;          //  sdram片選訊號

output sdram_ras_n;         //  sdram行位址選通脈衝

output sdram_cas_n;         //  sdram列位址選通脈衝

output sdram_we_n;          //  sdram寫允許位

reg[4:0] sdram_cmd_r;    //  sdram操作命令

assign = sdram_cmd_r;

關於命令部分其實主要是在命令控制模組裡賦值的。這裡還是回到正題預充電,預充電其實只要給sdram的操作命令sdram_cmd_r賦乙個相應的命令,只要保持乙個時鐘週期,然後sdram_cmd_r回到nop命令,預充電大概需要保持1個時鐘週期就行了(根據datasheet裡的時間引數)。

看看時序圖吧:

第一根粗黃線是預充電命令,可以看到這時候sdram的cs,cke,ras,cas,we都是和它前乙個時鐘週期(處於nop命令)是不同的,只是保持了乙個時鐘週期,又回到了nop命令,這樣在第二條黃線處就算完成了預充電,往後進行的是預重新整理操作。

說到這,再補充一下關於sdram的時鐘問題,sdram有乙個輸入始終引腳sdram_clk,它是sdram的工作時鐘,而不是fpga的工作時鐘,在我的程式裡,sdram_clk = ~clk;也就是說它和fpga的系統時鐘是反向的。這樣以來,在fpga時鐘的上公升沿可以對sdram的各個命令埠賦值,然後過了半個時鐘週期正好是sdram_clk的上公升沿,此時sdram鎖存相應的資料位址或者命令。

反向的時鐘如下:

預充電完成了就要連續進行八個預重新整理,時序如下:

從第一根黃線開始到第二根黃線為止,正好是八次的預重新整理操作。從圖上不難看出預重新整理操作需要的等待時間要比預充電長的多,大約需要6個時鐘週期(也有的資料說要9個時鐘週期,這和系統時鐘有關吧,應視具體情況而定)。

傳送一次預重新整理命令,然後回到nop命令等待完成,前後八次。

在往後是模式暫存器設定,看下圖:

上圖直觀明了我就不多廢話了。和前面不同的是在這一步,不僅要送命令,還要給ba0-ba1以及a0-a11埠送資料,也就是送入設定的資訊。這些設定關係到以後正常讀寫sdram的相關時序。

模式暫存器設定的時序如下:

相應的sdram_ba和sdram_addr都做了賦值,其verilog**如下:

i_mrs: begin  //模式暫存器設定,可根據實際需要進行設定

sdram_cmd_r <= cmd_lmr;

sdram_ba_r <= 2'b00; //操作模式設定

sdram_addr_r <= =00)

3'b011,  // cas潛伏期設定(這裡設定為3,=011)

1'b0,    //突發傳輸方式(這裡設定為順序,a3=b0)

3'b010   //突發長度,(這裡設定為4,=010)

end

FPGA之SDRAM控制器設計(二)

fpga之sdram控制器設計 二 重新整理 這次要來解決上次留下來的重新整理問題,在100us後首先要經過兩次重新整理才進行模式暫存器設定。這顆sdram晶元需要每隔64ms對8192行 列位址10 位,行位址13位 的每乙個儲存電容進行一次重新整理,因為不重新整理電充會洩露電流導致儲存資訊丟失。...

基於FPGA的呼吸燈設計

網上類似的標題很多,有一些呼吸燈的設計是基於微控制器的,還有一部分設計是基於fpga的,我也一時手癢,將這兩天自己重新寫的verilog描述語句曬出來,免得壓箱底放久了,出現發霉點。為什麼說重新寫的呢,之前有老師教過,講過呼吸燈,並且畫出了 波形圖和框圖,這段時間,略有閒暇,就將之前學習的程式,重新...

基於OpenCL標準的FPGA設計

在可程式設計技術發展的最初階段,可程式設計能力出現了兩個極端。乙個極端的代表是單核cpu和dsp單元。這些器件使用含有一系列可執行指令的軟體來進行程式設計。對於程式設計人員,在概念上以連續的方式來開發這些指令,而高階處理器能夠對指令重新排序,在執行時從這些連續程式中提取出指令級並行處理操作。作為對比...