设计一个数据路径来对三个输入中最大的两个求和

Posted

技术标签:

【中文标题】设计一个数据路径来对三个输入中最大的两个求和【英文标题】:Desigining a datapath to sum the greatest two of three inputs 【发布时间】:2016-05-19 23:23:06 【问题描述】:

我需要为以下问题实现数据路径:“设计一个组合逻辑设备,将三个无符号数 x、y 和 z 作为输入,并输出两者中最大值的和。您可以使用任何我们在您的设计中使用的组合数据路径组件:多路复用器、解码器、加法器/减法器、比较器和各个逻辑门(根据需要)。不要使用寄存器或触发器等时序逻辑器件。”

我在这方面遇到了麻烦,因为我觉得无论我比较哪种方式,我都会两次获得三个中最大的一个,而答案将是错误的。例如,如果 x = 1、y = 3 和 z = 2,那么总和应该是 5,因为 3 和 2 是最大的两个。但是如果我们使用一个比较器来获取 x 和 y,我们将得到 3,因为 3 更大,如果我们使用另一个比较器来比较 y 和 z,我们也会得到 3,这给了我们 6 作为我们的总和。我们是否还需要比较 x 和 z 以获得第二大?在这种情况下,我们将获得最大的整数两次,第二大的整数一次。所以我们将得到 3、3 和 2。我是否应该使用另一个比较器然后比较 3 和 3,然后通过 3,但还要有另一个比较器来检查哪个数字比另一个少?例如,我们已经有一个 3 通过,那么将其他 3 与 2 进行比较,因为 2 小于 3,所以通过 2 并将剩余的 3 和 2 相加?除了这些比较器,我们还将拥有 MUX,它可以根据比较器的选择输入让适当的输入通过。

这是我所拥有的:

这对吗?

【问题讨论】:

求最小值,然后从总的 x+y+z 中减去最小值不是更简单吗?两个 comps 和 muxes 找到最小值,一个加法和一个减法...... 我们不需要两个加法器来计算 x+y+z 吗?一个加法器只能接受 2 个输入,因此 1 个加法器来评估 x + y,并且将该输入输入到另一个带有 z 的加法器中以获得 (x + y) + z 是的,确实如此。我认为仍然是最简单的方法。 【参考方案1】:

对于您的答案,左下角的sel 位来自哪里?是什么决定了它是使用 A=B 还是 A

最简单、最合理的方法是计算所有三个可能的答案(x+y、x+z、y+z),并计算逻辑以确定三个数字中的最小值。一旦你有了它,你可以简单地选择较大的两个的总和。与您建议的更多选择重的解决方案相比,它可能使用更多的总门,但它应该具有更低的延迟,因为它更加并行化。

按照您的方式,当重复进入混音时,要保持清晰确实变得相当困难。

上述电路适用于 4 位无符号数字(计算 5 位无符号答案),但很容易将其扩展到任何大小的数字。

【讨论】:

以上是关于设计一个数据路径来对三个输入中最大的两个求和的主要内容,如果未能解决你的问题,请参考以下文章

最大联通子数组求和

c语言:输入两个整数,计算并输出这两个整数的和·平均数·最大值·最小值?

c语言:输入两个整数,计算并输出这两个整数的和·平均数·最大值·最小值?

算法设计--在数组中找求和最大的连续子串

算法设计--在数组中找求和最大的连续子串

求JAVA的两整数输出最大最小值以及两个数的和差积商的程序