[Перевод] My4TH — домашний компьютер без процессора
Этот обзор посвящен открытому проекту компьютера My4TH по информации от разработчика: Авторский сайт проекта: (вся исходная документация по повторению компьютера в домашних условиях приведена на сайте)
Далее текст описания предстален от лица автора:
My4TH (произносится как «мой четвертый») — это четвертый домашний DIY компьютер без процессора после MyCPU, MyNOR и TraNOR. Я хотел построить максимально простой компьютер с дискретным процессором, использующим как можно меньше элементов и компонентов, под управлением операционной системы Forth.
3
FORTH — это ранний язык программирования, разработанный Чарльзом Х. Муром в конце 1960-х годов. Мур разработал FORTH на миникомпьютере IBM 1130, который имел 16-разрядный процессор и всего 8 КБ оперативной памяти. Для упрощения и уменьшения потребления памяти он реализовал FORTH как виртуальную машину на основе стека, используя обратную польскую нотацию (RPN). Но FORTH — это гораздо больше, чем просто язык программирования. Поскольку FORTH имеет встроенный интерпретатор, компилятор и поддержку дискового ввода-вывода, компьютер, на котором работает FORTH, также называется «Forth-системой». My4TH является такой Forth-системой. Вы можете разрабатывать и отлаживать свои Forth-программы непосредственно на My4TH. Вы можете ввести исходный код с помощью встроенного текстового редактора и сохранить его во встроенной памяти EEPROM. Оттуда вы можете скомпилировать и запустить его непосредственно на плате My4TH.
Минималистичный Forth (Форт) компьютер
5
My4TH основан на MyNOR, поэтому в нем также есть очень простой 1-битный NOR-элемент «ALU». Из-за простоты аппаратного обеспечения My4TH не может интерпретировать код Forth напрямую. Вместо этого в нем реализован интерпретатор, написанный на родном машинном коде. Для дальнейшего увеличения скорости выполнения My4TH компилирует Forth-код в подпрограммный шитый код («Subroutine Threaded Code»), а не в промежуточный байт-код.
Блок схема TTL компьютера
My4TH возможности железа:
8-bit дискретный логический CPU
8 to 14 MHz частота тактирования
32 KB ROM, 32 KB RAM
up to 256 KB EEPROM
1-bit NOR gate "ALU"
6300 8-bit сложений за секунду
4 чипа памяти
16 CMOS логических чипов
RS-232 с 4800 скоростью пересылки данных
I2C-шина для расширения
6 цифровых входов
5 цифровых выходов
PCB размер 10 x 10 см.
My4TH возможности встроенного ПО:
16-bit Forth (Форт) система
Поддержка Forth 2012 стандарта
Слова ядра стандарта и его расширения
Слова поддержки слов для арифметики над ячейками двойного размера.
Слова поддержки Блоковой памяти
Встроенный текстовый редактор
6
Схема в PDF
Инструкции реализованного микропрограммного процессора — близки 6502
Слова Форт системы
Это самый маленький в мире* Форт-компьютер с наименьшим количеством компонентов и дискретным (TTL) процессором:
Но один вопрос остается открытым: Как все это работает?
Все начинается со счетчика адресов микрокода, который является чем-то вроде «сердца» компьютера. Каждая машинная инструкция состоит из 128 микроинструкций, при этом микроинструкция состоит из двух частей: 8-битного управляющего слова и дополнительного 8-битного слова данных. Машинная инструкция («код ОП»), которая должна быть выполнена, подается на адресные линии A8 — A14 EPROM, а счетчик адресов микрокода подключается к A0 — A7. Счетчик адресов микрокода пересчитывает все микроинструкции текущего кода ОП.
В каждом «четном» такте (когда A0 равен нулю) первая часть микроинструкции, а именно управляющее слово, сохраняется в защелке управляющего слова. 5 из 8 сигналов этого управляющего слова используются для управления потоком данных через процессор путем выбора устройства-источника и устройства назначения. Окончательная передача данных происходит в следующем «нечетном» тактовом цикле, когда A0 равен единице. Поскольку в этом втором такте сама EPROM также может служить источником данных, то легко хранить постоянные значения, определенные микрокодом, в различных регистрах и оперативной памяти. Однако, поскольку в этом такте в EPROM может быть введен любой адрес, можно выполнить произвольный доступ к EPROM на чтение, чтобы прикладная программа (интерпретатор Forth) могла быть выполнена из EPROM.
Как вы видите, основная цель всей логики — передача данных из различных источников в различные пункты назначения под управлением микрокода. Регистры процессора, такие как PC, SP, Accu и т.д., хранятся в оперативной памяти. Счетчик программ увеличивается с помощью таблицы поиска в EPROM.
Манипуляция данными осуществляется через один NOR-элемента на линии данных D0. Возможно, вы уже знаете, что из функции NOR можно вывести практически любую логическую функцию, даже такие сложные функции, как сложение и вычитание. Но чтобы обработать все биты байта, My4TH должен перебирать все биты данных и обрабатывать их бит за битом. Необходимая функция сдвига данных также реализована в виде таблицы поиска в EPROM.
Условные переходы возможны только в пределах 128 позиций микрокода ОП-кода. Когда микрокод должен выполнить условный переход, он сначала загружает целевой адрес (который находится в диапазоне от 0 до 127) в младшие 8 бит 16-битной адресной защелки. Затем управляющий сигнал, поступающий из защелки управляющего слова, включает условную загрузку нового адреса в счетчик микроинструкций в зависимости от значения D0 в течение нечетного тактового цикла.
Если вас больше интересует микрокод, рекомендую изучить документ «Инструкция ADD для MyNOR», где я описываю, как я реализовал инструкцию ADD в микрокоде для компьютера MyNOR. Поскольку MyNOR и My4TH очень похожи, микрокод функции ADD работает точно так же на My4TH. Но для увеличения производительности я немного схитрил, реализовав однобитный сумматор через небольшую таблицу поиска в EPROM.
Теперь перейдем к делу:
Запуск My4TH и увеличение тактовой частоты
Когда вы закончили сборку собственной компьютерной платы My4TH, вы можете выполнить первый тест. Для этого теста подключите светодиод к контактам 2 (+) и 5 (-) разъема RS-232 и соедините контакты SCL и RXD разъема J2 проволочной перемычкой. После подачи напряжения питания светодиод должен мигать. Частота мигания светодиода составляет 1 Гц, когда My4TH тактируется генератором с частотой 8 МГц.
Этот тест мигания светодиода очень полезен, если вы хотите проверить максимальную тактовую частоту, с которой My4TH все еще может работать. Например, если вы запрограммировали EPROM с образом для работы на частоте 8 МГц, вы не сможете установить соединение RS-232, если вы синхронизируете My4TH с частотой 10 МГц, потому что скорость передачи имеет необычное значение 6000 бод. В этом случае светодиод может дать вам первую подсказку, может ли My4TH работать на этой более высокой частоте. В качестве второго шага теперь вы можете записать EPROM с образом, предназначенным для работы на частоте 10 МГц.
Если у вас есть доступ к My4TH через последовательный терминал, вы можете использовать следующую однострочную строку, чтобы проверить, стабильно ли My4TH работает с новой частотой. В строке выводится простой лабиринт, состоящий из случайных символов / и \ .
: test begin 2 random if 47 else 92 then emit again ; test
Blink
Примечание: Этот тест на мигание светодиода очень полезен, если вы хотите проверить максимальную тактовую частоту, с которой еще может работать My4TH. Например, если вы запрограммировали EPROM с образом для работы на частоте 8 МГц, вы не сможете установить соединение RS-232 при тактовой частоте My4TH 10 МГц, потому что скорость передачи данных будет иметь необычное значение 6000 бод. В этом случае светодиод может дать вам первую подсказку, может ли My4TH работать на этой более высокой частоте. В качестве второго шага, вы можете записать EPROM с образом, предназначенным для работы на частоте 10 МГц.
Поддержка плат Adafruit STEMMA QT и SparkFun Qwiic
8
My4TH предоставляет интерфейс I2C для подключения внешних устройств. Я решил поддержать стандарты интерфейса Adafruit STEMMA QT и SparkFun Qwiic, поскольку платы STEMMA QT рассчитаны на работу при напряжении 5 В, а многие платы SparkFun Qwiic также подходят для работы при 5 В.
[My4TH с установленным адаптером Qwiic] Как вы можете видеть на рисунке, существует очень простой способ оснастить плату My4TH разъемами STEMMA QT / Qwiic. Если вы внимательно посмотрите на J2, то узнаете порядок выводов STEMMA QT и Qwiic: SCL, SDA, +5 В и GND. Это облегчает подключение платы адаптера SparkFun Qwiic.
Примечание:
Я написал несколько примеров «экранов», чтобы показать, как использовать некоторые платы Adafruit. Вы можете найти исходный код в разделе программного обеспечения на этом сайте.
Нужна дополнительная информация?
Если вы что-то пропустили, пожалуйста, посмотрите меню в верхней части со страницы сайта проекта. На ней приведены прямые ссылки для вашего удобства:
ForthDeck описан на отдельной странице: ForthDeck;
Коллекция Forth-программ для My4TH находится в разделе программного обеспечения.
Если вы интересуетесь Фортом и тем, как я его реализовал, посмотрите здесь: Forth на My4TH
Если у вас остались вопросы без ответов: Загляните в FAQ.
Ищете схемы и исходный код? Вы можете получить их в разделе загрузки.
Использование Форта
Если вы еще этого не сделали, пожалуйста, сначала прочитайте учебник «Starting Forth» Лео Броди. Учебник содержит множество примеров, которые вы можете опробовать на My4TH. Еще одно действительно хорошее введение в Forth — Forth Primer And So Forth… Ганса Беземера. Этот учебник также представляет собой набор очень полезных фрагментов кода Forth. И это еще один очень хороший учебник для начинающих, особенно для начинающих: A Beginner’s Guide to Forth.
Вот два примера простых программ на Форте, которые вы можете ввести и запустить на My4TH:
Квадратный корень из целого числа без знака можно вычислить следующим образом:
: sqrt dup begin 2dup / over + 2 / swap over - abs 2 < until nip ;
Строка выше реализует метод Герона для нахождения квадратного корня числа. Ведущее двоеточие сообщает Форту, что нужно скомпилировать новое слово «sqrt», которое состоит из всех следующих слов. Завершающая точка с запятой говорит Forth снова выйти из режима компиляции. После того, как вы введёте клавишу перевода строки, Форт ответит «ОК». Далее Вы сейчас введете
49 sqrt .
вы получите правильный результат 7.
Вот еще один пример. Программа ниже рисует треугольник Паскаля:
: triangle cr dup 0 ?do 1 over 1- i - 2* spaces i 1+ 0
?do dup 4 .r j i - * i 1+ / loop cr drop loop drop ;
Обратите внимание, что строка слишком длинная и не умещается в 80 символов. Это не проблема, потому что вы можете разделить линию пополам. Forth не выходит из режима компиляции, пока не увидит завершающую точку с запятой. Форт подтверждает первую строку словом «скомпилировано», а вторую строку словом «ОК».
Чтобы указать My4TH напечатать первые 10 строк треугольника, вам просто нужно ввести
10 triangle
и у вас получится вот такой красивый треугольник:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
OK
Реализация Форт
Моя реализация Forth для My4TH отличается от стандарта, потому что я немного изменил расположение «слов» в памяти, чтобы увеличить скорость. Слова хранятся в простом связанном списке в словаре. Первоначальная реализация, разработанная Чарльзом Х. Муром, изображена ниже:
Изображение
А это реализация на My4TH:
рисунок
Каждое «слово» снабжено заголовком, содержащим имя слова и указатель на следующее слово в памяти. Для Форта характерно, что имя представлено не как строка с нулем в конце, а как длина плюс строка. Длина строки хранится в байте, предшествующем строке. Поле под названием «полезная нагрузка» содержит фактический программный код. Этот код может состоять из машинного кода или списка 16-битных адресов-указателей, указывающих на другие слова, которые, в свою очередь, вызываются как подпрограммы. Реализация на My4TH теперь отличается тем, что слово в памяти начинается не с его имени, а с указателя на следующее слово. Это значительно ускоряет поиск в списке слов («словаре»), поскольку не требуется инструкции медленного сложения (в противном случае, чтобы получить указатель на следующее слово, нужно было бы добавить байт длины строки к начальному адресу слова). слово, чтобы получить указатель на указатель на следующее слово).
Кроме того, My4TH не использует классическую модель Прямого шитого кода (DTC), которая содержит только указатели функций в поле полезной нагрузки. Вместо этого я выбрал для My4TH подход «подпрограммного шитого кода» (STC) из соображений скорости. Здесь поле кода слова всегда содержит только чистый машинный код, а вызов подслов фактически выполняется вызовом JSR. К сожалению, этот метод приводит к увеличению использования памяти на слово примерно на 30%, поскольку в дополнение к 16-битному целевому адресу для подслова также должна храниться инструкция JSR (8-битная). Если вам нравится углубляться в эту тему, я рекомендую прочитать Брэдфорда Дж. Родригеса, «Moving Forth».
Чтобы еще больше увеличить скорость выполнения Forth на My4TH, многие слова Forth уже хранятся в оптимизированном машинном коде в ПЗУ. Таким образом, Форт уже имеет приличный размер 13 Кб в ПЗУ. В отличие от ПЗУ, ОЗУ все еще почти пусто, так что у пользователя все еще есть 30 КБ свободной памяти, доступной для самоопределяемых слов и составленных из них программ. Схема оперативной памяти выглядит так:
Изображение
Традиционно Forth работает с двумя стеками: стеком данных и стеком вызовов. Из соображений скорости два стека совместно используют общую область памяти на компьютере My4TH, а именно стек процессора. Стек вызовов занимает верхнюю половину области стека процессора с 8180h по 81FFh, а стек данных занимает нижнюю половину с 8100h по 817Fh. Оба стека адресуются с помощью обычных инструкций быстрого стека PSH и POP. Кроме того, в My4TH Forth реализованы еще два стека: «стек управления потоком», который необходим компилятору для разрешения вложенных IF / ELSE / THEN, и «стек управления циклом», который необходим во время выполнения цикла. переменные (индекс и приращение). Эти два стека можно было бы объединить с обычным стеком данных, но разделение стеков имеет два преимущества: во-первых, ограниченное пространство для хранения в стеке данных зарезервировано для фактических данных. Во-вторых, Стек управления циклом упрощает для новичка в Forth программирование циклов, поскольку нет необходимости учитывать параметры цикла при доступе к данным в стеке. На самом деле, это может привести к путанице, если вы не можете получить доступ к данным в стеке данных, как обычно, из цикла, который был помещен в стек до того, как вы вошли в цикл. Кстати, стек управления потоком допускает глубину вложенности до 32 IF/ELSE/THEN, а стек управления циклом допускает до 16 вложенных циклов.
Хорошо, это только половина правды. В моей реализации на Форте на самом деле есть два других стека: во-первых, расширенный стек возврата, доступ к которому осуществляется с помощью слов Форта >r и r>, и стек системных данных, который используется для внутренних функций операционной системы. Отделение этих стеков от стека возврата процессора имеет два основных преимущества: во-первых, увеличивается доступная глубина ветвления за счет освобождения стека процессора, а во-вторых, программирование «экранов» намного проще для новичка, которому не нужно беспокоиться об экране. границы блоков, поскольку стеки данных Forth и возвратов по-прежнему содержат согласованные данные после перехода от одного экрана к другому, и система не вставляет управляющие данные для служебных функций.
Часто задаваемые вопросы
Каковы основные различия между MyNOR и My4TH?
My4TH меньше (меньше размер, меньше компонентов), быстрее (до 14 МГц) и имеет больше памяти (32 КБ RAM и 256 КБ EEPROM), чем MyNOR. Кроме того, My4TH разработан специально для программирования FORTH.
Применима ли реализация MyNOR FORTH для приложений «реального мира»?
Нет, реализация MyNOR FORTH имеет несколько известных ошибок и считается доказательством концепции. My4TH стремится обеспечить более стабильную и полную реализацию FORTH.
Можно ли использовать My4TH с оборудованием MyNOR?
Да, для оборудования MyNOR доступна специальная версия My4TH Forth, но с некоторыми ограничениями из-за 8 КБ SRAM MyNOR. My4TH Forth для MyNOR также не поддерживает платы расширения MyNOR.
В чем разница в обмене файлами между MyNOR и My4TH?
My4TH использует инструмент командной строки для выгрузки и загрузки отдельных экранов или полного исходного кода FORTH вместо копирования текстовых файлов в окно терминала, как в MyNOR.
Могу ли я удалить Форт-слова из памяти?
К сожалению, архитектура Forth не позволяет удалять из памяти определенные слова. Однако вы можете использовать слова FORGET и MARKER, чтобы удалить все слова, скомпилированные после определенного момента.
Как исправить ошибки и обновить My4TH-ROM?
Поскольку проект с открытым исходным кодом, вы можете исправить ошибки в исходном коде. Затем вам нужно создать новый файл образа EPROM с помощью кросс-компилятора myca. Однако не рекомендуется исправлять ошибку самостоятельно. Вместо этого, пожалуйста, сообщите мне об этом, чтобы я мог исправить это в обновленной версии прошивки.
Как я могу сбросить My4TH из самой программы?
Вы можете создать простое слово для выполнения процедуры аппаратного сброса. Для этого скомпилируйте в My4TH следующий код:
hex : reset 2D00 execute ;
Когда вы вводите команду RESET, My4TH выполняет инструкцию по адресу 0×2D00, которая является переходом к процедуре аппаратного сброса.
Как я могу сохранить переменные в EEPROM, используя My4TH?
Вы можете использовать слова BLOCK, UPDATE и SAVE-BUFFERS в My4TH Forth. Используйте BLOCK для загрузки блока из EEPROM в RAM, который возвращает указатель на блок. Затем вы можете копировать свои переменные в блок и из него (рассматривайте буфер как большую двоичную структуру данных). Используйте UPDATE, чтобы пометить блок как измененный после изменения переменной, и SAVE-BUFFERS, чтобы записать измененный блок обратно в EEPROM.
Почему я теряю 1024 байта памяти при использовании команд BLOCK и BUFFER?
Потеря памяти происходит из-за того, что буфер блока выделяется командой BUFFER. Однажды выделенный, он не освобождается. Вы можете обойти эту проблему, установив маркер перед использованием команд, а затем освободив память после того, как закончите.
Как я могу очистить все ранее определенные слова и сбросить память, как «новая» команда в реализации MyNOR для проверки концепции?
Вы можете создать собственное НОВОЕ слово на основе примера из оригинального редактора MyNOR-Forth:
: execnew s" forget new : new execnew ;" execute ;
: new execnew ;
Введите эти две строки после перезагрузки компьютера, а затем вы можете использовать команду «NEW» по желанию.
Почему моя программа вылетает через определенное время?
Проблема может быть связана с тем, что стек данных переполняется. My4TH Forth не проверяет переполнение стека. Если стек данных переполняется, стек возврата перезаписывается и программа аварийно завершает работу.
Как я могу отладить стек данных?
Вы можете использовать команду .S для отображения текущего содержимого стека данных. Это может быть очень полезно для целей отладки.
Почему KEY? слово ждёт нажатия клавиши?
Если вы используете My4TH через последовательный терминал, My4TH должен опрашивать интерфейс RS-232 в программном обеспечении. Поэтому, чтобы не пропустить ни одного события клавиатуры, важно как можно быстрее опрашивать последовательный порт. По этой причине невозможно реализовать неблокирующее чтение с клавиатуры на My4TH. Если вам нужно неблокирующее взаимодействие с вашей программой, вы можете подключить дополнительные внешние ключи к входам/выходам и считывать их с помощью RINP.
Как я могу создать неблокирующий способ прерывания работающей программы?
Вы можете использовать команду RINP для прямого чтения вывода RXD. Вот пример:
: test 0 begin rinp 1 and while 1 + dup . repeat cr ." break, a key was pressed" ;
Имейте в виду, что вам может потребоваться удерживать клавишу нажатой некоторое время, чтобы убедиться, что программа прерывается должным образом.
Как заменить редактор на новый, загруженный из EEPROM?
Вы можете определить новое слово «EDIT», которое реализует новый редактор. Тогда старый редактор будет «перегружен». Например, вы можете определить слово ' : EDIT .» I am not an editor!» ; ' и вызовите EDIT. Если вы нажмете FORGET EDIT, эффект исчезнет, и EDIT будет работать как обычно.
Что возвращает слово UP?
Слово UP возвращает адрес указателя, указывающего на начало 256-байтовой области памяти, которая может свободно использоваться пользователем. Чтобы получить адрес начала этой области памяти, необходимо ввести «UP@».
Как My4TH отображает доступную память I2C EEPROM?
My4TH Forth сопоставляет доступную память I2C EEPROM с доступными 1K-блоками, независимо от их адресов. Например, если вы установите две EEPROM 24LC512 с любыми адресами I2C, вам будут доступны экраны с 0 по 127. Однако на плате MyNOR не совсем понятно, в какой EEPROM будет храниться конкретный экран.
Что произойдет с MyNOR, если я добавлю еще одну EEPROM в существующую конфигурацию?
Добавление еще одного EEPROM к существующей конфигурации на плате MyNOR может вызвать проблемы с поиском ранее сохраненных экранов. Новая EEPROM может быть назначена на номера экранов, которые ранее были назначены другой EEPROM. Рекомендуется не добавлять больше EEPROM после того, как у вас будет рабочая конфигурация, чтобы не потерять доступ к сохраненным экранам.
Могу ли я использовать другие конфигурации EEPROM с MyNOR/My4TH, например, 1x 24LC1026 и 2x 24LC512?
Да, возможны другие конфигурации. Однако максимальное расширение памяти в 512 КБ может быть достигнуто только с восемью 24LC512, или двумя 24LC1026, и четырьмя 24LC512, или четырьмя 24LC1026. Вы также можете использовать четыре 24LC1025 вместо четырех 24LC1026, а 24LCxxx можно заменить типами 24AAxxx. Всегда сверяйтесь с техническими данными, чтобы убедиться в правильности конфигурации контактов и избежать конфликтов адресов. Но сокеты на плате My4 могут быть заполнены только EEPROM 24LC512 или 24LC1026.
Могу ли я использовать EEPROM 24LC1025 с MyNOR/My4TH?
ЭСППЗУ 24LC1025 немного странные — контакт A2 выбора адреса должен быть подтянут к высокому уровню, иначе ЭСППЗУ не будет работать должным образом. К сожалению, на разъемах My4TH, а также на плате MyNOR контакт A2 подключен к GND. Тем не менее, по-прежнему можно использовать EEPROM 24LC1025 на обеих платформах, если подключить контакт 3 (A2) EEPROM к контакту 8 (+5 В). Но убедитесь, что контакт 3 не должен быть вставлен в гнездо на плате (просто отогните контакт от корпуса EEPROM).
Могу ли я использовать симулятор EPROM на веб-сайте с My4TH?
Нет, эмулятор EPROM нельзя использовать с платой My4TH. My4TH использует контакт 20 EPROM, который, к сожалению, неправильно подключен к плате эмулятора.
Могу ли я заменить EPROM на флэш-память для My4TH?
К сожалению, невозможно заменить СППЗУ флэш-памятью, поскольку микросхемы флэш-памяти часто намного медленнее, чем СППЗУ. Для My4TH вам понадобится EPROM с максимальным временем доступа 120 нс, если вы хотите запустить его на частоте 8 МГц. Самые быстрые чипы флэш-памяти, доступные сегодня, имеют время доступа 150 нс, что означает, что вы можете запустить MyNOR только на частоте 1/150 нс = 6,7 МГц. Также микросхемы флэш-памяти имеют немного другую распиновку, поэтому разъем на плате My4TH необходимо перепаять. Доступны одноразовые программируемые (OTP) СППЗУ со временем доступа до 45 нс. Кроме того, СППЗУ более «ретро» и поэтому лучше подходят для этого проекта.
License Information
This work (My4TH hardware and software) is licensed under a
Creative Commons Attribution-ShareAlike 4.0 International License. Creative Commons
License
Кросс ассемблер «myca» под лицензией GNU General Public License, Version 3.
Импрессариум и контактная информация:
Dennis Kuschel
Corintostraße 21
28279 Bremen, Germany
email: dennis_k@freenet.de
web: mynor.org and mycpu.eu website visits