Предисловие
Идеей создания собственного простого процессора, если это можно так назвать, я загорелся давно. Выбор архитектуры — дело неодназаначное, но будучи от части минималистом, захотелось реализовать что-то простое, в то же время мощьное и расширяемое, TTA отлично для этого подошла.
Часть 1.
Часть 2.
Если вкратце, идея заключается в том, что-бы у блока управления была лишь одна команда перемещения данных, а вычисления являлись побочным продуктом этих перемещений.
Воплощать это в жизнь буду в простой программе для составления и симуляции логических и электрических схем — Logisim, выбрал её из-за простоты и доступности, в случае удачной реализации, планируется переписать на Verilog.
При чтении лучше сразу трогать проект, его можно найти в конце статьи.
Блок управления
Блок управления — главная составляющая. Для простоты было решено выбрать 16 входов и 16 выходов, в итоге команда, поступающая в БУ получается 8-битная, первая половина которой указывает на один из входов, другая на один из выходов. Для того что-бы принимающий блок мог понять что к нему пришли данные, добавляется 1 бит на каждый вход из блока, принято эти блоки называть функциональными блоками.
Итак:
Память
Что-бы БУ мог исполнять программу, её надо где-то хранить, память будет представлять из себя функциональный блок, один из выходов который будет подключен к шине команд БУ.
Итак:
Самый нижний вход — тактовый сигнал, самый левый — входные данные, самый правый — выходные данные, они же команды БУ и последний — тот самый, служащий флагом, сообщающий о приходе данных. При получении данных, она записываются в счетчик, который указывает на текущюю команду, при каждом тактовом импульсе счетчик увеличивается, а БУ передает данные из одного ФУ в другое.
Другие простые ФУ
Создадим проcтые ФУ, которые будут выполнять банальные действия сложения и вычитания.
Шаблон ФУ выглядит так: на входе 8-битные регистры по количеству входов, запись в них осуществляется при поступлении данных. На выходе могут быть так-же регистры, в которых будет хранится ответ, но для сумматора это не обязательно.
Таким образом сумматор и вычитатель будет выглядеть так:
Готовое устройство
Давайте же соединим память и БУ, а после попробуем создать новое ФУ и написать программу.
В качестве тактового сигнала будет выступать кнопка.
Итак соединение:
Теперь подсоединим сумматор и вычитатель, а так-же две константы на вход:
Всё готово, чтобы написать программу, она будет выполнять банальную последовательность действий: прибавлять единицу к предыдущему значению сумматора, после чего переходить на начало посредством относительного перехода (для этого и был сделан вычитатель:3).
Напишем программу.
Изначально все регистры обнулены, поэтому делать это нет смысла, первой командой будет отправка единицы на один из вход сумматора (In3 -> O2), отправка выхода сумматора на его второй вход (In1 -> O1), оправка текущего адреса ячейки памяти на вход вычитателя (In0 -> O3), отправка изменения адреса на другой вход вычитателя, он будет вычитаться (In4 -> O4), после выход вычитателя на вход указателя адреса, тем самым выполнив переход(In2 -> O0).
Программа выглядит так:
1. In3 -> O2
2. In1 -> O1
3. In0 -> O3
4. In4 -> O4
5. In2 -> O0
В памяти:
Вот и всё. Эта программа исправно работает. Планирую сделать больше ФУ и сделать их соединение с БУ удобнее, кстати ФУ практически представляют собой ControlFlow устройства. Так же можно соединить несколько БУ вместе, то есть создать сеть таких устройств.
Спасибо за внимание!
> GitHub
pvvv
на верилоге: habr.com/ru/post/433342