面试官问道针对一个大数分频器(比如1千分频1万分频)的计数器,有什么好方法可以节省一点资源?
当时想了很久,就说按实际分频用到多少位就分配几位,避免一些无用寄存器的使用。然后他摇了摇头,我向他请教,他说正确的是要把大计数器分拆成几个小计数器,溢出计数。他说这样子反转的位数就少,才可靠。
我当时纳闷了,你不是说要节省资源吗?怎么问题跑到这上面去了?
私底下思考了一下,请问大神:分拆成小计数器对节省资源来说有作用吗?按我理解用到几位就需要有几个寄存器,这是省不了的。
盼回复,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
纯属胡扯,以altera为例:
- assign led = cnt[127];
- reg [127:0] cnt;
- always @(posedge clk or negedge rst)
- begin
- if(~rst)
- cnt <= 0;
- else
- cnt <= cnt + 1'b1;;
- end
复制代码一个128bit的计数器,消耗资源
- Total logic elements 128 / 10,320 ( 1 % )
- Total combinational functions 128 / 10,320 ( 1 % )
- Dedicated logic registers 128 / 10,320 ( 1 % )
- Total registers 128
复制代码- assign led = cnt2[63];
- reg [63:0] cnt1;
- reg [63:0] cnt2;
- always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk or negedge rst)
- begin
- if(~rst)
- cnt1 <= 0;
- else
- cnt1 <= cnt1 + 1'b1;;
- end
- always @ (posedge clk or negedge rst)
- begin
- if(~rst)
- cnt2 <= 0;
- else if(cnt1 == {64{1'b1}})
- cnt2 <= cnt2 + 1;
- end
复制代码拆分成2个64bit的计数器,消耗资源
- Total logic elements 149 / 10,320 ( 1 % )
- Total combinational functions 149 / 10,320 ( 1 % )
- Dedicated logic registers 128 / 10,320 ( 1 % )
- Total registers 128
复制代码可见拆分为2个更小的计数器,消耗的资源反而更多了,比较cnt2需要多一个比较逻辑才能加
这么做只有一个理由,那就是减少了计数器的组合逻辑路径(减少了加法器的进位链级数),提高了Fmax
可以说是面积换速度吧
一周热门 更多>