硬件設計
向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