Создание примитивного компьютера с нуля

Компьютер — это просто. Или нет?


Любой человек, интересующийся сферой информационных технологий, хоть раз задумывался о том, как на самом деле работает компьютер. А и действительно, с помощью компьютера можно сделать столько всего удивительного, что невозможно поверить, что всё, что происходит внутри него, — сложение чисел. Почему бы тогда не сделать свой самому?

image

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

Но это не так. После прочтения у меня всё-таки поселилось ощущение того, что от меня что-то сокрыто, что какие-то аспекты архитектуры вовсе не затрагивались. За бо́льшими объёмами информации я обратился к следующей книге — «Архитектура Компьютера» Эндрю Таненбаума. Информация в этой книге оказалась гораздо обширнее, однако я получил не совсем то, чего хотел.

На этом мой путь в мире архитектуры ЭВМ приостановился, началась учёба, я отвлёкся на другие, более интересные для меня на тот момент проекты. Но, к сожалению, я из тех людей, которые не могут без угрызений совести пользоваться чем-либо, не зная хотя бы примерно механизма работы этого инструмента. Это заставляло меня искать материал буквально обо всём.

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

Начало великого пути


То, что спасло меня, был ответ одного пользователя на каком-то форуме на пост человека, страдавшего похожим «расстройством», мир IT казался ему таким огромным, что его точно нельзя постичь. Я помню те слова, и они меня выручают каждый раз, когда я сталкиваюсь с чем-то новым. «Do not let yourself get overwhelmed» — то, что стоит говорить каждому новичку в IT.

И тогда я начал с новыми силами бороздить просторы интернета в поисках литературы. Мне очень повезло, что я наткнулся на замечательную книгу «The Elements of Computing Systems. Building a Modern Computer from First Principles» by Noam Nisan and Shimon Schocken(нет русского издания). В ней именно для таких, как я показывают создание реально работающего компьютера с нуля, то есть из логических вентилей.

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

Каждую следующую главу я начинал с жаждой знаний. Сконструировал АЛУ, руководясь заданиями в книге. Не могу сказать, что что-то в нём придумал я, скорее мне дали готовые детальки, а я их собрал в красивую машину. Зато какое удовольствие я получил, когда понял, что я своими руками собрал полностью работающее АЛУ.

Схема платы АЛУ, выполненная в программе BOOLR
image

Первые плоды


За ним последовал полностью работающий 16-битный процессор, который я доделал сегодня. Моему счастью нет предела, но я не собираюсь останавливаться. К моему сожалению, хоть в книге весь процессор и был собран полностью с нуля, но ассемблер для него был абстракцией в следующей главе(что логично, книга расчитана на более-мение краткое, хоть и детальное изложение). Немного погрустив, я понял, что Ассембли — тоже язык программирования, и создание полноценного Ассемблера с нуля займёт много времени.

Схема готового процессора. Большое чёрное пятно - то самое АЛУ
image

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

Написать свой Ассемблер — амбициозная цель, но это не единственная сложность. Путь, который я выбрал, обещает быть непростым. Регистры и в целом память в программе BOOLR можно реализовать только используя логические вентили. Почему это проблема? Всё просто: ничтожные 1024 байт RAM десятки раз рекурсивно пытаются поселить в оперативной памяти моего компьютера свои составные 16-битные регистры. Вот, что из этого получается:

Скриншот из списка процессов Дичпетчера Задач

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

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

    +27
    Знаете, Владислав, когда вы пишете статью, где делитесь какой-то информацией, прочитайте её сами, представляя себя на месте читателя, который не делал с вами этот процессор или что вы там в статье описываете. И попробуйте вообразить, понял он что-то из этих черных квадратов и общих фраз что-либо, или ничего не понял. Если второе — тогда надо бы статью сделать информативнее.
      +1
      Спасибо, учту
        +1

        Уже давно нет никакого смысла в разработке процессоров работать на уровне отдельных регистров
        И уж тем более не нужно делать это так
        Изучайте vhdl и пишите на нем.
        ЗЫ проектировать сложные системы имхо стоит всеже по методике водопад по крайней мере до первого релиза https://m.habr.com/ru/company/edison/blog/269789/

          0
          Здесь же задача была разобраться в работе существующих процессоров. Так что, почему бы и нет?
            +1

            Потому что общеизвестная часть процессора достаточно примитивна а изыски типа предсказания переходов в таком виде понять практически невозможно.

              +1
              Ага, примитивная для тех, кто уже разобрался.
              У нас в институте, например, два семестра был курс, посвященный этому. Начиная, с элементарного — бинарной логики, карт Карно, до более сложных вещей. И это был курс по весьма старым микропроцессорам — ни о каких предсказаниях ветвлений и речи не шло.
              Сдается мне, конструирование процессора с нуля и до конца будет примерно равно этому курсу.
                0
                имхо если этого курса нет в голове то и думать о разработке процессора не стоит
                  +1
                  Это же не о разработке процессора, а о получении знаний. Во время такой разработки получил новые знания, ничего плохого в этом нет.
      +4

      Компьютер в цифровом симуляторе — это интересное начало для Homebrew computers хобби. Но "железка" ещё интереснее! Homebrew computers очень разнообразны — релейные, с процессорами на дискретных элементах (а особо отважные и память на сердечниках делают), с процессорами на МИС/СИС, компьютеры с процессорами на FPGA, компьютеры с 8080/Z80/6502/6800… и самодельной периферией… Причём процессоры от четырёх до 32-битных, на любой вкус.

        0
        Понимаю ваш интерес и это действительно уникальный опыт. Но я пришёл скорее из программирования и хочу абстрагироваться от железа, хотя всё же зная, какое оно и что из себя представляет. Спасибо за то, что поделились
        +7

        Текст ну слишком уж оборванный, вообще никаких подробностей

          0
          А на транзисторах его можно будет спаять самому?
            0
            Да, вполне. Ещё нужны кнопки и питание и прочие штуки. Канал на YouTube, где как раз это делают. Этот парень просто гений, он не только делает красочные схемы, но ещё и объясняет так, что понятно будет любому.
            +2
            Спасибо за статью, было интересно. Я думал я один подобным страдаю :) Тоже сейчас делаю свой процессор, правда делаю его на ПЛИС. Сейчас процессор в целом готов, занимаюсь интерфейсами (UART реализовал, i2c в процессе). Если интересно, код процессора тут. Ассемблер для данного процессора реализовал с нуля (код компилятора тут). Все собираюсь написать статью, но пока руки не дошли. Про компиляторы даже записал несколько видео, если интересно, вот ссылка на плейлист :)
              0
              Пишу вот себе симулятор этого процессора на джаве, чтобы ассемблер делать. Заодно и джаву подучу. А почему компилятор, если ассемблер 1 к 1 транслирует? Спасибо, что поделились, интересно
                0
                Вы правы, пока это просто транслятор из ассемблера в машинный код. А компилятор он скорее в моих мечтах :)
                  0
                  По сути ассемблер и есть транслятор, но там есть ньюансы с адресацией — надо отслеживать метки, ограничения на относительную адресацию, вызовы «вперёд» когда адрес метки ещё не известен… макроподстановки, в целом это и есть компилятор. когда-то написал такой для Z80 чтобы не мучатся ручными пересчетами для самодельной конструкции на его основе.
                  0
                  Про компиляторы даже записал несколько видео, если интересно, вот ссылка на плейлист :)

                  Вот спасибо огромное! Сейчас как раз курю эту тему, как хобби ))
                  +1
                  > Немного погрустив, я понял, что Ассембли — тоже язык программирования, и создание полноценного Ассемблера с нуля займёт много времени.

                  Сделайте Форт. Пишется за две недели даже таким тупым человеком, как я. А умным человеком — за один вечер. Да и писать на форте поприятнее, нежели на ассемблере.
                    0
                    Я тоже так думал, но совсем недавно решил, что не так уж это и сложно написать ассемблер. Если не затрагивать понятия переменных, одного вечера так же хватит, имхо
                    +4
                    Секс в гамаке стоя. Не надо собирать процессоры на чем-то, кроме Verilog и vhdl. Пару вентилей, сумматор — окей. АЛУ на низком уровне — это уже пустая трата времени и сил, если у вас нет цели стать лучшим в мире собирателем АЛУ.
                    Если вы хотите сделать процессор — делайте его на верилоге, предварительно почитав Харриса и Харрис.
                    И компьютер виснуть не будет, и в железе потом можно будет попробовать недорого, со всех сторон одни плюсы.
                      0

                      Ощущение, что статья неполная, резко обрывается на введении. Понимаю, что тема обширная, но стоило в общих чертах описать не то, что вы сделали, а как, и показать инструменты, подводные камни, куски кода в конце концов.
                      Тоже давно мучаюсь подобным, но каждый раз садясь разбираться детально I get overwhelmed, как говорится, объемом информации и предстоящей работы, и руки опускаются. Рад, что вы не опускаете руки, и хотелось бы статью (или серию статей) о вашем хобби.

                        0

                        Я посчитал, что не интересно будет смотреть на логические вентили (видимо, сам так насмотрелся, что уже не хочется), и ошибся. Спасибо

                          0

                          это как раз самое интересное. добавьте пожалуйста

                            0

                            В таком случае советую вам пройти курс Nand to Tetris самому. Либо можете взять на изучение книгу по этому курсу. Количество материала не подходит для публикации на Хабре, а писать кратко об этом я не вижу смысла.
                            Это та тема, которую нужно вкушать самому, по моему мнению

                              0

                              ок спасибо! попробую

                        0

                        А вы не пробовали сопутствующую программу на курсере? https://www.coursera.org/learn/build-a-computer
                        Новый курс как раз сегодня стартует. Там есть видеолекции и можно задать вопросы.

                          0

                          Nand to Tetris — курс в MIT, по которому книга была написана. Вроде так

                            0
                            Я, кажется, не так понял. Программу в смысле ПО, а не курс? Пробовал, но она мне своим функционалом совсем не понравилась.
                              0

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

                                0

                                Они в принципе идентичны.
                                Что странно, я использовал курс для сложных случаев, хмм

                            0

                            State-of-art самодельных процессоров
                            https://hackaday.io/list/25846-homebrew-cpu

                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                я тоже ждал, но потом увидел тег Из песочницы, потом увидел, что автор вроде как учится и понял, что тут скорее всего просто попытка понять как работает компьютер, а не DIY статья, хотя ожидал, что будет и сборка на железке, но нет
                                0
                                Не знаю насколько имеет смысл сегодня так зарываться с собственной сборкой, ИМХО.
                                Для понимания работы ПК могу посоветовать книгу «Модернизация и ремонт ПК» (Скотт Мюллер). Зайдет даже новичку.

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

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