首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

精打细算节约系统资源的一个技巧

精打细算节约系统资源的一个技巧

今天开始设计CPLD的内部电路,花了一个上午的时间写了一些大概的代码,开始估算一下系统所需要消耗的资源,不算不知道,才刚两个计数器就消耗了200个LUT的资源,这下完了,整个芯片才240个LUT,其他的部分的电路怎么办,如果换大容量的芯片整个电路板得大改,而且增加了整个系统的成本,于是开始查原因,电路上使用了大量的分频器,一开始的直觉认为过多的分频器消耗了系统的资源,于是单独留下分频器部分编译,发现所占用的资源并不多,再一看,只剩下计数器的模块了,翻箱倒柜的看代码,人家的计数器二三十个LUT就可以了,为什么我的用了90个,很是不解,左看右看,终于发现如下一句代码:
PROCESS(clk)
VARIABLE counter: INTEGER :=0;
所有的信号量我都为整型的数据定义了取值范围,唯独这个变量没有设定,抱着试试看的心理,把代码改成
PROCESS(clk)
VARIABLE counter: INTEGER RANGE 0 TO 100000:=0;
编译了一下,妈呀,消耗的资源立即从88降到了53,节省了整整35个lut,仔细想了想也对,VHDL是实用硬件连线来表示数的,比如两个模块只有一根线连接,那么这跟线只能 传输两个数据,要么'0'要么'1',而如果两根线,那就可以表示四个数值,'00', '01', '10', '11',三根弦往后类推,我需要的计数范围是70000,算了一下,16根线可以表示0~65535这个范围的数字,不够,而17根线可以表示0~131071这个范围的数字,正好。而使用的线的多少在编译的时候直接的表现就是实用资源的多少。
那么此时可以反推编译器编译的过程,如果你指定了计数范围的话,编译器会为你的计数器分配17根信号线用来计数,而如果你不指定的话,编译器只能按照默认的最大位数来进行计数,假设是32根,但是实际上你的计数器可能并不需要那么多的资源,如果你没有发现这个问题的话,那么那些多编译的资源就是白白浪费了。
设计人员真的得注意细节啊!
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表