MyFPGA Forum

 找回密码
 注册
搜索
查看: 9518|回复: 11

【转载】SDRAM控制器软核的Verilog设计

[复制链接]
发表于 2010-3-13 22:38:44 | 显示全部楼层 |阅读模式
目前,在很多通信芯片及系统的开发中,常常需要用到存储容量大、读写速度高的存储器。在各种随机存储器件中,SDRAM 的价格低、体积小、速度快、容量大,是比较理想的器件。但是,与SRAM相比较,SDRAM的控制逻辑复杂,使用很不方便。为了解决这个矛盾,需要设计专用的SDRAM控制器,使系统用户象使用SRAM一样方便的使用SDRAM是十分必要的。考虑到控制器的通用性,本文提出了一种通用的SDRAM控制器的 Verilog设计,并给出了实现结果。
1   SDRAM的工作原理
    通常一个SDRAM中包含2个或4个BANK,每个BANK的存储单元是按行和列寻址的。由于这种特殊的存储结构,与SRAM比较而言,SDRAM在工作的原理上有以下几个特点:
    第一,SDRAM在上电100us-200us 后,必须由一个初始化过程来配置SDRAM的工作模式。初始化过程是由启动指令流完成:首先由一个Precharge all bank指令完成对所有BANK的预充,然后是两个或多个Auto Refresh指令,最后在模式配置指令下完成SDRAM内部模式设置寄存器的配置。模式寄存器的值控制着SDRAM的工作方式,详细描述如表1所示。

     SDRAM模式寄存器:
    第二,SDRAM行列地址采用复用的方式减少了地址总线的密度。这样以来,SDRAM在每次读写操作时,行列地址要锁存。具体的,由ACTIVE命令激活要读写BANK,并锁存行地址,然后在读写指令有效时锁存列地址。
    第三,SDRAM的操作是通过 AP信号的组合指令字完成的。由于特殊的存储结构,SDRAM操作指令比较多,不像SRAM一样只有简单的读写,其主要的指令字见表2。


2   通用SDRAM控制器的设计
2.1   总体设计框图
    SDRAM控制器的内部结构如图1所示,包括控制寄存器、初始化请求产生、刷新请求产生、指令仲裁器、指令译码、数据通路六个模块。控制寄存器控制SDRAM的各种工作模式,其值可以通过MCU接口配置。指令仲裁器对系统的读写请求信号sdram*rd*n、sdram*wr*n及初始化请求和刷新请求进行仲裁。仲裁的结果由指令译码器译码产生 SDRAM的操作指令字。用Sdram*busy信号指示SDRAM总线的闲忙,sdramready为SDRAM控制器对系统读写请求的响应指示,指示对数据有效的读写操作。

2.2   各模块的设计
2.2.1   控制寄存器模块
    包含控制工作模式的各种寄存器。系统用户可以根据实际需要配置SDRA的工作模式。可以通过MCU接口来配置,也可以省去MCU接口而通过预设参数来配置。寄存器主要包括两类:一是初始化模式控制寄存器,用于控制SDRAM初始化指令流的产生方式;二是SDRAM模式控制寄存器,用于SDRAM的刷新及其它操作指令参数的控制。
2.2.2   初始化请求产生模块
    上电后初始化请求信号的产生延迟控制。由于系统上电100us-200us 后时钟才能稳定,之后,SDRAM才可以开始初始化操作。为防止译码毛刺的出现,采用格雷码计数器来实现这一延迟的控制。系统复位结束后,启动计数器,当计数器计到设定的值后计数值保持,同时译码产生初始化的请求信号,在SDRAM初始化完成后请求变为无效。
2.2.3 刷新请求产生模块
    根据模式寄存器的配置的频率产生SDRAM的刷新请求信号。这部分电路也是采用格雷码计数器实现的。计数器计到设定的值后产生刷新请求信号,同时返回到初值继续计数。
2.2.4   指令仲裁器模块
    对初始化请求、刷新请求和系统的读写请求进行优先级仲裁,产生初始化响应initial*hold、刷新响应ref*hold和读写响应sdram*wr*hold。初始化操作只在上电时进行一次,它是SDRAM正常工作的基础,所以它的优先级最高。刷新请求的优先级次高,读写请求的优先级最低。当某一种操作正在执行时不会响应后来的请求。
2.2.5   指令译码器模块
    根据指令仲裁器的结果和SDRAM控制器模式寄存器对工作模式参数的设置,分别对初始化指令、刷新指令、读写指令进行译码。译码的结果就是输出的控制指令字。当initial*hold=1时,译码产生SDRAM的初始化指令流;当ref*hold=1时,译码产生刷新指令;当sdram*wr*hold=1并且读有效(Sdram*rd*n=0)或写有效 (Sdram*wr*n=0)时,根据寄存器设置的指令参数译码输出BANK激活指令、读指令及预充指令。此外,在SDRAM执行任何一种操作时,都用 sdram*busy=1来指示SDRAM忙;用sdram*busy=0来指示SDRAM空闲。用sdram*ready=1指示系统对SDRAM数据有效的读写操作。译码模块采用Verilog结合状态机的设计方法,直观清晰,提高了电路的设计周期。
     SDRAM控制器软核设计的状态机实现原理如图2所示,包含了10个状态,其中从Power on到Mode reg set为上电后SDRAM的初始化过程。其余状态为SDRAM的正常读写及刷新操作过程。

2.2.6   数据通路模块
    是根据寄存器的设置及指令译码的结果对把系统非复用的地址处理为SDRAM复用的地址,使得SDRAM的地址及数据和相应的操作指令在时序上同步。

3 接口时序
3.1 写时序(Burst=1)

3.2 读时序(CAS=3,Burst=1)


4   实现及应用
    本设计用Candence公司的 Ncverilog仿真工具进行了功能仿真。在仿真过程中,外部的SDRAM采用了Micron公司网上提供的1M×16、2M×2、4M×2的仿真模型,结果正确。最后,该控制器软核作为SDRAM的接口电路嵌在了西安深亚公司EOS0121芯片设计中,采用Actel公司的Designer R1-2002工具进行了综合布线,在ProASIC A500K180 208Pin的FPGA上得到了实现。目前该芯片已被多家公司采用,反映良好。从而也说明了该SDRAM控制器软核性能可靠,工作稳定。
    由于采用了IP核的设计思想,只要修改少量的参数配置就可以支持多个厂家多种型号的SDRAM器件。对特定容量的SDRAM的特定工作模式而言,只要根据其器件参数进行设定,控制器就可以适用特定SDRAM的特定工作模式。

5   结束语
    Verilog硬件描述语言已越来越广泛地应用于EDA领域,大多数EDA设计工程师都用它来进行ASIC设计和FPGA开发。用高级语言进行电路设计,可以灵活的修改参数,增加了电路设计的通用性和可移植性。最后,需要指出的是采用IP核的方法设计电路,既可以单独使用,也可以嵌入到ASIC或FPGA的电路设计中去,大大缩短了产品开发周期,应该大力推广。
发表于 2010-4-22 21:15:08 | 显示全部楼层
谢谢楼主 我也在弄这个方向呢 怎么没有图呢??
发表于 2010-4-23 12:17:00 | 显示全部楼层
回复 2# 丁丁

丁丁 你可以看一下这个
http://www.myfpga.org/discuz/vie ... &extra=page%3D1
发表于 2010-7-30 15:01:21 | 显示全部楼层
thanks a lot!
发表于 2010-8-1 11:11:29 | 显示全部楼层
分享了,谢谢!
发表于 2010-8-3 10:38:57 | 显示全部楼层
谢谢!!!!!!!!!!!!!
发表于 2010-10-27 19:41:27 | 显示全部楼层
多谢楼主了啊 !!!! 话说
发表于 2011-9-29 14:37:44 | 显示全部楼层
thanks you~~~~
发表于 2011-10-28 15:56:10 | 显示全部楼层
谢谢分享
发表于 2012-5-3 16:33:39 | 显示全部楼层
刷个分,要下东西,没权限啊。
发表于 2013-11-22 18:25:01 | 显示全部楼层
谢谢分享
发表于 2014-3-23 13:00:34 | 显示全部楼层
学习了,谢谢楼主。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-3-29 13:41 , Processed in 0.039105 second(s), 15 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表