玩转VHDL014-SDR驱动器

2020-02-02 11:28发布

014-SDR.rar (3.25 KB, 下载次数: 2) 2017-11-10 14:51 上传 点击文件名下载附件


SDR驱动器FPGA需大量数据缓存时要使用外部RAM。外部RAM分为SRAMDRAM两大类。静态的SRAM操作比较简单,但容量通常不大。动态的DRAM容量大但控制复杂。DRAM又可分为SDRDDR两类。DDR除了双沿读写外,其他与SDR类似。本文介绍SDR读写驱动并给出完整代码,对于DDR,只需稍作修改。
SDR概念简介
SDR,有的地方也写作SDRAM,是Synchronous DRAM的简称。全名译为同步动态随机存储器。SDR内部为行列层结构。在SDR芯片英文手册中,行用row表示,列用column表示,层用bank表示。列有时也简称为colSDR主要引脚有CLK, CKE, nCS, nRAS, nCAS, nWE, ADR, BADQ。分别表示时钟、时钟使能、片选、列选、行选、写使能、地址、层地址和输入输出数据。以下在不引起混淆的情况下简称输入输出数据为数据。SDR还有字节掩码引脚,我们在使用时恒接有效,不进行单字节控制。上述引脚中CLK上升沿为有效,其他以n开头的控制引脚表示低电平有效,否则高电平有效。ADR地址分时承载行地址和列地址。
SDR操作简介
SDR在上电后读写数据之前需要进行初始化,初始化主要完成对SDR工作模式的设置。SDR在不进行读写操作的空闲期间需要刷新refresh操作,以维持其存储的数据。刷新操作是逐行刷新,实际刷新周期必需不大于手册要求,通常为64ms。如果实际应用写入的数据保证在64ms内读取,也可不刷新。为了使驱动更具一般性,我们不考虑这种特殊应用。在读写SDR某一单元之前,需要对此单元所在行进行激活(ACTIVE)。激活后可按列顺序或随机读写。读写后需要进行预充电PRECHARGE操作,预充电后方可访问其他行。关于不同层的问题,在这里不作讨论也几乎没有必要,可简单把层地址看作行地址高位或地位。那么读写SDR可表述为三步:激活行、列读写、预充电。SDR驱动器对外接口只有读写操作,其他操作在驱动器内完成。
SDR驱动框架设计
本帖选用型号为HY57V561620SDR为例,叙述驱动设计,简称为HY57VSDR操作简介中可看出,一次从一行中读写多列可实现较大吞吐量。所以,驱动程序设计成从起始地址开始顺序读取一个或多个单元的方式。读写过程以请求响应方式完成。为叙述方便,定义读写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;

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。