This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320C6748: EMIFA对SDRAM的访问时序

Part Number: TMS320C6748


EMIFA按照SDRAM的接法接了FPGA,目前是想让FPGA模仿SDRAM的行为,将其用作同步外储

在DSP程序中对EMIFA接口的设置如下:

(第一个设置的是Self refresh mode,按照TRM文档18.3.2.1.1的说明,应先ENTER,再配置PLL,最后EXIT,由于我在GEL配置了PLL,把EMIFA的时钟配置为25M,所以直接EXIT. 中间三个关于我认为对时序的影响不大,所以就随意配了。)

我的访问方法是,定义一个数组emif_buf,通过链接脚本,配置到EMIFACS0的地址空间中,即 .far:.common:emif_buf > EMIFACS0,编译完成后在Memory Allocation的对应信息如下图所示。在主程序里,直接对这个数组进行操作,比如emif_buf[i] = (short)(i)

在FPGA端,采集到了一些信号,但我不明白应该如何处理。举个例子:

主程序中,对数组循环赋值:

在DEBUG模式下,expression窗口显示如下:

此窗口中显示的地址和数组下标是两倍的关系,我觉得这里能够对上RAM按字节存储,每单个地址对应一个字节,short是两个字节

FPGA采到的信号如下:command是对照TRM文档Table18-5设置的,11对应REFR,12对应PRE,13对应ACTV,14对应WRT,(15对应READ,下图没有READ命令),16对应BT,17对应NOP。clkin是时钟线,dqmnin是DQMn[0],addrin是地址总线,datain是数据总线,都是DSP引脚的信号

上图一共显示了两个burst

第一个13(ACTV)下面的0x005是row address,14(WRT)下面的0x144是column address,然后在16(BT)之前有两个数据,分别是WRT下的0x5544和NOP下的0x0000,分别对应的DQMn[0]是0和1

第二个13(ACTV)下面的0x005是row address,14(WRT)下面的0x144是column address,然后在16(BT)之前有两个数据,分别是WRT下的0x8000和NOP下的0x5545,分别对应的DQMn[0]是1和0

问题:

1:PIN脚的信号是否即TRM文档18.2.4.11提到的逻辑地址,此逻辑地址是否与物理地址一一对应?

      如,这里设置IBANK=0, PAGESIZE=2, 对照Table18-13,由上图信息可以得到4个逻辑地址,依次是0x2A88, 0x2A89, 0x2A89, 0x2A88。 那么这四个逻辑地址能否依次对应上EMIFACS0的物理地址0x40002A88,0x40002A89,0x40002A89,0x40002A88?

2:逻辑地址和数据是如何对应的?DQMn[0]为1时,写入高字节?为0时写入低字节?

      如,第一个burst,先在地址0x2A88写入WRT下0x5544的低字节0x44,再在地址0x2A89写入NOP下的0x0000的高字节0x0?第二个brust,先在地址0x2A89写入WRT下0x8000的高字节0x80,再在地址0x2A88写入NOP下的0x5545的低字节0x45?可是这样的解释说明往同一地址写入了两个不同数据。

3:emif_buf[i]这种直接数组访问有没有问题?而且这样是访问单个数据,此时看时序图,在burst进行两轮之后就被BT命令截断了,根据文档,C6748的burst size最大为8,如何访问,burst长度会为8?

  • 我已将你的帖子转给相关专家,请等待回复。

  • 你好,我对自己的FPGA侧程序进行了修正,得到了一个结果,具体如下:

    我在DSP侧的访问步骤是:

    数组emif_buf,配置到EMIFACS0的地址空间中;数组emif_wbuffer与emif_rbuffer,配置在DDR中

    emif_buf[i] = emif_wbuffer[i];  //emif_wbuffer写入emif_buf,其值与数组下标一致
    emif_rbuffer[i] = emif_buf[i];   //emif_rbuffer读取emif_buf

    在Expressions窗口可以看出emif_wbuffer与emif_rbuffer的值是相等的(程序中直接比较,也能判断得到一致结果),但是此窗口中直接显示的emif_buf会偶尔变化,并不稳定,变化的频率大概是3、4秒变化依次,只有部分值会变化,而且瞬间又能正常。

    而且读写循环持续大概十几分钟后存在DDR中的两个数组也开始变化。

    这里有个疑问:为何会得到不一致的结果?Expressions窗口显示的原理是什么,有没有用户手册介绍这一点?

    我在FPGA侧信号处理的逻辑与TRM文档的相关说明有些许不同,如下:(下面是对我自己的尝试的说明,不重要,回帖主要是为了增加一个Expressions窗口的提问

    1、两次连续的写入时序图如下,除了real_addr是我根据TRM文档18.2.4.11提到的逻辑地址变换得到的,其他信号均是直接从引脚采集到的

    我是忽略了DQMn为高的情况的,仅认为DQMn为低时有效。

    我找了一款SDR的datasheet,型号是K4S641632H-UC60,里面DQM的用法我的理解是,控制数据总线的三态门状态,DQM有效时屏蔽数据写入,但这里是高有效,所以SDR的DQM为高时读数据,为低时写数据。

    (引脚说明有两句话,但第一句没看懂)

    2、根据上一条说的“SDR的DQM为高时读数据”,所以,我设定DQMn为高时(且command为READ),为读入的地址,紧跟着的低电平状态持续几个CLK,就读几个数据,图中持续了两个CLK,所以读连续的两个数据,这一点是根据TRM的18.4.2.9:“The EMA_WE_DQM[1:0] pins are driven low during the READ commands and are kept low during the NOP commands that correspond to the burst request.”不一样的是,TRM的图中,READ命令下的DQMn为低电平。

  • 大概是搞定了,读写单个地址的误码率已经消除了,调试的时候不要开Expressions就行