获取数字逻辑中的设置位数


9

作为练习,我正在尝试以简单的数字逻辑设计一个Conway的“人生游戏”的实现。我可以通过最小化9变量函数来完成整个操作,但是我想那仍然会很大。该算法的核心要素之一是确定您的8个邻居中有多少处于“活动状态”。

给定8个输入,最简单的方法是确定设置多少个?特别是当设置2时,我需要一个高输出,而当设置3时,我需要一个高输出。

我的主要思想现在包括一个PISO移位寄存器,一个计数器和一个3:8解码器,但是我非常需要一个微控制器来驱动所有这些。似乎没有那么复杂的功能。也许256x2 ROM也可以工作,但是我的搜索还没有找到任何类似的内容。

我知道任何具有10 IO的图片都可以轻松完成此操作,但我想以合理可行的最小方式实现它。

Answers:


13

您可能会在快速位数统计方面找到各种算法。最后两个:Nifty并行计数和MIT HAKMEM计数很容易转换为门。请参阅此页面以了解其工作原理。

您可以使用Gates硬件执行此操作。使用四个1位加法器将成对的位加在一起。这为您提供了四个3位数字。使用两个3位加法器将它们成对相加。这使您可以使用一个4位加法器来添加两个4位数字。这给您留下了5位的值,但是您可以忽略最高位。然后使用两个4位比较器测试值2和3。

为了使零件数量最少,为什么不选择模拟?

创建一个分压器,其顶部有一个电阻,您的8个输入通过8个并联的电阻连接到底部。然后,只需使用两个比较器设置即可检测2或3位将产生的电压电平。只有6个部分:

位计数检测器

8电阻网络将产生0v(对于0位设置)到5v(对于8位设置)之间的电压。2位将产生0.5v。3位将产生1.56v。

  • 如果使用0或1位,则输出将为00。
  • 使用2或3位时,输出将为01。
  • 具有4位或更多位的输出将为11。

添加:

感谢DavidCary的出色建议。经过大量的计算,我认为我找到了一组可以工作的电阻,但是您应该首先仔细检查我的计算。在这里,我使用具有漏极开路输出的比较器,我想我已经设法使它具有单个输出。低表示下一轮死亡,高表示下一轮活着。

康威的生命之路2

令人高兴的是,该电路仅比其他电路多两个组件。它们都是E8串联电阻,因此应该可以掌握。同样,R6应该具有较高的值,例如4.7k或类似值。


4
+1只是因为您的答案不是 “使用微控制器”。这似乎是此处的默认模式。
康纳·沃尔夫

@FakeName:第一个参考是软件解决方案。当然,您不必在微控制器上实现它们,也可以使用超级计算机:)
Federico Russo

@FedericoRusso-我为软件解决方案提供了这些参考,从而使他对如何在硬件中实现实现有了一定的了解。
Rocketmagnet 2012年

3
也许:从中央单元的当前状态到Rocketmagnet电路的运算放大器“ +”加法点之间添加第9个20 kOhm的“求和电阻”-即,给中央单元权重为1,并将8个相邻单元权重权重为2。然后调整分压器,使其“出生”(具有3个活邻居的中央死电池;总和= 6)和“保持存活”(具有2个或3个活邻居的中央死电池,总和= 5或7)输出为“ 01”;而其他所有情况(中央单元死亡或死掉)的输出均为“ 00”或“ 11”。然后,“异或”门给出中央单元的下一个状态。
davidcary 2012年

1
我发现有一些事情需要做一些试验:阻力并不完全正确。我发现了一些更好的组合,但我仍在尝试进行优化。同样,当制作一个这样的网格时,电流将流过summimg电阻,并使事情变得混乱。互连链路上的二极管是防止这种情况的一种方法。
captncraig '19

6

最小的是什么?该微控制器是仅有1部分,并且可以以最小的延迟产生的结果(<1 S)。在54%的所述ATTiny20为被Digikey 10的I / O的最便宜的微控制器。 μ

查找表也只有一部分,比单片机快。忘了并行EEPROM,它们很昂贵。使用一个字节宽的并行Flash是512 kByte,比您所需的容量大2000倍,但这是最便宜的解决方案(1美元)。您还可以以相同的价格添加6个1位功能。

您也可以使用CPLD。用一个较长的SOP(产品总和)语句在VHDL或Verilog中编写该函数,然后让合成器创建逻辑。

移位寄存器是确定的,如果你能等待结果; 这是最慢的解决方案。

最后,您可以使用逻辑门来完成此操作,但是如果您想基本使用SOP,则将花费大量时间将SOP减小到最小形式。Rocketmagnet使用加法器是正确的主意,但他的数字不正确:1位半加法器输出2位,而不是3位。因此,将半加法器的输出乘以2的方式需要两个2位半加法器,即给出两个3位结果。使用3位半加法器获得4位结果。使用1位全加器,您将只需要一个2位加法器。


1

混合并行顺序电路比纯并行电路更紧凑。例如,如果您调整规则以使3x3框将在活细胞少于三个或四个以上的情况下将中心的单元变为死,而在恰好有三个活细胞的情况下将其变为活(在这些条件下的行为新规则将与原始规则匹配),可以通过执行两步操作来简化逻辑:

tempVal [x,y] = orig [x-1,y] + orig [x,y] + orig [x + 1,y]'三个一位数字的两位和
orig [x,y] = LiveDeadFunc(orig [x,y],tempval [x,y-1] + tempVal [x,y] + tempVal [x,y + 1])

该数组tempVal[x,y]每个单元有两个位。后面的运算将三个这样的数字相加,以产生值0-9(尽管所有超过四个的值都是等效的),然后可以将其用于计算下一代的单位有效/无效状态。

顺便说一句,在第二阶段进行算术求和并检查该值的另一​​种方法是将tempVal [x,y]转换为一个热表示,然后显式检查将产生三个值的九个值组合之一单元,或将产生四个单元的十二个单元之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.