实验任务:
将输入数据(data_in)存入ddr,然后读出,验证输入输出数据是否相等。
一、前言
接上一篇(3)mig的使用教程
mig配置如下:
1. 系统时钟sys_clk = 200mhz
2. 系统复位sys_rst 低有效
3. 模式:4:1
4. 位宽: 16bit
注:由于选择的ddr3的突然长度为8,所以mig的数据位宽=16*8=128bit,对应到代码即app_wdf_data[127:0] , app_rd_data[127:0]。
二、系统方案
2.1方案设计
实验任务:
将数据(data_in),存入ddr,然后读出,验证输入输出数据是否相等。
实验目的:
初步掌握ddr读写设计。
为什么要先过fifo再写入ddr?
因为ddr接口对用户而言并不是一直有效,只有等ddr“有效”时(app_rdy = 1 && app_wdf_rdy = 1),才能进行写入。
2.1.1输入接口时序图
输入数据为1-50共50个数据,以vld_in信号表征输入数据有效。
2.2状态机设计
2.2.1独热码localparam s0_idle = 6'b000001; //初始化状态,ddr初始化成功就跳转s1
localparam s1_wait = 6'b000010; //等待状态,等fifo缓存好数据就跳转s2
localparam s2_write = 6'b000100; //写ddr状态,fifo数据写完就跳转到s3
localparam s3_wr_done = 6'b001000; //写完成状态,给出读地址初始值就跳到s4
localparam s4_read = 6'b010000; //读ddr状态,读到相应长度的数量就跳到s5
localparam s5_rd_done = 6'b100000; //读完成状态,跳回idle
2.2.2状态机流程图
2.2.3三段式状态机
always @(posedge sys_clk or posedge sys_rst)begin
if(sys_rst == 1'b1)
current_state else
current_state end
always @(*)begin
case(current_state)
s0_idle :
if(init_calib_complete == 1'b1)
next_state else
next_state s1_wait :
if(eof == 1'b1)
next_state else
next_state s2_write :
if(ififo_empty == 1'b1)
next_state else
next_state s3_wr_done :
next_state s4_read :
if(cnt_read == cnt_length)
next_state else
next_state s5_rd_done :
next_state default :
next_state endcase
end
always @(posedge sys_clk or posedge sys_rst)begin
if(sys_rst == 1'b1)begin
cnt_length cnt_read cnt_write app_addr end
else case(current_state)
s0_idle : ;
s1_wait : ;
s2_write:
if(app_rdy && app_wdf_rdy && app_en)begin
app_addr cnt_write end
else begin
app_addr cnt_write end
s3_wr_done :begin
cnt_length app_addr end
s4_read :
if(app_rdy && app_en)begin
app_addr cnt_read end
else begin
app_addr cnt_read end
s5_rd_done :begin
cnt_length cnt_read cnt_write end
default : ;
endcase
end
代码很简单,对应流程图跳转,此处不再啰嗦 。
2.3app接口设计
assign app_wdf_mask = 16'b0; //掩码置0,表示传输的全部为有效数据
assign ififo_rden = (current_state == s2_write)&& app_rdy && app_wdf_rdy;
assign app_en = ((current_state == s2_write)&&(ififo_vld)) || (current_state == s4_read);
assign app_cmd = (current_state == s4_read) ? 3'b001 : 3'b000;
assign app_wdf_wren = ififo_vld;
assign app_wdf_end = ififo_vld;
assign app_wdf_data = ififo_rdata;
三、仿真结果
因为ddr仿真,需要用到ddr3_model和其他文件,单开一篇来讲解。
这里只看仿真结果。
输入:
输出:
输入数据: 1-50;
输出数据: 1-50;
ddr读写测试成功!
RTD2166 DisplayPort端口到VGA转换器介绍
microPython是什么,它的作用有哪些
智能边缘正在推动针对边缘应用的5G和Wi-Fi6路由器的采用
一种共集变压器反馈式振荡电路
盘点2018全球物联网芯片厂商TOP10
Xilinx FPGA平台DDR3设计保姆式教程(四)
华为西安运动健康科学实验室正式上线
如何通过德州仪器无线连接平台创建强大的智能家居和楼宇安全系统
2017CES展会下周开幕 将发布2万件消费电子新品
84x48像素单色LCD显示屏的使用教程
什么是模块化自动化?
ubuntu 下remmina的连接windows无法复制和粘贴
雪崩光电二极管电路图 雪崩二极管的工作曲线分析
印刷品生产中书帖检测系统的实现和设计方案
硬盘播放器特点
工业浪潮“热袭”鹏城,2023 EeIE智博会即将开启,倒计时中!
如可逆计算和神经形态芯片,4种奇特的新型计算方法
加速布局!美格智能获国内某自主大厂智能座舱项目模组定点
三层交换机VLAN路由的配置方法
缓存和RAID如何提高IO