上一讲我们完成了读的控制,但是并不知道是否设计成功,必须读写结合才行。DDR3 的 app 端的命令总线是读写复用的,因此可能会存在读写冲突的时刻,为了解决此问题,必须进行分时读写,也就是我们说的仲裁,具体是完成读还是写,交由仲裁模块来决定。

一、仲裁模块分析

  在我们实现了 DDR3 控制器 IP 核的读、写之后会发现读和写是共用一组命令线的,因此读、写需要分时的使用 IP 核中的命令总线,具体的解决方法如图:
  如上图所示,我们可以对分时的将 wr_ctrl 和 rd_ctrl 模块的 app_cmd信号传输给 IP 核的 app_cmd 信号。对于 wr_ctrl 和 rd_ctrl 模块的 app_addr信号,我们可以在不使用时将其置为 0,这样我们将 wr_ctrl 和 rd_ctrl 模块的 app_addr 进行按位或,结果即为 IP 核的 app_addr。同理,IP 核的 app_en 也可以通过 wr_ctrl 和 rd_ctrl 模块的 app_en 按位或得到。具体的示例代码如下所示:
assign app_en   = app_wr_en   | app_rd_en;
assign app_addr = app_wr_addr | app_rd_addr;
assign app_cmd = app_wr_en ? app_wr_cmd : app_rd_cmd; //写优先

  如上所述,我们完成了读、写模块与 IP 核的交互,但是假如读、写的启动信号同时产生,将会造成 app_addr 和 app_en 同时有效,上述的按位或的方式将会失效,因此我们不能让读、写启动信号同时产生,为了解决这个问题,我们可以加一个仲裁器来控制产生读、写的启动信号,具体框图如下所示:

  为了完成上图所示的仲裁器,我们可以设定一个状态机,具体如图 8 所示。当复位结束后,可以直接进入到仲裁状态(ARBIT),在 ARBIT 状态等待读、写请求,当某一个请求到来,即进入到对应的状态执行相应的操作,执行完回到ARBIT 状态等待下一次的请求,并且只有在 ARBIT 状态时读、写的请求才会有效,这样就可以保证读、写不会冲突。
 
二、仲裁模块设计
  本次设计仲裁模块,结合上述所说,波形如下所示,写请求优先级高于读优先级。
  本次设计均学自《威三学院FPGA教程》,具体代码就不贴了。
  顶层文件不要忘了例化此模块,同时由于顶层模块多了读写控制的代码:
assign app_en   = app_wr_en   | app_rd_en;
assign app_addr = app_wr_addr | app_rd_addr;
assign app_cmd = app_wr_en ? app_wr_cmd : app_rd_cmd; //写优先

因此在写控制模块和读控制模块的例化中,app_en、app_addr、app_cmd 这三个信号需要修改为对应的信号。

 
三、仲裁模块仿真

  设计仿真时我设计了一个校验程序,如果成功会显示 checked success,失败会显示 error cnt。经过仔细检查发现成功读回了写入的64个128bit数据,打印信息也显示 checked success! 说明此次仲裁模块及之前的读写模块都是正确的。

参考资料:威三学院FPGA教程

DDR3(5):读写仲裁的更多相关文章

  1. 76.ZYNQ-用PS控制DDR3内存读写

    本编文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是学习的过程吧. 本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验 ...

  2. [求助] 关于DDR3的读写操作,看看我的流程对吗?

    [求助] 关于DDR3的读写操作,看看我的流程对吗? 最近简单调了一下KC705开发板上面的DDR3,型号是MT8JTF12864HZ-1G6:有时候加载程序后,发现读出数据不是写进去的,在这将我的操 ...

  3. 第十一章 ZYNQ-MIZ702 DDR3 PS读写操作方案

      本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 11.0本章难度 ...

  4. 第十章 ZYNQ-MIZ701 DDR3 PS读写操作方案

      本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz701 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 10.0本章难度 ...

  5. 基于FPGA的DDR3多端口读写存储管理系统设计

    基于FPGA的DDR3多端口读写存储管理系统设计 文章出处:电子技术设计 发布时间: 2015/03/12 | 1747 次阅读 每天新产品 时刻新体验专业薄膜开关打样工厂,12小时加急出货   机载 ...

  6. 基于MIG IP核的DDR3控制器(二)

    上一节中,记录到了ddr控制器的整体架构,在本节中,准备把ddr控制器的各个模块完善一下. 可以看到上一节中介绍了DDR控制器的整体架构,因为这几周事情多,又要课设什么的麻烦,今天抽点时间把这个记录完 ...

  7. zedboard如何从PL端控制DDR读写(七)

    前面已经详细介绍了从PL端如何用AXI总线去控制DDR的读写,并且从AXI_BRESP的返回值来看,我们也是成功写入了的.但是没有通过别的方式来验证写入的数据的话,总是感觉差了点什么. 今天试了一把从 ...

  8. DDR3命令状态(二)

    DDR3中的状态机Diagram,详见相册. ACT:Activate,表示输出行地址,和是否自动precharge控制位. PRE:Precharge,在读写后,可以根据A10来判断是否自己进行pr ...

  9. 【转】DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)

    这两天正在学习FPGA如何控制DDR3的读写,找到一篇个人感觉比较有意义的文章,可以对DDR的内部结构有一个初步的了解.原文出处:http://blog.chinaunix.net/uid-28458 ...

随机推荐

  1. 基于Netty的IdleStateHandler实现Mqtt心跳

    基于Netty的IdleStateHandler实现Mqtt心跳 IdleStateHandler解析 最近研究jetlinks编写的基于Netty的mqtt-client(https://githu ...

  2. Ubuntu18.04安装cudnn7.6.1

    注:如果使用anaconda,貌似不需要安装cuda和cudnn,安装tensorflow时会自动安装 1.进入nvidia官网https://developer.nvidia.com/cudnn下载 ...

  3. ubuntu18 安装坑点记录(华硕飞行堡垒)

    环境 电脑:华硕飞行堡垒FX53VD 显卡:集成显卡+NVIDIA显卡(linux版本很不友好) 镜像:ubuntu18.04.3 LTS 准备安装 * 制作启动盘(百度) * 设置U盘启动项:按F2 ...

  4. JavaScript三种方法获取地址栏参数的方法

    今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split(“?”)这样一步步的分解出需要的参数. 后来想了一下,肯定会有更加简单的方法的!所以在网上找到了两个很又简单 ...

  5. 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?

    在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被 ...

  6. windows命令行模式打开目录

    cmd命令行里面,打开当前目录方式如下: explorer .

  7. Scrapy笔记04- Selector详解

    Scrapy笔记04- Selector详解 在你爬取网页的时候,最普遍的事情就是在页面源码中提取需要的数据,我们有几个库可以帮你完成这个任务: BeautifulSoup是python中一个非常流行 ...

  8. 各类app的小结

    各类app小结: 一.原生app: 二.webapp:   无法调用底层设备的api 三.混合app的方法: 1.原生app 嵌入 2.flutter 3.react native 4.AppCan( ...

  9. IIS添加MIME类型.woff/.svg/.woff2/.eot/.otf.ttf

    IIS添加MIME类型: 文件扩展名 MIME类型 .svg     image/svg+xml.woff   application/x-font-woff.woff2 application/x- ...

  10. debian 9 安装远程桌面

    1. 安装远程桌面服务: apt-get install xrdp 2. 修改设置文件 dpkg-reconfigure xserver-xorg-legacy  设置为anybody 3. 使用ms ...