014-SDR.rar
(3.25 KB)
SDR驱动器当FPGA需大量数据缓存时要使用外部RAM。外部RAM分为SRAM和DRAM两大类。静态的SRAM操作比较简单,但容量通常不大。动态的DRAM容量大但控制复杂。DRAM又可分为SDR和DDR两类。DDR除了双沿读写外,其他与SDR类似。本文介绍SDR读写驱动并给出完整代码,对于DDR,只需稍作修改。
SDR概念简介
SDR,有的地方也写作SDRAM,是Synchronous DRAM的简称。全名译为同步动态随机存储器。SDR内部为行列层结构。在SDR芯片英文手册中,行用row表示,列用column表示,层用bank表示。列有时也简称为col。 SDR主要引脚有CLK, CKE, nCS, nRAS, nCAS, nWE, ADR, BA和DQ。分别表示时钟、时钟使能、片选、列选、行选、写使能、地址、层地址和输入输出数据。以下在不引起混淆的情况下简称输入输出数据为数据。SDR还有字节掩码引脚,我们在使用时恒接有效,不进行单字节控制。上述引脚中CLK上升沿为有效,其他以n开头的控制引脚表示低电平有效,否则高电平有效。ADR地址分时承载行地址和列地址。
SDR操作简介
SDR在上电后读写数据之前需要进行初始化,初始化主要完成对SDR工作模式的设置。 SDR在不进行读写操作的空闲期间需要刷新refresh操作,以维持其存储的数据。刷新操作是逐行刷新,实际刷新周期必需不大于手册要求,通常为64ms。如果实际应用写入的数据保证在64ms内读取,也可不刷新。为了使驱动更具一般性,我们不考虑这种特殊应用。 在读写SDR某一单元之前,需要对此单元所在行进行激活(ACTIVE)。激活后可按列顺序或随机读写。读写后需要进行预充电PRECHARGE操作,预充电后方可访问其他行。关于不同层的问题,在这里不作讨论也几乎没有必要,可简单把层地址看作行地址高位或地位。那么读写SDR可表述为三步:激活行、列读写、预充电。 SDR驱动器对外接口只有读写操作,其他操作在驱动器内完成。
SDR驱动框架设计
本帖选用型号为HY57V561620的SDR为例,叙述驱动设计,简称为HY57V。 从SDR操作简介中可看出,一次从一行中读写多列可实现较大吞吐量。所以,驱动程序设计成从起始地址开始顺序读取一个或多个单元的方式。读写过程以请求响应方式完成。为叙述方便,定义读写SDR的模块单元为用户。用户可能为1个,也可能为多个。本帖着力介绍用户为1个的单用户驱动,并在附件SDR.rar中一并给出多用户驱动。多用户驱动只是在单用户驱动的基础上增加仲裁机制。附件中SDRAM_HY57V.vhd是单用户驱动器,用户个数可指定的驱动器SDRAM_HY57V_UN.vhd被称为多用户驱动器。多用户驱动器中类属参数UN表示用户个数,当UN=1时功能同单用户驱动器。
SDR驱动框架设计思想贯穿在驱动模块引脚描述中介绍。 单用户驱动模块命名为SDRAM_HY57V,模块实体如下: Entity SDRAM_HY57V is port( 1. DQ : inoutstd_vector(15 downto 0); BA : outstd_vector(1 downto 0); ADR : out std_vector(12downto 0); CKE,nCS,nWE : out std_logic; 5. nRAS,nCAS : out std_logic; clock : in std_logic; glbRst : in std_logic; wrReq,rdReq : in std_logic; dWrite : in std_vector(0 to15); 10. wrAdr,rdAdr : in std_vector(23 downto 0); wrLen,rdLen : in std_vector(0 to 9); qRead : out std_vector(0 to15); qEn,getNext : out std_logic; wrAck,rdAck : out std_logic; 15. bgnWr,bgnRd : out std_logic ); End SDRAM_HY57V;
|