FPGA RAM M9K不够用问题及解决方案

在做工程时发现一个问题,用quartusII综合时提示我所选的芯片M9K不够用,如果放在平时,只需要更换成资源多的芯片就可以,但是这次不行,为什么?因为必须在这个型号下进行实现,这就是这篇文章的目的,当因为外在原因无法更换芯片,而FPGA内部部分资源不够用时该怎么解决。

我的工程之前是在EP4CE6E22C8N上进行实现,LE有6K、M9K有30个,以前的工程可以跑起来问题,我现在增加了算法,主要是FIR滤波和线型互相关,这就让这颗芯片不能支撑我的设计,怎么办,我还是想在原有的核心板上进行实现,一下是我的思路:

(1)Altera 的FPGA同一系列下有不同资源的器件,找到完全兼容的进行替换。具体说就是封装、引脚个数、核电压、每个IO bank的参考电平数目都是一样的,可以直接拆掉原来的芯片,直接替换。(FBGA封装的自己一般焊接不了,引脚全在芯片底部;EQPF可以焊接,引脚均匀分布在芯片四周)

b1

(2)逻辑优化,尤其是算法结构和浮点数处理。具体为:

(a)如果系统时间不是很紧张,可以通过分时复用来使用同一运算单元(如:乘累加、乘法器、除法器、开方等),这不会改变算法的结构,只是时序控制上会变化;

(b)如果时间要求比较紧张,那么只能通过算法结构优化来实现,比如有些数据可以提前得到,并计算出结果,那么可以调用一个rom提前存取该数据以及计算结果,在算法运算时直接访问rom。

(c)除此之外还可以对计算公式进行化简,比如开方运算,是不是可以通过等式两边进行平方,再进行计算,以及指数运算,是不是可以通过一次函数或多项式来等效替换,这样就可以不使用指数IP核(这个IP相当耗费资源);

(d)除法运算是不是可以通过移位实现,如果已知被除数是一个常数,是不是可以对其进行分解(如a/25=(a/1024)(1024/25)=((a>>10)(32+8+0.5+0.125+0.0625+0.015625+0.0078125))这样就转换为移位运算,这个资源节省不是一点点,试试就知道啦)

(e)浮点运算是不是可以转为整数运算,比如同时扩大1024倍,即左移10bit,转为整数后再进行后续计算,最后再除以该放大倍数即可。当然这是要在精度要求范围内,放大倍数越大则约精确。

(f)符号运算是不是直接用补码更合适,完全不用担心正负了;
以上6中方法在FPGA处理复杂运算时经常用到,并且是交叉使用,所以需要你开脑洞,先对运算进行简化,再在FPGA上进行实现。

说回主题,我这次怎么解决的呢?
(1)将EP4CE6E22C8N替换为EP4CE10E22C8N,这两个完全兼容,其中E22表示芯片的尺寸,22X22mm。EP4CE10的LE资源10K,M9K有46个。比之前好一些。
(2)算法化简,尤其是采用分时复用,节省了2个12bit,1个25bit的乘法器;其次是对浮点数进行放大1024倍,转为整数进行计算;再就是通过平方将开方运算去掉,节省2个开方运算(同样计算量的情况下,开方运算占用资源比乘法器多,尤其是dsp);
通过这样处理,资源占用从8000多LES变为4191LES,足见算法结构对资源的影响有多巨大。

就在这样优化的情况下,还是综合出问题,提示说M9k不够,那么M9K在综合时究竟怎么计算呢?下面是引用被人的话,对M9k解释很清楚,值得一看。

在编程中会需要一些存储器,如果用逻辑构成的话就会占用大量逻辑,很浪费,于是在内部做了一些M4K,M9K等存储器,专门给FIFO,RAM等使用,这样就节约了逻辑用来做其他事。每一块中包含8192个存储位,加上校验位共9216位,故称M9K。每个RAM块可配置成图中的几种模式。

当fifo的宽度和深度符合表3-1中的各种配置时(fifo宽度和深度小于或等于表中的对应数值),每个fifo使用1个M9K块即可,但如果没有完全使用该块中的ram时,该块一般不可用做他用了。比如配置宽度为12位深度为512的fifo时实际使用的ram位为12*512=6144 ,故实际使用率为6144/8192=75%,当所有fifo都按照这种配置来分配时FPGA中的ram最大使用率也就是75%。

一种特殊情况是当fifo容量较小而且读写时钟分别相同时,QuartusII可能把几个fifo使用同一个ram块来实现。

当fifo宽度大于表3-1中所允许的最大宽度时Quartus会使用多个ram块来实现,比如配置宽度为114位的fifo时,Quartus必须使用3个ram块来实现这个fifo。当深度为25实际使用的ram位为114*25=2850 ,故实际使用率为2850/(8192*3)=11.6% ,相当多的ram位被综合掉。

b2

我这次选用的芯片一个有46个M9K,那么为什么还不够用呢,并且综合是给出结果只占用了11个M9K,明明还有很多M9K没有,为什么会提示M9K不够?

我对工程中的所有IP占用的M9K进行了统计,确实只用了11个M9K,h和综合结果一致,那又是为什么?

后来发现有一个FIR滤波器,52阶,占用了39个M9K,所以QuartusII在综合时并未把FIR的占用体现出来,但却有计算了,也就是综合报告并未体现,但是却实实在在使用了这部分M9K。

知道问题就知道怎么修改了,现在逻辑资源足够了(从算法那里压榨了一些),M9K不够,那么我在使用FIR IP核的时候就是用逻辑单元来存储FIR滤波器的系数,这样用了一部分逻辑资源来代替了M9K,通过这样的处理,工程顺利综合,M9K还比较富裕了。

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值