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

电器工程 数字逻辑
2022-01-24 00:52:42

作为一个练习,我试图用简单的数字逻辑设计一个康威生命游戏的实现。我可以通过最小化一个 9-Variable 函数来完成整个事情,但我想这仍然会相当大。该算法的核心要素之一是确定您的 8 个邻居中有多少是“活着的”。

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

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

我知道任何具有 10 IO 的图片都可以轻松做到这一点,但我想以尽可能合理的方式实现它。

3个回答

您可能会发现有关Fast Bit Counting的各种算法很有启发性。最后两个:Nifty Parallel Count 和 MIT HAKMEM Count 可能很容易转换为门。有关其工作原理的详细说明,请参阅此页面。

您可以使用门硬件来做到这一点。使用四个 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 或其他值。

什么是最小?控制器只有 1 个部件,并且可以以最小延迟 (< 1 \$\mu\$s) 产生结果。ATtiny20 售价54 美分,是Digikey最便宜的具有 10 个 I/O 的微控制器。

查找表也只是 1 部分,并且比微控制器更快。忘记并行 EEPROM,它们很昂贵。使用字节宽的并行Flash这个是 512 kByte,比你需要的多 2000 倍,但它是最便宜的解决方案(1 美元)。并且您可以以相同的价格再添加 6 个 1 位函数。

您也可以使用CPLD用 VHDL 或 Verilog 将函数写成一个长的 SOP(Sum Of Products)语句,然后让合成器创建逻辑。

如果可以等待结果,移位寄存器就OK这是最慢的解决方案。

最后,您可以使用逻辑门来做到这一点,但如果您想全部使用基本功能,您将花费大量时间将 SOP 减少到其最小形式。Rocketmagnet使用加法器的想法是正确的,但他的数字是错误的:1 位半加器输出 2 位,而不是 3。因此,将半加器的输出二乘二相加需要两个 2 位半加器,得到两个 3-位结果。使用 3 位半加器得到 4 位结果。使用 1 位全加器,您只需要一个 2 位加法器。

混合并行顺序电路往往比纯并行电路更紧凑。例如,如果您调整规则,使一个 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(尽管所有超过 4 的值都是等价的),然后可以使用它来计算下一代的单比特活/死状态。

顺便说一句,在第二阶段进行算术和检查值的替代方法是将 tempVal[x,y] 转换为 one-hot 表示,然后显式检查将产生三个值的九个组合之一细胞,或十二个会产生四个的细胞之一。