SDRAM控制器设计(8)SDRAM控制器仿真验证

SDRAM控制器设计(8)SDRAM控制器仿真验证到此,简单的可进行读写操作的SDRAM控制器模块就设计好了。接下来,结合仿真模型(镁光官网提供的SDRAM模型)sdr文件,和编写的testbench文件验证所设计的控制器是否正确。testbench如下`timescale1ns/1ns`defineCLK100_PERIOD10modulesdram_control_tb;`include”../src/Sdr…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

到此,简单的可进行读写操作的 SDRAM 控制器模块就设计好了。

接下来,结合仿真模型(镁光官网提供的 SDRAM 模型)sdr文件,和编写的 testbench 文件验证所设计的控制器是否正确。
testbench如下

`timescale 1ns/1ns
`define CLK100_PERIOD 10
module sdram_control_tb;
`include "../src/Sdram_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;
reg [`DSIZE-1:0] Wr_data;
wire[`DSIZE-1:0] Rd_data;
wire Wr_data_vaild;
wire Rd_data_vaild;
wire sdram_clk;
wire sdram_cke;
wire sdram_cs_n;
wire sdram_ras_n;
wire sdram_cas_n;
wire sdram_we_n;
wire [`BSIZE-1:0] sdram_bank;
wire [`ASIZE-1:0] sdram_addr;
wire [`DSIZE-1:0] sdram_dq;
wire [`DSIZE/8-1:0]sdram_dqm;
assign sdram_clk = ~Clk;
wire Rdata_done;
//SDRAM 控制器模块例化
sdram_control sdram_control(
.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(),
.Rdata_done(Rdata_done),
.Sa(sdram_addr),
.Ba(sdram_bank),
.Cs_n(sdram_cs_n),
.Cke(sdram_cke),
.Ras_n(sdram_ras_n),
.Cas_n(sdram_cas_n),
.We_n(sdram_we_n),
.Dq(sdram_dq),
.Dqm(sdram_dqm)
);
//SDRAM 模型例化
sdr sdram_model(
.Dq(sdram_dq),
.Addr(sdram_addr),
.Ba(sdram_bank),
.Clk(sdram_clk),
.Cke(sdram_cke),
.Cs_n(sdram_cs_n),
.Ras_n(sdram_ras_n),
.Cas_n(sdram_cas_n),
.We_n(sdram_we_n),
.Dqm(sdram_dqm)
);
initial Clk = 1'b1;
always #(`CLK100_PERIOD/2) Clk = ~Clk;
initial
begin
Rst_n = 0;
Wr = 0;
Rd = 0;
Caddr = 0;
Raddr = 0;
Baddr = 0;
Wr_data = 0;
#(`CLK100_PERIOD*200+1);
Rst_n = 1;
@(posedge sdram_control.sdram_init.Init_done)
#2000;
repeat(100) //写入 100 组数据
begin
Wr = 1;
Baddr = 2;
#`CLK100_PERIOD;
Wr = 0;
if(Caddr == 512-SC_BL)begin
Caddr = 0;
Raddr = Raddr + 1; //1 行写满,行加 1
end
else
Caddr = Caddr + SC_BL;
#5000; //延时 5us
end
Caddr = 0;
Raddr = 0;
#5000;
repeat(100) //读出 100 组数据
begin
Rd = 1'b1;
#`CLK100_PERIOD;
Rd = 1'b0;
if(Caddr == 512-SC_BL)begin
Caddr = 0;
Raddr = Raddr + 1; //1 行读完,行加 1
end
else
Caddr = Caddr + SC_BL;
#5000; //延时 5us
end
#5000;
$stop;
end
initial
begin
forever begin
@(posedge Wr_data_vaild);
repeat(SC_BL) //改变待(突发)写入的数据
begin
#`CLK100_PERIOD;
Wr_data = Wr_data + 1;
end
end
end
endmodule

这里仿真中 SDRAM 控制模块突发长度设置为 8,列选通潜伏期设置为 2。
本次仿真过程是向SDRAM中bank地址为2的块中写入100组突发长度的数据,然后读出这 100 组数据,写入数据在写数据有效区间内改变。观察比较写入与读出数据来验证控制设计是否正确。

仿真波形图:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160086.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号