`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company :
// Engineer :
// Create Date :
// Design Name :
// Module Name : sdram_cmd
// Project Name :
// Target Device: Cyclone EP1C3T144C8
// Tool versions: Quartus II 9.1
// Description : SDRAM命令模块
//
// Revision : V1.0
// Additional Comments :
//
////////////////////////////////////////////////////////////////////////////////
module sdram_cmd(
clk,rst_n,
sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n,sdram_ba,sdram_addr,
sys_wraddr,sys_r_wn,sdwr_byte,sdrd_byte,cnt_clk,sys_rdaddr,
init_state,work_state
);
//系统信号
input clk; //50MHz
input rst_n; //低电平复位信号
// SDRAM硬件接口
output sdram_cke; // SDRAM时钟有效信号
output sdram_cs_n; // SDRAM片选信号
output sdram_ras_n; // SDRAM行地址选通脉冲
output sdram_cas_n; // SDRAM列地址选通脉冲
output sdram_we_n; // SDRAM写允许位
output[1:0] sdram_ba; // SDRAM的L-Bank地址线
output[11:0] sdram_addr; // SDRAM地址总线
// SDRAM封装接口
//input[21:0] sys_addr; // 读写SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址
input[21:0] sys_wraddr; // 写SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址
input[21:0] sys_rdaddr; // 读SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址
input[8:0] sdwr_byte; //突发写SDRAM字节数(1-256个)
input[8:0] sdrd_byte; //突发读SDRAM字节数(1-256个)
// SDRAM内部接口
input[4:0] init_state; // SDRAM初始化状态寄存器
input[3:0] work_state; // SDRAM读写状态寄存器
input sys_r_wn; // SDRAM读/写控制信号
input[8:0] cnt_clk; //时钟计数
`include "sdr_para.v" // 包含SDRAM参数定义模块
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
reg[4:0] sdram_cmd_r; // SDRAM操作命令
reg[1:0] sdram_ba_r;
reg[11:0] sdram_addr_r;
assign {sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n} = sdram_cmd_r;
assign sdram_ba = sdram_ba_r;
assign sdram_addr = sdram_addr_r;
wire[21:0] sys_addr; // 读写SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址
assign sys_addr = sys_r_wn ? sys_rdaddr:sys_wraddr; //读/写地址总线切换控制
//-------------------------------------------------------------------------------
//SDRAM命令参数赋值
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
sdram_cmd_r sdram_ba_r sdram_addr_r end
else
case (init_state)
//初始化等待状态
`I_NOP,`I_TRP,`I_TRF1,`I_TRF2,`I_TRF3,`I_TRF4,`I_TRF5,`I_TRF6,`I_TRF7,`I_TRF8,`I_TMRD: begin
sdram_cmd_r sdram_ba_r sdram_addr_r end
`I_PRE: begin //预充电状态
sdram_cmd_r sdram_ba_r sdram_addr_r end
//8次自刷新
`I_AR1,`I_AR2,`I_AR3,`I_AR4,`I_AR5,`I_AR6,`I_AR7,`I_AR8: begin
sdram_cmd_r sdram_ba_r sdram_addr_r end
`I_MRS: begin //模式寄存器设置,可根据实际需要进行设置
sdram_cmd_r sdram_ba_r sdram_addr_r 2'b00, //操作模式设置
1'b0, //操作模式设置(这里设置为A9=0,即突发读/突发写)
2'b00, //操作模式设置({A8,A7}=00),当前操作为模式寄存器设置
3'b011, // CAS潜伏期设置(这里设置为3,{A6,A5,A4}=011)
1'b0, //突发传输方式(这里设置为顺序,A3=b0)
3'b111 //突发长度(这里设置为8,{A2,A1,A0}=011)
};
end
`I_DONE://初始化完成
case (work_state)
//等待状态
`W_IDLE,`W_TRCD,`W_CL,`W_TRFC,`W_RD,`W_WD,`W_TDAL: begin
sdram_cmd_r sdram_ba_r sdram_addr_r end
`W_ACTIVE: begin //行有效 送入BANK和行地址
sdram_cmd_r sdram_ba_r sdram_addr_r end
`W_READ: begin //列有效 送入BANK和列地址
sdram_cmd_r sdram_ba_r sdram_addr_r 4'b0100, // A10=1,设置写完成允许预充电
sys_addr[7:0] //列地址
};
end
`W_WRITE: begin //列有效 送入BANK和列地址
sdram_cmd_r sdram_ba_r sdram_addr_r 4'b0100, // A10=1,设置写完成允许预充电
sys_addr[7:0] //列地址
};
end
`W_AR: begin //自刷新
sdram_cmd_r sdram_ba_r sdram_addr_r end
`W_RBST: begin //读突发停止
sdram_cmd_r sdram_ba_r sdram_addr_r end
`W_WBST: begin //写突发停止
sdram_cmd_r sdram_ba_r sdram_addr_r end
default: begin
sdram_cmd_r sdram_ba_r sdram_addr_r end
endcase
default: begin
sdram_cmd_r sdram_ba_r sdram_addr_r end
endcase
end
endmodule