对于C6701,EMIF与SDRAM的接口时序由SDCTL寄存器控制。EMIF提供了5个时序参数,其中3个在SDCTL寄存器中设置,另外2个为固定值,如表4-4所列。在分析接口时序的配合情况时,需要计算“富裕时间”的大小,这是在考虑了SDRAM芯片的器件手册提供的最坏情况之后,得到的时序上的一个裕量,至于值的大小,是系统设计层需要考虑的问题,具体要求随不同的系统而异,而且与印制板的实际布线情况以及负载的情况密切相关。
SDCTL中需要设置的三个参数TRC、TRCD、TRP用以下三个公式来计算:
式中是指SDRAM芯片的时钟周期。
表4-4 C6701的SDRAM接口时序参数
| 参数 | 控制内容 | 相对于EMIF Clock的周期数 |
| REFR命令到ACTV、MRS或是下一个REFR命令之间的时间 | TRC+1 | |
| ACTV命令到READ或WAT命令之间的时间 | TRCD+1 | |
| DCAB命令到ACTV、MRS、REFR命令之间的时间 | TRP+1 | |
| ACTV命令到DEAC、DCAB命令之间的时间 | 7 | |
| 读数据和DCAB命令之间的时间 | 2 |
在需要配置的寄存器位段方面,EMIF全局控制寄存器中的SDCEN位,(位6)设置为1,用来使能SDRAM同步时钟SDCLK的输出。EMIFEC2空间控制寄存器中的MTYPE位段(位6~4)设置为011b,用来配置CE2为32位宽的SDRAM空间。由HY57V281620ET-H数据手册可查得、、,根据上面的计算公式,故而EMIF SDRAM控制寄存器中的TRC位段(位15~12)应设置为0100b,TRP位段(位19~16)应设置为0001b,TRCD位段(位23~20)应设置为0001b。INIT位(位24)置1,用来强制对SDRAM进行上电初始化。RFEN位(位25)置1,用来使能EMIF对SDRAM的刷新。SDWID位(位26)置1,用来向EMIF表明所使用的SDRAM芯片的字宽为16位,由于HY57V281620ET-H的刷新频率为每ms4096次,故根据公式c,EMIF SDRAM时序控制寄存器中的PERIOD位段(位11~0)被设置为0x209。
用C语言来实现完成上述初始化的操作如下所示[32,33,34]:
#define EMIF_GCR 0x 0x01800000
#define EMIF_CE2 0x 0x01800010
#define EMIF_SDCTL 0x 0x01800018
#define EMIF_SDTIM 0x 0x0180001C
void c6701_sdram_init()
{
CSL_init();
*(unsigned volatile int *)EMIF_GCR=0x3679;
*(unsigned volatile int*)EMIF_CE2=0xffff3f33;
*(unsigned volatile int*)EMIF_SDCTL=0x03114000;
*(unsigned volatile int*)EMIF_SDTIM=0x00138209;
}
FLASH相关:
在本系统中,FLASH芯片外接在DSP1的CE1空间。EMIF接口由一组存储器映射的寄存器进行控制与维护,包括配置各个空间存储器类型和设置读写时序等。和异步器件接口时需配置CE空间控制寄存器,由它来控制存储器的读写周期,本系统用到了CE1空间,故需要设置CE1空间控制寄存器的值。在设置CE1空间控制寄存器时,应满足以下条件:
1)异步读时:
2)异步写时:
3)附加参数:
对于本系统,从AM29LV320DB90的数据手册可以查出如下参数的值:、、、、、、、。而DSP1的时钟信号CLKOUT1为133MHz,所以。根据以上的公式,对EMIF寄存器相关的读写参数作出如下的计算:
1)寄存器相关读参数:
设置SETUP=1,
根据公式:,
因此:
取STROBE=15cycles,则;
,
因此:
因为HOLD不能为负,所以取HOLD=0,则;
取HOLD=3cycles,。
SETUP+STROBE +HOLD=19cycles;可以满足条件。
2)寄存器相关写参数:
,
取STROBE=7cycles,则
,
因此:,
取SETUP=3cycles,则;
,
取HOLD=3cycles,则;
所以: =97.5ns>90ns,满足条件。
通过以上的计算,我们已经知道本系统中EMIF相关寄存器位段的值,在初始化EMIF时,只需将其值写入相应的寄存器即可,其C语言的实现和SDRAM初始化相似,在此不再详述。
FIFO相关:
相关的三个参数由以下公式来确定:
式中指的为C6701的时钟频率,而其他的相关参数、、、、、、等均可从器件手册或者由FPGA提供。下载本文