本文设计思路与讲解于参考邓堪文老师的视频,感谢…(不太适合一点基础都没有的小白)

SDRAM简介

SDRAM(synchronous Dynamic Random ),同步动态随机存储器,同步指内存工作需要同步时钟,内存的命令的发送和数据的接收都以它为标准。动态是指需要不断地刷新来保证数据不丢失(电容存储),随机指的是储存位置可以随机指定,自由储存。
这里引荐博文DDR3详解
这里是我买黑金板子里带的资料

SDRAM储存计算方式

SDRAM 的空间 = 4(资源库-Bank)× 2^12 行×2^8 列(寻址深度)× 16 bits
= 4 × 1048576 × 16 bits
= 4 × 1048576 / 1024 × 16 bits
= 4 × 1024 K / 1024 × 16bits
= 4 × 1M × 16 bits
= 64Mbits 或者 67,108,864 bits

常用单词总结

  • row 行
  • column 列
  • nop(no operation) 无操作
  • precharge 预充电
  • outorefresh 自动刷新
    这里还有数据手册里边有一些有关单词的解释描述(带"—"表示低电平有效)

数据手册分析(及时序分析)

时钟产生

这里首先看一下时钟的产生

因为需要读取数据在时钟的上升沿。这里和iic里边也有点类似,为了使SDRAM时钟采集为数据的中点。视频里讲的是要求把系统时钟反转,反转后的时钟作为SDRAM时钟。
从仿真截图可以看出,反转后SDRAM时钟采样点恰好为数据中点。从而达到要求。

时序图

设计时序


可以看出这是初始化的模式寄存器配置的时序图(program mode register 暂时不去考虑-后续博文填坑)
接下来看语言描述
100us的延时需要在任何操作之前除过NOP和INHIBIT命令。这两个命令必须在200us期间应用并且持续在这个区间结束后。(这句话不懂什么意思)在满足上述条件后,precharge命令应该被应用在100us延时以后。所有的bank必须预充电,这将使得所有的bank进入idle状态。在两个auto refresh命令之后,SDRAM准备进行模式寄存器配置。
就是说这里需要上电后进行**(1)最少200us的延时。之后所有bank进入idle状态,然后进行(2)两次auto refresh 状态。之后对其进行(3)**模式寄存器配置。
即完成操作。下面看各个操作的时间间隔。

时间间隔


trp的最大时间间隔就是20ns
以上就是所有的时序需要知道的时间间隔。

COMMAND 与 LOAD MODE REGISTER

同样看数据手册

LOAD MODE REGISTER


在模式寄存器配置在A0到A12,只有在所有bank空闲状态这个命令才可以被发出。可以看出,这里通过A0-A12来进行配置模式寄存器。

突发长度(连续读出写入数据的长度),突发类型,cas潜伏期,操作模式,写突发所有作为模式寄存器定义。
先来看看每一个是什么意思(这里有详细的介绍)

这里解释下潜伏期。(简单理解就是读使能信号来了之后数据输出的延时,时序图如下)

这里是数据手册对突发类型的解释。突发类型,就是读数的映射读数方法

COMMAND

代码书写

接下来就是代码实现。理解起来开始这个不会很难。

module sdram_init(//system singlesclk,rst_n,//others singlescmd_reg,sdram_addr,flag_init_end);
input                   clk             ;
input                   rst_n           ;
output [ 3:0]           cmd_reg         ;
output [11:0]           sdram_addr      ;
output                  flag_init_end   ;
reg     [ 3:0]          cmd_reg         ;
reg                     flag_init_end   ;
//*************************************************\
//define parameter and intennal singles
//*************************************************/
localparam DELAY_200US = 10000     ;
reg  [13:0]     cnt_200us       ;
reg  [ 3:0]     cnt_cmd         ;
wire            flag_200us      ;
//sdram command
localparam NOP  = 4'b0111     ;
localparam PRE  = 4'b0010     ;
localparam AREF = 4'b0001     ;
localparam MSET = 4'b0000     ;
//*************************************************\
//main code
//*************************************************/
//200us_cnt
always@(posedge clk or negedge rst_n)
beginif(!rst_n)cnt_200us <= 14'd0;else if(!flag_200us)cnt_200us <= cnt_200us + 1'b1;
endassign flag_200us = (cnt_200us >= DELAY_200US) ? 1'b1 : 1'b0;//cnt_cmd
always @ (posedge clk or negedge rst_n)
beginif(!rst_n)cnt_cmd <= 'd0;else if(flag_200us == 1'b1 && flag_init_end == 1'b0)cnt_cmd <= cnt_cmd + 'd1;
end
//flag_init_end
always  @(posedge clk or negedge rst_n)    beginif(!rst_n)flag_init_end    <=  0;else if(cnt_cmd == 4'd10)flag_init_end <=  1;  end
//cmd_reg
always @ (posedge clk or negedge rst_n)
beginif(!rst_n)cmd_reg <= NOP;else if(flag_200us)case(cnt_cmd)0:cmd_reg <= PRE;1:cmd_reg <= AREF;5:cmd_reg <= AREF;9:cmd_reg <= MSET;default:cmd_reg <= NOP;endcase
end//sdram_addr
assign  sdram_addr      =      (cmd_reg == MSET) ? 12'b0000_0011_0010 :12'b0100_0000_0000;
//突发长度为4,潜伏期为3 Burst Type       = Sequential  Write Burst Mode = Programmed Burst Length
endmodule

放着结果,这里用仿真器仿真,模拟SDRAM,同时在控制面板打印相关信息

基于FPGA的SDRAM控制器设计(一)----------SDRAM初始化相关推荐

  1. 基于 FPGA 的 UART 控制器设计(VHDL)(下)

    今天给大侠带来基于FPGA的 UART 控制器设计(VHDL)(下),由于篇幅较长,分三篇.今天带来第三篇,下篇,使用 FPGA 实现 UART.话不多说,上货. 之前有关于 Veriliog HDL ...

  2. 七、基于FPGA的Flash控制器设计

    根据项目需求,设计一个Flash控制器.以便将完成低速数据的存储.Flash选用了S25FL032.使用单线SPI接口,接线如图: 1,Flash S25fl032介绍 1.1 IO描述 1.2 相关 ...

  3. 基于FPGA的PID控制器设计

    1 知识背景 PID控制应该算是应用非常广泛的控制算法了.常见的比如控制环境温度,控制无人机飞行高度速度等.PID我们将其分成三个参数,如下: P-比例控制,基本作用就是控制对象以线性的方式增加,在一 ...

  4. 基于FPGA的SDRAM控制器设计(二)

    基于FPGA的SDRAM控制器设计(二) 1. SDRAM理论基础 2. SDRAM初始化模块以及仿真 3.TOP模块的仲裁机制 4. SDRAM刷新模块代码以及仿真 5.代码 6.参考资料 1. S ...

  5. FPGA之SDRAM控制器设计(三)

    FPGA之SDRAM控制器设计(三):写 由于已经涉及了上电刷新,写三个大的状态转移,先把状态转移图给出.主控状态转移图是基于手册上描述来的.在代码注释中会给出每个状态的意义解释. 写时序图 写状态转 ...

  6. SDRAM控制器设计

    SDRAM控制器设计 SDRAM 器件引脚示意图和功能框图如下: SDRAM 器件有如下的特性 通常情况下, SDRAM 存储器工作在 3.3V 的电压下(需要注意的是 DDR DRAM工作电压是 2 ...

  7. 基于FPGA的以太网控制器(MAC)设计(中)

    今天给大侠带来基于FPGA的以太网控制器(MAC)设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,以太网控制器(MAC)程序的实现.话不多说,上货. 导读 当前,互联网已经极大地改变了我们的生产和生 ...

  8. 基于FPGA的以太网控制器(MAC)设计(下)

    今天给大侠带来基于FPGA的以太网控制器(MAC)设计,由于篇幅较长,分三篇.今天带来第三篇,下篇,程序的仿真与测试和总结.话不多说,上货. 导读 当前,互联网已经极大地改变了我们的生产和生活.与之相 ...

  9. 基于FPGA的电子计算器设计(上)

    今天给大侠带来基于FPGA的电子计算器设计,由于篇幅较长,分三篇.今天带来第一篇,上篇,话不多说,上货. 导读 本篇介绍了一个简单计算器的设计,基于 FPGA 硬件描述语言 Verilog HDL,系 ...

  10. 【Simulink教程案例1】基于Simulink的PID控制器设计与实现

    欢迎订阅<FPGA/MATLAB/SIMULINK系列教程> 目录 1.软件版本 2.PID控制器理论概述 3.基于Simulink的PID控制器设计

最新文章

  1. Python:Spider
  2. db2top详细使用方法_Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略
  3. 马斯克近日表示:Neuralink脑机接口有望明年用于人类
  4. Gin的路由类型:GET POST PUT DELETE
  5. js mysql 时间日期比较
  6. django和flask用MD5加密密码
  7. 第二百五十三节,Bootstrap项目实战-资讯
  8. C/C++编程知识分享:C++ 手把手教你实现可变长的数组
  9. 世界上有条件JavaScript是什么?
  10. 爱心的数学函数方程_高中数学中的函数与方程思想
  11. 【HTML5】媒体元素标签audio video
  12. openstack 功能_为什么我们在OpenStack中冻结功能
  13. 4 谐波_谐波的基础知识
  14. OracleHelper
  15. 快速撑握C#知识点之类的数据成员
  16. 时间和日期的JS库Moment.js常见用法总结
  17. DirectX修复工具有什么用
  18. JDBC 数据库连接池
  19. 那些好玩的生成器网站(二)
  20. bat脚本--android adb一键截图

热门文章

  1. Java并发(五)线程池使用番外-分析RejectedExecutionException异常
  2. 关于微信中的localStorage及使用cookie的解决方案
  3. Angular / RxJs我应该何时退订`Subscription`
  4. 关于MultiActionController异步Ajax,post;
  5. cmd imp导入dmp文件_exp/imp、expdp/impdp使用总结,这些你都清楚吗?
  6. JAVA:json解析
  7. python动态图片转字符画_【小工具】使用python将图片转彩色字符画
  8. ❤️Bean的自动装配(详细)
  9. 利用new Object创建对象
  10. 显示隐藏-display(HTML、CSS)