Разбор

VCB · 16-bit CPU

Свой 16-битный процессор в Virtual Circuit Board: регистры, стек, арифметика и программы на своём ассемблере

Сверху вниз: карта памяти и шины, арифметика на одно слово, полный ALU, блок регистров

Зачем

Хотелось не просто собирать вентили, а сделать машину, на которой реально крутится программа: свой набор команд, свои короткие имена инструкций, свои тесты. 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
REG · D / C / B / A
Порты и линии управления
STK и соседняя логика на шине

Арифметика (ALU)

Два блока. Первый — арифметика «на одно слово»: 16 одинаковых разрядов с цепочкой переноса, чтобы сложение/вычитание шли по всему слову сразу. Второй — полный ALU рядом: сложение, вычитание, сравнение и флаги «равно», «меньше», «больше», «не». Сравнение сделано через вычитание и разбор результата, а не отдельным «волшебным» компаратором.

Арифметика на одно слово
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 и укороченный листинг теста Фибоначчи.

← К проектам