搜索
bottom↓
回复: 27

哇咔咔,FPGA的速度真不是盖的。

[复制链接]

出0入22汤圆

发表于 2012-8-26 14:52:28 | 显示全部楼层 |阅读模式
我用niosii,设置cpu跑100M,做了一个读写SDRAM的验证代码,代码如下:

while(1)
        {
            for(ramIndex=0x10000;ramIndex<33488896;ramIndex++)
            {
                ram[ramIndex]=ramIndex%256;
                if(ram[ramIndex]!=ramIndex%256)
                {
                    LED->DATA|=0x01;
                }
                else
                {
                    LED->DATA&=0xfe;
                }
                LED->DATA^=0x08;
            }
        }

32M字节的SDRAM,100M时钟,一秒居然可以跑362000次。同样的代码,在LM3S,内核80M,SDRAM 40M的情况下,一秒只能跑2次.差距不是一点半点。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-8-26 14:54:38 | 显示全部楼层
这个就是软件与硬件的区别

软件灵活,硬件高效

出0入22汤圆

 楼主| 发表于 2012-8-26 15:09:23 | 显示全部楼层
leeseel 发表于 2012-8-26 14:54
这个就是软件与硬件的区别

软件灵活,硬件高效

LM3S扩展SDRAM也是使用的硬件EPI的。

出0入0汤圆

发表于 2012-8-26 16:17:07 | 显示全部楼层
数字看起来不合理,32MB数据,不知道你位宽,就算16位宽,16M字,100M的时钟,全页突发大约为80M字、每秒的样子(因为我做过125M时钟,每秒115MB有效数据),你的意思32MB(即16MW)每秒32MB*362000=1158400MB吗?太离谱

出0入0汤圆

发表于 2012-8-26 16:22:14 | 显示全部楼层
同意楼上说的。FPGA快在并行计算上,你用FPGA做成了软核已经和单片机没有区别了。

出0入0汤圆

发表于 2012-8-26 16:32:43 | 显示全部楼层
那是……

出200入657汤圆

发表于 2012-8-26 16:46:40 | 显示全部楼层
本帖最后由 ziruo2002ab 于 2012-8-26 16:48 编辑

LZ乘坐时光穿梭机从未来来到了现在?
按照LZ的说法,你fpga的sdram的吞吐率达到了TB/s以上了,神啊

出0入0汤圆

发表于 2012-8-26 17:15:48 | 显示全部楼层
价格也相差了不止一个等级

出0入0汤圆

发表于 2012-8-26 17:28:37 | 显示全部楼层
100M的软核的变量赋值一次  最少也得15ns以上(一般是30到70ns)
一个nop();是10ns   这样看来100M的软核相对于那些比较快的单片机(AVR/430),大概只有30M左右的效率

实际上软核计算速度并不快,只是它可以很灵活的配合FPGA的硬件IP来使用,取长补短

出0入442汤圆

发表于 2012-8-26 18:14:00 | 显示全部楼层
哈,这个是代码问题,被优化之后已经没有内存操作了。想要强制访问内存,必须使用violatile关键字。

出0入0汤圆

发表于 2012-8-26 18:17:43 | 显示全部楼层
呵呵                           

出0入22汤圆

 楼主| 发表于 2012-8-26 18:25:42 | 显示全部楼层
本帖最后由 zxq6 于 2012-8-26 18:37 编辑
wye11083 发表于 2012-8-26 18:14
哈,这个是代码问题,被优化之后已经没有内存操作了。想要强制访问内存,必须使用violatile关键字。 ...


哈,我知道原因了。
是有个代码位置没放对。

while(1)
        {
            unsigned char p;
            for(ramIndex=0x10000;ramIndex<33488896;ramIndex++)
            {
                p=ramIndex%256;
                ram[ramIndex]=p;
                if(ram[ramIndex]!=p)
                {
                    LED->DATA^=0x01;
                }
                if((ramIndex%10000)==0)
                {
                    LED->DATA^=0x02;
                }
            }
            LED->DATA^=0x08;
        }

改成这个后,从逻辑上是对了,但是运行效率也太低了吧?访问10000个数据基本上要50ms,那么慢?算下来才 200KBps

出0入0汤圆

发表于 2012-8-26 18:42:24 | 显示全部楼层
NIOS效能并不好
另外感觉NIOS其实能干的活不多,有点负载就卸载IP里了OTL

出0入0汤圆

发表于 2012-8-26 18:44:26 | 显示全部楼层
看看 ramIndex 的定义

是不是一个 Uint8_t  

出0入22汤圆

 楼主| 发表于 2012-8-26 18:45:57 | 显示全部楼层
STM32_Study 发表于 2012-8-26 18:44
看看 ramIndex 的定义

是不是一个 Uint8_t

那个变量是这么定义的:

volatile unsigned long ramIndex;

出0入0汤圆

发表于 2012-8-26 20:29:40 | 显示全部楼层
zxq6 发表于 2012-8-26 18:25
哈,我知道原因了。
是有个代码位置没放对。


你总算穿梭回地球了

出0入0汤圆

发表于 2012-8-26 20:33:42 | 显示全部楼层
,还是地球好

出0入442汤圆

发表于 2012-8-26 20:41:44 | 显示全部楼层
zxq6 发表于 2012-8-26 18:45
那个变量是这么定义的:

volatile unsigned long ramIndex;

你说错了吧。是读一遍50ms还是读0x10000个字节50ms还是?内存带宽16bit?不过说句实话,DRAM的IP真不怎样,只支持一个读写端口不说,我估计它对连续读写优化也不够。

出0入22汤圆

 楼主| 发表于 2012-8-26 21:40:01 | 显示全部楼层
wye11083 发表于 2012-8-26 20:41
你说错了吧。是读一遍50ms还是读0x10000个字节50ms还是?内存带宽16bit?不过说句实话,DRAM的IP真不怎样 ...


是写入和读取10000个字节,不是0x10000个字节,更不是一个32M字节一个轮回。
我又测了一下,就在一个while(1)里面执行这条语句
LED->DATA^=0x08;
实测io翻转的频率也只有2.8M左右,也就是这条语句每秒只执行了5M多次。所以楼主位的测试有点问题。不过修改之后的程序,感觉测试又太慢了点。不清楚是啥原因,还请指教。

PS:内存选用的是HY57V561620,数据16bit的。

出0入0汤圆

发表于 2012-8-26 21:51:00 | 显示全部楼层
zxq6 发表于 2012-8-26 21:40
是写入和读取10000个字节,不是0x10000个字节,更不是一个32M字节一个轮回。
我又测了一下,就在一个whil ...

看样子你有示波器,看下CAS RAS WE相关波形也许非常有收获,快看吧

出0入22汤圆

 楼主| 发表于 2012-8-26 22:06:32 | 显示全部楼层
本帖最后由 zxq6 于 2012-8-26 22:11 编辑
NJ8888 发表于 2012-8-26 21:51
看样子你有示波器,看下CAS RAS WE相关波形也许非常有收获,快看吧


这是示波器上的截图,我看不出有啥端倪,请帮忙看看,谢谢!其中第一个是WEN,第二个是CASN,第三个是RASN,另外,FPGA和SDRAM之间是使用了22欧的电阻隔离的,所有的地址线和数据线。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-8-26 22:16:52 | 显示全部楼层
你要是用hdl写更快

出0入442汤圆

发表于 2012-8-26 22:49:25 | 显示全部楼层
可能是NIOS性能差吧。我记得Altera说他的NIOSII能达到120MIPS/100MHz,按理说是每周期就能访问一次的。然而,考虑到你的程序,哈哈,你把Index表示为Violatile,这样每个for是访问6次Index的,所以你测的带宽要*24才对。为什么是*24?首先,每个for循环要访问6次,再次,你的Index是32位整型,因此,实际带宽是你测的带宽*24。

出0入22汤圆

 楼主| 发表于 2012-8-26 23:00:01 | 显示全部楼层
wye11083 发表于 2012-8-26 22:49
可能是NIOS性能差吧。我记得Altera说他的NIOSII能达到120MIPS/100MHz,按理说是每周期就能访问一次的。然而 ...

我看资料都说的NIOSii是32bit的软核,应该不是按照byte的方式对齐的吧?

出0入22汤圆

 楼主| 发表于 2012-8-26 23:32:20 | 显示全部楼层
本帖最后由 zxq6 于 2012-8-27 00:05 编辑

刚刚测试又有发现,当前定义的ramIndex如果是long型,则第一次for循环完成后就死机了。不会进入第二次。
如果修改为int,则循环时间会减小。也能够第二次进入for循环
如果修改为long long,则循环时间大大增大,基本上是long的2倍
用int的情况下,循环到后面,值越大,耗时越长,最开始可能是400ms,到结束的时候要到550ms左右了。
猜测,估计是nios的循环效率不高导致的该情况,有待证实。

后面又变成了如下的循环,也是循环10W次结果,周起可以跑到100ms了
while(1)
        {
            unsigned char i,j,k;
            for(i=0;i<200;i++)
            {
                for(j=0;j<100;j++)
                {
                    for(k=0;k<5;k++)
                    {
                        ;
                    }
                }
            }
            LED->DATA^=0x02;
        }

出0入0汤圆

发表于 2012-8-26 23:56:39 | 显示全部楼层
“一秒居然可以跑362000次。同样的代码,在LM3S,内核80M,SDRAM 40M的情况下,一秒只能跑2次.差距不是一点半点。”
你不是说 比 LM3S 快几十万次吗,这样效率还不高?

出0入0汤圆

发表于 2012-8-27 08:39:16 | 显示全部楼层
本帖最后由 NJ8888 于 2012-8-27 08:58 编辑

你那样发图看不出,至少双踪(应当三踪好)才能看出命令类型,因为那样才能看出看两方面,一个是两次突发间隔时间,另一个是总体看(稍慢扫描)突发访问占用总时间的比例.看RAS,负脉冲式ACTIVE或PRECHANGE(主要是没有双综不好猜),就算ACTIVE,你示波器窗口100ns*10=1us,大约10次ACTIVE,可以猜到最快100ns一次访问,但不知你一次突发多长,可以肯定不是全页突发,因为全页大约要5us左右

出0入22汤圆

 楼主| 发表于 2012-8-28 14:32:15 | 显示全部楼层
千山万水js 发表于 2012-8-28 14:12
唉,羡慕你们,还在理论挣扎的伤不起


理论挣扎 ,这是啥?
其实从理论到实践很容易的。买个板子,+一个调试(下载)工具,实践环境就起来 。再安装一个软件,再有一台计算机,就齐全了。再加一个示波器,一台电源,就更完美了。
ps:我这个板子还送空板哦。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 23:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表