📄 sdr_sdram.v
字号:
/******************************************************************************
*
* LOGIC CORE: SDR SDRAM Controller
* MODULE NAME: sdr_sdram()
* COMPANY: Northwest Logic, Inc.
* www.nwlogic.com
*
* REVISION HISTORY:
*
* Revision 1.0 05/11/2000 Description: Initial Release.
* 1.1 07/10/2000 Description: change precharge to terminate
* for full page accesses.
*
* FUNCTIONAL DESCRIPTION:
*
* This module is the top level module for the SDR SDRAM controller.
*
* Copyright Northwest Logic, Inc., 2000. All rights reserved.
******************************************************************************/
module sdr_sdram(
CLK,
RESET_N,
ADDR,
CMD,
CMDACK,
DATAIN,
DATAOUT,
DM,
SA,
BA,
CS_N,
CKE,
RAS_N,
CAS_N,
WE_N,
DQ,
DQM
);
`include "params.v"
input CLK; //System Clock系统时钟
input RESET_N; //System Reset系统复位信号
input [`ASIZE-1:0] ADDR; //Address for controller requests用户输入到SDRAM CONTROLLER的地址
input [2:0] CMD; //Controller command 用户输入到SDRAM CONTROLLER的命令
output CMDACK; //Controller command acknowledgement SDRAM CONTROLLER输出给用户的命令确认信号
input [`DSIZE-1:0] DATAIN; //Data input 用户输入到SDRAM CONTROLLER的数据,即要往SDRAM中写的数据
output [`DSIZE-1:0] DATAOUT; //Data output SDRAM CONTROLLER输出给用户的数据,即读SDRAM所得到的数据
input [`DSIZE/8-1:0] DM; //Data mask input 用户输入到SDRAM CONTROLLER的数据屏蔽信号,每一位屏蔽信号可屏蔽8位数据信号,因此屏蔽信号位宽是DSIZE/8
output [11:0] SA; //SDRAM address output SDRAM CONTROLLER输出到SDRAM的地址信号
output [1:0] BA; //SDRAM bank address SDRAM CONTROLLER输出到SDRAM的BANK选择地址信号
output [1:0] CS_N; //SDRAM Chip Selects SDRAM CONTROLLER输出到SDRAM的SDRAM片选信号
output CKE; //SDRAM clock enable SDRAM CONTROLLER输出到SDRAM的时钟使能信号
output RAS_N; //SDRAM Row address Strobe SDRAM CONTROLLER输出到SDRAM的行地址选通信号
output CAS_N; //SDRAM Column address Strobe SDRAM CONTROLLER输出到SDRAM的列地址选通信号
output WE_N; //SDRAM write enable SDRAM CONTROLLER输出到SDRAM的写使能信号
inout [`DSIZE-1:0] DQ; //SDRAM data bus SDRAM与SDRAM CONTROLLER之间的双向数据总线
output [`DSIZE/8-1:0] DQM; //SDRAM data mask lines SDRAM数据屏蔽线,由SDRAM CONTROLLER输出给SDRAM
reg [11:0] SA; //SDRAM address output
reg [1:0] BA; //SDRAM bank address
reg [1:0] CS_N; //SDRAM Chip Selects
reg CKE; //SDRAM clock enable
reg RAS_N; //SDRAM Row address Strobe
reg CAS_N; //SDRAM Column address Strobe
reg WE_N; //SDRAM write enable
reg [`DSIZE-1:0] DQIN; //接收双向数据总线DQ上从SDRAM中读出的数据
wire [`DSIZE-1:0] DQOUT; //接收缓存后的用户输入的数据,进而将其送到双向数据总线DQ
wire [`DSIZE-1:0] IDATAOUT; //Data output接收sdr_data_path模块输出的从SDRAM中读出的数据
reg [`DSIZE-1:0] DATAOUT; //Data output用于保存从SDRAM中读出的数据,输出给用户
wire [11:0] ISA; //SDRAM address output 用来给SA赋值
wire [1:0] IBA; //SDRAM bank address 用来给BA赋值
wire [1:0] ICS_N; //SDRAM Chip Selects 用来给CS_N赋值
wire ICKE; //SDRAM clock enable 用来给CKE赋值
wire IRAS_N; //SDRAM Row address Strobe 用来给RAS_N赋值
wire ICAS_N; //SDRAM Column address Strobe 用来给CAS_N赋值
wire IWE_N; //SDRAM write enable 用来给WE_N赋值
wire [`ASIZE-1:0] saddr;
wire [1:0] sc_cl;
wire [1:0] sc_rc;
wire [3:0] sc_rrd;
wire sc_pm;
wire [3:0] sc_bl;
wire load_mode;
wire nop;
wire reada;
wire writea;
wire refresh;
wire precharge; //这些wire型变量用来在control_interface模块和command module之间做为连接线传递信号
wire oe; //输出使能信号,用于连接command module和sdr_data_path模块,确定是否该向SDRAM输出数据
wire CLK133; //133M时钟,SDRAM使用
wire CLK133B;
wire CLK; //系统时钟
pll1 PLL1(
.inclock(CLK),
.clock0(CLK133),
.clock1(CLK133B),
.locked(locked)
); //实例化锁相环模块得到133M时钟CLK133
control_interface control1 (
.CLK(CLK133),
.RESET_N(RESET_N),
.CMD(CMD),
.ADDR(ADDR),
.REF_ACK(ref_ack),
.CM_ACK(cm_ack),
.NOP(nop),
.READA(reada),
.WRITEA(writea),
.REFRESH(refresh),
.PRECHARGE(precharge),
.LOAD_MODE(load_mode),
.SADDR(saddr),
.SC_CL(sc_cl),
.SC_RC(sc_rc),
.SC_RRD(sc_rrd),
.SC_PM(sc_pm),
.SC_BL(sc_bl),
.REF_REQ(ref_req),
.CMD_ACK(CMDACK)
); //实例化control_interface模块,对用户输入到该模块的命令CMD进行解码(解码成NOP、READA、WRITEA、REFRESH、PRECHARGE、LOAD_MODE信号,以传送给command module),
//对用户输入到该模块的地址ADDR进行锁存(锁存为SADDR,以传送给command module)
//接收command module送来的命令确认信号CM_ACK,向用户发送命令确认信号CMD_ACK
//接收command module送来的刷新确认信号REF_ACK,向command module发送刷新请求信号REF_REQ
//将REG1配置信息锁存到SC_CL、SC_RC、SC_RRD、SC_PM、SC_BL,以传送给command module
//将REG2配置信息锁存到REF_PER,做为control_interface模块内部计数器的计数初值,当计数器减计数到0时刷新请求锁存到REF_REQ
command command1(
.CLK(CLK133),
.RESET_N(RESET_N),
.SADDR(saddr),
.NOP(nop),
.READA(reada),
.WRITEA(writea),
.REFRESH(refresh),
.PRECHARGE(precharge),
.LOAD_MODE(load_mode),
.SC_CL(sc_cl),
.SC_RC(sc_rc),
.SC_RRD(sc_rrd),
.SC_PM(sc_pm),
.SC_BL(sc_bl),
.REF_REQ(ref_req),
.REF_ACK(ref_ack),
.CM_ACK(cm_ack),
.OE(oe),
.SA(ISA),
.BA(IBA),
.CS_N(ICS_N),
.CKE(ICKE),
.RAS_N(IRAS_N),
.CAS_N(ICAS_N),
.WE_N(IWE_N)
); //实例化一个command module。接收control_interface模块送来的锁存后的地址saddr;接收control_interface模块送来的解码后的命令NOP、READA、WRITEA、REFRESH、PRECHARGE、LOAD_MODE;
//接收control_interface模块送来的REG1配置信息SC_CL、SC_RC、SC_RRD、SC_PM、SC_BL;接收control_interface模块送来的隐藏的刷新请求REF_REQ;
//产生刷新请求确认信号REF_ACK、命令确认信号CM_ACK,发送给control_interface模块
//产生输出使能信号oe,发送给sdr_data_path模块
//产生SDRAM地址信号SA、BA,控制信号CKE、RAS_N、CAS_N、WE_N,输出给顶层模块SDRAM CONTROLLER
sdr_data_path data_path1( //实例化一个sdr_data_path模块。接收command module送来的向SDRAM输出数据使能信号oe,接收用户输入的数据DATAIN,将其缓存后送到DQOUT(从而输出给顶层模块),
.CLK(CLK133), //接收用户输入的数据屏蔽信号DM,缓存后送DQM从而输出给顶层模块,进而输出给SDRAM
.RESET_N(RESET_N), //接收来自SDRAM的数据DQIN,送DATAOUT输出给顶层模块的IDATAOUT,进而输出给用户
.OE(oe),
.DATAIN(DATAIN),
.DM(DM),
.DATAOUT(IDATAOUT),
.DQIN(DQIN),
.DQOUT(DQOUT),
.DQM(DQM)
);
always @(posedge CLK133) //133M时钟上升沿,SDRAM CONTROLLER将地址信号SA、BA,控制信号CKE、RAS_N、CAS_N、WE_N输出给SDRAM;
begin //读双向数据线DQ到DQIN;保存上一次从SDRAM中读出的数据IDATAOUT到DATAOUT,从而输出给用户
SA <= ISA;
BA <= IBA;
CS_N <= ICS_N;
CKE <= ICKE;
RAS_N <= IRAS_N;
CAS_N <= ICAS_N;
WE_N <= IWE_N;
DQIN <= DQ;
DATAOUT <= IDATAOUT;
end
assign DQ = oe ? DQOUT : 32'bz; //若输出使能信号oe有效,则将用户输入的数据DQOUT送双向数据线DQ;否则DQ保持高阻态
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -