SDRAM-学习7-控制模块

126 阅读1分钟

控制模块: 是对数据读和数据写 仲裁模块 初始化模块 自动刷新模块的整合。

sdram_ctrl:

image.png

程序:

(
//时钟 复位 初始化结束信号
input wire sys_clk,
input wire sys_rst_n,
output wire init_end,

//sdram 写端口
input wire sdram_wr_req,
input wire [23:0]sdram_wr_addr,
input wire [9:0]wr_burst_len,
input wire [15:0]sdram_data_in,
output wire sdram_wr_ack,
//sdram读端口

input wire sdram_rd_req,
input wire [23:0]sdram_rd_addr,
input wire [9:0]rd_burst_len,
output wire [15:0]sdram_data_out,
output wire sdram_rd_ack,

//sdram硬件连接接口
output wire sdram_cke,
output wire sdram_cs_n,
output wire sdram_ras_n,
output wire sdram_cas_n,
output wire sdram_we_n,
output [1:0]sdram_ba,
output [12:0]sdram_addr,
output [15:0]sdram_dq

);

//init
wire [3:0]init_cmd;
wire [1:0]init_ba;
wire [12:0]init_addr;
//aref


wire aref_en;
wire [3:0]aref_cmd;
wire [1:0]aref_ba;
wire [12:0]aref_addr;
wire aref_end;
wire aref_req;
//write
wire wr_en;
wire [3:0]wr_cmd;			
wire [1:0]wr_ba;			
wire [12:0]wr_sdram_addr;	
wire wr_sdram_en;	
wire wr_end;			
wire[15:0] wr_sdram_data;	
//read
wire rd_en;
		
wire [3:0]rd_cmd			;
wire [1:0]rd_ba			;		
wire [12:0]rd_sdram_addr;		
wire rd_sdram_en	;		
wire rd_end			;		
	
		

sdram_init sdram_init_inst(
.sys_clk      (sys_clk)   ,
.sys_rst_n    (sys_rst_n)   ,
.init_cmd     (init_cmd )   ,
.init_ba      (init_ba )   ,
.init_addr    (init_addr)   ,
.init_end	  (init_end	)
);


sdram_arbit
(
.sys_clk 	(sys_clk),
.sys_rst_n	(sys_rst_n),
.init_cmd	(init_cmd	),	
.init_ba		(init_ba		),
.init_addr	(init_addr	),
.init_end	(init_end	),

.aref_req	(aref_req	),
.aref_cmd	(aref_cmd	),
.aref_ba		(aref_ba		),
.aref_addr	(aref_addr	),
.aref_end	(aref_end	),

.wr_req		(sdram_wr_req		),
.wr_cmd		(wr_cmd		),
.wr_ba		(wr_ba		),
.wr_addr		(wr_addr		),
.wr_end		(wr_end		),
.wr_sdram_en(wr_sdram_en),
.wr_data		(wr_data		),


.rd_req		(sdram_rd_req		),
.rd_cmd		(rd_cmd		),
.rd_ba		(rd_ba		),
.rd_addr		(rd_addr		),
.rd_end		(rd_end		),
//.rd_sdram_en(rd_sdram_en),

.aref_en		(aref_en),
.wr_en		(wr_en),	
.rd_en		(rd_en),

.sdram_cke	(),
.sdram_cs_n	(),
.sdram_cas_n(),
.sdram_ras_n(),
.sdram_we_n	(),
.sdram_ba	(),
.sdram_addr	(),
.sdram_dq 	()

);

sdram_read sdram_read_inst
(
   .sys_clk   		(sys_clk),
	.sys_rst_n 		(sys_rst_n),
	.init_end		(init_end),
	.rd_addr			(sdram_rd_addr),    //两位宽bank地址 13位宽行地址 9位宽列地址
	.rd_data			(sdram_dq),    //sdram 芯片位宽为16位
	.rd_burst_len	(rd_burst_len),  //我们使用页突发,我们使用512,表示512需要10位
	.rd_en			(rd_en), 
	.rd_cmd			(rd_cmd			),	
	.rd_ba			(rd_ba			),
	.rd_sdram_addr	(rd_sdram_addr	),
	.rd_sdram_en	(rd_sdram_en	),
	.rd_end			(rd_end			),
	.rd_sdram_data	(sdram_data_out	),
	.rd_ack        (sdram_rd_ack)


);

sdram_write sdram_write_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.init_end(init_end),
	.wr_addr(sdram_wr_addr),    //两位宽bank地址 13位宽行地址 9位宽列地址
	.wr_data(sdram_data_in),    //sdram 芯片位宽为16位
	.wr_burst_len(wr_burst_len),  //我们使用页突发,我们使用512,表示512需要10位
	.wr_en(wr_en), 
	
	.wr_cmd			(wr_cmd),	
	.wr_ba			(wr_ba),
	.wr_sdram_addr	(wr_sdram_addr),
	.wr_sdram_en	(wr_sdram_en),
	.wr_end			(wr_end),
	.wr_sdram_data	(wr_sdram_data),
	.wr_ack			(sdram_wr_ack)
);

sdram_aref sdram_aref_inst(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.init_end(init_end),

.aref_en(aref_en),
.aref_cmd(aref_cmd),
.aref_ba(aref_ba),
.aref_addr(aref_addr),
.aref_end(aref_end),
.aref_req(aref_req)

);





endmodule