Внедрение чипа AND в HDL

Я работаю над этой книгой http://nand2tetris.org/book.php которая учит фундаментальным концепциям CS, и я застрял там, где меня просили написать код AND и протестировать его в предоставленном программном обеспечении для тестирования.

Вот что у меня так далеко:

 /**
 * And gate: 
 * out = 1 if (a == 1 and b == 1)
 *       0 otherwise
 */

CHIP And {
    IN a, b;
    OUT out;

    PARTS:
    // Put your code here:
    Not(in=a, out=nota);
    Not(in=b, out=notb);
    And(a=a, b=b, out=out);
    Or(a=nota, b=b, out=nota);
    Or(a=a, b=notb, out=notb);

}

Проблема в том, что я получаю эту ошибку:

...
at Hack.Gates.CompositeGateClass.readParts(Unknown Source)
at Hack.Gates.CompositeGateClass.<init>(Unknown Source)
at Hack.Gates.GateClass.readHDL(Unknown Source)
at Hack.Gates.GateClass.getGateClass(Unknown Source)
at Hack.Gates.CompositeGateClass.readParts(Unknown Source)
at Hack.Gates.CompositeGateClass.<init>(Unknown Source)
at Hack.Gates.GateClass.readHDL(Unknown Source)
...

И я не знаю, получаю ли я эту ошибку, потому что программа тестирования работает со сбоями или потому, что мой код неверен и программное обеспечение не может его загрузить.

4 ответа

Может быть полезно изучить таблицы истинности для Nand и And:

Nand
а | б | из
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0

А также
а | б | из
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1

И является инверсией Nand, что означает, что для каждой комбинации входов, И даст противоположный результат Nand. Другой способ представить себе "противоположность" двоичного значения - это "не" это значение.

Если вы отправите 2 входа через вентиль Nand, а затем отправите свой выход через вентиль Not, у вас будет Not(Nand(a, b)), что эквивалентно And(a, b).

Ваша проблема в том, что вы пытаетесь использовать части (Не, И и Или), которые еще не были определены (и вы пытаетесь использовать И-ворота в своем определении И-гейта).

В каждой точке курса вы можете использовать только те части, которые вы создали ранее. Если память служит, на данный момент единственная доступная часть - это ворота Нанд.

Вы должны быть в состоянии построить ворота А, используя только ворота Нанд.

Вы значительно продумываете проблему

Если ему дано NAND или (не) AND, тогда AND можно построить как (не)NAND, поскольку (не)(не) AND = AND

Я тоже боролся с этим. Я предполагаю, что приведенный выше комментарий об использовании только вентилей И-НЕ для создания вентиля И является инструкцией. Комментарий «0» выше дает нам ответ, но она не «разъяснила» его для нас. (Итак, мне все же потребовалось некоторое время, чтобы найти ответ.) Для входов вашего AND, a и b, свяжите их с a и b NAND. Затем разверните NAND на a и b другого NAND. Затем выход этого второго NAND можно сопоставить с выходом вашего AND.

И это на самом деле не единственный способ сделать это! Вот что делает логику микросхем такой увлекательной!

Другие вопросы по тегам