提示:这里可以添加技术概要
例如:
本文以米联科开发板为例,介绍ddr测试相关例程。
提示:这里可以添加技术整体架构
提示:这里可以添加技术名词解释
例如:
app _addr:表示正在提交给用户界面的请求的地址。聚合外部所有地址字段,并向您显示一个平面地址空间,每个地址待变4BYTES。
app _cmd: 此输入指定请求的命令如下,001读,000时写.
app_en:用户输入时使用,
app_hi_pri:表示当前请求时高优先级,用不到;
app-wdf—data :当前正在写入外部存储器的数据;
app-wdf-mask:那些位被写入外部存储器
app-wdf-wren:该输入表示总线上数据有效
app_rdy: 此输出向用户显示正在提交给UI的请求是否被接受;
提示:这里可以添加技术细节
根据原理图及相关要求,配置好FPGA的MIG核,可以点击官方的案例, open IP example design。
添加以下读写控制代码;
状态机代码:
parameter [1:0]IDLE =2'd0;
parameter[1:0]WRITE=2'd1;
parameter[1:0]WAIT=2'd2;
parameter[1:0]READ=2'd3;
设置读写命令;
parameter[2:0]CMD_READ =3'd1;
parameter[2:0]CMD_WRITE=3'd0;
设置读写范围:
parameter TEST_DATA_RANGE=24'd1000;
这里小姐以下ddr地址的概念;
128M16 前面的128M表示地址。这里的地址时行列地址,还有bank地址一起,
通常我们说的地址是行列,所以是24位,整体式27位。每一位含有16位数据。
reg [1:0] state=0; 这里式设置初始状态;后续表示状态机代码;
reg [23:0]count 128M*2*16/256(为什么除以256,我也没明白,我猜想式32*16)其实式一个bank的地址范围。
reg app_addr_begin=0
wire tg_compare_error;
assgin app_wdf_end =app_wdf_wren;
assgin app_en=(state==WRITE)?(app_rdy&&app_wdf_rdy):((state==READ)&&app_rdy);
assgin app_wdf_wren =(state==WRITE)?(app_rdy&&app_wdf_rdy):1'b0;
assgin app_cmd =(state==WRITE)?(app_rdy&&app_wdf_rdy):1'b0;
assgin app_addr =app_addr_begin;
assgin app_wdf_data={Count_64[7:0]};
下面式状态机跳转设计:
always@(posedge clk)
if(rst&!init_calib_complete)
begin
state<=IDLE;
app_addr_begin<=29'd0;
Count_64<=24'd0;
end
这是复位状态;
else case (state)
IDLE:begin
state
if(app_addr_begin >10000)
app_addr_begin <=29'd0;
count64<=24'd0;
end
空闲状态
WRITE:
begin
state<=(count_64==TEST_DATA_RANGE)&&app_rdy&&app_wdf_rdy?WAIT:atate;
count_64<=app_rdy&&app_wdf_rdy?(count_64+24'd1):count_64;
app_addr_begin<=app_rdy&&app_wdf_rdy?(app_addr_begin+29'd16):app_addr_begin;
read
begin
state<=(count_64==test_data_range)&&app_rdy?idle:state;
count_64<=app_rdy?(count_64+24'd1):count_64;
app_addr_begin <=app_rdy?(app_addr_begin+29'd16):app_addr_begin;
end
以上式ddr读信号
以上就是测试ddr的核心代码,另外读者可以根据需要,增加一些debug信号来测试结果。
在设置好debug信号后,在进行编译,最后下载到FPGA。
提示:这里可以添加总结
例如:
本文以FPGA核心板为例子,结合官方的案例,修改,进行了ddr测试。