打印

nios为什么这么慢?

[复制链接]
4057|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ysdx|  楼主 | 2010-4-7 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3C16Q240芯片,外挂SDRAM MT48LC2M32B2跑NIOS,60MHZ还能过。80MHZ就报SDRAM错误(下载的时候校验不过,PCB布线都做了等长。SDRAM时钟和CPU时钟相位差-30度)。最要命的是DMA也慢得像蜗牛。本来我计划一个5M时钟的32bit并行数据通过FIFO进来,通过DMA到SDRAM,然后通过另一个FIFO出去。SDRAM作为缓存。现在测试发现仅仅DMA发送过程就占了大半时间。根本无法实现收发。(我的测试方法:关闭LED灯,启动DMA发送4K字节数据到FIFO。等待结束后把LED灯点亮。等待FIFO半空后关闭LED,启动DMA,如此循环)。发现LED信号波形中高电平占用很少。这说明DMA时间占用时间多。

相关帖子

沙发
yxwsz| | 2010-4-8 21:38 | 只看该作者
SDRAM的特点,决定了其在访问过程中,burst长度越长,效率越高;
因为每一次访问都需要发命令->行地址->列地址,然后才有数据读出或者写入;并且过一段时间还需要刷新。
如你访问的burst长度为1, 那SDRAM的效率真是惨不忍睹;

建议你还是使用SRAM吧,如果带宽要求比较高,可以使用同步SRAM, 比如QDR SRAM

使用特权

评论回复
板凳
ysdx|  楼主 | 2010-4-9 12:47 | 只看该作者
通过调整相位,系统已经可以跑到100M了。但是DMA的速度感觉还是很慢。

alt_dma_txchan_ioctl(txchan,ALT_DMA_SET_MODE_32,0);
alt_dma_txchan_ioctl(txchan,ALT_DMA_TX_ONLY_ON,__IO_CALC_ADDRESS_NATIVE (SEND_BASE, 0x07));
  
while(1)
{
   if(IORD(SEND_BASE,4)<2048)    //FIFO半空
   {             IOWR_ALTERA_AVALON_PIO_DATA(PIO_BASE,0xff);   //close led
                  if(alt_dma_txchan_send(txchan, SDRAM_BASE, TRANSFER_LENGTH, dma_done, NULL))
    {  printf ("Failed to post transmit request");
        return 0;
     }
     while(tx_done == 0);
  }
  IOWR_ALTERA_AVALON_PIO_DATA(PIO_BASE,0x00);  //open led
  
  tx_done = 0;
}

使用特权

评论回复
地板
ysdx|  楼主 | 2010-4-9 12:53 | 只看该作者
定制的DMA可以支持1024word的burst。不应该这样啊。

使用特权

评论回复
5
drentsi| | 2010-4-9 19:00 | 只看该作者
没用过nios,不知性能如何,我用的microblaze,100MHz,不使用数据缓存
用xilinx的总线和外设,用CPU搬数据,可以每秒搬15MB,
用自制改进的总线和外设,还是用CPU搬数据,可以每秒搬25MB,基本上极限就这个性能
用自制DMA,每秒搬400~900MB

使用特权

评论回复
6
ysdx|  楼主 | 2010-4-12 09:26 | 只看该作者
发现问题在定制DMA上。不用BURST功能就好了。不清楚什么时候用这个功能合适,哪位介绍一下?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:新手死于追涨,老手死于抄底,高手死于杠杆,价值投资死于满仓死杠!

337

主题

1051

帖子

21

粉丝