面试时提到一个关于大计数器的问题

2020-02-04 10:13发布

面试官问道针对一个大数分频器(比如1千分频1万分频)的计数器,有什么好方法可以节省一点资源?
当时想了很久,就说按实际分频用到多少位就分配几位,避免一些无用寄存器的使用。然后他摇了摇头,我向他请教,他说正确的是要把大计数器分拆成几个小计数器,溢出计数。他说这样子反转的位数就少,才可靠。
我当时纳闷了,你不是说要节省资源吗?怎么问题跑到这上面去了?
私底下思考了一下,请问大神:分拆成小计数器对节省资源来说有作用吗?按我理解用到几位就需要有几个寄存器,这是省不了的。
盼回复,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
nstel
1楼-- · 2020-02-04 14:49
面试官说的对,但是,没有说明白,或许是有意不说明白的?
因为,你要真的是实际搞过分频器而不只是个书面高手,那你就应该明白:分频器就是同步计数器,而多位同步计数器是很占资源的。分拆成几个小的同步计数器,再串联成大的计数器,就能节省大量的资源!这时,几个小的计数器之间不是同步计数而是异步计数。
hqbenson
2楼-- · 2020-02-04 18:23
nstel 发表于 2016-8-16 16:37
面试官说的对,但是,没有说明白,或许是有意不说明白的?
因为,你要真的是实际搞过分频器而不只是个书面 ...

谢谢大神您的快速回复!谢谢!经您的解释好像有点懂了。
可以具体举个例子吗?比如用一个8位计数器拆成两个4位来说,具体可以节省哪些资源呢?(寄存器应该是少不了吧,我理解是不是节省了一些组合逻辑资源?)
谢谢您!
nstel
3楼-- · 2020-02-04 21:51
hqbenson 发表于 2016-8-16 17:14
谢谢大神您的快速回复!谢谢!经您的解释好像有点懂了。
可以具体举个例子吗?比如用一个8位计数器拆成两 ...

节省大量的组合逻辑和布线资源。多位同步计数器的组合逻辑,会是几何级数增加的。布线,也是很占资源的。有时,布线比寄存器占的资源还多!而且,布线多了还要隔离,隔离占用的资源也不小。单层布线走不通,还要用多层布线,这个资源就是几何级数增加了!
hqbenson
4楼-- · 2020-02-05 03:36
 精彩回答 2  元偷偷看……
kdurant
5楼-- · 2020-02-05 06:43
本帖最后由 kdurant 于 2016-9-2 15:39 编辑

纯属胡扯,以altera为例:
  1. assign                  led = cnt[127];
  2. reg     [127:0]           cnt;

  3. always @(posedge clk or negedge rst)
  4. begin
  5.     if(~rst)
  6.         cnt <= 0;
  7.     else
  8.         cnt <= cnt + 1'b1;;
  9. end
复制代码
一个128bit的计数器,消耗资源
  1. Total logic elements        128 / 10,320 ( 1 % )
  2. Total combinational functions        128 / 10,320 ( 1 % )
  3. Dedicated logic registers        128 / 10,320 ( 1 % )
  4. Total registers        128
复制代码
  1. assign                  led = cnt2[63];
  2. reg     [63:0]           cnt1;
  3. reg     [63:0]           cnt2;

  4. always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk or negedge rst)
  5. begin
  6.     if(~rst)
  7.         cnt1 <= 0;
  8.     else
  9.         cnt1 <= cnt1 + 1'b1;;
  10. end

  11. always @ (posedge clk or negedge rst)
  12. begin
  13.     if(~rst)
  14.         cnt2 <= 0;
  15.     else if(cnt1 == {64{1'b1}})
  16.         cnt2 <= cnt2 + 1;
  17. end
复制代码
拆分成2个64bit的计数器,消耗资源
  1. Total logic elements        149 / 10,320 ( 1 % )
  2. Total combinational functions        149 / 10,320 ( 1 % )
  3. Dedicated logic registers        128 / 10,320 ( 1 % )
  4. Total registers        128
复制代码

可见拆分为2个更小的计数器,消耗的资源反而更多了,比较cnt2需要多一个比较逻辑才能加

这么做只有一个理由,那就是减少了计数器的组合逻辑路径(减少了加法器的进位链级数),提高了Fmax
可以说是面积换速度吧
小白报道
6楼-- · 2020-02-05 09:56
kdurant 发表于 2016-9-2 15:38
纯属胡扯,以altera为例:

一个128bit的计数器,消耗资源

好厉害,好厉害,好厉害,好厉害

一周热门 更多>