`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company :
// Engineer :
// Create Date :
// Design Name :
// Module Name : sdr_test
// Project Name :
// Target Device: Cyclone EP1C3T144C8
// Tool versions: Quartus II 9.1
// Description :
//
// Revision : V1.0
// Additional Comments :
//
////////////////////////////////////////////////////////////////////////////////
module sdr_test(
clk,rst_n,
sdram_clk,sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n,
sdram_ba,sdram_addr,sdram_data,//sdram_udqm,sdram_ldqm
rs232_tx,sdram_ldqm,sdram_udqm, led,
/* sdram_rd_req,sdram_wr_ack,sdram_rd_ack,
sys_data_out,sdram_busy,sys_data_in,sys_dout_rdy,
*/ rdf_dout/*,rdf_rdreq*/
);
input clk; //系统时钟,100MHz
input rst_n; //复位信号,低电平有效
// FPGA与SDRAM硬件接口
output sdram_clk; // 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地址总线
//output sdram_udqm; // SDRAM高字节屏蔽
//output sdram_ldqm; // SDRAM低字节屏蔽
inout[15:0] sdram_data; // SDRAM数据总线
output rs232_tx; //RS232发送数据信号
output[3:0] led;
output sdram_udqm;
output sdram_ldqm;
assign sdram_ldqm=1'b0;
assign sdram_udqm=1'b0;
////////////////////////////////////////////////
// SDRAM的封装接口测试引出
/*output sdram_rd_req; //系统读SDRAM请求信号
output sdram_wr_ack; //系统写SDRAM响应信号
output sdram_rd_ack; //系统读SDRAM响应信号
output[15:0] sys_data_in; //写SDRAM时数据暂存器,4个突发读写字数据,默认为00地址bit15-0;01地址bit31-16;10地址bit47-32;11地址bit63-48
output[15:0] sys_data_out; //读SDRAM时数据暂存器,(格式同上)
output sdram_busy; // SDRAM忙标志,高表示SDRAM处于工作中
output sys_dout_rdy; // SDRAM数据输出完成标志
*/
output[15:0] rdf_dout; //sdram数据读出缓存FIFO输出数据总线
//output rdf_rdreq; //sdram数据读出缓存FIFO数据输出请求,高有效
////////////////////////////////////////////////
// SDRAM的封装接口
wire sys_en; //系统写SDRAM请求信号
wire sys_r_wn; //系统读SDRAM请求信号
wire sdram_wr_ack; //系统写SDRAM响应信号,作为wrFIFO的输出有效信号
wire sdram_rd_ack; //系统读SDRAM响应信号,作为rdFIFO的输写有效信号
//wire[21:0] sys_addr; //读写SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址
wire[8:0] sdwr_byte = 9'd256; //突发写SDRAM字节数(1-256个)
wire[8:0] sdrd_byte = 9'd256; //突发读SDRAM字节数(1-256个)
wire[21:0] sys_wraddr; //写SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址
wire[21:0] sys_rdaddr; //读SDRAM时地址暂存器,(bit21-20)L-Bank地址:(bit19-8)为行地址,(bit7-0)为列地址
wire[15:0] sys_data_in; //写SDRAM时数据暂存器
wire[15:0] sys_data_out; //sdram数据读出缓存FIFO输入数据总线
wire sdram_busy; // SDRAM忙标志,高表示SDRAM处于工作中
wire sys_dout_rdy; // SDRAM数据输出完成标志
//wrFIFO输入控制接口
wire[15:0] wrf_din; //sdram数据写入缓存FIFO输入数据总线
wire wrf_wrreq; //sdram数据写入缓存FIFO数据输入请求,高有效
//rdFIFO输出控制接口
wire[15:0] rdf_dout; //sdram数据读出缓存FIFO输出数据总线
wire rdf_rdreq; //sdram数据读出缓存FIFO数据输出请求,高有效
//系统控制相关信号接口
wire clk_25m; //PLL输出25MHz时钟
wire clk_100m; //PLL输出100MHz时钟
wire sys_rst_n; //系统复位信号,低有效
//------------------------------------------------
//例化系统复位信号和PLL控制模块
sys_ctrl uut_sysctrl(
.clk(clk),
.rst_n(rst_n),
.sys_rst_n(sys_rst_n),
.clk_25m(clk_25m),
.clk_100m(clk_100m),
.sdram_clk(sdram_clk)
);
//------------------------------------------------
//例化SDRAM封装控制模块
sdram_top uut_sdramtop( // SDRAM
.clk(clk_100m),
.rst_n(sys_rst_n),
.sys_en(sys_en),
.sys_r_wn(sys_r_wn),
.sdram_wr_ack(sdram_wr_ack),
.sdram_rd_ack(sdram_rd_ack),
.sys_wraddr(sys_wraddr),
.sys_rdaddr(sys_rdaddr),
.sys_data_in(sys_data_in),
.sys_data_out(sys_data_out),
.sdwr_byte(sdwr_byte),
.sdrd_byte(sdrd_byte),
.sdram_busy(sdram_busy),
.sdram_cke(sdram_cke),
.sdram_cs_n(sdram_cs_n),
.sdram_ras_n(sdram_ras_n),
.sdram_cas_n(sdram_cas_n),
.sdram_we_n(sdram_we_n),
.sdram_ba(sdram_ba),
.sdram_addr(sdram_addr),
.sdram_data(sdram_data)
// .sdram_udqm(sdram_udqm),
// .sdram_ldqm(sdram_ldqm)
);
//------------------------------------------------
//读写SDRAM数据缓存FIFO模块例化
sdfifo_ctrl uut_sdffifoctrl(
.clk_25m(clk_25m),
.clk_100m(clk_100m),
.rst_n(sys_rst_n),
.wrf_din(wrf_din),//SDRAM wrfifo的数据输入总线,即外部数据存入SDRAM的数据总线
.wrf_wrreq(wrf_wrreq),//SDRAM wrfifo的写请求信号
.sdram_wr_ack(sdram_wr_ack),//SDRAM数据写入响应信号,数据在写入SDRAM时为高电平,写入完毕或读状态时为低,出现下降沿表示数据写入完成
.sys_data_in(sys_data_in),//内部信号,SDRAM数据输入总线(wrfifo输出,SDRAM DATABUS输入)
.sys_en(sys_en),//内部信号,sdram工作使能信号,0:SDRAM不工作
.sys_data_out(sys_data_out),//内部信号,SDRAM数据输出总线(rdfifo输入,SDRAM DATABUS输出)
.rdf_rdreq(rdf_rdreq),//用户读SDRAM rdfifo请求信号
.sdram_rd_ack(sdram_rd_ack),//SDRAM数据读出响应信号,读SDRAM时为高电平
.rdf_dout(rdf_dout),//sdram rdfifo数据输出
.sys_r_wn(sys_r_wn),
.syswr_done(syswr_done),
.tx_start(tx_start)
);
//------------------------------------------------
//例化模拟写入数据到sdram模块
wire syswr_done; //所有数据写入sdram完成标志位
datagene uut_datagene(
.clk(clk_25m),
.rst_n(sys_rst_n),
.wrf_din(wrf_din),
.wrf_wrreq(wrf_wrreq),
.sys_wraddr(sys_wraddr),
.sys_rdaddr(sys_rdaddr),
.syswr_done(syswr_done),
.sdram_busy(sdram_busy),
.sdram_rd_ack(sdram_rd_ack)
);
//------------------------------------------------
//例化串口数据发送控制模块
wire tx_start; //串口发送数据启动标志位,高有效
uart_ctrl uut_uartctrl(
.clk(clk_25m),
.rst_n(sys_rst_n),
.tx_data(rdf_dout[7:0]),
.tx_start(tx_start), ///////////
.fifo232_rdreq(rdf_rdreq),
.rs232_tx(rs232_tx)
);
led_test uut_led_test(
.clk(clk_25m),
.sys_rst_n(sys_rst_n),
.led(led)
);
endmodule