基於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單元。這些器件使用含有一系列可執行指令的軟體來進行程式設計。對於程式設計人員,在概念上以連續的方式來開發這些指令,而高階處理器能夠對指令重新排序,在執行時從這些連續程式中提取出指令級並行處理操作。作為對比...