DSP片外高速海量SDRAM存储系统设计
在数字图像处理、航空航天等高速信号处理应用场合,需要有高速大容量存储空间的强力支持,来满足系统对海量数据吞吐的要求,通过使用大容量同步动态ram(sdram)来扩展嵌入式dsp系统存储空间的方法,选用issi公司的is42s16400高速sdram芯片,详细论述在基于tms320c6201(简称c6201)的数字信号处理系统中此设计方法的具体实现。
1 is42s16400芯片简介
is42s16400是issi公司推出的一种单片存储容量高达64mb(即8mb)的16位字宽高速sdram芯片。sdram的主要特点是:①同步访问,读写操作需要时钟;②动态存储,芯片需要定时刷新。is42s16400采用cmos工艺,它的同步接口和完全流水线的内部结构使其拥有极大的数据传输速率,可以工作在高达133mhz时钟频率下,刷新频率每64ms为4096次。该sdram芯片内部有4个存储体(bank),通过行、列地址分时复用系统地址总线,对不同存储体内不同页面的具体存储单元进行读写访问寻址。在进行读操作之间,必须预先激活sdram内对应的存储体,并选择存储器的某一行,然后送入列地址读取需要的数据。从输出列地址到sdram返回相应数据之间存在一个存取延迟。如果访问新的页面,则先需要关闭所有的存储体,否则已打开的页面将一直有效。在写操作之前,由于已经预先激活了有关的行地址,因此可以在输出列地址的同时输出数据,没有延迟。is42s16400提供自刷新模式的设置,可以使芯片运行在低功耗的状态下,从而大大减少嵌入式系统的功率消耗。
2 c6201与sdram的外部存储器接口
dsp芯片访问片外存储器时必须通过外部存储器接口emif(external memory interface)。c6000系列dsps的emif具有很强的接口能力,不仅具有很高的数据吞吐率(最高达1200mb/s),而且可以与目前几乎所有类型的存储器直接接口。在c6201系统中,提供了4个彼此独立的外存接口(cex)。除ce1空间只支持异步接口外,所有的外部cex空间都支持对sdram的直接接口。表1总结了c620x dsps的emif所兼容的sdram配置。表2给出了c6000系列dsps的emif所支持的sdram控制命令。


2.1 sdram的刷新
为了提高存储容量,sdram采用硅片电容来存储信息。随着时间的推移,必须给电容重新充电才能保持电容里的数据信息,这就是所谓的“刷新”,它的存在也使得sdram的应用变的略显复杂,带来了一定的应用难度。
c6000系列dsps有专门的sdram控制寄存器(sdtcl)和sdram时序控制寄存器(sdtim),用来进行sdram的各种时序控制,大大减轻了设计人员的开发难度,sdctl寄存器中的rfen位控制是否由emif完成对sdram的刷新。如果rfen=1,emif会控制向所有的sdram空间发出刷新命令(refr);而sdtim寄存器中的period位段则控制具体的刷新周期。
在refr命令之前,会自动插入一个dcab命令,以保证刷新过程中所有的sdram都处于未激活状态。dcab命令之后,emif开始按照sdtim寄存器中perd字段设置的值进行定时刷新。刷新前后,页面信息会变为无效。
对于c620x,emif sdram控制模块内部有一个2位的计数器,用来监测提交的刷新申请的次数。每提交一个申请,计数器加1;每次刷新周期之后,计数器减1。复位时,计数器自动置为11b,以保证在存取访问之前先进行若干次刷新。计数器自动置为11b,代表紧急刷新状态,此时页面信息寄存器变无效,迫使控制器关闭当前的sdram页面。然后,emif sdram控制器在dcab命令后执行3次refr命令,使计数器的值减为0,再继续完成余下的存取操作。
2.2 sdram的初始化
当某个ce空间配置为sdram空间后,必须首先进行初始化。用户不需要控制初始化的每一个步骤,只需要向emif sdctl寄存器的init位写1,申请对sdram作初始化。然后,emif就会自动完成所需要的各步操作。初始化操作不能在进行sdram存取过程中进行。整个初始化过程包括下面几个步骤:
①对所有的sdram空间发出dcab命令;
②执行3个refr命令;
③对所有的sdram空间发出mrs命令。
2.3 页面边界控制
sdram属于分页存储器,emif的sdram控制器会监测访问sdram时行地址的情况,避免访问时发生行越界。为了完成这一任务,emif在内部有四个页面寄存器,自动保存当前打开的行地址,然后与后续存取访问的地址进行比较。需要说明的是,当前存取操作结束并不会引起sdram中已经激活的行被立即关闭,emif的控制原则是维持当前的打开状态,除非必须关闭。这样做的好处是可以减少关闭/重新打开之间的命令切换时间,使接口在存储器访问的控制过程中充分利用地址信息。
对于c620x,每个ce空间包含1个页面寄存器(只对配置为sdram空间有效),因此c620x每个ce空间1次只能激活1页。进行比较的地址位数取决于sdctl寄存器中sdwid位的值。如果sdwid=0,该ce空间构成页面的大小为512,比较的逻辑地址是位23~11;如果sdwid=1,该ce空间sdram构成页面的大小为256,比较的逻辑地址是位23~10。一旦发现存取访问发生了页面越界,emif会自动执行dcab操作,然后再开始新的行访问。
2.4 访问地址的移位
由于sdram行逻辑地址与列逻辑地址复用相同的emif引脚,所以emif接口需要对行地址与列地址进行相应的移位处理。地址的移位处理由sdcrl寄存器中的sdwid位控制。
另外,对于sdram,因为输入地址也是控制信号,因此需要说明以下几点:
①ras有效期间的高位地址信号会被emif内部sdram控制器锁存,以保证执行read和wrt命令时选通正确的bank;
②read/wrt操作期间,emif会保持pre-charge信号为低(c620x是sda10),以防止read/wrt命令执行后发生auto-pre-charge操作。
2.5 接口时序的设计
对于c620x,emif与sdram的接口时序由sdctl寄存器控制。emif提供了5个时序参数,其中3个在sdctl寄存器中设置,另外2个为固定值,如表3所列。在分析接口时序的配合情况时,需要计算“富裕时间”tmargin的大小,这是在考虑了sdram芯片的器件手册提供的最坏情况之后,得到的时序上的一个裕量,至于tmargin值的大小,是系统设计层需要考虑的问题,具体要求随不同的系统而异,而且与印制板的实际布线情况以及负载的情况密切相关。

3 系统设计中is42s16400芯片的应用
3.1 c6201与is42s16400的接口实现
由于is42s16400属于16位字宽的64mb sdram芯片,而c6201的emif只提供32位字宽的同步外存储接口,为了使整个系统的存储空间保持连续,使用2片sdram与dsp芯片组成实际大小为16mb的外部存储系统,如图1所示。图1中is42s16400芯片各引脚含义如下:cs,片选;clk,系统同步时钟;ras,行地址选择;cas,列地址选择;we,读/写使能;cke,时钟使能,dqmu、dqml,高低字节使能;a[13:12],bank地址选择线;a[11:0]行、列地址先;dq[15:0],双向数据端口。

由图1可以看出,虽然c6201提供32位地址寻址能力,但是经emif直接输出的地址信号只有ea[21:2]。一般情况下,ea2信号对应逻辑地址a2,但这并不意味着dsp芯片访问外存时只能进行word(32位)的存取,实际内部32位地址的最低2~3位经译码后由bex输出,是能够控制字节访问的。更高位逻辑地址经译码后输出ce[3:0]。
在实际的系统实现中,c6201的clkout1时钟频率为200mhz,故而sdram的实际工作频率为100mhz,(sdclk=clkout2=clkout1 frequency/2),即tcyc=10ns。sdram被配置在ce2空间(起始逻辑地址为0x02000000)。
3.2 c6201 emif sdram寄存器设置
表4列出了配置sdram需要设置的emif寄存器名称及相应的位或位段。

emif全局控制寄存器中的sdcen位,(位6)设置为1,用来使能sdram同步时钟sdclk的输出。emifec2空间控制寄存器中的mtype位段(位6~4)设置为011b,用来配置ce2为32位宽的sdram空间。由is42s16400数据手册可查得trc=70ns、trp=18ns,trcd=18ns,故而emif sdram控制寄存器中的trc位段(位15~12)应设置为0110b,trp位段(位19~16)应设置为0001b,trcd位段(位23~20)应设置为0001b。init位(位24)置1,用来强制对sdram进行上电初始化。rfen位(位25)置1,用来使能emif对sdram的刷新。sdwid位(位26)置1,用来向emif表明所使用的sdram芯片的字宽为16位,由于is42s16400的刷新频率为每64ms4096次,故根据公式period=trefresh/tcyc,emif sdram时序控制寄存器中的period位段(位11~0)被设置为0x61a。
3.3 ccs开发环境中sdram配置程序源代码
ti公司的集成开发环境ccs(code composer studio)中,is42s16400sdram芯片的配置程序c代码如下:
#include<emif.h> … /*其他用户程序*/ /*读出emif控制寄存器的默认设置*/
unsigned int g_ctrl=get_reg(emif_gctrl);
unsigned int ce0_ctrl=get_reg(emif_ce0_ctrl);
unsigned int ce1_ctrl=get_reg(emif_ce1_ctrl);
unsigned int ce2_ctrl=get_reg(emif_ce2_ctrl);
unsigned int ce3_ctrl=get_reg(emif_ce3_ctrl);
unsigned int sdram_ctrl=get_reg(emif_sdram_ctrl);
unsigned int sdram_ref=get_reg(emif_sdram_ref);
/*emif全局控制寄存器-使能sdclk*/
set_bit(&g_ctrl,sdcen);
/*设置ce2为sdram空间*/
load_field(&ce2_ctrl,mtype_23sdram,mtype,mtype_sz);
/*设置sdram控制寄存器*/
load_field(&sdram_ctrl,6,trc,trc_sz);
load_field(&sdram_ctrl,1,trp,trp_sz);
load_field(&sdram_ctrl,1,trcd,trcd_sz);
set_bit(&sdrrm_ctrl,sdwid);
set_bit(&sdrrm_ctrl,init);
set_bit(&sdrrm_ctrl,rfen);
/*设置sdram的刷新周期*/
load_field(&sdram_ref,0x61a,period,period_sz);
/*重配制emif控制寄存器*/
emif_inif(g_ctrl,ce0_ctrl,cel_ctrl,ce2_ctrl,ce3_ctrl,
sdram_ctrl,sdram_ref);
…/*其他用户程序*/
结语
以上介绍了tms320c6201 dsp芯片与sdram(is42s16400)的具体硬件接口实现。由于sdram具有的大容量、高速度和低价格的优势,使用sdram构建嵌入式应用海量存储系统会成为一种行之有效的方法。目前该系统已调试完毕。使用sdram作为dsp系统外接高速、大容量主存储器具有非常明显的优势,充分显示了sdram在嵌入式系统中的良好应用前景。
评论