在做这个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. C#,一份超简单的数据库帮助类,SqlHelp

    简单,实用,留存. using System; using System.Collections.Generic; using System.Configuration; using System.D ...

  2. netstat/ps用法

    1.netstat 语法     命令1:netstat -antp | grep :80(查看80端口被哪个服务占用)or netstat -antpuel  | grep ":22&qu ...

  3. python全栈学习--day2

    一.in的使用 说明:in有相当多的用处,比如判断,循环for 等. 实例一:in 操作符用于判断关键字是否存在于变量中 s = '男人john' print('男孩' in s) print('男孩 ...

  4. 配置tomcat8数据源(采用局部数据源方式)

    tomcat提供两种数据源配置方式,全局和局部.全局的话对于所有web应用都生效,局部只对于配置的某一个web生效. 步骤: 1.将mysql的jdbc驱动复制到tomcat的lib路径下. 2.在t ...

  5. 通过运行一个tomcat容器来记录下初学docker常用的几个命令---容器篇

    1.查看容器列表 显示正在运行的容器: [root@localhost HMK]# docker ps 显示所有容器,包括未运行的: [root@localhost HMK]# docker ps - ...

  6. js计时功能

    //个位秒加 function time4jia() { //分钟60为上限 所有加停止 if (sz(a('time1').innerHTML) == 6) { return; } var m4 = ...

  7. 操作 numpy 数组的常用函数

    操作 numpy 数组的常用函数 where 使用 where 函数能将索引掩码转换成索引位置: indices = where(mask) indices => (array([11, 12, ...

  8. 利用python 创建XML文件

    #coding=utf-8 from xml.etree import ElementTree import pdb def printNodeInfo(node): #node.tag 标签名称 # ...

  9. vue class与style 绑定详解——小白速会

    一.绑定class的几种方式 1.对象语法 直接看例子: <div id="app3"> <div :class="{'success':isSucce ...

  10. Node入门教程(5)第四章:global 全局变量

    global - 全局变量 全局对象(global object),不要和 全局的对象( global objects )或称标准内置对象混淆.这里说的全局的对象是说在全局作用域里的内的对象.全局作用 ...