在做这个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. 第一次作业:我与CS的缘分

    "既然选择了远方,便只顾风雨兼程"   --汪国真 一.结缘计算机 1.1初识计算机 当第一次看到这个作业题目的时候,我的思虑不禁回到了小时候那个对这个世界的一切充满兴趣的纯真年代 ...

  2. alpha-咸鱼冲刺day1

    一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 登陆界面随意写了一下.(明天用来做测试的) 把学姐给我的模板改成了自家的个人主页界面,侧边栏啥的都弄出来了(快撒花花!) 四,问题 ...

  3. 201621123062《Java程序设计》第一周学习总结

    1.本周学习总结 关键词: 初步熟悉Java的基本组成.语言特点(简单性.结构中立性).运行环境.简单语法等. 关键概念之间的联系: 1.JVM是Java程序唯一认识的操作系统,其可执行文件为.cla ...

  4. python 使用Nginx和uWSGI来运行Python应用

    参考:http://zmrenwu.com/post/20/ uWSGI是一个Web应用服务器,它具有应用服务器,代理,进程管理及应用监控等功能.它支持WSGI协议,同时它也支持自有的uWSGI协议, ...

  5. Flask 扩展 Flask-RESTful

    Flask路由可以指定HTTP请求方法,并在请求函数中根据不同的请求方法,执行不同的逻辑.这样实现一个Restful的请求已经相当简单了 Flask还有更简便的方法,就是其Flask-RESTful扩 ...

  6. 《高级软件测试》JIRA使用手册(一)JIRA基本情况

    JIRA 官方网站为:https://www.atlassian.com/software/jira 中文代理网站为:https://www.jira.cn 现版本:v7.3.0 Atlassian公 ...

  7. 02-移动端开发教程-CSS3新特性(中)

    1. 新的背景 背景在CSS3中也得到很大程度的增强,比如背景图片尺寸.背景裁切区域.背景定位参照点.多重背景等. 1.1 background-size设置背景图片的尺寸 cover会自动调整缩放比 ...

  8. kubernetes入门(07)kubernetes的核心概念(4)

    一.pod 二.Volume volume可以为容器提供持久化存储,比如 三.私有镜像 在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用.创建docker r ...

  9. 新概念英语(1-117)Tommy's breakfast

    Lesson 117  Tommy's breakfast 汤米的早餐 Listen to the tape then answer this question. What does she mean ...

  10. 06、NetCore2.0依赖注入(DI)之整合Autofac

    06.NetCore2.0依赖注入(DI)之整合Autofac 除了使用NetCore2.0系统的依赖注入(DI)框架外,我们还可以使用其他成熟的DI框架,如Autofac.Unity等.只要他们支持 ...