nand2tetris. Реализация памяти

Я реализовал реализацию памяти данных в курсе nand2tetris. Но я действительно не понимаю некоторые части моей реализации:

CHIP Memory {
    IN in[16], load, address[15];
    OUT out[16];

    PARTS:

    DMux4Way(in=load, sel=address[13..14], a=RAM1, b=RAM2, c=scr, d=kbr);
    Or(a=RAM1, b=RAM2, out=RAM);

    RAM16K(in=in, load=RAM, address=address[0..13], out=RAMout);
    Screen(in=in, load=scr, address=address[0..12], out=ScreenOut);
    Keyboard(out=KeyboardOut);

    Mux4Way16(a=RAMout, b=RAMout, c=ScreenOut, d=KeyboardOut, sel=address[13..14], out=out);
}
  1. За какую нагрузку здесь отвечает. Я понимаю, что если загрузка равна 0 - из Dmux4Way в любом случае будет 0 0 0 0. Но я не понимаю, как это работает в этом случае после этого. А именно, как это позволяет не загружать данные в память.
  2. По крайней мере, непонятно, почему в Screen мы указали адрес [0..12] вместо адреса [0..14] - полный адрес. По моему мнению, мы должны использовать второе, потому что карта памяти экрана остается после карты памяти ОЗУ, и если мы хотим запросить карту памяти экрана - мы должны использовать диапазон (16 384 - 24 575) - десятичный или (100000000000000 - 101111111111111) - двоичный. Но как мы можем представить этот диапазон, используя всего 13 ширин ширины (адрес [0..12])??? Это невозможно.

    Поэтому, если мы хотим представить карту памяти экрана, мы должны использовать диапазон, который был представлен выше. И этот диапазон имеет 15 ширину или адрес [0..14], НО не адрес [0..12] (ширина 13). Но почему работает только адрес [0..12] и не работает адрес [0..14](полный адрес)

DMux4Way (in = load, sel = address [13..14], a = RAM1, b = RAM2, c = scr, d = kbr);

1 ответ

Решение

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

Чтобы ответить на ваши вопросы:
Ad.1.
Вы демультиплексируете один бит (бит загрузки) для исправления части памяти и одновременно вводите ввод данных во все части памяти. Это гораздо более простое и чистое решение, чем делать это наоборот, то есть направлять мультиплексирование 16-битного ввода на правильную деталь вместе с битом загрузки.
Чтобы быть более понятным. У вас есть 2 возможных назначения при записи данных: RAM и Screen. Самый маленький демультиплексор, который у вас есть, это 4-полосный мультиплексор, и это то, что вы используете. Когда вы записываете в память, вам необходимо предоставить 2 части информации, данные и адресата одновременно. Вы можете демультиплексировать ввод данных с DMux4Way16 и отдельно один бит загрузки с DMux4Way, но для этого потребуется 2 демультиплексора, и мы можем добиться большего. Вот что здесь сделано: вы направляете ввод данных в ОЗУ и на экран, а затем используете только один демультиплексор: DMux4Way, чтобы выбрать одно из 2 возможных мест назначения, только одно выбранное будет загружено новыми данными, а для другого ввода данных будет принято. Зная, что вам нужно изучить формат A-инструкции: когда биты 14 и 13 A-инструкции (или данные, находящиеся в A-регистре) имеют двоичное значение 00 или же 01 это будет означать, что местом назначения является RAM. Когда биты 14 и 13 имеют двоичное значение 10 это будет означать, что Экран является местом назначения. Когда вы заметите, что выбираете эти 2 бита как sel для своего демультиплексора. Выборы 0 и 1 имеют одинаковое значение, так что вы можете использовать их ИЛИ и передавать этот вывод в качестве нагрузки в ОЗУ. Выбор 2 означает, что экран будет загружен с новым значением, поэтому бит загрузки идет туда. Вариант 3 никогда не используется, поэтому нас это не волнует - выход d демультиплексора никуда не будет подключен. Мы используем свойство демультиплексора, что выбранный выход будет иметь значение 1, а все остальные выходы будут давать 0 в результате. Это означает, что будет загружен только 1 пункт назначения памяти.
Ad.2.
Экран - это отдельное устройство, здесь он не имеет ничего общего с оперативной памятью, ПЗУ или клавиатурой. Вы и только вы даете значение тому, что значат эти конкретные устройства. Чтобы ответить на ваш вопрос, когда вы обращаетесь к какому-либо регистру на экране, вы обращаетесь к нему в своем собственном внутреннем адресном пространстве. В его внутреннем адресном пространстве первый адрес будет 0, но из всей памяти это будет 16384. Это ваша работа, чтобы сделать этот переход. В данном конкретном случае, размер экрана памяти устройства не обязательно использовать 14-битную адресную шину, 13 бит это все, что вам нужно. Что будет 14-й бит значить в этом случае? Это не добавит никакой ценности. Кроме того, вы пользователь, а не дизайнер экрана, вы только смотрите и следуйте его описанию интерфейса.

Надеюсь, что он отвечает на ваши вопросы, если нет, я призываю вас вернуться и изучить более внимательно предыдущие главы, связанные с аппаратным обеспечением.

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