MIG连载-----写模块(3)
写模块总体框图
写模块分别用命令fifo和数据fifo里面读取数据;
a7_wr_start :指示写开始信号
a7_wr_bl :用户接口突发传输的数据个数n,则传输的总bit数位128*n。
app_rdy,app_wdf_rdy :来自IP核分别表示IP和准备好接受数据和写数据准备好写入。
data_req :数据fifo读出数据响应信号,同数据fifo读使能信号
a7_wr_data_end :一次突发传输结束信号,详细见时序图
写时序图
1.wr_bl:用于将数据缓存起来,因为a7_wr_start有效一个时钟周期
2.app_addr :用于缓存初始地址,并且没读入一个数据之后地址+(UI用户数据总线位宽)/(DDR3数据总线位宽)
2.wr_flag :指示可以写数据,遇到a7_wr_start有效止之后一直拉高即可,wr_flag拉低条件同cnt拉低条件
3.app_wdf_rdy :基本一直处于拉高状态,很少有为0的情况
4.app_rdy :出现低电平的可能性还是很高的
5.cnt :写入数据的个数计数,归零条件是:cnt==BL && app_rdy && app_wdf_rdy && wr_flag
6.app_addr :首地址由a7_wr_addr_initi决定,之后每次+8会伴随写入一个128bit的数据
7.此时序图反映的是数据和命令在同一个时钟写入的情况,其它两种情况原理相同
假设计数器cnt清零的条件是cntBL,wr_flag 拉低的条件是cnt == BL,如果是上面的时序图,这样最后一个数据无法写入,因为app_rdy在cntBL期间为低,也就是最后一个数据始终无法写入,所以cnt清零的条件是cnt==BL && app_rdy && app_wdf_rdy && wr_flag。
读时序的三种模式:from ug586 page of 167
写有三种模式,第三种模式数据迟于命令出来,最大不能超过两个周期。
//*************************************************************************//
//写模块的总体思路是先从命令fifo里面取指令,然后根据指令对数据fifo进行操作
//后续会有仲裁器判断读写模块哪个先执行
//*************************************************************************//module a7_wr_ctrl #(parameter BL_WIDTH = 7,parameter ADDR_WIDRH = 28,parameter DATA_WIDTH = 128,)(input wire sclk , //模块工作时钟,连接到ui_clk即可input wire sys_rst ,input wire a7_wr_start ,input wire [2:0] a7_wr_cmd , //直传给MIG的读写指令input wire [BL_WIDTH-1:0] a7_wr_bl , //命令fifo读出的突发长度 input wire [ADDR_WIDRH-1:0] a7_wr_init_addr , input wire [DATA_WIDTH-1:0] a7_wdf_data , //数据fifo读出的数据 input wire [DATA_WIDTH/8-1:0] wr_mask , // input wire app_rdy ,//指示向UI提供的数据是是否能被接收input wire app_wdf_rdy ,//OUTPUT output wire app_en , output reg app_cmd , output wire app_wdf_wren ,output reg [ADDR_WIDRH-1:0] app_addr , output wire [DATA_WIDTH-1:0] app_wdf_data ,output wire app_wdf_end , output wire [DATA_WIDTH/8-1:0] app_wdf_mask , output wire data_req , //数据请求信号,也即数据fifo的读使能 output reg wr_end //所有数据传输完成指示);//内部变量定义
reg [BL_WIDTH-1:0] wr_bl ;//缓存输入进来的突发长度
reg wr_flag ;//指示写模块有效信号,在a7_wr_start之后有效
reg [BL_WIDTH-1:0] data_cnt;//输入数据个数计数器
reg [6:0] cmd_cnt ;//命令计数器always @(posedge sclk or negedge sys_rst)
beginif (sys_rst)beginwr_bl <= {BL_WIDTH{1'b0}} ;app_addr <= {ADDR_WIDRH{1'b0}};cnt <= {BL_WIDTH{1'b0}} ;wr_end <= 1'b0 ;data_cnt <= {BL_WIDTH{1'b0}} ;end else if (a7_wr_start) //外部输入的写开始信号,一个周期有效beginwr_flag <= 1'b1 ;wr_bl <= a7_wr_bl ;app_addr <= a7_wr_init_addr ;end else if (data_req && data_cnt == wr_bl - 1'b1) beginwr_flag <= 1'b0 ;data_cnt <= {BL_WIDTH{1'b0}} ;app_addr <= {ADDR_WIDRH{1'b0}} ;endelse if (data_req)beginapp_addr <= app_addr + 4'd8 ;data_cnt <= data_cnt + 1'b1 ;end
end //app_cmd
assign app_amd = a7_wr_cmd ;
//app_wdf_mask
assign app_wdf_mask = wr_mask ;
//app_wdf_data
assign app_wdf_data = a7_wdf_data;
//app_wdf_end
assign app_wdf_end = app_en ;
//app_en
assign app_en = (app_rdy && app_wdf_rdy && wr_flag) ? 1b'1: 1'b0;
//data_req
assign data_req = (app_rdy && app_wdf_rdy && app_en ) ? 1b'1: 1'b0;assign app_wdf_wren = (app_rdy && app_wdf_rdy && wr_flag) ? 1b'1: 1'b0;//cmd_cnt
always@(posedge sclk)
if(rst_n==1'b0)cmd_cnt <= 7'b0;
else if(cmd_cnt == wr_bl-1'b1 && app_rdy==1'b1)cmd_cnt <= 7'b0;
else if(app_en==1'b1 && app_rdy == 1'b1)cmd_cnt <= cmd_cnt+1'b1;//wr_end
always@(posedge sclk)
if(rst_n==1'b0)wr_end <= 1'b0;
else if(cmd_cnt == wr_bl-1'b1 && app_rdy==1'b1)wr_end <= 1'b1;
elsewr_end <= 1'b0;endmodule
控制逻辑的核心可以概括为:由app_en 和app_wdf_rdy控制,app_en控制是否可以写,app_wdf_rdy控制数据是否被接收。
补充知识DDR读写效率测试与分析 :http://xilinx.eetrend.com/d6-xilinx/article/2016-12/10776.html
MIG连载-----写模块(3)相关推荐
- XILINX DDR3 VIVADO(二)写模块
文章目录 一. 项目介绍: 写命令和写数据总线介绍 写控制模块框图及波形 代码 Testbench 一. 项目介绍: 本章节将会讲解 A7 芯片内自带的 DDR3 SDRAM 的 IP 核的写时序,以 ...
- python用缩进来写模块_python学习笔记
一.基础简介 1.#!/usr/bin/python #!/usr/bin/python 相当于写死了 python 路径 #!/usr/bin/env python 会去环境设置寻找 python ...
- 【IEEE_Verilog-12.2】覆写模块参数的值
12.2 Overriding module parameter values 覆写模块参数值 定义参数有两种不同的方法.第一个是module_parameter_port_list(见12.1),第 ...
- python利用自动识别写模块_序章:资料预处理(python3.6 可用fortran unformatted sequencial data读取模块)...
首先我只是一个接触Python约半年的菜鸟,开这一个专栏的目的主要是记录自己所学,以及实践的一些有用的东西,顺便分享一些自己写的公用代码段以方便具有同样想法的朋友. 既然是序章我就多写一些吧,我本人对 ...
- php网站评论模块怎么写,模块内容评论循环
一.作用 用于循环查询模块评论数据(支持分页查询) 二.语法 {commentmodule=模块名称....}{/comment} 三.参数介绍(红色表示必填参数,蓝色表示系统默认参数)参数介绍 mo ...
- python利用写模块_使用C++编写python扩展模块
简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的).而是指使用Python本身提供的API,使用C++来对Python ...
- python利用自动识别写模块_教你用Python 实现自动导入缺失的库
在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named 'xxx' 或者 ModuleNotFoundError: No mod ...
- Python自己写模块提供调用
1.将自己写的py模块放在C:\Users\coder\AppData\Local\Programs\Python\Python37\Lib://就是lib文件夹内 然后照常import就可以了 -- ...
- python用什么来写模块-用Python编写模块有何技巧?
随着对Python学习的深入,其优点日渐突出,让读者也感觉到Python的强大了,强大感觉之一就是"模块自信",因为Python不仅有自带的模块(称之为标准库),还有海量的第三方模 ...
最新文章
- R语言plotly可视化:plotly可视化基本散点图(指定图像类型、模式)、plotly可视化散点图(为不同分组数据配置不同的色彩)、ggplotly使用plotly包呈现ggplot2的可视化结果
- @Autowired
- YUMI~~强大的USB启动盘制作工具!!
- 【BIM入门实战】建筑墙体知识全攻略
- HBase 基本Java API
- Stone Game, Why are you always there? HDU - 2999(sg定理)
- Atitit.收银机小票打印功能的设计 java php c#.net版本
- 智能推荐系统开发中的十个关键注意点
- Espresso之RecyclerView
- 鸿蒙系统功能,华为HarmonyOS2.0系统功能都有哪些呢-华为鸿蒙系统HarmonyOS2.0功能介绍[图文]_咖绿茵手游站...
- 联想笔记本怎么进入pe系统_图解联想G40-30(N2840)笔记本是怎么进入pe设置U盘启动的...
- RISC-V学习基础(五)
- linux 分区数据恢复
- Calculator Conundrum
- 十、纺织品库存管理系统全部功能展示
- dhu复试基础——63 倒序
- python图形化界面
- 二分三分法--+++这一天的纪录
- Apple Developer 注册,闭坑或潘多拉魔盒?
- 那些学习了编程的中学生,为什么会更可能成功?
热门文章
- spring boot整合jsp报错 Whitelabel Error Page 500或者404 问题处理
- 桃花影落飞神剑,碧海潮生按玉箫(黄药师)
- 今年天猫双11的这些技术,可能会改变整个零售行业
- 海信电视E7H和E5H哪个好?有什么区别
- 00 Linux到底是什么?
- 安卓模拟器刷小米系统_米柚模拟器下载_米柚手游模拟器(在电脑上玩遍小米所有手游) 2.1.9.9 官方版_极速下载站...
- (论文解读)High-frequency Component Helps Explain the Generalization of Convolutional Neural Networks
- 不对外开放的微信小程序审核时不通过,因为无法提供测试账号导致审核人员登录失败解决办法!
- 知乎微信小程序广告真的猛的一塌糊涂
- Mac键盘锁住了怎么办