FPGA——sdram控制器2

硬件设计

向sdram中写入1024个数据,从SDRAM的起始地址开始写,写完后读出

sdram总容量:8MX16X4bank
8M指1个L-bank存储单元的数目:8X1024X1024
16指sdram的数据位宽
4bank指L-bank的数目

系统框图

FPGA——sdram控制器2_第1张图片

sdram控制器

FPGA——sdram控制器2_第2张图片

初始化状态图

FPGA——sdram控制器2_第3张图片
FPGA——sdram控制器2_第4张图片

{sdr_cs_n,sdr_ras_n,sdr_cas_n,sdr_we_n}=sdr_cmd
`I_NOP:上电状态 至少200000周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
	
`I_PRE:预充电状态  
	sdr_cmd = 4'b0010;
	sdr_a = 13'h1fff;//sdr_a[12:11],sdr_a[9:0]don't care,sdr_a[10]=1 all bank precharge
	sdr_ba = 2'b11;//all bank
`I_TRP:预充电等待状态 至少2周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`I_AUTO_REF:刷新
	sdr_cmd = 4'b001;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`I_TRC:刷新等待 至少7周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`I_MRS:模式寄存器设置
	sdr_cmd = 4'b0000;
	sdr_a = {3'b000,
			 1'b0,//可编程bl
			 2'b00,//标准
			 3'b010,//cl=2
			 1'b0,//顺序
			 3'b111//全页突发};
	sdr_ba = 2'b00;
`I_TMRD:模式寄存器设置等待状态 至少2周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`I_DONE:sdram初始化完成 进入工作状态 
	sdr_init_done = 1;

FPGA——sdram控制器2_第5张图片

工作状态图

FPGA——sdram控制器2_第6张图片

刷新

FPGA——sdram控制器2_第7张图片

刷新状态
·W_AUTO_REF_PRE:预充电状态  
	sdr_cmd = 4'b0010;
	sdr_a = 13'h1fff;//sdr_a[12:11],sdr_a[9:0]don't care,sdr_a[10]=1 all bank precharge
	sdr_ba = 2'b11;//all bank
`W_AUTO_REF_TRP:
预充电等待状态 至少2周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`W_AUTO_REF1::刷新1
	sdr_cmd = 4'b001;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`W_TRC1:刷新等待 至少7周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`W_AUTO_REF2::刷新2
	sdr_cmd = 4'b001;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`W_TRC2:刷新等待 至少7周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care

FPGA——sdram控制器2_第8张图片

FPGA——sdram控制器2_第9张图片

写状态
·W_ACTIVE:激活状态  
	sdr_cmd = 4'b0011;
	sdr_a = 行地址
	sdr_ba = bank地址
`W_TRCD:
激活等待 至少2周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`W_WRITE:写操作
	sdr_cmd = 4'b0100;
	sdr_a = 列地址
	sdr_ba = bank地址
	sdr_dq=d_in
`W_WD:写数据
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
	sdr_dq=d_in
`W_BT:写中断
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`W_PRE:预充电
	sdr_cmd <= 4'b0010;
	sdr_a <= 13'h0000;
	sdr_ba <= sys_addr[24:24];
`W_TRP://预充电等待
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care

FPGA——sdram控制器2_第10张图片

FPGA——sdram控制器2_第11张图片

读状态
·W_ACTIVE:激活状态  
	sdr_cmd = 4'b0011;
	sdr_a = 行地址
	sdr_ba = bank地址
`W_TRCD:
激活等待 至少2周期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`W_READ:读操作
	sdr_cmd = 4'b0101;
	sdr_a = 列地址
	sdr_ba = bank地址
	sdr_dq=d_in
`W_CL:读潜伏期
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
	sdr_dq=d_in
`W_RD:读数据
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care
`W_PRE:预充电
	sdr_cmd <= 4'b0010;
	sdr_a <= 13'h0000;
	sdr_ba <= sys_addr[24:24];
`W_TRP://预充电等待
	sdr_cmd = 4'b0111;
	sdr_a = 13'h1fff;//don't care
	sdr_ba = 2'b11;//don't care

FPGA——sdram控制器2_第12张图片

你可能感兴趣的:(FPGA)