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

📄 ddr_sdram.v

📁 ddr_sdram控制器的vhdl代码,里面的地址和数据长度可配置,能满足不同用户的需要.
💻 V
字号:
/******************************************************************************
*
*  LOGIC CORE:          DDR SDRAM Controller							
*  MODULE NAME:         ddr_sdram()
*  COMPANY:             Northwest Logic Design, Inc.
*                       www.nwlogic.com	
*
*  REVISION HISTORY:  
*
*    Revision 1.0  05/12/2000	Description: Initial Release.
*
*  FUNCTIONAL DESCRIPTION:
*
*  This module is the top level module for the DDR SDRAM Controller
*
*  Copyright Northwest Logic Design, Inc., 2000.  All rights reserved.
******************************************************************************/
module ddr_sdram(
        CLK,
        RESET_N,
        ADDR,
        CMD,
        CMDACK,
        DATAIN,
        DATAOUT,
        DM,
        SA,
        BA,
        CS_N,
        CKE,
        RAS_N,
        CAS_N,
        WE_N,
        DQ,
        DQM,
        DQS
        );


`include        "params.v"

input                           CLK;                    //System Clock
input                           RESET_N;                //System Reset
input   [`ASIZE-1:0]            ADDR;                   //Address for controller requests
input   [2:0]                   CMD;                    //Controller command 
output                          CMDACK;                 //Controller command acknowledgement
input   [`DSIZE-1:0]            DATAIN;                 //Data input
output  [`DSIZE-1:0]            DATAOUT;                //Data output
input   [`DSIZE/8-1:0]          DM;                     //Data mask input
output  [11:0]                  SA;                     //SDRAM address output
output  [1:0]                   BA;                     //SDRAM bank address
output  [1:0]                   CS_N;                   //SDRAM Chip Selects
output                          CKE;                    //SDRAM clock enable
output                          RAS_N;                  //SDRAM Row address Strobe
output                          CAS_N;                  //SDRAM Column address Strobe
output                          WE_N;                   //SDRAM write enable
inout   [`DSIZE/2-1:0]          DQ;                     //SDRAM data bus
output  [`DSIZE/16-1:0]         DQM;                    //SDRAM data mask lines
inout   [`DSIZE/16-1:0]         DQS;                    //SDRAM Data Strobe lines

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/2-1:0]          DQIN;

wire    [`DSIZE/2-1:0]          DQOUT;

wire    [11:0]                  ISA;                     //SDRAM address output
wire    [1:0]                   IBA;                     //SDRAM bank address
wire    [1:0]                   ICS_N;                   //SDRAM Chip Selects
wire                            ICKE;                    //SDRAM clock enable
wire                            IRAS_N;                  //SDRAM Row address Strobe
wire                            ICAS_N;                  //SDRAM Column address Strobe
wire                            IWE_N;                   //SDRAM write enable

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                            oe;
wire                            CLK100;
wire                            CLK200;
wire                            locked;
wire                            dqoe1;
wire                            dqoe2;
wire                            dqoe3;
wire                            dqoe4;




// instantiate the pll
pll1 PLL_1 (
                .inclock(CLK),
                .clock0(CLK100),
                .clock1(CLK200),
                .locked(locked)
                );
        
              
// instantiate block of the controller
ddr_control_interface control1 (
                .CLK(CLK100),
                .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)
                );

ddr_command command1(
                .CLK(CLK100),
                .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)
                );
                
ddr_data_path data_path1(
                .CLK100(CLK100),
                .CLK200(CLK200),
                .RESET_N(RESET_N),
                .OE(oe),
                .DATAIN(DATAIN[31:0]),
                .DM(DM[3:0]),
                .DATAOUT(DATAOUT[31:0]),
                .DQIN(DQIN[15:0]),
                .DQOUT(DQOUT[15:0]),
                .DQM(DQM[1:0]),
                .DQS(DQS[1:0]),
                .SC_CL(sc_cl),
                .DQOE(dqoe1)
                );

ddr_data_path data_path2(
                .CLK100(CLK100),
                .CLK200(CLK200),
                .RESET_N(RESET_N),
                .OE(oe),
                .DATAIN(DATAIN[63:32]),
                .DM(DM[7:4]),
                .DATAOUT(DATAOUT[63:32]),
                .DQIN(DQIN[31:16]),
                .DQOUT(DQOUT[31:16]),
                .DQM(DQM[3:2]),
                .DQS(DQS[3:2]),
                .SC_CL(sc_cl),
                .DQOE(dqoe2)
                );

ddr_data_path data_path3(
                .CLK100(CLK100),
                .CLK200(CLK200),
                .RESET_N(RESET_N),
                .OE(oe),
                .DATAIN(DATAIN[95:64]),
                .DM(DM[11:8]),
                .DATAOUT(DATAOUT[95:64]),
                .DQIN(DQIN[47:32]),
                .DQOUT(DQOUT[47:32]),
                .DQM(DQM[5:4]),
                .DQS(DQS[5:4]),
                .SC_CL(sc_cl),
                .DQOE(dqoe3)
                );

ddr_data_path data_path4(
                .CLK100(CLK100),
                .CLK200(CLK200),
                .RESET_N(RESET_N),
                .OE(oe),
                .DATAIN(DATAIN[127:96]),
                .DM(DM[15:12]),
                .DATAOUT(DATAOUT[127:96]),
                .DQIN(DQIN[63:48]),
                .DQOUT(DQOUT[63:48]),
                .DQM(DQM[7:6]),
                .DQS(DQS[7:6]),
                .SC_CL(sc_cl),
                .DQOE(dqoe4)
                );


// register the SDRAM i/o for higher performance.
always @(posedge CLK100)
begin
                SA      <= ISA;
                BA      <= IBA;
                CS_N    <= ICS_N;
                CKE     <= ICKE;
                RAS_N   <= IRAS_N;
                CAS_N   <= ICAS_N;
                WE_N    <= IWE_N;
end

// capture the read data
always @(negedge CLK200 or negedge RESET_N)
begin
     if (RESET_N == 0)
          DQIN <= 0;
     else
          DQIN <= DQ;
end

assign  DQ[15:0]  = dqoe1 ? DQOUT[15:0]  : 16'bz;                     
assign  DQ[31:16] = dqoe2 ? DQOUT[31:16] : 16'bz;                     
assign  DQ[47:32] = dqoe3 ? DQOUT[47:32] : 16'bz;                     
assign  DQ[63:48] = dqoe4 ? DQOUT[63:48] : 16'bz;                     

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -