源程序如下:
//---------------------------------------------------------------------------
//-- 文件名 : Project_Ddr2.v
//-- 作者 : ZIRCON
//-- 描述 : DDR2读写测试模块
//-- 修订历史 : 2017-01-01
//---------------------------------------------------------------------------
`include "Ddr2_Param.v"
module Project_Ddr2
(
/* 时钟和复位信号 */
CLK_50M,RST_N,
/* DDR2接口 */
DDR2_ODT,DDR2_CS_N,DDR2_RAS_N,DDR2_CKE,DDR2_ADDR,DDR2_CLK,
DDR2_BA,DDR2_CAS_N,DDR2_WE_N,DDR2_CLK_N,
DDR2_DM,DDR2_DQ,DDR2_DQS
);
//---------------------------------------------------------------------------
//-- 外部端口声明
//---------------------------------------------------------------------------
input CLK_50M; //时钟信号
input RST_N; //复位信号
output DDR2_ODT; //DDR2片上终结信号
output DDR2_CS_N; //DDR2片选信号
output DDR2_CKE; //DDR2时钟使能信号
output [ `MEM_ADDRWIDTH-1:0] DDR2_ADDR; //DDR2地址总线
output [ `MEM_BAWIDTH-1:0] DDR2_BA; //DDR2BANK信号
output DDR2_RAS_N; //DDR2行地址选择信号
output DDR2_CAS_N; //DDR2列地址选择信号
output DDR2_WE_N; //DDR2写使能信号
output [ `MEM_DMWIDTH-1:0] DDR2_DM; //DDR2数据掩膜信号
inout DDR2_CLK; //DDR2时钟信号
inout DDR2_CLK_N; //DDR2时钟反相信号
inout [ `MEM_DQWIDTH-1:0] DDR2_DQ; //DDR2数据总线
inout [ `MEM_DQSWIDTH-1:0] DDR2_DQS; //DDR2数据源同步信号
//---------------------------------------------------------------------------
//-- 内部端口声明
//---------------------------------------------------------------------------
wire CLK_100M; //时钟信号
wire RST_B; //复位信号
wire CLK_25M; //25MHz写时钟
wire CLK_30M; //30MHz读时钟
wire user_init_done; //初始化完成信号
wire user_phyclk; //DDR2 IP核输出时钟,166.7MHz
wire user_phyrst_n; //DDR2 IP核同步后的复位信号
wire user_wren; //写使能信号
wire user_wrreq; //写FIFO请求信号
wire [12:0] user_wrdata; //写数据总线
wire user_wrfull; //写FIFO满标志
wire user_wrdone; //写完成标志,只有一拍
wire user_rden; //读使能信号
wire user_rdreq; //读FIFO请求信号
wire [15:0] user_rddata; //读数据总线
wire user_rdempty; //读FIFO空信号
wire user_rddone; //读完成标志,只有一拍
//---------------------------------------------------------------------------
//-- 逻辑功能实现
//---------------------------------------------------------------------------
/* PLL IP核控制模块 */
Pll_Control Pll_Control_Init
(
.CLK_50M (CLK_50M ), //时钟输入端口
.RST_N (RST_N ), //复位输入端口
.CLK_100M (CLK_100M ), //100M时钟输出
.CLK_25M (CLK_25M ), //25M时钟输出
.CLK_30M (CLK_30M ), //30M时钟输出
.RST_B (RST_B ) //复位输出端口
);
/* 封装了Ddr2 Ip核和Fifo Ip核的DDR2控制器模块 */
Fifo_Ddr2_Fifo fifo_ddr2_fifo_inst
(
/* 时钟和复位信号 */
.CLK_DDR2 (CLK_100M ), //时钟信号
.RST_N (RST_B ), //复位信号
/* DDR2存储器接口 */
.mem_odt (DDR2_ODT ), //DDR2片上终结信号
.mem_cs_n (DDR2_CS_N ), //DDR2片选信号
.mem_cke (DDR2_CKE ), //DDR2时钟使能信号
.mem_addr (DDR2_ADDR ), //DDR2地址总线
.mem_ba (DDR2_BA ), //DDR2BANK信号
.mem_ras_n (DDR2_RAS_N ), //DDR2行地址选择信号
.mem_cas_n (DDR2_CAS_N ), //DDR2列地址选择信号
.mem_we_n (DDR2_WE_N ), //DDR2写使能信号
.mem_dm (DDR2_DM ), //DDR2数据掩膜信号
.mem_clk (DDR2_CLK ), //DDR2时钟信号
.mem_clk_n (DDR2_CLK_N ), //DDR2时钟反相信号
.mem_dq (DDR2_DQ ), //DDR2数据总线
.mem_dqs (DDR2_DQS ), //DDR2数据源同步信号
/* DDR2用户接口 */
.user_init_done (user_init_done ), //初始化完成信号
.user_phyclk (user_phyclk ), //DDR2 IP核输出时钟,166.7MHz
.user_phyrst_n (user_phyrst_n ), //DDR2 IP核同步后的复位信号
.user_wrclk (CLK_25M ), //写数据进FIFO工作时钟
.user_rdclk (CLK_30M ), //从FIFO读数据工作时钟
.user_wrdone (user_wrdone ), //写完成标志,只有一拍
.user_rddone (user_rddone ), //读完成标志,只有一拍
.user_wren (user_wren ), //写使能信号
.user_rden (user_rden ), //读使能信号
.user_wrfreq (user_wrreq ), //写FIFO请求信号
.user_wrffull (user_wrfull ), //写FIFO满标志
.user_wrfusedw (), //写FIFO中的数据个数
.user_rdfreq (user_rdreq ), //读FIFO请求信号
.user_rdfempty (user_rdempty ), //读FIFO空信号
.user_rdfusedw (), //读FIFO中的数据个数
.user_wrdata (user_wrdata ), //写数据总线
.user_rddata (user_rddata ), //读数据总线
.user_wrlen (10'd256 ), //写突发长度
.user_rdlen (10'd256 ), //读突发长度
.user_wrheadaddr (25'h0 ), //写操作首地址
.user_wrendaddr (25'd25 ), //写操作尾地址
.user_rdheadaddr (25'h0 ), //读操作首地址
.user_rdendaddr (25'd25 ), //读操作尾地址
.user_pingpongen (25'd0 ) //乒乓操作使能信号
);
Ddr2_Control Ddr2_Control_Init
(
.CLK_25M (CLK_25M ), //时钟端口
.CLK_30M (CLK_30M ), //时钟端口
.RST_B (RST_B ), //复位端口
.user_phyclk (user_phyclk ), //DDR2 IP核输出时钟,166.7MHz
.user_phyrst_n (user_phyrst_n ), //DDR2 IP核同步后的复位信号
.user_wren (user_wren ), //写使能信号
.user_wrreq (user_wrreq ), //写FIFO请求信号
.user_wrdata (user_wrdata ), //写数据总线
.user_wrfull (user_wrfull ), //写FIFO满标志
.user_wrdone (user_wrdone ), //写完成标志,只有一拍
.user_rden (user_rden ), //读使能信号
.user_rdreq (user_rdreq ), //读FIFO请求信号
.user_rddata (user_rddata ), //读数据总线
.user_rdempty (user_rdempty ), //读FIFO空标志
.user_rddone (user_rddone ), //读完成标志
.rddata_cnt (rddata_cnt ) //读数据计数
);
endmodule