|
SDRAM控制器设计的主要功能是能对SDRAM进行读写操作,本工程实现了SDRAM的初始化和自动刷新两个功能。 " _:iK] 初始化功能在前一章的分享中已经进行了比较详细的描述,感兴趣的同学可以搜索学习下,文后历史文章里有链接。今天我们主要讨论SDRAM的自动刷新的功能以及实现。 <E[HlL 一、原理功能1、为什么刷新我们都知道SDRAM是使用电容保存信息的,随着使用时间的增长,电容的电量会有损失,因此在操作SDRAM时要进行刷新。SDRAM的刷新分为两种,分别是Auto Refresh和Self Refresh。本次实验采用的是Auto Refresh。 "y~muE:. 2、刷新间隔 查询器件手册得到(64ms, 8192-cycle (commercial and industrial)),对8192行全部进行一次刷新时间是64ms。一次刷新操作是对4个bank的同一行进行刷新,所以一次刷新间隔是64ms/8192=7.813us。但是当刷新时间到来时,SDRAM可能正在进行读写,那么需要本次读突发或者写突发完成之后才能进行刷新操作;那么一次读突发为7拍,写突发为6拍,时间是60ns或者70ns (SDRAM工作时钟是100MHz,1拍是10ns),同时考虑到读写命令都是仲裁模块发出,会有一定的延时,所以本次实验刷新间隔设为7.5us,留出足够的时间。 NF/Ti5y
3、刷新时序 刷新时序如上图所示。这里需要注意,此时序图发了两次Auto Refresh命令,这种被称为背靠背技术;但其实背靠背技术并不是必须的,可以只发一次命令。 c}IX"
二、FPGA实现 1、模块架构 MvZ+n 2、信号说明 fVH*dX'Jz m@G<ZCMZ x&R9${e% 3、顶层模块参考代码 ]g>m? \'n UAsF0&] 4、模块功能 T-a&e9B g08*}0-k (1)PLL模块my_pll模块产生SDRAM和控制器工作时钟。 输入的50M时钟,经过PLL模块后,会产生两个100M、相位相差180度的时钟。其中一个用于输出给外部SDRAM,另一个用于其它模块的工作时钟。关于此模块的原理,可以参考《基于FPGA的SDRAM控制器设计—初始化设计》中的“SDRAM中心对齐原则”部分进行学习。 另外,本模块锁定输入时钟后,将产生LOCK指示信号,此信号用于其它模块的复位信号。我们可以理解为,在时钟稳定之前,其它模块都处于复位状态。 35Ai;mU' (2)仲裁模块 k^H0b\hYY arbitrate即仲裁模块,因为SDRAM控制时可能进行刷新或者读写操作(后续介绍),但是刷新时不能进行读写操作,因此需要一个仲裁模块,对这些控制命令进行管理,使刷新命令优先级最高。 jlu`lG*e& f >mhFy
当初始化完成之后仲裁模块发出rt_en信号,当仲裁模块收刷新定时器计时到最大值时的标志信号rt_flag后,发出刷新使能信号ref_en,并发出rt_clear信号。 (KT38RhA
其代码如下所示: 0JmFQ^g( (3)刷新定时器模块 f{)+-8 ref_timer即刷新定时器模块,主要是计数刷新间隔时间,当计数到最大值时拉高rt_flag信号。当收到rt_clear信号时将rt_flag信号拉低。 oM6j>&$b 代码如下所示: oN *SRaAp 9{_8cpm4
6ayy[5tW (4)初始化模块sdr_init初始化模块,在《基于FPGA的SDRAM控制器设计—初始化设计》中我们有比较详细的介绍,可以认真学习一下。
+"jl(5Q ~mtTsZc
(5)刷新模块sdr_ref刷新模块,收到刷新使能信号后进行刷新操作,在前文中“刷新时序”一节有讲述原因。本代码通过一个计数器cnt对时序进行计数,并产生了两个刷新命令;刷新完成后,让ref_done信号置1个时钟的高电平,表示刷新完成。 hT?6sWa 代码如下: +T9Q_e* 2d-{Q8Pi 6、选择模块 tv0Ha A sdr_mux模块,由于初始化模块和刷新模块都会发出SDRAM的信号,所以需要一个多路器来进行选择。由仲裁模块的sel_sm来控制输出init_bus信号还是ref_bus;当初始化没完成时输出init_bus,初始化完成时输出ref_bus。 ny)]GvxI 代码如下所示: o+NMA
( 三、仿真测试 </= CZy5w 最后对代码进行仿真,仿真文件参考:sdram_top_tb.v。 modelsim生成的报告如下所示,出现如下LOG信息,说明成功。 {3LA%xO r088aUO
P 以上就是SDRAM控制器的完整设计,明德扬专注FPGA设计研究,更多FPGA资料可以进入论坛进行学习交流。
|