fpga控制sdram存储器的读写4:sdram写数据

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

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值