在做这个SDRAM控制器之前,博主有一个疑问,对于学生来说,是否有必要学习用纯Verilog写一个SDRAM控制器?因为目前X家和A家都有了DDR IP Core,对于要实现一个应用可以直接调用IP Core,只需要对其接口操作即可。对于开发者来说,与其费时费力用Verilog去写一个性能差而且老的SDRAM控制器,还不如直接调用官方经过打磨的更为先进IP Core。所以博主特地去号称平均学历211,平均月薪7、8万的知(bi)乎提出了这个问题,得到的解答博主总结大致如下。

对于学生这个身份来说,应该是要以学习为主要目的,虽然说目前企业为了加快项目进度会直接使用IP Core,但是我们以学为本的初衷不应该为了避过难点而直接不去尝试,就比如我们刚开始学Verilog的时候肯定都会写过分频器,那么为什么不直接去学更简单精度更高PLL IP Core呢?从一个新手逐渐成长成一个老手都是由简单到复杂,由基础到提升,这是一个必经的过程。这也就是很多高校还是会开设汇编语言编写单片机的课程,学FPGA全用IP Core和学单片机全用库函数是一个道理。这是其一。

第二,写一个SDRAM控制器还是可以锻炼一些典型的技能。

  1. 看官方文档
  2. 根据时序图设计SDRAM逻辑,使用状态机
  3. 配合仿真模型写测试仿真
  4. 调试,提高频率,让你的SDRAM跑的更快
  5. 研究时序约束

  这一套做下来,你就可以提高一个层次了,经历过和没经历过是有质的区别。其实博主在提问的时候心中早已有了答案,只是还没有足够的信念去完成这个事情,当时看到很多业界前辈都支持去写的时候,博主心里也是比较开心的。之前博主已经学一些SDRAM的基础知识,只是当时水平还不够,没有坚持下去,心里一直不甘。趁着最近两个月之内没有什么事情要忙,所以决定要再次死磕SDRAM。

SDRAM基本概念

  SDRAM(Synchronous Dynamic Random Access Memory),同步动态随机存储器。同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准。动态是指存储阵列需要不断的刷新来保证数据不丢失。随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。

  我手上的这块开发板的SDRAM芯片为,海力士的HY57V641620ETP-7,行地址12位,列地址8位,一个存储单元为16bit,则一个bank的存储单元为2^12 x 2^8 = 1M,一个bank内存为16Mbit。

  SDRAM容量 = 数据位宽x存储单元数量(bank数x行地址x列地址)

  (一个bank里面有16Mbit(行地址x列地址x存储单元位宽))

  The Hynix HY57V641620E(L/S)T(P)  4Bank x 1Mbits x 16 = 64Mbit

  主要特性:

  ·电压:vdd vddq 3.3v

  ·4096 refresh cycles/64ms

  ·54Pin TSOPII (Thin Small Out-Line Package,薄型小尺寸封装)

SDRAM内部结构

SDRAM内部一般有四个bank用来存储信息,每个bank的行地址和列地址是通用的,bank地址来判断对哪个bank进行操作。

每个bank的存储数据方式就如同一个表格一样,通过行地址和列地址来确定一个数据,每个数据为16位。我手上的这块SDRAM的列地址是8位,行地址是12位也就是说一共是2^12 = 4096行,2^8 = 256列。每个bank能存储1048576个数据,1048576 x 16bit = 1M x 16bit = 16Mbit,那么这个SDRAM一共可以存储4 x 16Mbit = 64Mbit。SDRAM的存储容量也就是这么计算来的。

引脚说明

对于一些引脚的描述,还是直接看英文的好。

Note:其他的没啥说的,一般的芯片引脚都这样,这是要提的是UDQM,LDQM这两个引脚,数据掩码,UDQM为高电平,DQ0~DQ15数据总线的高字节即DQ8~DQ15呈现高阻态(全零),LDQM为高电平,DQ0~DQ15数据总线的高字节即DQ0~DQ7呈现高阻态(全零)。韦德是屏蔽输入输出信号。

模式寄存器

A4—A6 CAS Latency  列选通潜伏期设置寄存器,这个意思为当我们给读命令之后,SDRAM等待2/3/reserved个时钟周期之后才会进行操作。

突发长度为4              Addr = 12’b0000_0110_0010

突发长度为full page    Addr = 12’b0000_0110_0111

Burst length(激发长度)。突发长度为4指给一次读或写命令SDRAM会连续的读四个数据或连续的写四个数据,同理 SDRAM支持页读写,当burst length为111是full page一次读写命令可以读/写一整页的数据。

我这里这个设计中设置潜伏期为3,突发长度为4。

SDRAM操作命令

SDRAM的操作命令可以从手册中查到,我用到的就这么几个。由片选有效、行有效、列有效、写使能信号组成。对于这些SDRAM的基本特性都是可以在官方手册中可以直接看到的。不同公司的SDRAM的型号不同但是其读写操作模式都是相同的,所以都是可以相互参考,看文档还直接看英文文档好。这篇就先简单记录SDRAM的基本概念,下次再记录工作原理和各个功能模块的设计。

  目前博主也是刚开始学习SDRAM控制器的设计,刚刚实现了一个简易的SDRAM控制器,频率这跑到了50Mhz,通过PC端串口发送数据到FIFO缓冲,然后写入SDRAM,最后再读出来,用FIFO缓冲再用串口发送到PC端,后面博主会继续调试,争取能挂载摄像头实时处理显示。

转载请注明出处:NingHeChuan(宁河川)

个人微信订阅号:开源FPGA

如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/8903938.html

是否有必要学习使用纯Verilog写一个SDRAM控制器的更多相关文章

  1. Verilog写一个对数计算模块Log2(x)

    网上一个能用的也没有,自己写一个把. 1.计算原理:  整数部分 网上找到了一个c语言的计算方法如下: int flog2(float x) { return ((unsigned&)x> ...

  2. vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架

    自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...

  3. tensorflow学习笔记3:写一个mnist rpc服务

    本篇做一个没有实用价值的mnist rpc服务,重点记录我在调试整合tensorflow和opencv时遇到的问题: 准备模型 mnist的基础模型结构就使用tensorflow tutorial给的 ...

  4. 让我们纯手写一个js继承吧

    继承在前端逻辑操作中是比较常见的,今天我们就从零开始写一个js的继承方式 在es5中继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上Parent.call(this),在es6中则 ...

  5. QT学习日记篇-03-仿写一个智能家居界面

    课程大纲: <1>让界面漂亮起来,仿写一个智能家居界面 ->第一:给QT工程添加图片 进入下一步: <注意路径和名称一定不能有中文>                   ...

  6. python学习(5)写一个二分算法的程序

    把之前学习的做一个小结.之前看二分查找法,只能是似而非地看懂大概.现在用这么多天的知识积累已经可以自己写了. 而且在算法书的基础上,把需要找的数字做一个人机互动操作. 另外,初步接触到了 __name ...

  7. 还在为小三角形切图?使用纯CSS写一个简单的三角形

    同学们,当美工给的设计图是这样: 或者这样: 我的内心其实是拒绝的-_-:但工作还得干,大部分同学会写 <style> .icon{width:20px;height:20px;displ ...

  8. React Native学习(四)—— 写一个公用组件(头部)

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

  9. 【Java学习笔记】如何写一个简单的Web Service

    本Guide利用Eclipse以及Ant建立一个简单的Web Service,以演示Web Service的基本开发过程: 1.系统条件: Eclipse Java EE IDE for Web De ...

随机推荐

  1. 开始补习JavaScript的第一天

    JavaScript介绍: ①.JavaScript是一种解释性的,基于对象的脚本语言. ②.JavaScript是一种轻量级的编程语言,可以嵌入到html页面中,由浏览器来解释执行. ③.JavaS ...

  2. WCF配置问题(配置WCF跨域)

    其它的先放一边.今天先来分享一下前段时间给公司做网站WCF服务接口的心得. 配置文件的配置问题 这里既然讨论WCF配置文件的问题,那么怎么创建的就不一一讲解了.好多博主都有提过的.所以直接分享自己开发 ...

  3. python+selenium:解决上传文件<input type='file'>标签属性被css的visibility隐藏导致无法定位元素的问题

    要想上传文件,需要找到在HTML中<input type="file" />这个标签,有它就可以利用send_keys上传文件,不过这里的<input>元素 ...

  4. C第十八次课

    总结知识点: 指针 1.指针变量 指针变量的定义:例8.1 指针变量的引用:例8.2: 指针变量作为函数参数:例8.3 swap函数,例8.4 比较排序函数 2.指针数组 数组元素的指针:int *p ...

  5. Alpha第九天

    Alpha第九天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  6. 团队作业7——第二次项目冲刺(Beta版本12.08)

    项目每个成员的进展.存在问题.接下来两天的安排. 已完成的内容:完成了排行榜的测试.上传头像功能的原型设计.界面优化 计划完成的内容:上传头像功能开发.测试.头像裁剪原型设计 每个人的工作 (有wor ...

  7. Java暑假作业

    一.电影观后感 电影<摔跤吧!爸爸>观后感 二.下学期的计划与目标 大一学年总结: 参与了大大小小的学院活动,例如机器人搭建.辩论赛,也参加了学生会的部门,参与了组织活动.通过参与活动获 ...

  8. ExecutorService,另一种服务,线程

    http://heipark.iteye.com/blog/1393847 Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得       博客 ...

  9. 利用yield 实现Xrange功能

    def xrange(n): start = 0 while True: if start>n: return yield start start+=1 obj = xrange(5) n1 = ...

  10. DNS搜索过程

    以www.renyi.com为例 一:客户端首先检查本地HOST文件,是否有对应的IP地址,如果有,客户端直接访问,如果没有,则执行下一步. 二:客户端查看本地缓存信息,是否有对应的IP地址,如果有, ...