⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdr_sdram.v

📁 详细的SDRAM控制器HDL代码
💻 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 + -