Реализация чипа 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)
...

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


person Mark Alexa    schedule 06.03.2018    source источник


Ответы (3)


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

Нанд
а | б | выход
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0

И
а | б | выход
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1

And является обратным Nand, что означает, что для каждой комбинации входов And будет давать выход, противоположный Nand. Другой способ думать о «противоположном» двоичному значению — это «не» это значение.

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

person Antonio Dangond    schedule 18.05.2018

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

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

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

person MadOverlord    schedule 06.03.2018

Вы слишком много думаете о проблеме

Если задано НЕ-И или (не)И, то И может быть построено как (не)НЕ-И, поскольку (не)(не)И = И

person Seth Holtquist    schedule 07.03.2018
comment
Я все еще борюсь с этим. Интересно, что я создаю веб-сайты, где использую логическую логику каждый день, но сгораю, когда изучаю более фундаментальные вещи. - person Mark Alexa; 07.03.2018
comment
Из книги я понимаю, что функция возвращает 1 (True), если оба входа также имеют значение True, в противном случае возвращает 0 или False, но как на самом деле написать это на языке HDL? Я вижу учебник здесь, но я просто не понимаю. Жаль, что я не могу сделать это на Python. - person Mark Alexa; 07.03.2018