写模块总体框图


写模块分别用命令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)相关推荐

  1. XILINX DDR3 VIVADO(二)写模块

    文章目录 一. 项目介绍: 写命令和写数据总线介绍 写控制模块框图及波形 代码 Testbench 一. 项目介绍: 本章节将会讲解 A7 芯片内自带的 DDR3 SDRAM 的 IP 核的写时序,以 ...

  2. python用缩进来写模块_python学习笔记

    一.基础简介 1.#!/usr/bin/python #!/usr/bin/python 相当于写死了 python 路径 #!/usr/bin/env python 会去环境设置寻找 python ...

  3. 【IEEE_Verilog-12.2】覆写模块参数的值

    12.2 Overriding module parameter values 覆写模块参数值 定义参数有两种不同的方法.第一个是module_parameter_port_list(见12.1),第 ...

  4. python利用自动识别写模块_序章:资料预处理(python3.6 可用fortran unformatted sequencial data读取模块)...

    首先我只是一个接触Python约半年的菜鸟,开这一个专栏的目的主要是记录自己所学,以及实践的一些有用的东西,顺便分享一些自己写的公用代码段以方便具有同样想法的朋友. 既然是序章我就多写一些吧,我本人对 ...

  5. php网站评论模块怎么写,模块内容评论循环

    一.作用 用于循环查询模块评论数据(支持分页查询) 二.语法 {commentmodule=模块名称....}{/comment} 三.参数介绍(红色表示必填参数,蓝色表示系统默认参数)参数介绍 mo ...

  6. python利用写模块_使用C++编写python扩展模块

    简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的).而是指使用Python本身提供的API,使用C++来对Python ...

  7. python利用自动识别写模块_教你用Python 实现自动导入缺失的库

    在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named 'xxx' 或者 ModuleNotFoundError: No mod ...

  8. Python自己写模块提供调用

    1.将自己写的py模块放在C:\Users\coder\AppData\Local\Programs\Python\Python37\Lib://就是lib文件夹内 然后照常import就可以了 -- ...

  9. python用什么来写模块-用Python编写模块有何技巧?

    随着对Python学习的深入,其优点日渐突出,让读者也感觉到Python的强大了,强大感觉之一就是"模块自信",因为Python不仅有自带的模块(称之为标准库),还有海量的第三方模 ...

最新文章

  1. R语言plotly可视化:plotly可视化基本散点图(指定图像类型、模式)、plotly可视化散点图(为不同分组数据配置不同的色彩)、ggplotly使用plotly包呈现ggplot2的可视化结果
  2. @Autowired
  3. YUMI~~强大的USB启动盘制作工具!!
  4. 【BIM入门实战】建筑墙体知识全攻略
  5. HBase 基本Java API
  6. Stone Game, Why are you always there? HDU - 2999(sg定理)
  7. Atitit.收银机小票打印功能的设计  java php c#.net版本
  8. 智能推荐系统开发中的十个关键注意点
  9. Espresso之RecyclerView
  10. 鸿蒙系统功能,华为HarmonyOS2.0系统功能都有哪些呢-华为鸿蒙系统HarmonyOS2.0功能介绍[图文]_咖绿茵手游站...
  11. 联想笔记本怎么进入pe系统_图解联想G40-30(N2840)笔记本是怎么进入pe设置U盘启动的...
  12. RISC-V学习基础(五)
  13. linux 分区数据恢复
  14. Calculator Conundrum
  15. 十、纺织品库存管理系统全部功能展示
  16. dhu复试基础——63 倒序
  17. python图形化界面
  18. 二分三分法--+++这一天的纪录
  19. Apple Developer 注册,闭坑或潘多拉魔盒?
  20. 那些学习了编程的中学生,为什么会更可能成功?

热门文章

  1. spring boot整合jsp报错 Whitelabel Error Page 500或者404 问题处理
  2. 桃花影落飞神剑,碧海潮生按玉箫(黄药师)
  3. 今年天猫双11的这些技术,可能会改变整个零售行业
  4. 海信电视E7H和E5H哪个好?有什么区别
  5. 00 Linux到底是什么?
  6. 安卓模拟器刷小米系统_米柚模拟器下载_米柚手游模拟器(在电脑上玩遍小米所有手游) 2.1.9.9 官方版_极速下载站...
  7. (论文解读)High-frequency Component Helps Explain the Generalization of Convolutional Neural Networks
  8. 不对外开放的微信小程序审核时不通过,因为无法提供测试账号导致审核人员登录失败解决办法!
  9. 知乎微信小程序广告真的猛的一塌糊涂
  10. Mac键盘锁住了怎么办