CPU Design I (First ver.)

    Другой вариант этой статьи здесь.

    Спроектируем в Logisim'е устройство, позволяющие суммировать наборы чисел, хранящихся в памяти. Возьмем набор восьмиразрядных чисел и подключим его к мультиплексору, переход от одного числа к другому будем осуществлять с помощью счетчика, подключенного к выбирающему входу мультиплексора, а к выходу мультиплексора подключим сумматор и аккумулятор. В качестве тактового генератора будем использовать кнопку. Данные будут загружаться в аккумулятор при отпускании кнопки (это осуществляется с помощью элемента НЕ, подключенного к кнопке).



    Далее реализуем операцию «вычитание», и будем хранить наши операции (команды) в отельном массиве. Команда «0» выполняет сложение, а команд «1» — вычитание. Далее эти команды подаются на вход мультиплексора, подключенного к Сумматору и Вычитателю.


    Далее, допустим, нам нужно найти три суммы: трёх слагаемых, двух слагаемых и еще двух слагаемых. Реализуем устройство, позволяющее загрузить в аккумулятор значение из памяти и сохранить в памяти значение из аккумулятора, для этого уберем из схемы Вычииатель, а мультиплексор, который мы использовали для выбора операции, будем теперь использовать для выборки данных из памяти.

    Для того, чтобы реализовать команду «сохранить», в массиве «данные» заменим элементы «Контакт» восьмиразрядными регистрами, добавим демультиплексор (дешифратор) для записи в регистры.

    Увеличим разрядность команд: команда 10 загружает элемент из памяти в аккумулятор,
    команда 00 прибавляет число из памяти к аккумулятору, команда 01 сохраняет в памяти значение из аккумулятора. «Разветвитель» позволяет разделить разряды команды, младший разряд отправить на мультиплексор, старший на демультиплексор.



    Заменим отдельные регистры массивами RAM.

    Будем использовать схему с одним синхронным портом чтения/записи (доступна по умолчанию). Для записи будем использовать управляемый буфер.



    В нашем устройстве коды и данные хранятся в разных блоках памяти (Гарвардская архитектура). Спроектируем устройство, в котором коды и данные будут храниться в одном блоке (архитектура фон Неймана).

    В первых четырех разрядах восьмиразрядной ячейки памяти будет храниться команда, во вторых четырех разрядах будет храниться адрес (абсолютная прямая адресация).

    Будем загружать адрес и команду в отдельные регистры, а затем с помощью мультиплексора переходить по сохраненному адресу. Для записи данных в ОЗУ будем использовать схему задержки подачи импульса на основе сдвигового регистра.

    Команда 3 загружает элемент из памяти в аккумулятор, команда 2 прибавляет число из памяти к аккумулятору, команда 4 записывает содержимое аккумулятора в ОЗУ.

    Вот пример программы, которая складывает три числа (ячейки 8, 9, a) и сохраняет результат в свободную ячейку (ячейку b): 38 29 2a 4b.



    Добавим также возможность совершать безусловные переходы.

    Реализуем устройство, в котором будет выполняться всего одна команда — команда безусловного перехода. Для этого на счетчик, генерирующий адрес, будем отправлять четыре младших разряда (собственно, адрес), а на порт загрузки будем подавать команду, хранящуюся в старших разрядах ячейки памяти.

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



    Добавим это устройство к основной схеме.
    Получившаяся схема позволяет складывать числа (хранящиеся в памяти), а также перепрыгивать на ячейку с определённым адресом.



    Вообще, на geektimes уже была статья, посвященная проектированию CPU в Logisim.

    Все схемы, представленные в статье, можно скачать одним файлом.

    Logisim можно скачать здесь






    Рассмотрим, как работает сумматор на примере микросхемы 155им3 (зарубежный аналог 7483). Для микросхем 155-й серии условимся, что на входах есть внутренний резистор, подтягивающий к плюсу (если ножка «висит в воздухе», то на ней присутствует логическая «единица»), поэтому при подключении питания на микросхему зажгутся все 5 светодиодов, присоединенных к выходу.

    image

    Так выглядит модель микросхемы в Logisim.

    image

    Для того, чтобы в Logisim спроектировать такую микросхему, необходимо выбрать «Меню» — «Проект» — «Добавить схему».

    Вот как эта МС выглядит внутри подсхемы. Это четыре полусумматора, объединённые в полный сумматор.

    image


    В качестве аккумулятора будем использовать микросхему 155тм8 (74175) — счетверённый D-триггер.

    Триггеры, входящие в состав МС, пропускают насквозь всё время, пока на входе синхронизации присутствует 1, а не только по фронту (триггеры со статическим управлением), но в программе Logisim нам доступны только триггеры с динамическим управлением, но в данном случае это не важно; будем использовать то, что есть.

    Подробнее про триггеры можно прочитать в Википедии.

    Соберём из D-триггеров модель МС 155тм8.

    image

    Далее соберём схему, позволяющую складывать наборы чисел.

    Например, если сложить набор из чисел 2 (0010), мы получим 2 (0010), 4 (0100), 6 (0110) и т.д.

    image


    image

    Сперва 2 появляется на выходе сумматора (красные светодиоды), затем 2 загружается в счетверенный D-тригер (желтые светодиоды), а на выходе сумматора появляется 4, затем 4 загружается в 155тм8, а на выходе сумматора появляется 6 и т.д.

    Для того, чтобы спроектировать простой модуль памяти (статической), нам понадобится мультиплексор. Спроектируем сдвоенный мультиплексор 155кп2.

    image

    Также нам понадобится счетчик. Спроектируем микросхему 155ие5.


    Это четырехразрядный счетчик, но нам понадобится только два младших разряда.

    Будем хранить числа, например, 2 (0010), 3 (0011), 5 (0101).

    image



    Объединим все компоненты в одну схему. Будем складывать числа, которые хранятся в памяти
    2 + 3 + 5.



    image

    Далее создадим устройство, позволяющее осуществлять операцию «вычитание». Для того, чтобы вычесть число, его надо сначала перевести в обратный код (заменить все 0 на 1; все 1 на 0), а затем в дополнительный код (прибавить 1).

    Для хранения чисел будем использовать 155ру2 (ОЗУ), для перевода в обратный код будем использовать 155лн2 (шесть Элементов Не). Эти микросхемы имеют выходы с
    открытым коллектором .

    Для МС 155ру2 будем считать, что вход синхронизации и вход разрешения записи объединены в одну линию. Этот (объединённый) вход является статическим, МС пропускает насквозь всё время, пока на входе присутствует 0 (низкий уровень).

    Данные поступают в МС при появлении низкого уровня на этом (объединенном) входе, поэтому повесим Элемент Не к тактовому входу.

    Выходы будут инвертированы, если подключать по схеме, которую я привел выше для выхода с ОК (повесим Элементы Не к выходам), вход выбора кристалла тоже инвертирован, МС осуществляет цикл записи или чтения только при нулевом уровне на этом входе (повесим Элемент Не ко входу выбора кристалла).

    Также МС имеет отдельные входы для адреса и для данных, поэтому при выборе стандартного модуля ОЗУ (Боковое меню — Память — ОЗУ) на вкладке «Интерфейс данных» необходимо выбрать «Раздельные порты чтения и записи».

    Т.о. наиболее близкой к 155ру2 будет такая модель:

    image

    Для выбора числа в прямом или обратном коде будем использовать мультиплексор. Будем хранить числа 8, 4 (в обратном коде), 1.

    image


    image

    Объединим нашу схему с предыдущей и будем из 8 вычтать 4, т.е. 8 + 4 (в обратном коде) + 1.

    image

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

    Спроектируем наши схемы на ПЛИС/FPGA. Будем использовать Quartus II. Бесплатную версию с ограниченным функционалом можно скачать с официального сайта.

    При регистрации в разделе My Primary Job Function is* необходимо выбрать пункт Student.
    Далее необходимо скачать драйвер для программатора (драйвер для usb-blaster'a можно установить из C:\altera\...\quartus\drivers\usb-blaster).

    В среде Quartus создадим новый проект («File»/«New»/«New Quartus II Project») и добавим к проекту Block Diagram/Schematic File («File»/«New»/«Block Diagram/Schematic File»).

    Нам понадобятся сумматор (7483) и аккумулятор (74175).

    Эти микросхемы можно добавить из Symbol Tool:

    image


    Добавив порты ввода-вывода («Symbol Tool»/«primitives»/«pin»), получаем схему, позволяющую складывать набор четырехразрядных чисел.


    Если использовать внешний источник тактового сигнала, тактовую ногу источника надо стянуть к «земле».

    Схемы, спроектированные в Logisim, можно скачать одним файлом.
    Поделиться публикацией

    Комментарии 2

      +1
      за гифку до ката надо…
        +2

        Выпить? Ну, за гифку до ката!

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое