sdram_ctrl 顶端模块
1.需要注意各个子模块所传入的addr地址信息的位宽
方案所选芯片结构为 4Meg x 16 x 4
4Meg: 8192 x 512 =4,294,304 存储地址标定【从0开始计数的】
2^13 = 8192 ----------即单个L_bank含8192行--------------只需13位宽
2^9 = 512 ----------即每一行含512列---------------------- 只需9位宽
4 : 即共4个L_bank,2^2 ----------------------------------------------只需2位宽
16 : 每个最小存储单元的数据位宽为16bit --------------------------基本数据位宽16
output reg [1:0] sdram_ba , //SDRAM Bank地址
output reg [12:0] sdram_addr , //SDRAM地址总线
inout wire [15:0] sdram_dq //SDRAM数据总线
1)写操作模块
输入信号(部分) {bank地址,行地址,列地址} 2+ 13 + 9 = 24
input wire [23:0] wr_addr ,
input wire [15:0] wr_data ,
input wire [9:0] wr_burst_len ,
输出信号(部分)
output reg [1:0] wr_ba ,
output reg [12:0] wr_sdram_addr ,
在做为输出时,行、列地址共用一个端口,故选择两者位宽最大者,因为sdram运作模式中,行 列的选择是分开在不同命令中
激活指令:激活特定bank的特定行
WR_ACTIVE : //激活阶段
begin
wr_cmd <= ACTIVE ;
wr_ba <= wr_addr[23:22] ;
wr_sdram_addr <= wr_addr[21:9] ;
end
写操作: 在前面已激活的行。指定列起始位置,作为写突发长度的起点
WR_WRITE : //写指令阶段
begin
wr_cmd <= WRITE ;
wr_ba <= wr_addr[23:22] ;
wr_sdram_addr <= {4'b0000,wr_addr[8:0]} ;
end
2)读操作模块
输入信号(部分) {bank地址,行地址,列地址} 2+ 13 + 9 = 24
input wire [23:0] rd_addr ,
input wire [9:0] rd_burst_len ,
input wire [15:0] rd_data ,
输出信号(部分)
output reg [1:0] rd_ba ,
output reg [12:0] rd_sdram_addr ,
激活指令:激活特定bank的特定行
RD_ACTIVE : //激活阶段
begin
rd_cmd <= ACTIVE;
rd_ba <= rd_addr[23:22] ;
rd_sdram_addr <= rd_addr[21:9] ;
end
读操作: 在前面已激活的行基础上,指定列起始位置 ,作为读突发长度的起点
RD_READ : //读指令阶段
begin
rd_cmd <= READ;
rd_ba <= rd_addr[23:22] ;
rd_sdram_addr <= {4'b0000,rd_addr[8:0]} ;
end
3)自动刷新模块
13位宽,因为刷新的基本单位为行,无需包含列地址
output reg [12:0] aref_addr ,
output reg [1:0] aref_ba ,
4)初始化模块
13位宽---初始化的基本内容就是 1.预充电 2.自动刷新 3.配置模式寄存器(A0~A12地址来进行 配置)
预充电 :基本单位为bnak
自动刷新: 基本单位为行,
刷新速度为: 64ms/行,即必须在64m内刷新所有行,sdram内部会依次自动生成行地址,所以无 需 列寻址,全部置1即可。 且执行自动化刷新命令前,必须先要执行预充电指令,关闭所 有 L- bank.
output reg [12:0] init_addr,
output reg [1:0] init_ba ,
自动刷新指令阶段
AUTO_REF : /* 自动刷新指令 */
begin
aref_cmd <= A_REF;
aref_ba <= 2'b11;
aref_addr <= 13'h1fff;
end
2.理解读写“突发长度”的意义
input wire [9:0] rd_burst_len ,
我们应用的sdram芯片为每一行包含2的9方即512个列,故需位宽为10
需要注意的是:方案芯片每一行包含2^9即512列
在标定列地址时,0可以表示地址,故可从0开始计数,addr 只需9位宽
在计量突发长度是,最小突发长度为1,故需要10个位宽
3.理解刷新模块的运作模式
刷新模块,不需要外部的刷新请求信号来驱动模块运作,只要 init_end 有效,即初始化完成,就开始计数“刷新间隔”,计满,内部释放 aref_req 信号,同时 三种请求信号优先级
aref_req > write_req , read_req