nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 16 Jul 2019 21:13



Reply to topic  [ 5 posts ] 
RISC эксперимент 
Author Message
Fanat
User avatar

Joined: 12 Apr 2011 21:43
Posts: 75
Location: Tashkent
Reply with quote
Давнo волновала мысль о реализации процессора с интуитивно прозрачной системой команд.
Так, x80 задумывался мною как нечто среднее между z80 и i8086. Но CISC довольно сложна в освоении реализации и там я наткнулся на множество подводных камней, хотя первые шаги и сделал.

Решил наконец перешагнуть через некоторые свои принципы и заняться RISC всерьёз.
А именно, сделать набросок простого (не простейшего) процессора, но с оригинальной системой команд и интуитивно ясным байт-кодом, чтобы не нужно было зубрить таблицу системы команд.
И я нашёл достаточно оригинальный вариант…

Мой подход максимально прост: Шестнадцатиричный код инструкции и является мнемоникой команды.

Code:
Bytes|Assm | Краткое описание
----- ----- ------------------
00    HALT - Куда без неё?
01…99 1…99 - Шестнадцатиричные цифры используются как десятичные
0A…0F ALU  - 0xA:Add; 0xB:suB; 0xC:Conjunction (AND); 0xD:Disjunction (OR); 0xE:Eor; 0xF:Flags (CMP)
A1…A9 A1…9 - Выбор одного из девяти регистров A
B1…B9 B1…9 - Выбор одного из девяти регистров B
C1…C9 C1…9 - Выбор одного из девяти регистров C
AA…CC R,T  - Выбор пары приёмник-источник (Receiver,Translator pair)
AD    ADDR - Фиксация значений приёмника-транслятора в регистре адреса
BE    BE   - Чтение из буфера памяти (Buffer Extract)
BF    BF   - Запись в буфер памяти (Buffer Flush)
DA…DF DA…F - Skip 1 Instruction by: Amount; Bigger; Carry; Dis-Carry; Equal; False
EB    EB   - Execute Buffer (Jump to Buffer Address)

С помощью ПЗУ объёмом в 256 байтов с асинхронным доступом можно легко прошить всю таблицу дешифратора команд, в которую также входят 99 ячеек перевода двоично-десятичных представлений кодов.

Сначала схему я строил в Atanua, но потом перешёл в Logisim, так как он удобнее в работе с шинами. За неделю мне удалось набросать более-менее приличную схему, если сравнивать с предыдущим безобразием из путаницы проводников и логики по всему экрану. Сейчас выглядит схема более приличнее и многое расположено гораздо ровнее, чем было в первых вариантах.
А главное - это работает.
Самым сложным моментом было разработка узла чтения/записи памяти, так как первый вариант был аналогичным Гарвадскому. Теперь набор вентилей и сдвиговый регистр выполняют нормальный Принстонский функционал, на отладку которого ушло несколько ночей. Думаю, опыт пригодится в моём x80, когда руки дойдут до него.

Как это работает…
Можно из схемы заметить, что значительную часть составляет регистровый файл.
Конечно, можно было использовать готовый элемент памяти, но схему я разрабатывал так, чтобы можно было на ТТЛ всё собрать при возможности.
В Logisim все дешифраторы выдают активную логическую единицу, тогда как подавляющее большинство физических микросхем активным используют логический ноль.

Всего данный процессор способен выполнить пока 140 инструкций.
И на данный момент АЛУ имеет только функцию сумматора под кодом операции 0A, так как пока нет нужды во всех операциях. Хотя, как и в x80, операции будут те же…
(0A:Add, 0B:suB, 0C:Conjunction/AND, 0D:Disjunction/OR, 0E:Eor, 0F:diFference/CMP)

Например:
Code:
0000 BA ; Выбор пары B,A
0001 B9 ; Выбор регистра B9
0002 64 ; Загрузить десятичное 64 (0x40) в регистр B9
0003 CB ; Выбор пары C,B
0004 C8 ; Выбор регистра C8
0005 30 ; Загрузить десятичное 30 (0x1E) в регистр C8
0006 AD ; Поместить в указатель адреса значения C8 и B9: Addr = (C8 << 8) | B9
0007 A1 ; Выбор регистра A1
0008 AB ; Выбор пары AB
0009 BE ; Прочитать память и сохранить данные: A1 = [Addr] или A1 = [0x1E40]
000A 00 ; Останов
Если вдуматься, то реализация процессора получилась почти полной по Тьюрингу.
Реализовать стек программно теоретически возможно уже сейчас.

Code:
0000 A9 ;     A9  ; Чтобы организовать цикл, нужно настроить указатель
0001 B9 ;     B9  ; Выбираем регистры A9 B9
0002 AA ;     A,A ; Эти аргументы помогут очистить регистр A9
0003 0E ; EOR     ; (EOR A9,A9) посредством Исключающего ИЛИ
0004 BA ;     B,A ; Теперь загрузим адрес единственной метки
0005 16 ;      16 ; Сейчас B9,A9 имеют значения 0x10,0x00
0006 AB ;     A,B ; Формируем корректный адрес: 0x00,0x10
0007 AD ; ADDRESS ; Загружаем в указатель буфера 0x0010 из A9,B9
0008 A8 ;     A8  ; Теперь настроим регистры для циклического счёта
0009 B8 ;     B8  ; A8 будет счётчиком, а B8 будет хранить предел
000A AA ;     A,A ; Очистим будущий счётчик
000B 0E ; EOR     ; (EOR A8,A8) традиционным способом
000C BA ;     B,A ; Чтобы загрузить B8, нужно выбрать аргументы
000D 99 ;      99 ; (MOV B8,99) Теперь B8 == 0x63
000E B1 ;     B1  ; Здесь будет храниться шаг инкремента
000F 01 ;      1  ; (MOV B1,1)
0010 ;;;;         ; Этот адрес мы указали в начале программы - прошло 32 такта
0010 AB ;     A,B ; Указываем порядок аргументов
0011 A8 ;     A8  ; Чтобы обеспечить инкремент
0012 B1 ;     B1  ; как A8 += B1
0013 0A ; ADD     ; (ADD A8,B1)
0014 B8 ;     B8  ; Регистр предела
0015 0F ; CMP     ; (CMP A8,B8) Операция сравнения
0016 DC ; DC      ; (Do if Carry) Операция проверки флага переноса
0017 EB ;  EB     ; Если переноса нет, эта команда (Execute Buffer) будет пропущена - 16 тактов + 2
0018 00 ; HLT     ; Останов - всегда 2 такта
В этой программе на каждую инструкцию уходит по 2 такта (4 полупериода ручным кликом), за исключением условной DC, которая требует 4 такта для холостого инкремента указателя инструкций при завершении цикла. Тем самым, на всю программу потребуется 2*16+99*(2*8)+2+2


Attachments:
File comment: Текущий вариант процессора с программой Hello World!
cpu_risc.png
cpu_risc.png [ 93.7 KiB | Viewed 733 times ]
logisim-risc_cpu.zip [13.21 KiB]
Downloaded 16 times


Last edited by Paguo-86PK on 16 Mar 2019 07:17, edited 2 times in total.

14 Mar 2019 05:10
Profile WWW
Doomed

Joined: 01 Oct 2007 11:30
Posts: 427
Location: Ukraine
Reply with quote
Ничего не понял (надо думать). Это вам надо R800 (MSX) курить? на базе Z80(Z280).

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


14 Mar 2019 07:34
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17906
Location: Colorado
Reply with quote
Логисим не глючит от такой большой схемы?

_________________
:eugeek: https://twitter.com/Shaos1973


14 Mar 2019 14:32
Profile WWW
Fanat
User avatar

Joined: 12 Apr 2011 21:43
Posts: 75
Location: Tashkent
Reply with quote
Первопoст обновил…
Добавил в схему все 6 операций АЛУ, флаговый регистр и инструкции условного исполнения.
Теперь есть операция загрузки указателя инструкций.

Очень любопытно, смогу ли я написать что-нибудь практическое?
Типа, Тетриса или простейшую BIOS-заставку…
Shaos wrote:
Логисим не глючит от такой большой схемы?
Когдa пытался сделать большой экран 320x192, симуляция часто подвисала и приходилось LogiSim закрывать через диспетчер задач.
Если развёртку делать последовательно по всем панелям, то период их обновления очень велик.
Потому я на каждую панель выделил отдельное ОЗУ и устал разводить шины плексеров.
Отдельное ПЗУ отвечает за линейный доступ к ячейкам всего дисплея, чтобы все 7680 ячеек не имели всяких фокусов с дешифрацией при доступе к ним.

Но весь труд себя не оправдал - симуляция через какое-то время зависает…


Attachments:
File comment: Большой экран
BigScreen.png
BigScreen.png [ 138 KiB | Viewed 771 times ]
14 Mar 2019 17:55
Profile WWW
Fanat
User avatar

Joined: 12 Apr 2011 21:43
Posts: 75
Location: Tashkent
Reply with quote
Рeшил набросать схему контекстного файла - Logisim сильно тормозить стал.
Да и тактовый вход забыл вывести, как потом заметил…

Короче, должна быть схема памяти с четырьмя портами.
Но для Logisim это очень тяжело, оказывается…
Нужно что-то иначе делать…


Attachments:
File comment: Модуль файла контекста
Context.gif
Context.gif [ 76.27 KiB | Viewed 664 times ]
File comment: Регистровый файл:
Порт #1 - 8-битовый операнд R(eceiver) и аккумулятор
Порт #2 - 8-битовый операнд T(ranslator)
Порт #3 - 2 8-битовых регистра (в том числе IP/BX/CX/DX/SP/BP/SI/DI)
Порт #4 - 2 8-битовых регистра страницы памяти

x80_context.png
x80_context.png [ 424.55 KiB | Viewed 665 times ]
21 Mar 2019 16:35
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 5 posts ] 

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.