Нажмите "Enter", чтобы перейти к содержанию

Процессор своими руками: проект BMOW 1 / Хабр

Микропроцессор своими руками. Часть 1.1.

Введение

В этой статье приведен пример разработки микроконтроллера в FPGA. Статья может быть интересна как студентам и начинающим разработчикам, так и профессионалам, которые имеют опыт разработки устройств, и в том числе и в FPGA, но по тем или иным причинам не имели возможности разрабатывать и использовать «встроенные в FPGA» микропроцессоры. Дальше приведено два вступления — для студентов и для профессионалов. Хочется чтобы для каждой из этих групп читателей данная статья представляла определенный интерес. Но поскольку мотивация для прочтения этой статьи для двух групп разная, то далее следуют два вступления.

Все статьи цикла:
  • Микропроцессор своими руками. Часть 1.1.
  • Микропроцессор своими руками. Часть 1.2.
  • Микропроцессор своими руками. Часть 2.1.
  • Микропроцессор своими руками. Часть 2.2. Битовый процессор
  • Микропроцессор своими руками. Часть 3.1. Ассемблер и софт-симулятор
  • Микропроцессор своими руками. Часть 3.2. Ассемблер и софт-симулятор
  • Микропроцессор своими руками. Часть 4.1. Как отладить встроенный в FPGA микроконтроллер?
  • Микропроцессор своими руками. Часть 4.2. Как отладить встроенный в FPGA микроконтроллер?
  • Микропроцессор своими руками. Часть 4.3. Как отладить встроенный в FPGA микроконтроллер?
  • Микропроцессор своими руками. Часть 5.1. По поводу начала проекта встроенного в FPGA микроконтроллера
  • Микропроцессор своими руками. Часть 5.2. По поводу начала проекта встроенного в FPGA микроконтроллера
  • Микропроцессор своими руками. Часть 5.3. По поводу начала проекта встроенного в FPGA микроконтроллера
  • Микропроцессор своими руками. Часть 5.4. По поводу начала проекта встроенного в FPGA микроконтроллера

Все файлы, приведенные в данной статье, будут доступны в Интернете на сайте автора
www.iosfk.narod.ru.

Введение для студентов

К написанию этой статьи меня подтолкнуло следующее: моя дочь, которая учится в довольно известном питерском вузе, сейчас «проходит» курс микропроцессоров. Но «проходит» — это именно то слово, которое здесь наиболее уместно. Ибо заучивание слов лектора и скромные «лабы» — так и мы учили когда-то курс ЭВМ. Но чтобы было понятно, о чем идет речь, придется сделать небольшой экскурс в недавнюю, для меня, историю.

Мой опыт работы с ЭВМ начинается с кошмарных воспоминаний о машине, по-моему это был «Проминь», которую установили на нашей кафедре в ЛЭТИ, где я, тогда еще студент четвертого курса, работал на полставки лаборантом. Итак, год, наверное, 1975-й. И курсовики и дипломы с применением расчетов на ЭВМ еще только входили в моду. И вот курсовик «Расчет трансформатора в баке с маслом» — название именно потому и запомнилось, что это была моя первая попытка автоматизировать инженерный труд при помощи ЭВМ, как сказали бы теперь. Мне, как сотруднику кафедры, разрешили провести часть расчетов на ЭВМ. Был написан алгоритм, составлена программа и вот уже получено время для работы на машине. Дальше — беда.

Оказывается что в машине, где команды задавались специальными кодирующими планками, которые нужно было втыкать в специальное наборное поле, не хватает команд умножения для реализации моего алгоритма. Даже после того, как я сбегал на соседнюю кафедру и одолжил там планки для умножения от такого же «Проминя», выяснилось, что не хватает двух команд. Конечно, курсовик был рассчитан на логарифмической линейке.

Вернемся в сегодняшний день. Многие из сегодняшних студентов просто не представляют, насколько стремительно меняется техника. Но в темпе изменения техники должны меняться и приоритеты для инженерного труда, и методики обучения. Так, как учились вчера, уже нельзя учиться сегодня. Сегодня молодой инженер, не умеющий пользоваться ORCAD’ом, PICAD’ом, симуляторами электрических цепей типа Electronics Workbench, не способный описать схему на VHDL и написать сотню строчек кода на С++, достоинтолько сожаления. Если вчера было модно программировать видеоигры, базы данных и бухгалтерские программы, то сегодня рынок уже поменялся.

Сегодня открылся новый огромный рынок — программирование FPGA. Если 2–3 года тому назад программирование FPGA понималось как разработка периферии к стандартным микропроцессорам, то теперь ситуация коренным образом изменилась. Теперь наступило время «систем на кристалле». Более подробно об этом будет написано во введении для профессионалов. Программирование FPGA в скором времени плавно перейдет в разработку заказных микросхем — «систем на кристалле». И первые российские успехи в этом направлении уже есть (см. Л1).

Итак, заканчивая это вступление, нужно сказать следующее. Если вас не учат этому в вашем ВУЗе — требуйте, требуйте также настойчиво, как требуют тушенку в рекламе. Вы имеете на это право. Если вы не научитесь этому сейчас, то дальше догонять других будет очень тяжело. Но, если научиться современным технологлиям в вузе нет возможности, то вспомните, что сказал Скруджу МакДаку его папа: «Скрудж, работай головой, а не руками». Большая часть из программ, выпускаемых крупными и известными фирмами — производителями ПО, имеют студенческую версию, т. е. они совершенно бесплатны. Они доступны на сайтах самих фирм и их дилеров. Что касается Altera, то фирма рассылает CD, на котором есть и студенческая версия ПО, статьи и описания на микросхемы. Для того, чтобы данная статья послужила в полную меру, возьмите книгу Л2. К книге также приложен CD с необходимым ПО и примерами по обучению ПО MAXPLUS.

Введения для профессионалов

Время, скажем так, стандартных микросхем заканчивается. Начинается новое время — время «систем на кристалле». Разработка самих систем, частей таких систем — библиотечных мегафункций или ядер, становится не только заманчивой перспективой, но и реальностью. Причем прибыльной реальностью.Так, по данным из Интернета, фирма, продающая лицензию на свое ядро процессора для телекоммуникаций, получает за каждую продажу лицензии 150 тыс. долл. единовременно, и по 7 долл. с каждой выпущенной поих лицензии микросхемы за первый год выпуска и по 2 долл. с каждой микросхемы за последующие годы. Представьте, что это процессор для сотового телефона или видеокарты, и посчитайте.

За последние полгода технологический рывок изготовителей микросхем привел к тому, что появились микросхемы, способные работать с ядром процессора на частоте до 300 МГц. Ресурс, который можно занять для проекта, так-же вырос. Появились аппаратные блоки, например, процессор ARM7TDMI в микросхемах серии «Экскалибур» или умножители в серии «Стратикс». А это значит, что микропроцессор, реализованный в FPGA, способен составить конкуренцию DSP средней производительности. А при выполнении блоков, выполняющих умножение и деление по заданному пользователем алгоритму, микропроцессор, реализованный в FPGA и ориентированный на конкретную задачу пользователя, будет иметь производительность не ниже, а, может быть, и выше, чем самые быстрые DSP.

Рост популярности того или иного направления можно оценить по количеству сайтов в Интернете, на которых отражаются интересы разработчиков.

Фирмы-производители микросхем предлагают различные ядра, оптимизированные под их продукцию, для встраивания в проекты пользователя, например http://www.altera.com/ipmegastore/index.html.

Фирма Triscend предлагает 40-MHz 8051-ядро на кристалле, с FPGA, доступной пользователю. Аналогичный продукт есть и у фирмы Atmel Corp. — FPSLIC. Более подробное описание по предлагаемым продуктам приведено в Л3, 4.

Фирма Altera предлагает микроконтроллеры на ядре an ARM9T (http://www.arm.com/) или на ядре MIPS32 4K (http://www.mips.com/).

Часть проекта фирмы Altera ™ по встроенным решениям, процессор Excalibur, а также его вариант реализации — программное ядро встроенного процессора Nios ™. Nios — это встраиваемый процессор общего назначения, с перестраиваемой конфигурацией, который легко вписывается в устройство Altera APEX ™, оставляя большинство логики, доступной для размещения там периферийных устройств и пользовательских функций.

Встраиваемое ядро процессора Nios — конвейерный RISC-процессор, в котором команды выполняются за один цикл частоты синхронизации. Более подробно об этом процессоре можно прочитать в Л5 — 13.

Кроме широко известных сайтов фирм-производителей, появились и поддерживаются и наши, российские сайты, такие, как www.asicdesign. ru, белорусский http://nit.gsu.unibel.by/IEESD-2000.

Проекты и их части перепродаются как интеллектуальная собственность, то есть они становятся товаром. Сайт по перепродаже проектов — http://www.hellobrain.com/.

Но вместе с тем существуют и развиваются некоммерческие центры, такие, как сайты предлагающие открытые проекты, — и www.opencores.org. Есть также и сайты, поддерживающие разработку именно процессоров в FPGA http://www.fpgacpu.org/.

Рост интереса к разработке именно процессоров отражением в росте публикаций открытых проектов на сайте www.opencores.org. Сейчас там предлагается 35 проектов микропроцессоров от крошечного tiny8 до 32-битного Yellow Star.

Что же касается российских разработчиков и разработчиков стран СНГ, то здесь несколько иная ситуация. Фирмы-производители микросхем имеют программу по поддержке партнеров-разработчиков ядер (мегафункций). Это и реклама, и сервис, и многое другое. Но для российских разработчиков попасть в партнеры пока еще практически невозможно, и это резко ограничивает их возможности.

Преимущество микроспроцессора, «встроенного в FPGA»

«Встроенные в FPGA» микропроцессоры и микроконтроллеры на их основе имеют главное преимущество перед обычными микроконтроллерами средней производительности: они абсолютно синхронны со всем остальным проектом, расположенным в этой же микросхеме. Если устройство, которое вы проектируете, работает в реальном времени и с большими потоками данных, которые вы должны извлекать из периферии и отдавать в периферию, то задача синхронизации становится достаточно серьезной.

Все быстрые «мелкие» микроконтроллеры работают асинхронно (относительно периферии в Altera), и не имеют аппаратного входа «Готовность», поэтому они могут синхронизироваться с периферией только программно, а для программной привязки их к синхронному проекту в Altera нужно, во-первых, несколько команд процессора, что займет несколько тактов синхрочастоты, во-вторых, это также требует ресурса микросхемы FPGA и, в-третьих, занимает довольно много места на плате.

Быстрые «крупные» процессоры имеют возможность аппаратной синхронизации по входу «Готовность», но дороги и занимают еще больше места на плате. Да и применение «крупного» процессора для небольших задач нецелесообразно. А это значит, что при том же быстродействии ядра процессора получится выигрыш по производительности в 2–3 раза.

Следующее преимущество — специализированные команды пользователя. Это значит, что проектируя микроконтроллер, пользователь может произвести предварительное программирование и определить в потоке команд, выполняемых процессором, группы наиболее часто повторяющихся команд. Если теперь группу таких команд объединить в одну специализированную команду, то быстродействие процессора для данного класса задач увеличится, а программировать его станет легче. Специализированные команды пользователя (см. например, описание команд процессора NIOS), могут быть однотактные или мгоготактные. Они могут выполняться в ALU микропроцессора или в дополнительном вычислительном блоке, подключаемом к ALU, например FFT, FIR и т.

д.

Еще одно преимущество — микроконтроллер становится «невидимым». То есть микроконтроллер конечно есть, просто увидеть его уже нельзя. Это не шкаф, не каркас, не набор плат и даже не корпус микросхемы. Это теперь просто файл, который входит в другой файл. Но что удивительно, свои функции он выполняет не хуже, а часто лучше, чем его «старший брат».

И последнее, что необходимо отметить — микроконтроллер получает ту периферию и в таком количестве, как нужно пользователю.

Периферия же может быть самой экзотической: от простого UART’a и до контроллеров Ethernet MAC 10/100 или сопроцессоров DSP.

Среди библиотечных элементов, описывающих периферию для микропроцессора, доступны следующие:

  • универсальный Асинхронный Приемопередатчик (UART),
  • таймер,
  • параллельный ввод — вывод (PIO),
  • интерфейс SRAM,
  • SDRAM-контроллер,
  • интерфейс FLASH памяти,
  • последовательный периферийный интерфейс (SPI),
  • контроллер I2C,
  • модулятор ширины импульса (PWM),
  • IDE-контроллер диска,
  • контроллер Локальной сети 10/100 Ethernet (MAC),
  • контроллер USB.

Конечно, этот список далеко не полный, но он дает представление о том, какой уровень разработок библиотечных элементов достигнут. Подключив требуемые библиотечные элементы, можно сформировать необходимый для конкретного применения микроконтроллер.

У нас же есть конечный автомат, зачем нам что-то еще?

Часто можно услышать такие рассуждения: «Для обработки чего-то сложного 16-битного или 32-битного, конечно, применим процессор. Но вот для чего-то мелкого зачем нам эти программы, ассемблеры и т. д. У нас же есть конечный автомат, ну и еще пригоршня триггеров. Обойдемся и этим».

Чтобы сравнить микроконтроллер с конечным автоматом, необходимо сравнить трудоемкость следующих работ:

  • Чтобы в новом проекте реализовать заданную последовательность действий, можно либо каждый раз заново создавать конечный автомат, либо взять уже готовый микроконтроллер, адаптировать его к заданным условиям, и, написав небольшую программу, запустить. Причем написание программы для микроконтроллера намного проще написания конечного автомата на языках AHDL, VHDL и так далее.
  • Чтобы изменить алгоритм работы конечного автомата, необходимо его полностью переписывать, что требует много времени и сил, в микроконтроллере достаточно изменить микропрограмму.
  • Чтобы исправить ошибку в конечном автомате, необходимо переработать весь проект, в котором описан автомат, а в варианте микроконтроллера можно только переписать программу.
  • Конечный автомат должен иметь ограниченное количество состояний, так как это требует дополнительных логических ячеек, в то время как микроконтроллер по количеству состояний ограничен только объемом памяти программ, а это на несколько порядков больше.
  • И последнее, но очень существенное добавление. Конечный автомат при увеличении количества состояний становится все более и более медленнодействующим, так как рост числа дополнительных логическихячеек приводит к увеличению времени прохождения сигнала. Каждое изменение автомата может привести к необходимости повторной верификации проекта.

Команды, выполняемые микропроцессором, определены по времени выполнения и не зависят от программы, выполняемой на данном процессоре.

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

Если интерес к этой теме еще не пропал, то не стоит дожидаться, пока статический автомат в ваших устройствах разрастется в жуткого «монстра», при доработках и отладках, и от него придется отказаться. Тогда все остальное в этой статье тоже должно быть интересно и для вас.

Здесь конец лирике и начало проекта

Материал, приведенный в данной статье, написан на основе реальной разработки, описанной в Л14. Упрощенная модель микропроцессора, описанная в данной статье, служит только примером для разработки или изучения. Но тем не менее, она может быть легко доработана для практического использования.

Методика разработки позволяет оценить трудоемкость, определить ресурс, необходимый для реализации микроконтроллера в FPGA. Весь процесс разработки будет состоять из следующих этапов:

  1. Разработка задания на проектирование.
  2. Разработка блок-схемы микропроцессора.
  3. Разработка полей кодов операций.
  4. Разработка кодов команд.
  5. Описание на AHDL блоков, входящих в микропроцессор.
  6. Описание микропроцессора на AHDL.
  7. Написание микропрограммы.
  8. Симуляция микропроцессора с микропрограммой.
  9. Выводы.

Что мы хотим получить?

Известный герой детских сказок любил сначала закапывать деньги, а потом долго не мог вспомнить, что он делал накануне вечером и куда делись деньги. Чтобы у нас с вами такого не произошло, попробуем сначала «нарисовать известное поле». На старом языке этот этап назывался разработкой технического задания. Итак, мы хотим спроектировать:

  1. RISC-процессор, потому что не хочется делать разборку многословных команд. Пусть все наши команды выполняются за один такт синхрочастоты.
  2. Применим для процессора Гарвардскую структуру. Будем считать, что загрузка памяти команд нам не нужна и все команды будут храниться в памяти команд, что и происходит при инициализации микросхемы. Назовем память команд — Program Space (PS). Ограничим область адресов PS 16 битами. Далее возможна страничная адресация памяти, но для большинства случаев и этого уже будет достаточно. Для конкретной реализации микропроцессора введем параметр, описывающий разрядность шины адресов PS.
  3. Расположим память данных в отдельной области памяти. Назовем ее Data Space (DS). Ограничим область адресов DS также 16-ю битами. Для конкретной реализации микропроцессора введем параметр, описывающий разрядность шины адресов DS.
  4. Представим область ввода-вывода в виде набора регистров, дадим им номера 0..15.
  5. Для реализации режима реального времени потребуется вход запроса прерывания — IRQ.
  6. Чтобы отрабатывать прерывания и вызовы подпрограмм, нам будет необходим стек.
  7. Необходимо задать разрядность шины данных. Выберем для определенности разрядность, равную 16 битам.
  8. Будем считать, что системный сигнал СБРОС, действующий внутри кристалла, будет применяться и для нашего микропроцессора.

Построение ядра микропроцессора

Для упрощения положим, что:

  • аккумулятор/регистр общего назначения будет один,
  • область DS будет состоять из одного регистра,
  • область ввода-вывода тоже будет состоять из одного регистра,
  • применим самую простую структуру выборки данных из памяти, то есть асинхронную выборку и без конвейера команд,
  • будем считать, что вход запроса прерывания выставляется синхронно с тактовой частотой и длительность входа запроса — 1 такт синхрочастоты.

Данные упрощения сделаны только для сокращения текстов описаний, так как в рамках журнальной статьи приводить обширные описания довольно затруднительно. Тем не менее, счетчик адресов DS полностью аналогичен счетчику адресов PS. Увеличение количества регистров связано только с увеличением описания в области дешифратора управляющих сигналов, которые вырабатываются при операциях записи в эти регистры и с мультиплексором выходных шин от регистров на внутреннюю шину микропроцессора.

Вход запросов прерывания обычно обслуживается контроллером прерывания, который фиксирует запрос по фронту или по уровню и выставляет вектор прерывания. Контроллер прерывания может быть рассмотрен отдельно и не является необходимым звеном для данного проекта. Таким образом, приведенные сокращения не должны оказывать существенного влияния на излагаемый материал.

На основании задания и сделанных упрощений на микропроцессор получим архитектуру, показанную на рис. 1.

Микропроцессор состоит из набора следующих блоков:

Узел контроля для выработки управляющих воздействий на все блоки микропроцессора — ALU,
Счетчика адресов памяти программ — PS_CNT,
Блока памяти программ — PS,
Блока памяти данных — DS,
Стека — Stack,
Регистров — Rg0 и Rg1.

На входы микропроцессора подадим сигнал синхрочастоты — CLK и сигнал запроса прерывания — IRQ.

Системный сигнал СБРОС подается на микропроцессор, так же как и на все остальные блоки системы (здесь он не показан).

Выходами микропроцессора будут сигналы с выходов регистров Rg0 и Rg1.

Счетчик команд, при загрузке микросхемы или при инициализации системы по сигналу СБРОС, устанавливается в состояние 0 и далее производит счет адресов памяти программ.

Адреса поступают на вход блока PS. Данные, хранящиеся в памяти программ, выбираются в соответствии с поступившим адресом.

Далее данные с выхода PS поступают в ALU.

Для ALU — это будут коды команд микропроцессора. Блоки DS, Stack, Rg0 и Rg1 обмениваютя сигналами с блоком ALU по одной внутренней шине данных.

Сигнал со входа IRQ поступает на ALU и дешифрируется в ALU как код команды, причем сигнал IRQ имеет приоритет в выполнении над кодом команды, поступившим в ALU от PS.

Выберем команды, отвечающие нашим задачам

Опишем группы команд, которые должен исполнять микропроцессор.

  1. Служебные команды:

    NOPНет операции

  2. Группа команд загрузки:

    LDI Reg, < C >Загрузка в регистр. приемник константы – (данных из памяти команд по текущему адресу )

  3. Группа команд пересылки:

    MOV Reg, RegЗапись содержимого одного регистра в другой
    MOV Reg, [Mem]Запись содержимого регистра в память
    MOV [Mem], RegЗапись из памяти в регистр

  4. Команды ветвления:

    JMP AddrПереход по абсолютному адресу
    CALL AddrВызов подпрограммы (с записью адреса возврата в стек)
    RETВозврат из подпрограммы (по содержимому стека)

Для изучения принципов работы микропроцессора, такого набора команд будет достаточно. На практике набор команд можно дополнять и расширять до необходимого для выполнения конкретного набора задач пользователя. Арифметические операции убраны из списка команд, так как выполнение математических операций в FPGA достаточно описано, и в рамках данной статьи они не рассматриваются.

Определим поля команд

Чтобы определить поля команд необходимо определить наибольшее требуемое поле для выполнения заданных команд. Очевидно, что для данного набора команд самое большое поле требуется для команды MOV Reg, [Mem] и MOV [Mem], Reg. Поле [Mem] — имеет разрядность 16 бит, поле Reg — 4 бита (для 16 регистров). Поэтому выберем разрядность памяти PS — 24 бита. Тогда команда непосредственной записи из памяти в регистр будет выглядеть так:

23….Коп – 4 бита…2019…..Reg – 4 бита …1615 …Mem – 16 бит.. 0

Команда MOV Reg, Reg пересылки из регистра в регистр будет выглядеть так:

23….Коп – 4 бита…2019…. .Reg – 4 бита …163 … Reg – 4 бита.. 0

Команда LDI Reg < C > — непосредственная загрузка в регистр-приемник данных из памяти команд по текущему адресу:

23….Коп – 4 бита…2019…..Reg – 4 бита …1615 …Const – 16 бит.. 0

Команда JMP Addr — команда безусловного перехода по абсолютному адресу будет выглядеть так:

23….Коп – 4 бита…2015 …Mem – 16 бит.. 0

Команда CALL Addr — команда безусловного вызова подпрограммы по абсолютному адресу будет выглядеть так:

23….Коп – 4 бита…2015 …Mem – 16 бит.. 0

Команда RET команда безусловного возврата из подпрограммы или из прерывания будет выглядеть так:

23…. Коп – 4 бита…20

Команда NOP — «Нет операции» будет выглядеть так:

23….Коп – 4 бита…20

Итак, нам нужно получить восемь команд для микропроцессора, и, как мы видим, поле кода операции разрядностью в 4 бита позволяет иметь 16 команд. Необходимо отметить, что для более мощных процессоров выбор полей кодов операций — очень серьезная задача, которая и определяет, насколько эффективным будет процессор для конкретного набора команд.

Определим коды операций команд

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

Наиболее просто определить код команды NOP — здесь нет никаких требований, кроме одного — этот код команды должен быть на входе ALU при получении им сигнала «СБРОС». Так как дальнейшее развитие проекта неминуемо приведет к конвейеризации и прочим профессиональным «хитростям», то рекомендуем выбрать код команды NOP = 0.

Чтобы несколько упростить визуальное восприятие команд, применим следующую кодировку: пусть команды переходов будут расположены в зоне кодов от 8 до H»F». Тогда шестнадцатиричные коды операций команд будут такие:

0 — NOP
1 — JMP
2 — CALL
3 — RET
8 — MOV Reg, Reg
9 — MOV Reg, [Mem]
А — MOV [Mem], Reg
B — LDI Reg < C >

Примеры кодов команд

Команда NOP будет иметь код 000000, а JPM 1234 — команда безусловного перехода по адресу 1234 — будет иметь код команды — 101234, MOV 9, 5 — команда пересылки данных из регистра 5 в регистр 9 будет иметь вид 890005 и т. д.

Определим требования к стеку

Для данной задачи применим стек глубиной 8 вложений и разрядностью равной разрядности шине адресов PS. Реализуем стек в отдельной от PS и DS области — на массиве регистров.

Определим требования к прерываниям

Применим следующее решение: при поступлении запроса прерывания будем выполнять переход по фиксированному адресу с занесением адреса возврата в стек.

Определим требования к программному обеспечению

Одним из основных требований к разработке встроенного ПО для микроконтроллеров является требование о необходимости инструментального ПО, то есть нам будет, как минимум, необходим редактор и ассемблер. Для более сложных проектов могут потребоваться симуляторы работы программы, языки высокого уровня, операционные системы и т. д.

Что касается редактора, то существуют такие редакторы, как EditPlus2 (
http://www.editplus.com), Prisma, и другие редакторы текста, позволяющие выделять ключевые слова по списку, формируемому пользователем.

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

Однако, и довольно часто, разработчики применяют систему команд тех микропроцессоров к которым они привыкли и к которым уже существуют инструментальные средства разработки ПО. Здесь на первом месте микропроцессоры с системой команд MCS-51, а на втором месте PICmicro. Для этих микропроцессоров имеются как средства разработки, так и огромные библиотеки разработанных программ.

Поскольку проект, описываемый здесь, посвящен только описанию микропроцессора, то дальнейшее описание требований к инструментальному ПО мы опускаем. Будем считать, что у нас есть ассемблер, который преобразует мнемонические коды команд в машинные коды и формирует файл инициализации памяти команд, совместимый с ПО MaxPlus.

Заключение по этапу разработки задания

Мы произвели разработку задания на микропроцессор, выполняющий основные функции, такие, как пересылки данных, ветвление программы, обработка прерываний.

Продолжение следует.

1.2. Процессор– 25.12.2020 – Компьютер своими руками

Эксперты от уфологии на полном серьезе доказывают, что отсчет компьютерной эры надлежит вести с 1949 г., когда в небе над Нью-Мексико сошла с рельсов и грохнулась на землю знаменитая «летающая тарелка». Якобы, именно при потрошении остатков оной и были найдены те загадочные детальки, которые позднее превратились благодаря шаловливым ручонкам инженеров из Intel в первые микропроцессоры. Следует, правда, признать, что земные ученые отлично замаскировались: поначалу, для отвода глаз, им пришлось изобрести транзисторы, затем — интегральные схемы…

processor

А уже потом, выждав почти четверть века, явить народу его величество микропроцессор! Допустим, так оно и было. И инопланетяне были (вскрытие их тел даже вроде бы было запечатлено на кинопленку, и сегодня соответствующий фильм продается едва ли не в каждом киоске), и инопланетные же процессоры. Правда, трудно представить себе НЛО, чьим управлением заведуют устройства, аналогичные первым процессорам Intel-4004. Но, может быть, поэтому и грохнулась тарелочка? Не будем спорить с уфологами — занятие это не только утомительное, но и бесполезное. А потому остановимся на голых фактах: в 1970 г. мудрый доктор Хофф (американцы несколько фамильярно зовут его Тэдом, но нам не помешает знать полное имя — Маршиан Эдвард Хофф) с командой инженеров из Intel сконструировал первый микропроцессор. Во всяком случае, так принято считать — хотя в действительности еще в 1968 г. инженеры Рэй Холт и Стив Геллер создали подобную универсальную микросхему SLF для бортового компьютера истребителя F-14. Но их разработка так и осталась в хищных когтях ястребов из Пентагона, в то время как детище Intel ждала иная судьба. Изначально процессор 4004 предназначался для микрокалькуляторов и был изготовлен по заказу японской компании Busicom. Правда, ввиду финансовых трудностей от выпуска калькулятора на основе микропроцессора японцы отказались, и разработка перешла в собственность не ожидавшей такого счастья Intel! Появление микропроцессоров изменило весь рынок микроэлектроники, и именно они способствовали появлению тех самых компьютеров, с которыми мы работаем сегодня! парадоксально, но практически сразу после появления микропроцессоров Intel утратила майку лидера в этой области: в брюшке первых персональных компьютеров, обжились «камешки» производства не Intel, а ее многочисленных конкурентов! Прежде всего Zilog и Motorola — именно эти компании были подлинными королями процессорного рынка 70-х. В частности, на мотороловском процессоре работал знаменитый «Альтаир», сбивший с пути истинного юного Билла Гейтса (кто знает, во что могла бы превратиться эта лопоухая коллекция веснушек, не встреться на его пути неказистый ящик с кучей лампочек и тумблеров!).Сама же Intel тоже получила шанс урвать свой кусок от пирога — но на этот раз синяя птица пролетела мимо руководства корпорации незамеченной. Однажды в дверь кабинета Гордона Мура, президента Intel, робко поскребся один из сотрудников. И, заикаясь от волнения, предложил шефу сварганить на основе ставшего популярным камешка недорогой компьютер. Совсем маленький — чтобы на столе помещался!— Позвольте спросить, и кому же пригодится эта фиговина? — вскинул бровиБольшой Босс.— Ну… — замялся новоявленный гений, — домохозяйкам, к примеру. Они в нем рецепты будут хранится— А может, еще барбекю на камешке жарить? — саркастически ухмыльнулся Мур. И, указав выскочке на дверь, вновь уткнулся в изучение графика поставок. Свою ошибку Мур и его коллеги поняли очень скоро. Но с лихвой наверстали упущенное, «сосватав» свой процессор Intel 8088 компании IBM. Плодом этого романа стал знаменитый компьютер IBM PC, вознесший на вершины славы Microsoft и Intel… Словом, всех, причастных к его созданию — за исключением самой IBM.Первый процессор работал на частоте всего 750 кГц. Сегодняшние процессоры от Intel быстрее своего прародителя более чем в десять тысяч раз, а любой домашний компьютер обладает мощностью и «сообразительностью» во много раз большей, чем компьютер, управлявший полетом космического корабля «Аполлон» к Луне. Недаром тот же Гордон Мур говорил: если бы автомобили развивались так же быстро, как процессоры, то сегодня на одном литре бензина мы могли бы проехать миллион километров, а сам автомобиль было бы дешевле выбросить, чем платить за парковку! Вообще-то процессор в компьютере не один: собственным процессором снабжена видеоплата, звуковая плата, множество внешних устройств (например, принтер). И часто по производительности эти микросхемы могут поспорить с главным, Центральным Процессором. Но в отличие от него, все они являются узкими специалистами — один отвечает за обработку звука, другой — за создание трехмерного изображения. Основное и главное отличие центрального процессора — это его универсальность. При желании (и, разумеется, при наличии необходимой мощности и соответствующего программного обеспечения) центральный процессор может взять на себя любую работу, в то время как процессор видеоплаты при всем желании не сможет раскодировать, скажем, музыкальный файл Любой современный процессор состоит из сотен миллионов отдельных электронных переключателей-транзисторов, соединенных между собой по специальной схеме. Трудно представить, что такое сложное устройство можно изготовить человеческими руками: легендарный левша — и тот умер бы от зависти! На самом деле процессоры из отдельных транзисторов, конечно, никто не собирает — это было бы просто невозможно. Для их изготовления используется выращенный по специальной технологии кристалл кремния, в который внесены специальные добавки. После изготовления пластину покрывают тонким слоем диэлектрика — оксида кремния, который в свою очередь покрывается светочувствительным лаком с особыми свойствами — фоторезистом. Затем на этот лак, как на обычную фотопленку, переносится со специального фотошаблона схема будущего
процессора. Во время экспонирования (засветки с помощью ультрафиолетовых лучей) фоторезист изменяет свои свойства: в зависимости от его типа засвеченные (или наоборот, не засвеченные) участки образуют устойчивый к внешним воздействиям защитный слой. Лак на незащищенных участках впоследствии протравливается, а в образовавшиеся «раны» на теле пластины добавляются специальные примеси, проникающие в кристаллическую решетку кремния. Полупроводниковый слой готов Но одним слоем дело не ограничивается: поверх напыления вновь наносится фото резисторный лак — и процесс повторяется снова и снова… Для связи отдельных слоев друг с другом используются ионы металлов: заполняя специально оставленные для них канавки, они образуют металлические дорожки-проводники. Похоже на слоеный пирог — а если вспомнить, что на каждой пластине помещается множество «клеточек», которые потом превратятся в отдельные процессоры, неудивительно, что такую пластину называют «вафлей»! На завершающем этапе «вафлю» разрезают на отдельные кристаллы: какая-то их часть идет в брак, а остальные — тестируются и, в зависимости от своего качества, маркируются как процессоры с определенной тактовой частотой. Можно сказать, что крохи-транзисторы (напомним, что их размер в современном процессоре в тысячу раз тоньше человеческого волоса) наделяют компьютер способностью «думать». Точнее — вычислять, производя определенные математические операции с числами, в которые преобразуется любая поступающая в компьютер информация. Однако это будет не совсем правильно: ведь сами транзисторы способны лишь работать переключателями, пропуская или задерживая бегущий по каналам процессора ток! Поэтому чтобы понять, как процессор может обрабатывать информацию, нам нужно будет познакомиться с основными логическими блоками. С логической точки зрения процессор состоит из множества обрабатывающих информацию ячеек. Хранить такая ячейка может от 1 до 8 байт информации (комбинация из двух байтов иначе называется «машинным словом»). Впрочем, далеко не
все регистры заняты обработкой данных: часть из них, так называемые «адресные» и «сегментные» регистры, занимаются «пропиской» данных в ячейках памяти, другие регистры отвечают за самодиагностику процессора… Словом, внутри каждого «камня» существует целый город, каждый житель которого четко знает свои обязанности. Вроде бы все понятно, однако пока что вы не получили ответа на главный вопрос: каким образом процессор взаимодействует с программной начинкой нашего компьютера? Для того чтобы объяснить это взаимодействие, попробуем представить себе компьютер в виде большой кухни, где есть повар, плита и продукты, из которых готовятся блюда. Задачи программы (которая в этой кухне работает поваром) —подготовить данные (продукты) для кулинарной обработки на плите-процессоре. Подобно тому, как повар шинкует и нарезает кубиками овощи, программа переводит данные на язык понятных процессору инструкций. Один большой процесс, будто сложение двух чисел или воспроизведение музыкальной композиции, разбивается на множество кусочков-операций. На уровне процессора это выглядит просто «считать информацию, проживающую в памяти по такому-то адресу, переместить ее в такой-то регистр». Каждый кусочек информации проходит через своеобразный конвейер, где каждый «рабочий» выполняет только одну простую операцию.
На выходе прошедшие через «кулинарную обработку» данные вновь передаются программе-повару, которая умело сервирует всю эту стряпню и подает ее на красивой тарелочке на ваш стол. Впрочем, один процессор, каким бы могучим он не был, с обработкой информации справиться не в состоянии: для этого ему нужно общаться со множеством других компьютерных устройств: жестким диском, оперативной памятью и т. д. Для
этого в компьютере существует специальная скоростная магистраль, по которой данные передаются к процессору и обратно — она называется «шиной». С ее работой мы подробнее познакомимся в главе, посвященной системным платам.Но все же, когда речь заходит о покупке нового компьютера, то первым делом мы смотрим именно на процессор: от его выбора зависит очень и очень многое! А вы-
бор этот сделать порой не просто: сегодня на рынке можно найти десятки моделей процессоров. И у каждого из них есть свои особенности и отличия в скорости, архитектуре… И, конечно, в цене. Поэтому нам с вами просто необходимо понять, чем же отличаются друг от друга разные процессоры?
Начнем с семейства процессоров. То есть — с производителя. Вы уже знаете, что через пару лет после изобретения процессора у Intel появились шустрые конкуренты — рынок есть рынок! Одни из них, такие как Motorola, VIA, Cyrix — потихоньку сошли со сцены. А вот компания AMD осталась: сегодня ее процессоры конкурируют с изделиями Intel фактически на равных. Лидеры в гонке постоянно меняются: если в середине нынешнего десятилетия перевес был на стороне AMD, то сейчас «лидерская майка» принадлежит Intel. Несмотря на то, что в основе процессоров и Intel и AMD лежат схожие принципы (иначе они не были бы совместимы на программном уровне!), «железа» каждый из них требует разного. Как минимум, системная плата, а иногда и память «заточены» под конкретный тип процессора. Установить процессор от AMD на плату для Core 2 Duo вы, при всем желании, не сможете (хотя лет десять назад это было вполне возможно). Более того, даже процессоры одной фирмы часто создаются под совершенно разные «гнезда»: в большинстве случаев это сделано из чисто маркетинговых соображений, чтобы вынудить покупателя при смене процессора покупать еще и новую системную плату. Реальной необходимости в таком разнообразии гнезд, как и процессоров, нет никакой: к примеру, разница в производительности между старыми процессорами Core 2 Duo и новыми Core i7 в большинстве задач не превышает 10 %. При этом разница в стоимости этих двух платформ составляет чуть ли не 400 долларов! Совет: если вам необходим игровой компьютер среднего уровня, присмотритесь по- пристальней к изделиям с логотипом AMD на корпусе. Конечно, процессоры AMD несколько уступают Intel по реальной производительности при той же тактовой частоте — однако это отставание нивелирует серьезная разница в цене всей «платформы» (процессор плюс системная плата). Сэкономленные средства лучше потратить на более производительную видеоплату, что может здорово прибавить прыти всей системе в целом. С другой стороны, системы для серьезных вычислений или обработки видео, а также экстремального «гейминга» лучше строить на основе топ-моделей Intel. Если не в видео, ни в игрушках вы не заинтересованы, то все эти виртуальные баталии Intel и AMD вам будут совершенно неинтересны. То же самое относится и к ноутбукам.

1.2.1.Поколения и модификация процессоров

1.2. Основные понятия

Собрать собственный процессор? Это легкая часть!

Вы хотите собрать свой собственный процессор? Это очень весело, но вы можете обнаружить, что это не так сложно, как вы думаете. За эти годы я сделал несколько ЦП, и нет недостатка в других нестандартных ЦП, начиная от довольно серьезных попыток и заканчивая компьютерами, сделанными из дискретных микросхем, и компьютерами, сделанными с реле. Не хочу упрощать попытку, но настоящая проблема не в процессоре. Это инфраструктура.

Какая инфраструктура?

Я полагаю, что святым Граалем было бы загрузить ваш собственный процессор в полноценную систему Linux. Это достаточно большая работа, которую я еще не делал. Хотя вы можете быть более продуктивным, чем я, вам, вероятно, нужно определенное количество сна, и поэтому вы можете подумать, действительно ли вы можете сделать все это за разумное время. Например, многие нестандартные ЦП не работают под управлением интерактивных операционных систем (или любой другой операционной системы, если уж на то пошло). В крайних случаях пользовательские процессоры не имеют никакой инфраструктуры, и вы программируете их в прямом машинном коде.

Машинный код подвержен ошибкам, поэтому вам действительно нужен ассемблер. Если вы работаете на большой машине, вам может понадобиться компоновщик. Кодирование на языке ассемблера через некоторое время становится утомительным, поэтому, возможно, вам нужен компилятор C (или какой-либо другой язык). Отладчик? Что насчет операционной системы?

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

Получение инфраструктуры?

Самый простой способ получить инфраструктуру — украсть ее. Но это означает, что ваш ЦП должен быть совместим с каким-либо другим доступным ЦП (например, OpenSparc или OpenRisc), и что в этом интересного? Тем не менее, в Интернете полно клонов процессоров, которые работают таким образом. Что хорошего в клонированном процессоре? Предположительно, разработчик хочет использовать именно этот процессор, но хочет интегрировать его с другими элементами для создания системы на кристалле. Конечно, иногда люди просто хотят подражать старой машине, и это тоже может быть весело.

В общем, привлекательность разработки собственного процессора заключается в том, чтобы сделать его своим. Может быть, вы хотите поэкспериментировать со странной архитектурой набора инструкций. Возможно, у вас есть идея, как минимизировать зависания процессора. Или вы могли бы быть как я и просто хотеть компьютер, который моделирует то, как вы думаете, лучше, чем любая коммерческая альтернатива. Если да, то что вы делаете? Можно попробовать портировать инфраструктуру. Это что-то среднее между воровством и созданием с нуля.

Портативные опции

Вариантов портативных ассемблеров довольно много. Предполагая, что ваш процессор не выглядит слишком странно, и вы не возражаете против традиционных соглашений ассемблера о метках и символах, вы можете рассмотреть TDASM или TASM. У меня есть свой вариант, AXASM, и я расскажу о нем подробнее в ближайшем будущем.

Язык ассемблера хорош, но вам действительно нужен язык высокого уровня. Конечно, вашей первой мыслью будет портирование gcc, который является отличным компилятором C и C++ (среди прочего). Есть хорошие новости, плохие новости и худшие новости. Хорошей новостью является то, что gcc сделан переносимым, если ваша архитектура соответствует некоторым предопределенным понятиям (например, как минимум 32-битные целые числа и плоское адресное пространство). Плохая новость заключается в том, что сделать порт довольно сложно. Худшая новость заключается в том, что существует лишь ограниченное количество документации, и большая ее часть очень устарела.

Тем не менее, это возможно. Для создания кросс-компилятора необходимо создать всего три вещи:

  • Описание машины
  • Коллектор машины
  • Некоторые функции станка

Однако их создание довольно сложно и использует нотацию, подобную Lisp, которая не всегда интуитивно понятна. Если вы хотите заняться этим, есть несколько интересных документов. Там очень хороший обзор слайд-шоу, очень устаревшая официальная документация и магистерская диссертация какого-то парня. Однако будьте готовы читать много исходного кода и экспериментировать. Тогда вы, вероятно, также захотите портировать gdb, что тоже нетривиально (см. видео ниже).

Существуют и другие компиляторы C. В проекте llvm есть clang, который вам может показаться немного легче портировать, хотя я все же не считаю его тривиальным. Компилятор lcc появился в виде книги в 1995 году. Он использует iburg для генерации кода, и этот инструмент может быть полезен и в некоторых других проектах по ретаргетингу. Хотя компилятор vbcc обновляется нечасто, документация по его серверной части выглядит очень хорошо, и кажется, что это один из самых простых компиляторов для переноса. Существует портативный компилятор C, PCC, весьма почтенный. Я видел, как люди переносили некоторые варианты «маленьких C» на другой процессор, хотя, поскольку они не являются стандартными C, их использование ограничено.

Имейте в виду, что перенос gcc – это нечто большее, чем просто компилятор C. Вам нужно будет определить свой ABI (бинарный интерфейс приложения; в основном, как организована память и передаются аргументы). Вам также потребуется предоставить хотя бы некоторую загрузочную библиотеку C, хотя вы сможете перепрофилировать большую часть стандартной библиотеки после того, как компилятор заработает.

Так что, возможно, компилятор C — это слишком. Есть и другие способы освоить язык высокого уровня. Создание работающей JVM (или другой виртуальной машины) позволит вам кросс-компилировать Java и, вероятно, в целом потребует меньше усилий. Тем не менее, это не так просто, и производительность вашей JVM, вероятно, даже близко не будет к скомпилированной программе. Я обнаружил, что версии Форта легко запустить. Jones on Forth — хорошее место для начала, если вы сможете найти его резервную копию.

Если вы стиснете зубы и создадите компилятор C, следующим препятствием станет операционная система. Большинство сборок Linux предполагают, что у вас есть расширенные функции, такие как управление памятью. Есть версия uClinux, которую портировать немного проще. Возможно, вам лучше взглянуть на что-то вроде Contiki или FreeRTOS.

Немного реализма

Создание нового процессора — занятие не для слабонервных и, вероятно, не лучший выбор для первого проекта ПЛИС. Иногда просто получить приличную переднюю панель может быть проблемой (см. видео ниже), не говоря уже о компиляторах и операционных системах.

Самостоятельная загрузка новой системы в полноценный Linux-монстр потребует от одного хакера много работы. Это может быть более подходящим для команды хакеров. Возможно, вы сможете разместить свой проект на Hackaday. io.

Тем не менее, если вы не можете собрать следующий 128-битный суперскалярный ЦП за выходные, это не значит, что вам не следует пробовать свои силы в создании ЦП. Вы многому научитесь и, кто знает, возможно, даже изобретете что-то новое.

Как спроектировать собственный процессор с нуля — Часть 1 — nerdhut

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

Я планирую сделать из этой серии большую серию статей и видео о том, как собрать полностью индивидуальный компьютер с нуля. Я также планирую написать ОС для машины позже.

Как спроектировать свой собственный ЦП с нуля (4 части)
Здесь я планирую спроектировать действительно простой 8-битный ЦП с нуля, используя только низкоуровневую логику и низкоуровневые компоненты. Я также рассмотрю основные части ЦП и, возможно, рассмотрю расширенные функции и конвейерную обработку в конце серии или в следующей статье.

Как собрать собственный компьютер с нуля (5 частей)
Здесь я планирую построить все необходимое вокруг процессора. В этой серии я разработаю собственную материнскую плату с вводом-выводом и простой графической микросхемой, которая выводит VGA. Я расскажу обо всех важных темах в соответствующих статьях этой серии.

Как спроектировать и запрограммировать собственную операционную систему
Это то, чем я планирую заняться в будущем, и это то, что я хотел попробовать с тех пор, как впервые начал программировать.

Из чего состоит процессор?

На этот вопрос не так-то просто ответить, особенно если вы посмотрите на современные процессоры, у которых так много разных функций, что о них можно написать целую серию книг. Однако я хочу сосредоточиться на самой простой (но несколько практичной) конструкции ЦП, которую я могу придумать: 8-битный ЦП без конвейерной обработки и без каких-либо расширенных функций. Это будет довольно неэффективно, но это должно быть легко понять. Я хочу сделать его как можно более простым, чтобы все (те, кто интересуется этой темой) могли понять основные концепции.

ALU
Это часть процессора, которая занимается вычислениями. Аббревиатура расшифровывается как «арифметико-логическая единица». Это электронная схема, которая сочетает в себе различные арифметические и побитовые логические операции. Самая базовая функциональность, которая должна быть у каждого АЛУ (иначе это не имело бы никакого смысла), — это арифметическое сложение и логические функции И и НЕ или ИЛИ и НЕ, поскольку они завершены, что означает, что вы можете вывести любую другую логическую функцию, используя эти две. Кстати, совмещенные функции (И-НЕ и НЕ-ИЛИ) и в комплекте тоже.

Память данных/инструкций
T
здесь должен быть какой-то способ хранения результатов предыдущих вычислений. В микропроцессоре это обычно происходит в регистрах. (Для примера см. эту статью, если быть более точным: часть программы PRU). В нашем случае одно слово состоит из 8-бит, а один регистр в этом процессоре может хранить 8-бит.

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

В моей конструкции данные и инструкции хранятся отдельно. Эта архитектура известна как «Гарвардская архитектура». Комбинированное хранение инструкций и данных в одном хранилище также называют «архитектурой фон Неймана».

Я планирую использовать 16 регистров, из которых только 13 могут использоваться прикладным программистом. Три регистра, которые доступны только для чтения, будут хранить значения для -1, 0 и 1, то есть в двоичном виде (1111 1111), (0000 0000) и (0000 0001), чтобы упростить увеличение и уменьшение значений. и удалить сохраненное значение.

Если вы посмотрите на все регистры ЦП, результирующая таблица часто называется «файлом регистров». Иногда его также называют «блокнотом».

Шифтер
Шифтер обычно также входит в состав процессора. Простейший возможный сдвигатель позволяет программисту сдвинуть результат последнего вычисления на 1 бит либо влево, либо вправо. Можно и вообще не переключаться. Более продвинутые ЦП позволяют программисту сдвигать несколько позиций или вращать двоичные значения.

Мой ЦП позволяет пользователю сдвигать результат только на одну позицию (влево или вправо) или вообще не сдвигать результат.

Часы
Очевидно, что вся схема должна иметь сигнал, сообщающий всем отдельным компонентам и секциям, когда они должны выполнять свою работу. Поскольку у этого процессора не будет конвейерной обработки, нам нужно будет задержать часы для каждой отдельной секции, чтобы они знали, когда работать.

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

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

Основные шины будут между регистровым файлом и АЛУ, АЛУ и памятью программ и всем ЦП и внешней памятью (или контроллером памяти, если быть более точным), для хранения данных в ОЗУ или постоянной памяти.

Резюме
Чтобы ЦП имел смысл, он должен состоять из блока, который вычисляет значения, хранения данных и шин, которые соединяют компоненты и передают данные. Все управляется тактовым сигналом.

Как я уже сказал выше, это далеко не полный список. Это самые основные компоненты ЦП, которые я хочу спроектировать. Я связал дополнительные ресурсы на соответствующих позициях. Я также объясню детали более подробно, когда покажу вам отдельные конструкции.

Подробнее об АЛУ

Как я уже говорил выше, эта часть отвечает за все вычисления. Обычно ALU обозначается буквой v с входной и выходной строками:

Рисунок 1: Типичное представление ALU

A и B — это слова данных, которые будут использоваться в следующем вычислении. F представляет входные флаги, которые используются для нескольких целей. Например, он позволяет АЛУ узнать, какая следующая инструкция и как вычислить результат (R).

Выходные флаги (D) могут использоваться прикладным программистом. ALU может иметь линию, которая становится высокой, когда последний результат был равен 0 или когда он был отрицательным. Там может быть больше флагов, и я буду использовать их для переходов в приложениях на моем процессоре.

Арифметические функции в АЛУ

В этом разделе я рассмотрю только различные типы двоичных схем сложения, потому что это единственная функция, которую поддерживает мое АЛУ, поскольку все остальные простые арифметические операции могут быть получены из сложения.

One-Bit-Addition
Начну с самой простой из всех возможностей. Просто представьте, что у вас есть только два однобитных слова, которые вы хотите вычислить. Выход также состоит из одного бита.

Полусумматор
Полусумматор складывает две однобитовые двоичные цифры без учета предыдущего переноса, который мог произойти во время предыдущего сложения. Таким образом, у него есть два входа: A и B и два выхода: S и C, которые обозначают сумму и перенос.

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

A B S 9 0064 С
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

nЭтот сумматор можно построить с помощью XOR и вентиля AND, и он выглядит следующим образом:

Рисунок 2: Полусумматор

Полный сумматор
Полный сумматор очень похож на полусумматор сверху. Единственная разница в том, что он имеет дополнительный вход, часто называемый Cn-1 или Ci, который обозначает бит переноса из предыдущего добавления.

Логика полного сумматора выглядит следующим образом:

Рисунок 3: Полный сумматор. Он состоит из двух полусумматоров и вентиля ИЛИ

. -Бит длинные слова данных. Следовательно, АЛУ должен иметь возможность добавлять два 8-битных числа. Поэтому нам придется объединить 1-битные сумматоры, указанные выше, чтобы сформировать большую сеть. Есть несколько популярных методов, но я хочу обсудить только два из них:

Сумматор пульсаций переноса
Я начну с самого простого для понимания. Первый этап может быть полным сумматором, но я буду использовать полусумматор, потому что мой ЦП просто проигнорирует, если в последнем добавлении был перенос. Остальная часть сумматора-переноса состоит из полных сумматоров.

Входы A и B являются соответствующими битами, которые вы хотите добавить, и перенос одного сумматора соединяется с переносом предыдущего. Перенос последней FA является переносом всего 8-битного сумматора пульсаций переноса.

Итак, давайте взглянем на 4-битный сумматор переноса пульсаций (конечно, 8-битный будет иметь всего 16 входов и 8 сумматоров, но этого достаточно, чтобы показать функциональность):

Рисунок 4: перенос -ripple-adder

Попробуйте здесь: https://simulator.io/board/JIxRlrtGhm/1 (готовый пример)

Преимущество этой схемы в том, что ее легко собрать и понять. Относительно медленное вычисление является одним из негативных побочных эффектов.

Кстати, этот сумматор я когда-то построил в LBP. Вот краткая демонстрация того, как работают полные сумматоры и сумматор переноса пульсаций:

Сумматор с опережением переноса
Эта схема намного сложнее, и поэтому ее труднее продумать. Однако это быстрее и выглядит следующим образом:

Рисунок 5: Сумматор с опережением во всех подробностях конечный результат.

В сумматоре с опережением переноса мы определяем, выполняется ли бит после определенной позиции, и тогда мы можем вычислять разные части чисел одновременно. Например, если в сумматор введены два 4-битных числа, мы определяем, будут ли последние два бита генерировать перенос, а затем используем эту информацию для вычисления суммы первых двух битов одновременно с суммой двух последних. бит, а затем вывести полное полученное 4-битное слово. Вот почему этот сумматор также иногда называют «параллельным сумматором» или «PA с опережением».

Действительно хорошее и более подробное объяснение можно найти в этой статье.

Блок-схема

Следующая блок-схема объясняет АЛУ, входы и выходы. Я решил использовать сумматор переноса пульсаций просто потому, что его легко реализовать и построить, и в этом случае меня не слишком волнует производительность.

Ваш комментарий будет первым

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *