fpga之sdram控制器設計(二):重新整理
這次要來解決上次留下來的重新整理問題,在100us後首先要經過兩次重新整理才進行模式暫存器設定。這顆sdram晶元需要每隔64ms對8192行(列位址10-位,行位址13位)的每乙個儲存電容進行一次重新整理,因為不重新整理電充會洩露電流導致儲存資訊丟失。那每一行的重新整理時間為64/8192 ≈ 7810ns,注意重新整理是以行為單位,器晶元內部有乙個計數器,這個計數器不是時鐘直接驅動的,而是auto precharge驅動,每發一次atuoprecharge命令這個計數器加1,我們是看不到的也無法對其直接置數,這個計數器一上電就進行初始化這是我們不需要關心的,我們要做的是在7810ns進行一次重新整理操作就行了。所做的讀和寫就是在兩次重新整理間隔內進行的,這個會在下一節講到。
重新整理模組的設計思路是:重新整理的命令狀態機和乙個重新整理標誌產生的計數器,在此基礎上要加上乙個主控狀態機,也就是控制何時上電重新整理讀寫的乙個模組。
重新整理狀態轉移圖:
重新整理狀態機設計
`include "head.v"
module ref_fsm(
ref_done,ref_en,clk,ref_bus,soft_rst_n
);//重新整理狀態機
input clk;
input ref_en;
input soft_rst_n;
output reg ref_done;
output [19:0] ref_bus;
reg [12:0] ref_a;
reg [1:0] ref_ba;
reg [3:0] ref_cmd;
reg ref_cke;
assign ref_bus = ;
reg [14:0] cnt;
reg [1:0] state;
localparam s0 = 2'b00;
localparam s1 = 2'b01;
localparam s2 = 2'b10;
always @(posedge clk)
begin
if(soft_rst_n == 1'b0)
begin
ref_done <= 1'b0;
ref_ba <= 'd0;
ref_cmd <= `nop;
ref_cke <= 1'b0;
cnt <= 'd0;
state <= s0;
endelse
case(state)
s0 : if(ref_en == 1'b0)
begin
ref_done <= 1'b0;
state <= s0;
endelse
begin
ref_cmd <= `pre;
ref_a[10] <= 1'b1;
ref_done <= 1'b0;
state <= s1;
ref_cke <= 1'b1;//add
ends1 : if(cnt < `trp - 1)
begin
cnt <= cnt + 1'b1;
ref_cmd <= `nop;
state <= s1;
endelse
begin
cnt <= 'd0;
ref_cmd <= `ref;
state <= s2;
ends2 : if(cnt < `trfc - 1)
begin
cnt <= cnt + 1'b1;
ref_cmd <= `nop;
state <= s2;
endelse
begin
cnt <= 'd0;
ref_done <= 1'b1;
state <= s0;
endendcase
endendmodule
定時模組設計
`include "head.v"
module ref_time(
clk,soft_rst_n,rt_en,rt_flag
);//重新整理定時器
input clk;
input rt_en;
input soft_rst_n;
output reg rt_flag;
reg [9:0] cnt;
always @(posedge clk)begin
if(soft_rst_n == 1'b0)
begin
cnt <= 'd0;
rt_flag <= 1'b0;
endelse if(rt_en == 1'b1 )
if(cnt < 780)
begin
cnt <= cnt + 1'b1;
rt_flag <= 1'b0;
endelse begin
cnt <= 'd0;
rt_flag <= 1'b1;
endend
endmodule
儲存控制器和SDRAM
start.檔案 equ mem ctl base,0x48000000 命令用於把常量值設定為可以在文字段中使用的符號 equ sdram base,0x30000000 類似於c語言中 define 0x48000000 bwscon,0x30000000 bank6 text global s...
SDRAM控制器新增讀寫FIFO
在原來控制器的基礎上新增了讀寫fifo,對資料進行快取,從而解決了原控制器在某些時刻讀寫被忽略掉 比如重新整理請求和寫請求同時到來 導致資料的儲存和讀寫出現遺漏 其中,sdram control 模組的寫使能wr 和讀使能rd 是分別通過判斷寫fifo 模組和讀fifo 模組中所儲存的資料量來決定的...
基於FPGA的SDRAM設計 SDRAM的初始化
基於fpga的sdram設計 sdram的初始化 先引乙個圖說明一下sdram的初始化過程吧,這樣來的直觀一些 這便是sdram在開機時的初始化過程,上電後要有200us的輸入穩定期,在這個時間內不可以對sdram的介面做任何操作 200us以後就是要對所有l bank預充電,再往後給sdram 8...