2

我被要求用半 HDL 语言实现逻辑门以进行练习。问题是我对实现缺乏直觉,并且看不到将真值表“转换”为逻辑门的方法或算法,即使是更简单的逻辑门(如 XOR);如何将一个运算符“转换”为多个逻辑门的形式?到现在为止,这个练习感觉就像“尝试所有可能的逻辑门组合”,我想它不会是这样的。

4

2 回答 2

2

由于原始问题被标记为nand2tetris我认为不同的答案是有序的。

如果您正在学习这本书coursera 课程,那么您应该已经掌握了可以自己学习的信息。但是,我也为此苦苦挣扎,因为这对我来说是新事物,所以也许我了解您正在经历的事情并可以提供帮助。coursera 课程应在第 1 周涵盖 Xor 的实现。本书第 1 章介绍了 Xor 。我将在这里介绍我对这本书的解释的理解。

作者要求人们不要在互联网上提供问题的答案。但是,Xor 的答案由本书的作者完成并提供,您可以在第 16 页找到它。鉴于此,我将继续并在此处提供我自己的解释。

为了实现 Xor,您需要了解作者所说的以下内容:

  1. “...每个布尔函数都可以使用至少一个称为规范表示的布尔表达式来表达”第 9 页
  2. “从函数的真值表开始,我们关注函数值为 1 的所有行。对于每个这样的行,我们构造一个由 And-ing 创建的术语,将固定所有值的文字(变量或其否定)行的输入。” ,第 9 页
  3. “现在,如果我们将所有这些项(对于函数具有 value1 的所有行)进行或运算,我们将得到一个布尔表达式,它等效于给定的真值表。” ,第 9 页
  4. “这……引出了一个重要的结论:每个布尔函数,无论多么复杂,都只能使用三个布尔运算符来表示:And、Or 和 Not”第 9 页

因此,如果您尝试实现布尔逻辑门(如 Xor 一样),您可以通过写下其真值表、写下该真值表的规范表示,然后使用 HDL 实现布尔逻辑门来实现由规范表示指定的 And、Or 和 Not 门的组合。


以下是 Xor 的工作原理:

  1. 写下异或的真值表:
a  b   out 
0  0 |  0  
0  1 |  1  
1  0 |  1  
1  1 |  0
  1. 写下 Xor 真值表的规范表示:
(!a && b) || (a && !b)
  1. 在 HDL 中实现规范表示:
CHIP Xor {
    IN a, b;
    OUT out;

    PARTS:
    // !a && b
    Not(in=a, out=nota);
    And(a=nota, b=b, out=lhs);
    // a && !b
    Not(in=b, out=notb);
    And(a=a, b=notb, out=rhs);

    // (!a && b) || (a && !b)
    Or(a=lhs, b=rhs, out=out);
}

就是这样。


具体来说,我认为你可能需要学习自己解决这个问题的技术是如何写下真值表的规范表示。因此,请尝试弄清楚我是如何从第 1 步到第 2 步的,如果您有问题,请在此处提问。请记住,这本书和 coursera 课程都详细介绍了如何做到这一点,并且我引用了上面书中最相关的部分。

我希望这会导致您正在寻找的直觉。祝你好运。

于 2020-11-22T19:13:46.310 回答
1

既然您谈到了从真值表到其实现,我正在为您提供另一种实现或可视化数字电路的方法。这在当今更为普遍,因此每个数字电路设计人员都应该意识到这一点。

如今,数字电路通常在 FPGA 或 CPLD(包含 LUT(查找表)和触发器阵列)中实现,而不是使用单独的基本门,如(AND、OR 和 NOT)或 NAND 或 NOR。LUT 用于实现任何组合电路。

简单地说,LUT 是一个多路复用器。将其与真值表 (TT) 联系起来,TT 的输出(0 和 1)连接到多路复用器的输入。多路复用器的选择线是TT的输入。

查看 LUT 的另一种方法是存储器,它存储 TT 的输出。使用 TT 的输入作为地址来获取特定位置的值。

例如,可以使用两个4 对 1 多路复用器来实现半加法器。Sum 多路复用器的 4 个输入为 0,1,1,0,进位多路复用器的 4 个输入为 0,0,0,1。每个多路复用器中将有 2 条选择线,即输入 A 和 B。

另一个例如,可以使用两个8 对 1 多路复用器来实现全加器。Sum 多路复用器的 8 个输入为 0,1,1,0,1,0,0,1,进位多路复用器的 8 个输入为 0,0,0,1,0,1,1,1。每个多路复用器中将有 3 条选择线,即输入 A 和 B 以及 Cin。

于 2020-09-02T05:21:22.387 回答