FPGA——sdram控制器2

硬件設計

向sdram中寫入1024個數據,從SDRAM的起始地址開始寫,寫完後讀出

sdram總容量:8MX16X4bank
8M指1個L-bank存儲單元的數目:8X1024X1024
16指sdram的數據位寬
4bank指L-bank的數目

系統框圖

在這裏插入圖片描述

sdram控制器

在這裏插入圖片描述

初始化狀態圖

在這裏插入圖片描述
在這裏插入圖片描述

{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;

在這裏插入圖片描述

工作狀態圖

在這裏插入圖片描述

刷新

在這裏插入圖片描述

刷新狀態
·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

在這裏插入圖片描述

在這裏插入圖片描述

寫狀態
·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

在這裏插入圖片描述

在這裏插入圖片描述

讀狀態
·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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章