项目名称
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
全局仿真结果