无符号整数最大值如何在硬件中实现?

电器工程 数字逻辑
2022-01-18 07:42:10

我正在研究一个涉及很多 max 函数(以及 max 函数作为其他 max 函数的参数)的设计。

为了简化硬件设计,我想知道如何在硬件中实现 max ?

在数学上,Max(a,b) 可以表示为 [(a + b) + abs(b - a)]/2。

这是它在硬件中的实现方式吗?(即分阶段;加法、位移除法等)

如果是这样,如何计算差异的绝对值?

3个回答

一个非常简单的方法是实现 (a>b)?a:b。a>b 可以通过从左边开始并检查 (a,b) 的每个位对来实现:

  • both 0 or both 1 : 继续下一个较低的对
  • a 为 1:a 最高;b 为 1:b 最高

当您知道哪一个是最高的时,您可以通过 2N->N 多路复用器来选择那个。

通过一些巧妙的技巧,可以将位对的检查与同一个位对的复用器结合起来。

让我们看一下问题中的算法:

[(a + b) + abs(b - a)]/2

这有一个加法和减法阶段,然后将其送入第二阶段加法。除以 2 在硬件上是微不足道的,可以通过删除 LSB 来完成。然而,两级全加器/减法器非常缓慢且门密集,特别是如果您像您一样级联多个caparison。

根据 Wouter van Ooijen 的回答,通用结构是一个数字比较器,用于输入多路复用器的选择信号:

示意图

模拟此电路- 使用CircuitLab创建的原理图

上述示意图适用于:

(A > B) ? A : B

但请注意,通过在比较器输出和多路复用器选择之间建立不同的逻辑连接,它可以很容易地重新配置为两个输入之间的任何比较。

因此,如果我们知道如何制定比较器的三个输出,我们就可以在硬件中实现任何比较。比较器逻辑在这里得到了很好的描述。为了优化硬件,我们只需删除驱动未使用的比较器输出的逻辑。

但最终,如果是硬件,它必须经过综合。所以你不应该纠结于哪种门级方案是最优的。相反,优化你的代码和算法,这样你至少不会强迫合成器产生低效的结果。“通过一些巧妙的技巧,可以将位对的检查与同一个位对的复用器结合起来,”执行这种优化的最简单方法是使用综合。

如果您真的想构建一个专门的电路来计算最大值,您可以从一个基本块开始,其中包含以下等式:

$$\begin{eqnarray} E_{i,out} &\leftarrow& E_{i,in} \wedge \neg (a_i \oplus b_i) \\ L_{i,out} &\leftarrow& (\neg E_{i, in} \wedge L_{i,in})\vee (E_{i,in} \wedge a_i \wedge \neg b_i)\\ r_i &\leftarrow& (\neg E_{i,in} \wedge ((L_{ i,in} \wedge a_i) \vee (\neg L_{i,in} \wedge b_i))) \vee (E_{i,in} \wedge (a_i \vee b_i)) \end{eqnarray}$$

然后将它们与馈送下一个的最高有效数字连接起来。关键部分从 MSB 到 LSB,而基于减法的电路充其量只有一条从 LSB 到 MSB 然后回到 LSB 的关键路径。

它相当于进位纹波加法器。如果您有兴趣,您可以构建等效于进位保存或进位选择加法器。

(\$E\$ 表示在此之前相等,并且 \$L\$ 只有当 \$\neg E\$ 并且表示选择 \$a\$ 时才有意义)