【问题标题】:Low power design for adders加法器的低功耗设计
【发布时间】:2013-09-10 07:59:40
【问题描述】:

我必须实现一个串行执行 A+B+C+D 的电路。

A 和 B 使用第一个加法器相加,结果使用第二个加法器添加到 C,最后使用第三个加法器将结果一个接一个地添加到 D。

问题是,为了使设计低功耗。我必须关闭其他两个未使用的加法器。我能想到的只是启用和禁用信号,但这会导致延迟问题。

如何在 verilog 中有效地合成这个?

A、B、C、D 可能会在每个时钟周期发生变化。开始信号用于指示何时需要进行新的计算。

【问题讨论】:

  • 任何相关材料都会有用
  • 你所说的“连续”是什么意思?如果它是真正的位串行,您可以使用单个一位加法器并通过它移动所有位 - 最小功率,高延迟,无需关闭,相对容易编码。如果您实际上必须禁用两个真正的 n 位加法器以节省电力,那么您必须关闭它们的时钟。启用和禁用信号通常不会有什么帮助(很多),如果它们只是门控数据。
  • 它是一个8位加法器,执行可以忽略
  • 使用 Verilog 事件来触发加法器会更有效吗??
  • @TrafalgarLaw 否 Verilog 事件不可合成。

标签: verilog


【解决方案1】:

我假设您的加法器已通过 sum = A + B; 隐含。对于面积优化,为什么不共享一个加法器单元。 CLK1 中的 A+B,CLK2 中的 SUM+C,CLK3 中的 SUM+D。那么你就没有什么可以禁用或时钟门了。

当值发生变化时会使用大部分功率,因此在不使用时将输入归零实际上可以通过创建不必要的切换来增加功率。由于加法器是组合逻辑,我们可以为给定架构节省功耗的所有方法都是保持值稳定,这可以通过使用时钟门单元控制/排序输入和输出触发器 clks 来完成。

更新

信息表明每个时钟周期都可能需要进行新的计算,并且有一个名为start 的启用信号。这个问题提到了连续添加它们,即:

sum1 = A + B;
sum2 = sum1 + C;
sum3 = sum2 + D;

由于可能在每个时钟周期计算结果,因此它们全部打开或全部关闭。给定的序列化(全部并行执行)有 3 个加法器串在一起(3 个加法器的波纹路径)。如果我们重构为:

sum1 = A + B;
sum2 = C + D;
sum3 = sum1 + sum2;

或者纹波路径只有 2 个加法器深度,从而允许更快的建立时间,这意味着消耗功率的纹波或瞬变更少。

我很想在 1 行上完成这一切,并允许综合工具对其进行优化。

sum3 = A + B + C + D;

为了省电,我会在合成时打开自动时钟门控,并使用与此技术配合良好的结构:

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    sum3 <= 'b0;
  end
  else begin
    if (start) begin //no else clause, means this signal can clk gate the flop
      sum3 <= A + B + C + D;
    end
  end
end

【讨论】:

  • 问题目的地的一部分是拥有三个加法器来增加吞吐量并在不使用时禁用它们。使用一个加法器是有意义的,但是,数据 -A,B,C,D是随机流入的,即每个时钟都可以流入,或者可能有几个时钟周期的延迟
  • @TrafalgarLaw 输入 A、B、C、D 中的任何一个是否比另一个更容易发生变化,这可能会通过将静态值组合在一起来影响功率。假设 A 和 D 几乎没有变化,sum1(A+D) + sum2(B+C)。这里我们将 sum1 中的切换最小化,从而节省电量。
  • 来自测试台的启动信号指示输入数据
  • 每次数据进来都可能发生变化
猜你喜欢
  • 2018-05-21
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多