这个项目里面包含了大量的知识点,内容比较复杂,为了方便后续复习,对其中的内容进行一个大概的梳理。

一、项目介绍

设计并实现一个 SDRAM 数据读写控制器,使用 PC 机通过串口向 SDRAM 写入 10 字节数据,并将写入的 10 字节数据读出,通过串口回传至 PC 机,在串口助手上位机上打印显示回传数据。

项目中用到的SDRAM型号为W9825G6KH , 存 储 容 量 为 256Mbit(32MByte),地址位宽 13 位,数据位宽 16 位。

二、思路整理

这个项目大大小小调用了13个模块,其模块框图如下所示。

根据硬件设计的思路,其程序流向如下图所示。

端口数和线路连接虽然很多,但只要弄清楚每个端口的作用和每个模块的作用,整个项目就会清晰很多。

整体大致可以分为三个模块:

sdram_ctrl:这个模块的作用是将对SDRAM最底层的读写、刷新、初始化等操作进行了封装,留出基本的地址线、数据线、命令线等,方便后续直接对SDRAM进行读写操作。

sdram_top:这个模块是在sdram_ctrl基础上,加入了fifo模块,并进行封装,整个模块具有了基本的缓冲功能,方便后续跨时钟域对SDRAM进行读写操作。

uart_sdram:这个是最顶层的模块,在本项目中,我们使用了uart通信实现PC与SDRAM间数据交互,加入了fifo_read模块,对SDRAM读出的数据进行缓存,然后提供给uart_tx模块将数据输出。

其他模块,比如对SDRAM进行基本操作的模块,可以根据SDRAM数据手册进行编写,从下至上,步步为营,每个模块仿真没有问题后,一步步封装引用,到最后水到渠成。

三、项目总结(细节知识整理)

1、SDRAM的自动刷新操作

SDRAM的存储体是利用电容能够保持电荷以及可充放电的特性制成,电容所存储的电荷会随时间慢慢释放,这就需要不断刷新为电容充电,以保证存储数据可靠性。

SDRAM的刷新操作是周期性的,在两次刷新的间隔可以进行数据的相关操作,所以我们需要计算出执行刷新操作的时间间隔。目前国际公认的标准是,存储体中电容的数据有效保存期上限是64ms,也就是说每一行刷新的循环周期最大为 64ms,那么刷新速度就是:行数/64ms。

刷新命令一次对一行有效,刷新间隔也是随总行数而变化,由此可知,刷新周期计算公式为:T = 64ms \ 总行数 。要注意的是,这里算出的刷新周期是允许的最大周期,一般设置的比这个周期小一点更稳妥。

2、仲裁模块

在项目中,我们共涉及到SDRAM的4种操作方式,初始化操作、自动刷新操作、数据写操作和数据读操作,其中初始化操作优先级最高,SDRAM只有经过初始化操作后,才可被正常使用。SDRAM初始化后,自动刷新操作周期执行,而读和写操作不定时执行,为了协调好这些模块的运行,我们使用仲裁模块对其进行处理。

使用状态机来表示仲裁模块的执行:

由图可知, SDRAM 上电后处于初始状态(IDLE),初始化完成后,状态跳转到仲裁状态(ARBIT);当状态机处于仲裁状态时,若自动刷新请求、读请求、写请求中的任意一路请求有效,且其他两路请求信号无效,状态跳转到有效请求信号对应状态,对应操作完成后,对应结束信号有效,状态跳回到仲裁状态,等待下一次请求信号。

若多路请求信号同时有效,优先执行优先级较高的操作,默认优先级为自动刷新操作>数据写操作>数据读操作。

各路请求信号只有在仲裁状态才会被响应,这就保证某一操作正在执行时,不会被新的请求信号打断。

3、数据流衔接

项目能够顺利实现,很重要的一点就是要处理好数据流之间的衔接关系,也就是“打拍打地恰到好处”。比如项目中用到了FIFO模块,我们使用的FIFO 读模式为normal模式,这样从FIFO中读取数据会有“延一拍”的效果,在使能信号到达后,还要再来一拍数据才会输出,而写模式却没有滞后,所以要理清每个端口数据流接收与发送之间的时间关系,设计时才会成竹在胸。

参考资料:《FPGA Verilog开发实战指南——基于Altera EP4CE10》

[FPGA系列] SDRAM项目实战总结相关推荐

  1. 深度学习入门系列6项目实战:声纳回声识别

    大家好,我技术人Howzit,这是深度学习入门系列第六篇,欢迎大家一起交流! 深度学习入门系列1:多层感知器概述 深度学习入门系列2:用TensorFlow构建你的第一个神经网络 深度学习入门系列3: ...

  2. asp.net html5 异步,asp.net core 系列 5 项目实战之:NetCore 的 async 和 await(参考自:Microsoft教程)...

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 1.简介 从 VS 2012 开始,新引入了一个简化的方法,称为异步编程.我们在 >= .NETFRM 4.5 中和 Windows 运行时中 ...

  3. 福布斯系列之数据采集 | Python数据分析项目实战

    1 数据采集概述 开始一个数据分析项目,首先需要做的就是get到原始数据,获得原始数据的方法有多种途径.比如: 获取数据集(dataset)文件 使用爬虫采集数据 直接获得excel.csv及其他数据 ...

  4. 【WEB API项目实战干货系列】- API登录与身份验证(三)

    上一篇: [WEB API项目实战干货系列]- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. ...

  5. 菜鸟级三层框架(EF+MVC)项目实战之 系列一 EF零基础创建领域模型

    系列概述:全系列会详细介绍抽象工厂三层的搭建,以及EF高级应用和 ASP.NET MVC3.0简单应用,应用到的技术有Ef.Lambda.Linq.Interface.T4等. 由于网上对涉及到的技术 ...

  6. android中私有方法 继承,Android项目实战系列—基于博学谷(五)个人资料

    由于这个模块内容较多,篇幅较长,请耐心阅读. 个人资料模块分为两个部分 [x] [个人资料]() [x] [资料修改]() 一.个人资料 1.个人资料界面 (1).创建个人资料界面 在com.buxu ...

  7. 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)

    目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的Demo需求. 按照既定的要求,我们的API会提供给众多的客户端使用, 这些客户端可以是各种Web站点, ...

  8. Vue2+VueRouter2+webpack 构建项目实战系列(完整版) - 收录篇

    以下为收录的CSDN博客专家 · 博文系列: Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述 Vue2+VueRouter2+Webpack+ ...

  9. android注册文件打开,Android项目实战系列—基于博学谷(三)注册与登录模块

    由于这个模块内容较多,篇幅较长,请耐心阅读. 注册与登录模块分为三个部分 [x] [欢迎界面]() [x] [注册界面]() [x] [登录界面]() 一.欢迎界面 1.创建工程,命名为BoXueGu ...

最新文章

  1. Keras Theano 输出中间层结果
  2. nyoj117求逆序数 并归排序法
  3. Ribbon-3使用配置文件自定义Ribbon Client
  4. udf、utaf、udtf进出数量规律
  5. MCU VR班會(05)記錄
  6. 第一百一十三期:去伪存真,区块链应用到底能解决什么实际问题?
  7. Elasticsearch的javaAPI之percolator
  8. 在html上运行asp,ASP在网页设计的作用
  9. python教程39-做个淘宝双十一满减攻略
  10. 什么是电子邮件地址?
  11. 1、Java好的书籍
  12. 安卓java代码ping网关_Android代码中使用Ping命令
  13. delphi 讲的比较详细的多线程(推荐)
  14. Shader Graph 水面制作个人总结
  15. 在Windows7和Ubuntu上编译安装MICO
  16. 终于看完friends
  17. crc java_CRC 校验
  18. 基于arduino用esp8266和继电器实现小爱同学开关灯
  19. Python爬取起点小说并写入文档
  20. DNS服务(三):域名解析he域名迁徙

热门文章

  1. 系统逻辑人工神经网络专家系统等人工智能技术应用于
  2. AutoML-第二章-元学习
  3. 关于fscanf乱码和死循环的解决方法
  4. for循环遍历csv文件夹
  5. 查看 php-fpm 内存占用的几个命令
  6. Memcache(MC)系列(五)使用memcache-top监控memcache集群状态
  7. linux的top命令源码解析:RES指标
  8. 1亿像素手机,4K电视,能达到人眼分辨率吗
  9. php样式模板,word样式和模板的区别
  10. WatchKit FAQ