nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 11:54



Reply to topic  [ 10 posts ] 
x80 - CISC 
Author Message
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Сначала я пробовал адаптировать исходные ресурсы готового эмулятора.
Но вскоре написал свой собственный.

Затем используя Icarus Verilog начал разрабатывать с чистого листа.
Облачный x80 хоть и исполняет несколько инструкций, но по листингу можно видеть, что там я запутался.
Всё-таки Verilog я знаю куда хуже, чем стандартные ЯВУ…

Почему-то моделировать схему графически легче, чем Verilog листинг.
Во-первых, масштаб схемы можно изменять и визуально охватывать целиком всё. Это нельзя сделать с листингом, так как текст воспринимается всё же иначе. Даже несмотря на продвинутые редакторы с подсветкой синтаксиса и выделения модулей.
Во-вторых, путь сигнала графически просматривается моментально. Тогда как в листинге именованные проводники, даже с подсветкой, прослеживаются хуже.
В-третьих, проектирования цифровых узлов я освоил в тетрадках ещё в школе. Но обычную радиоэлектронику не одолел, так как цифра - куда проще в плане входа-выхода.
К тому же, программирование я освоил позже, чем сборку цифровых узлов с мигалками и генераторами звука или растра на ТВ.

Идеология
Процессор x80 является подправленным i8080A в плане таблицы команд.
Здесь я описывал задумку. Но, повторюсь…
Байт-код x80 более интуитивно понятный, чем у совместимых процессоров. Прежде всего, для кодирования программ голым дампом, так как ассемблер или Си - роскошь в моём случае.
У x80 код инструкций более прозрачен и шестнадцатеричные нибблы говорят сами про инструкцию.
В отличии от i8080/z80, x80 имеет только 8-битные константы поля операндов инструкции. Команды ветвления только короткие.
Система команд разрабатывалась не в угоду упрощения аппаратной реализации в перспективе, так как в XXI веке достаточно всяческих микроконтроллеров с самой разнообразной архитектурой. И как-то не красиво уже в наше время уродовать систему команд ради укорочения какого-то проводочка где-то в дешифраторе.

Префиксы
Программисту доступно 7 префиксов на прикладном уровне и дополнительный префикс на системном уровне.
Префиксы кодируются насквозь кодами 11h, 22h, 33h, 44h, 55h, 66h, 77h. Это легко запомнить и декодировать аппаратно.
Системный префикс имеет код 00h, что необычно. Для прикладной программы код 00h - операция останова «hlt». Тогда как для операционного кода останов не требуется и открывается восьмой префикс. Это единственная привилегированная операция. Но логически, если приложение прыгнуло в адрес занулённой памяти, то будет однозначный моментальный останов.

Регистры
В состав РОН входят 7 8-битных регистров - AL/BL/CL/DL/BH/CH/DH и ячейка памяти [BX] (аналог M от i8080/z80)..
Имеются и регистровые пары - BX/CX/DX. А также и указатели - SP/BP/SI/DI.
Тем самым, в распоряжении программиста имеется почти весь набор регистров x86.

Прерывания
Имеется 10 инструкций программного прерывания с кодами F0…F9, что легко запомнить.
Они легко расширяются до 80 при помощи префиксов: 11 F0…F9, 22 F0…F9, 33 F0…F9, 44 F0…F9, 55 F0…F9, 66 F0…F9, 77 F0…F9.

Константы
Коды операций 80…BF загружает непосредственную константу в поле операндов инструкции. Аппаратно схему дешифратора это упрощает.
В комбинации с префиксом команда может иметь до трёх байтов:
Code:
   04   |MOV AL,[BX]   ; Загрузка произвольной ячейки памяти в регистр #4
   A4 CE|MOV AL,0xCE   ; Загрузка непосредственной ячейки памяти в регистр #4
55 A4 CE|MOV AL,[BX-50]; Загрузка индексируемой ячейки памяти в регистр #4

Можно заметить, что добавление префикса несильно меняет логику команды.
В отличии от z80 с двумя индексными регистрами IX/IY, здесь за индексный регистр можно указывать любой из 7, почти как в x86.

Ветвления
Кодирование операций ветвлений сквозное и имеет коды BA…BF, что можно читать, например, BC как Branch by Carry.
Размах перехода у этих команд ±127 байтов, но с помощью 7 префиксов размах расширяется до ±1023 байтов.
Чтобы совершить прыжок на абсолютный адрес, необходимо его загрузить в стек и выполнить команду RET.

Постфиксы
В состав команд ветвления входят ситуации, когда команда условного перехода замыкается на себя, провоцируя бесконечный цикл.
Аппаратно на уровне загрузки кода такие случаи исключаются и преобразовываются в особые коды префиксов.
Так, «BC FE» зациклена на себя при переносе - «JC $». Однако дешифратор предотвращает это, генерируя префикс #14.
Тем самым, «BC FE» уже из команды ветвления интерпретируется как «CLC».

Аппаратная реализация
Первоначально может показаться, что аппаратно загружать в буфер инструкции из памяти, предусматривая префиксы, постфиксы и «hlt» как дополнительный префикс в режиме ядра - довольно непросто.
Однако, используя LogiSim, удалось разработать достаточно компактную схему, выполняющую все основные функции по корректной загрузке команды любой длины в буфер:

P.S.: Здесь я тренировался своим RISC, приобретая опыт работы с памятью.
Если активно заниматься проектом, можно воплотить этот x80 в рамках визуального симулятора реального времени LogiSim. Что предоставит некоторый опыт для дальнейшего перевода проекта на уровень Verilog…


Attachments:
File comment: Парсер x80-инструкций
x80-parser.gif
x80-parser.gif [ 482.08 KiB | Viewed 11786 times ]


Last edited by Paguo-86PK on 16 Jan 2020 16:07, edited 4 times in total.

30 Mar 2019 03:52
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
reserved


30 Mar 2019 03:53
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
reserved


30 Mar 2019 03:54
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
reserved


30 Mar 2019 03:55
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Практичeски год прошёл…
Так как я запутался в узле управления внешней памятью и здесь это прослеживается на cpu.v в строчках 42…98 приличным бардаком, была мысль подойти к решению этой проблемы со стороны графического дизайна принципиальной схемы. А так как серьёзная OrCAD и весит достаточно серьёзно, имея к тому же уйму багов в графическом редакторе, я решил использовать более простой инструмент - LogiSim.
Здесь я уже построил RISC и узел управления шинами более-менее работоспособный.
Однако, этот узел не применим в моём CISC и требуется заново всё разрабатывать и отлаживать.

Удалось лишь проработать узел регистрации x80-команд.
А именно:
  • IC (Instruction Code) - регистр хранения кода активной команды
  • IB (Instruction Base) - регистр хранения префикса активной команды
  • ID (Immediate Data) - регистр хранения константы активной команды
  • IA (Instruction Align) - регистр опционального выравнивания команды
 "Демонстрация CISC-схемы в LogiSim"

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

Таким образом, с помощью простого LogiSim я прощупываю пути к корректному логическому описанию моего x80 средствами Verilog, так как в LogiSim можно оперативно прервать работу схемы в любой момент и изучить всё состояние схемы в деталях, внося коррекцию без перезапуска. Тогда как в Verilog я, как разработчик, обязан чётко понимать по диаграммам что где должно переключаться в такой-то момент. А это для меня слишком затруднительно на моём текущем уровне владения Verilog.


Attachments:
File comment: Необходимые файлы для симуляции аппаратного дизассемблера x80-инструкций.
x80-logisim.zip [16.18 KiB]
Downloaded 472 times
14 Oct 2019 07:31
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Вчерa весь вечер потратил на перенос схемы с LogiSim в Proteus…
Так как многие логические элементы изображаются фигурными и слишком крупно, пришлось изрядно потрудиться и над IEC-дизайном. Почему-то в LogiSim с этим особых проблем не возникало, тогда как в OrCAD и Proteus дефолтная графика слишком по-детсадовски огромна! :esurprised:

Не удалось применить микросхемы одной серии и пришлось смешивать S/ALS/F/HC/HCT, что уже довольно не хорошо! А когда почти закончил, ахнул от величины схемы в корпусах: 20 микросхем! :o
Почему почти? Один бит (самый старший в ID на LogiSim-дизайне) не смог никуда разместить! Отдельно ТМ2 добавлять - тоже не очень красиво, так как помимо тактового входа требуется ещё разрешающий. А это требует вентилей опять же…
И U19/U20 корпусами выдались как знаменитый ИД3! :surprised:

В общем, теперь сижу и думаю…
По-своему красиво было бы процессор свой живьём собирать отдельными платками-модулями для каскадной сборки.
А с другой стороны - никак не ожидал, что модуль выборки команд получится таким концентрированным, объёмным и сложным… :roll:

P.S.: Два месяца прошло, а чем серьёзнее я хватаюсь за идею, тем больше разочарования и ошеломительных подробностей… :econfused:


Attachments:
File comment: Схема узла выборки команды.
IA/IB/IC хранятся элементами U17/U18/U19,
а 8 бит ID - элементом U20

The_x80_fetch.png
The_x80_fetch.png [ 55.46 KiB | Viewed 10880 times ]
31 Dec 2019 05:41
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Paguo-86PK wrote:
Вчерa весь вечер потратил на перенос схемы с LogiSim в Proteus…
Так как многие логические элементы изображаются фигурными и слишком крупно, пришлось изрядно потрудиться и над IEC-дизайном. Почему-то в LogiSim с этим особых проблем не возникало, тогда как в OrCAD и Proteus дефолтная графика слишком по-детсадовски огромна! :esurprised:

Ну во-первых, в Proteus есть выбор между фигурными и НЕфигурными элементами,
а во-вторых, в Proteus без потери функционала можно нарисовать собственные элементы
любой произвольной формы.
Вот по-детсадовски жаловаться на пакеты с широкими возможностями как-то неуместно. :-?

_________________
iLavr


31 Dec 2019 08:50
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Нос буратино ушёл в курилку...

_________________
:dj: https://mastodon.social/@Shaos


15 Jan 2020 18:51
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Shaos wrote:
Нос буратино ушёл в курилку...
Спасибо! :oops:


15 Jan 2020 19:57
Profile WWW
Maniac
User avatar

Joined: 12 Apr 2011 20:43
Posts: 267
Location: Tashkent
Reply with quote
Потрaтил три дня на то, чтобы подогнать свой HTML5-эмулятор под новый префикс - «00».
Казалось бы - пустячок!
На самом же деле - рухнуло всё!
Исчезла вся таблица команд, отказал ассемблер и дизассемблер, отказало и само ядро эмуляции.
И все три дня я шаг за шагом, средствами встроенного в Хром отладчика, корректировал десятки моментов по разным строчкам в файле с общим числом строк более 6500 :exclaim:

В итоге, пришлось забраковать частично то решение, которое я реализовал в схеме.
В схеме команда без префикса имеет префикс по-умолчанию #8, а «супер-префикс» для нужд супервизора имеет код #0, что, казалось бы, схематически упрощает решение.
Однако, на многих сайтах я спорил на тему, что в своём x80 я не буду совершать банальные ошибки инженеров 70-х, которые ради упрощения топологии кристалла устроили исковерканную систему команд. В своём процессоре система команд, хоть и не так проста для новичка, но она не требует зубрёжки, если программировать прямо дампом. Большинство кодов - сквозные и шестнадцатеричные знаки кода являются аббревиатурой инструкции.

Тем самым, если описывать дешифрацию команд по схеме, то она усложняется. Так как в JavaScript команды я закодировал в стиле Verilog под модуль с «casex», то без префикса код 8 всё ломал и усложнял.
Пришлось оставить префикс по-умолчанию - код 0, а супер-префикс - код 8. И всё заработало как надо.

Теперь нужно думать, как доработать схему к новому принципу.
Хотя, если схема будет просто ссылаться на адрес микрокода - то ничего менять не нужно.
А если схема будет реальной CISC-архитектурой, то данная мелочь с префиксами, если её не исправить, усложнит узел дешифратора не так уж незначительно. :roll:


09 May 2020 04:40
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 10 posts ] 

Who is online

Users browsing this forum: No registered users and 20 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:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.