SDRAM控制器仿真

项目名称

SDRAM控制器仿真

项目说明

仿真代码,进行例化,sdram_clk=~clk主要是要在sdram时钟的上升沿进行采样数据,数据中心在时钟上升沿

`timescale 1ns/1ns
`define clk_period 10

module sdram_ctrl_tb;
`include  "params.h"

	reg				clk;
	reg				rst_n;
	reg				wr;//写使能
	reg				rd;//读使能
	reg[`ASIZE-1:0]caddr;//写列地址
	reg[`ASIZE-1:0]raddr;//写行地址
	reg[`BSIZE-1:0]baddr;//写sdram 时的bank地址
	reg[`DSIZE-1:0]wr_data;//待写入的数据
	wire[`DSIZE-1:0]rd_data;//读出的数据
	wire 			rd_data_vaild;//读数据有效区
	wire 			wr_data_vaild;//写数据有效区
	
	
	wire				      wdata_done;//一次突发写完成标志
	wire				      rdata_done;//一次突发读完成标志
	
	wire [`ASIZE-1:0]         sa;//地址总线
	wire [`BSIZE-1:0]        ba;//bank总线
	wire					 cs_n;//片选信号
	wire					 cke;//时钟使能
	wire					 ras_n;//行地址选通
	wire					 cas_n;//列地址选通 
	wire					 we_n;//写使能
	wire[`DSIZE-1:0]	      dq;//数据总线
	wire[`DSIZE/8-1:0]      dqm;//数据掩码

	
sdram_ctrl  sdram_ctrl(
	.clk				(clk), 
	.rst_n				(rst_n),
	.wr					(wr	),				
	.rd					(rd	),	
	.caddr				(caddr),		
	.raddr				(raddr ),		
	.baddr				(baddr),					
	.wr_data			(wr_data),			
	.rd_data			(rd_data ),		
	.rd_data_vaild		(rd_data_vaild ),						
	.wr_data_vaild		(wr_data_vaild  ),				
	.wdata_done			(wdata_done	 ),				
	.rdata_done			(rdata_done	),			
	.sa					(sa	 ),		
	.ba					(ba	 ),				
	.cs_n				(cs_n ),			
	.cke				(cke),				
	.ras_n				(ras_n	 ),				
	.cas_n				(cas_n),			
	.we_n				(we_n),			
	.dq					(dq	 ),				
	.dqm                (dqm )
);

assign sdram_clk=~clk;
//sdram模型例化
sdr sdr(
	.Dq(dq), 
	.Addr(sa),
	.Ba(ba), 
	.Clk(sdram_clk), 
	.Cke(cke), 
	.Cs_n(cs_n), 
	.Ras_n(ras_n), 
	.Cas_n(cas_n), 
	.We_n(we_n), 
	.Dqm(dqm)
);

产生时钟

initial clk=0;
always #(`clk_period/2) clk=~clk;

写入1-100并读出 

initial begin
	rst_n=0;
	wr=0;
	rd=0;
	caddr=0;//列地址
	raddr=0;//行地址
	baddr=0;
	wr_data=0;
	 #(`clk_period*200+1)
	 rst_n=1;
	 @(posedge sdram_ctrl.sdram_init.init_done)
	 #2000;
	 
	 repeat(100)
	 begin
		wr=1;
		baddr=2;
		#(`clk_period);
		wr=0;
			wr_data = wr_data + 1;
		if(caddr==512-SC_BL)begin    //sc_bl突发长度为8
			caddr=0;
			raddr=raddr+1;
		end
		else
			caddr=caddr+SC_BL;
			
			#5000;
	 end
	 
	 caddr=0;
	 raddr=0;
	 repeat(100)
	begin
		rd=1;
		#(`clk_period);
		rd=0;
		if(caddr==512-SC_BL)begin
			caddr=0;
			raddr=raddr+1;
			
		end
		else
			caddr=caddr+SC_BL;
		
		#5000;
	end
	#5000;
	$stop;
end

全局仿真结果

SDRAM控制器仿真_第1张图片

 

 

你可能感兴趣的:(项目进阶)