Разбор
VCB · 16-bit CPU
Свой 16-битный процессор в Virtual Circuit Board: регистры, стек, арифметика и программы на своём ассемблере
Зачем
Хотелось не просто собирать вентили, а сделать машину, на которой реально крутится программа: свой набор команд, свои короткие имена инструкций, свои тесты. Virtual Circuit Board для этого удобен — видно, как данные ходят по проводам между регистрами, арифметикой, стеком и памятью. Ошибки ловятся на схеме, а не прячутся за слоем симулятора.
Архитектура
Всё на 16-битной шине. Четыре регистра общего назначения A, B, C и D; стек на 8 слов; память программ (ASM), данные (DAT) и видеопамять (V-MEM). Управление — отдельные линии: такт (CLK), сброс (RST) и сигналы к памяти и стеку (M-LINE, D-TR, STK).
- REG — блок регистров D / C / B / A, собранный по битам
- STK — аппаратный стек с индикатором, что он активен
- Справа шина стыкует память программ, данных и видео через линию D-TR
Арифметика (ALU)
Два блока. Первый — арифметика «на одно слово»: 16 одинаковых разрядов с цепочкой переноса, чтобы сложение/вычитание шли по всему слову сразу. Второй — полный ALU рядом: сложение, вычитание, сравнение и флаги «равно», «меньше», «больше», «не». Сравнение сделано через вычитание и разбор результата, а не отдельным «волшебным» компаратором.
Команды и ассемблер
Имена команд подобраны под то, как данные реально двигаются по схеме. Константы в регистры — `wta` / `wtb`. В арифметику и обратно — `ala` / `alb` / `alr`. Сложение — `aad`. Стек — `swa` / `swb` / `src` / `srb` / `std`. Условный переход, пока нет переполнения — `jmn`. В ассемблере есть закладки: ими удобно помечать точки входа тестов.
Тест: Фибоначчи до переполнения
Простая проверка арифметики и стека. В A и B кладётся 1, цикл складывает числа, гоняет промежуточные значения через стек, пишет сумму обратно в A и прыгает снова, пока нет переполнения 16 бит. Когда переход уже не срабатывает, в B остаётся наибольшее число Фибоначчи, которое ещё помещается в 16 бит.
test_ALU_Fibonachi
bookmark test_ALU_Fibonachi
wta 0x0001
wtb 0x0001
hlt # start loop
ala # A → ALU.a
alb # B → ALU.b
aad # sum
swa # A → stack
swb # B → stack
src / std # C ← stack, pop
srb / std # B ← stack, pop
alr # ALU result → A
jmn 0x0003 # no overflow → loop
hlt
hlt # B = largest 16-bit Fibonacci Как открыть
Скачайте схему и откройте её в Virtual Circuit Board. На карточке проекта — скрины регистров и ALU и укороченный листинг теста Фибоначчи.