一.理论知识
1.写数据之前,芯片已经完成初始化操作。初始化操作对所有L-Bank进行预充电,此时芯片中没有激活的Bank和行。所以在写数据之前,第一步要激活某个Bank和Bank中的特定行,表示即将要对该行进行写数据操作,此时需要给芯片发送激活指令,Bank地址,13位行地址。
2.紧接着要给芯片发送写数据指令和列地址信号,因为addr是分时复用信号线,此时只需要给芯片发送9位列地址信号,A9~A12是空闲状态。A10 的电平变化控制突发写操作完成后是否立即执行自动预充电操作,若 A10 为高电平,突发写操作完成后,立即执行自动预充电操作,关闭当前行;若 A10 为低电平,突发写操作完成后,当前行依然处于激活状态,以便对当前行执行新的读/写操作,想要关闭当前激活行,需写入预充电指令。剩下的A9,A11和A12信号当前不起作用,只需要赋值0即可。
3.发送写数据指令的同时发送第一个数据,然后每个时钟上升沿依次发送下一个数据。因为这里写数据选择的是页突发模式,所以数据的个数不能超过列地址个数,也就是2的9次方等于512。当不需要写数据的时候,只需要发送突发停止指令即可。
4.由于上面采用的是非自动预充电模式,因此在突发停止指令发送完之后,要给芯片发送预充电指令,用来关闭激活的bank和特定行,这样就不能在当前bank和特定行中继续执行读写操作。下次读写数据的时候,需要重新激活bank和特定行。
二.芯片时序分析

三.设计verilog时序图

四.verilog代码
module sdram_write
(
input wire sys_clk,
input wire sys_rst_n,
input wire init_end,
input wire wr_en,
input wire [23:0] wr_addr,
input wire [15:0] wr_data,
input wire [9:0] wr_burst_len,
output reg wr_ack,
output reg [3:0] wr_sdram_cmd,
output reg [1:0] wr_sdram_ba,
output reg [12:0] wr_sdram_addr,
output reg wr_end,
output reg wr_sdram_en,
output reg [15:0] wr_sdram_data
);
// 状态
parameter ST_IDLE = 0,
ST_ACTIVE = 1,
ST_ACT_WAIT = 2,
ST_WRITE = 3,
ST_WR_DATA = 4,
ST_BURST = 5,
ST_PRE = 6,
ST_PRE_WAIT = 7,
ST_WR_END = 8;
// 延迟计数器的值
parameter CNT_ACT_WAIT = 2,
CNT_PRE_WAIT = 2;
// 命令
parameter CMD_NOP = 4'b0111,
CMD_ACTIVE = 4'b0011

本文详细阐述了嵌入式系统中DRAM写操作的步骤,包括数据写入前的Bank和行初始化、突发写操作指令的发送、时序控制与Verilog代码实现。通过Verilog模块展示了如何控制SDRAM的命令、地址和数据传输,以确保高效和精确的数据操作。
最低0.47元/天 解锁文章
2950

被折叠的 条评论
为什么被折叠?



