Проектирование процессора (CPU Design) [First ver.]

  • Tutorial
Это начальный вариант статьи о процессоре, конечный вариант этой же статьи здесь.

Спроектируем в 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). Часто в литературе для доп. кода числа используется термин дополнение до двух (two’s complement), двоичное дополнение или двоичный дополнительный код.

Для хранения чисел будем использовать 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, можно скачать одним файлом.

Статья про создание эмулятора процессора
Ещё статья

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

    +1
    Прочитал и удивился, 155 серия ещё жива.
      0
      Живее всех живых, в гос закупках военные еще и 133 серию закупают, у них прогресс застрял в 70-х. А для данных опытов 155, 555 и рядом с ними самое оно.
        +2
        Я бы не сказал что застрял, просто длительная поддержка своих устройств. ;).
        Новые вполне себе на более-менее современной комплектухе. Съездите в августе на ту же выставку «Армия 2018», там очень даже ничего :)
        Другое дело, что новое очень медленно проходит, так как нужны тесты, сертификация и т.д. и т.п.
          0
          Да ладно, если нужно применить вносят в перечни и сертификаты выписывают почти без тестов, только примитивный входной контроль. Главное, чтобы получилось закупить…
          +1
          Золотая 133 серия это наша версия с приёмкой, аналог 74 серии… Ещё 100+ лет будет использоваться.
            0
            Не знаю насчет приёмки, но мне встречались экземпляры 133 с боязнью темноты :). На свету работает, а в темноте нет. Видимо за счет металло-стеклянного корпуса. Ох и намучился я тогда с ними. Правда давно это было, в 1987…

              0
              Ну не такой он и стеклянный. Вроде металлическая крышечка на керамической «ванночке», так ведь? А как выяснили про боязнь темноты?
                +1
                Случайно. Завинчиваю корпус устройства (а он тяжелый сволочь, чугунный )- не работает, отвинчиваю — работает. И все контрольные точки в порядке. Случайно рукой над корзинкой провел, ближе к вечеру тень от лампы упала- и от опа на. Часов пять проковырялся, золотистых 133 около сотни на каждой плате.
        +1
        Эвм, системы и сети, второй курс .)
          0
          У кого как. У нас на третьем курсе это преподавали)))
          0
          Вспомнил старые добрые МИФИшные стенды на 12 кафедре
            0
            Спасибо за статью. Можно с полной уверенностью сказать: всем желающим разобраться, как работает Ардуино изнутри посвящается.
              0

              Ну то есть вы очевидно даже не понимаете, что такое Ардуино, ибо это таки не процессор вообще.
              Да и реальный процессор намного, намного сложнее чем этот сумматор. И что-бы разобраться реально как он работает явно недостаточно понимать как работает сумматор. Хотя так то всего три элемента, куда уж проще. И, НЕ да ИЛИ.

                +1
                «Попутно, пользуясь поводом, мы пропиарим отличный проект Marsohod.org как раз активно описывающий работу с ПЛИС. Рекомендую зайти к ним в гости и пошариться там. Найдете много интересного. Там есть и всякие пищалки музыкальные, USB устройства, разные протоколы и даже создание упрощенного AVR ядра в недрах ПЛИС, с компиляцией кода под него в AVR Studio :) И это при том, что ПЛИС EPM240T100C5 реально небольшая.»
                ссылка
                  0
                  Интересно, а реально ли построить прототип Ардуино только на трёх типах элементов? Если да, то сколько сотен-тысяч корпусов понадобилось бы?
                  +1
                  Увидел ваш комметарий и вспомнил про это: www.aloriumtech.com/xlr8
                  0
                  удивительно, что этот комок проводов работает без керамики по питанию…
                  ТТЛ же!
                  ps нашел в детстве где то 155ИП3, разобрался по книжке и даже что то считала как надо, но применить куда то в то время не смог. Хотя даже была и статическая память 1 кб, счётчики, мультиплексоры и дешифраторы от ЕС ЭВМ, но больше конечно беспонтовых ЛР*, ЛП* и ЛА*. Тогда кстати и пришло понимание, что без кондёров, толстых шин и витых проводов — ТТЛ не стабильно не живёт
                    0
                    удивительно, что этот комок проводов работает без керамики по питанию…

                    Несколько факторов. Во-первых, всего несколько корпусов. Во-вторых, помех на лабораторном столе может быть намного меньше, чем в условиях реальной эксплуатации. Ну и помех боятся только D-триггеры и более сложные корпуса с их использованием, в схеме с использованием простых логических злементов несколько случайных импульсов на входе (помехи) вызовут несколько импульсов на выходе с мгновенным возвратом в исходное состояние (в отличии от триггера, который изменит своё состояние). По светодиодам этого не заметить. В своё время, когда активно увлёкся цифровой логикой, старался обходиться без триггеров там, где была возможность.
                    0
                    Очень интересный канал. Автор собирает 8 битный процессор, параллельно объясняет устройство. На английском языке.
                    www.youtube.com/user/eaterbc/videos
                      0
                      Год назад собирал демонстрационные схемы, похожие на представленную на первом снимке, но с использованием AND, OR и XOR (SN74ACT08, SN74ACT32 и SN74ACT86) и на большинстве форумов хватались за голову и рекомендовали собрать как минимум что-то вроде этого:

                      image

                      Не подскажете, что почитать для ликбеза совсем уж начинающему строителю схем?

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

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