nios为什么这么慢?

[复制链接]
 楼主| 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。不应该这样啊。
drentsi 发表于 2010-4-9 19:00 | 显示全部楼层
没用过nios,不知性能如何,我用的microblaze,100MHz,不使用数据缓存
用xilinx的总线和外设,用CPU搬数据,可以每秒搬15MB,
用自制改进的总线和外设,还是用CPU搬数据,可以每秒搬25MB,基本上极限就这个性能
用自制DMA,每秒搬400~900MB
 楼主| ysdx 发表于 2010-4-12 09:26 | 显示全部楼层
发现问题在定制DMA上。不用BURST功能就好了。不清楚什么时候用这个功能合适,哪位介绍一下?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

338

主题

1056

帖子

21

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:新手死于追涨,老手死于抄底,高手死于杠杆,价值投资死于满仓死杠!

338

主题

1056

帖子

21

粉丝
快速回复 在线客服 返回列表 返回顶部