Внедрение чипа 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.
И это на самом деле не единственный способ сделать это! Вот что делает логику микросхем такой увлекательной!