调取的 DDR3 控制器给用户端预留了接口,用于实现对该 IP 核的控制,本篇介绍一下 DDR3 IP核写。在生成 DDR3 IP 核的界面中,可以找到 User Guide 手册,DDR3 的使用将围绕这个手册来展开。

一、接口框图

  打开 User Guide 第 90 页,可以看到 DDR3 IP 核的接口框图如下所示。可以看到,中间部分就是我们调取的 DDR3 IP 核,它预留了两组总线,右边一组直接绑定在 DDR3 芯片端口,其总线信号名称均以 ddr 开头,这部分总线只需要在 top 层设为端口即可,无需自己写代码控制。而左边一组则是留给用户端逻辑,其总线信号名称多以 app 开头,这些信号则需我们自己来编写实现。

二、总线详解

  对于 User Interface用户端逻辑信号, User Guide 第92页里有个汇总表,我们简单翻译一下。

1、命令总线(表格红色部分),其时序图如下所示。

2、写总线(表格黄色部分),其时序图如下所示。共有 3 种传输模式。模式 1 指的是命令和数据同时发送到 IP 核,模式 2 指的是数据提前于命令发送到 IP 核,模式 3 指的是数据落后于命令发送到 IP 核。模式 1 和 2 均可稳定传输,而模式 3 必须满足一个条件,即数据落后命令的时间不能超过两个时钟周期。一般来说,模式 2 比较常用,时序设计相对容易。

  关于 app_wdf_end 信号,该信号表示:当前突发写的最后一个数据。在A7 DDR3 的控制器IP核中,只存在突发长度为 8 地址的形式 ,1 个地址能存放的数据是 16bit,因此每一次的地址突发带来的数据突发为 8*16=128 bit(对外接口为128bit)。本次 DDR3 IP 核调取时,我们选取的 “物理层 - 用户端” 的速率为 4:1,每次发送的有效数据为 128 bit,因此1 次突发写就完成了数据的写入,app_wdf_end 和 app_wdf_en 时序上同步了。

  而如果选取的 “物理层 - 用户端” 的速率为 2:1,每次发送的有效数据为 64 bit,因此1次突发要分成2次才能真正写完,app_wdf_end 就看得更清楚了。

3、读总线(表格黄色部分),也分为两种速率,4:1 和 2:1。

4、其他总线(表格白色部分)

  本次设计没有使用到,不作讲解。

三、写控制模块设计

  本次设计写控制模块,试着将64个128bit数据写入DDR3 IP核,并最终进行仿真验证。为什么是64个?因为我喜欢。写控制模块框图如下所示:

  当 wr_cmd_start 有效时启动本次的突发写,根据外部输入信号 wr_cmd_bl 可以确定本次突发需要写多少个数据。wr_cmd_addr 代表本次突发写的起始地址,数据是128bit的,一个地址能存16bit,因此每个128bit数据需要占用8个地址,即每次的地址计数+8。wr_end 用于告知其他模块,本次突发写结束。

  本次设计均学自《威三学院FPGA教程》,具体代码就不贴了。

  顶层文件不要忘了例化此模块。

//写控制模块 ---------------------------------------------------------------
wr_ctrl u_wr_ctrl
(
.sclk (ui_clk ), // input 100Mhz
.rst (ui_clk_sync_rst | (~init_calib_complete)), // input
.wr_cmd_start (wr_cmd_start ), // input
.wr_cmd_instr (wr_cmd_instr ), // input [ 2:0]
.wr_cmd_bl (wr_cmd_bl ), // input [ 6:0]
.wr_cmd_addr (wr_cmd_addr ), // input [27:0]
.wr_cmd_mask (wr_cmd_mask ), // input [15:0]
.data_128bit (data_128bit ), // input [127:0]
.data_req (data_req ), // output
.wr_end (wr_end ), // output
.app_rdy (app_rdy ), // input
.app_wdf_rdy (app_wdf_rdy ), // input
.app_en (app_wr_en ), // output
.app_addr (app_wr_addr ), // output [27:0]
.app_cmd (app_wr_cmd ), // output [ 2:0]
.app_wdf_mask (app_wdf_mask ), // output
.app_wdf_wren (app_wdf_wren ), // output
.app_wdf_data (app_wdf_data ), // output [127:0]
.app_wdf_end (app_wdf_end ) // output
);

四、写控制模块仿真

可以看出,数据成功写入到了 ddr3 ip核。

调试 Modelsim 小技巧:在sim --- sim_1 --- behav --- modelsim中打开 top_ddr3_hdmi_tb_compile.do 文件,将最后一句 quit -force 删除掉,即可不关闭 Modelsim 调试仿真。

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

DDR3(3):写控制的更多相关文章

  1. 一点用JS写控制权限的心得

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. DDR3(4):读控制

    写控制完成后开始设计读控制,写控制和读控制是非常相似的. 一.总线详解 由 User Guide 可知各信号之间的逻辑关系,读数据是在给出命令之后一段时间后开始出现的.图中没有给出app_rd_dat ...

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

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

  4. unity3d easytouch计算摇杆旋转角度以及摇杆八方向控制角色

    在写第三人称控制的时候,一开始在电脑测试是用WASD控制角色 后来需要发布到手机上,于是就加了一个摇杆 键盘控制角色的代码已经写好了,角色八方向移动 如果按照传统的大众思路来控制的话,是达不到我想要的 ...

  5. 32、从零开始写CMOS摄像头驱动

    使用的内核:linux-3.4.2 参考源码:第32课_新内核下的I2C驱动\i2c\1th_i2c_new_device第2课第1.1.7节文档和图片(从0写USB摄像头)\myuvc 设备地址:写 ...

  6. 【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待

     [等待事件]等待事件系列(3+4)--System IO(控制文件)+日志类等待   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可 ...

  7. 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED

    https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮  F1 4C为CRC高位和低位 ...

  8. termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - 获取和设置终端属性,行控制,获取和设置波特率

    SYNOPSIS 总览 #include <termios.h> #include <unistd.h> int tcgetattr(int fd, struct termio ...

  9. 基于SqlSugar的开发框架循序渐进介绍(9)-- 结合Winform控件实现字段的权限控制

    字段的权限控制,一般就是控制对应角色人员对某个业务对象的一些敏感字段的可访问性:包括可见.可编辑性等处理.本篇随笔结合基于SqlSugar的开发框架进行的字段控制管理介绍. 在设计字段权限的时候,我们 ...

随机推荐

  1. 【转】Why BIOS loads MBR into 0x7C00 in x86 ?

    最近在读Linux的grub的stage1中看到“BIOS执行INT 0x19,加载MBR内容至0x7c00,然后跳转执行”,为什么一定是0x7c00这个地址. 作者刚好在下面推荐了这篇文件,刚好顺手 ...

  2. 【转】面试题:实现一个队列,这个队列除了有EnQueue, DeQueue操作,还有一个Max操作,三个操作复杂度都是O(1)

    1.每次  新元素进栈的时候,栈里面的元素需要排序 2.让最小的或者最大的元素位于栈顶,这样就可以在O(1)时间内获得最小或者最大的值了, ------ 3.上面的想法  不能保证,进栈(进了队列)之 ...

  3. android 第三方开源库 学习汇总

    依赖注入框架ButterKnife  https://github.com/JakeWharton/butterknife  学习过程     专注于android的View注入框架,并不支持其他方面 ...

  4. 4.redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?

    作者:中华石杉 面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当 ...

  5. MySQL Execution Plan--文件排序(file sort)

    在MySQL处理ORDER BY语句时,如果查询无法利用索引的有序性,则需要额外操作对数据进行排序.在MySQL中有三种排序算法: 1.快速排序(Quick Sort),对冒泡排序的一种改进,基本思想 ...

  6. vmware虚拟机安装T6客户端

    1.虚拟机安装T6 经过测试,vmware 里系统装T6  网络适配器必须使用桥接,nat模式是无法连接数据库的

  7. min25筛学习总结

    前言 杜教筛学了,顺便把min25筛也学了吧= =刚好多校也有一道题需要补. 下面推荐几篇博客,我之后写一点自己的理解就是了. 传送门1 传送门2 传送门3 这几篇写得都还是挺好的,接下来我就写下自己 ...

  8. Android 获取联系人的号码的类型描述

    ...... int index = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); int t ...

  9. 达信:深度解读COSO新版企业风险管理框架(ERM)

    http://www.sohu.com/a/124375769_489979 2016年6月,美国反欺诈财务报告委员会(The Committee of Sponsoring Organization ...

  10. 实现:笑脸_Crack

    直接载入OD,观察发现弹窗可能为MessageBox,那么进行对windows api函数的搜索 跟进反汇编窗口跟随函数,来到这里,直接进行断点操作 运行程序,跑到断点处,如下图 接着发现堆栈窗口有调 ...