Перейти к содержанию
    

Койяанискаци - ТТЛ-процессор с душой акына

35 minutes ago, iosifk said:

Может быть следующую книжку послать? Скажем про конвейер в ARM?

Тоже интересно глянуть!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, Alikberov сказал:

(На участке схемы слишком много сигналов - отделить тяжело: Слишком много сигналов для ручной их подачи…)

Когда-то очень-очень давно я читал интервью писателя фантаста Артура Кларка. Его спросили о том, как он успевает написать так много. Артур сказал, что раньше писал авторучкой. Это было медленно, почти так же как высекать буквы на камне. Потом он купил пишущую машинку и дело пошло быстрее. Потом он диктовал секретарю, а том - печатал. Это было еще лучше, но все же напечатанный текст было тяжело редактировать.... А вот потом он купил огромный мэйнфрем-компьютер с кастрюлями дисков и перфораторами всякими. И ему поставили программу распознавания голоса. Но они тогда не умели "слушать" всех и Артуру пришлось надиктовать свой словарь. И вот тут Артур сказал, что наступило для него "счастье", потому как для написания текста и его последующего редактирования не надо было прилагать какие-либо усилия.

К чему это все сказано? А что Вас удивляет, если технологии разработки у Вас еще находятся на уровне "печатающей машинки"? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

50 минут назад, haker_fox сказал:

Тоже интересно глянуть!

Сейчас про ARM под руками нет, но вот в моих "художествах" есть описание V850 нековского. Там примерно такой же конвейер... 

http://www.compitech.ru/html.cgi/arhiv/07_06/stat_24.htm

Про Микроблэйз - Зотов КиТ №9 2003 - это тоже похоже на АРМ...

 

А еще книжка эта влезла... Ну и кусок презентации. Пока хватит, чтобы начать жевать и грызть. 

computer_arch_quantitative_approach.pdf lec9_2.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Читaю и возникло несколько вопросов…

 

Первое: Теоретически конвейер в мою архитектуру можно добавить…
Цепочка кода «A1 AB 5F 4E 3D 2C 1B 0A» как «A1 = ((((B5 ^ B4) | B3) & B2) - B1) + B0)» может быть выполнена за 1 такт, так как определение операндов «AB» попадается 1 раз, если иметь 6 АЛУ и Регистровый Файл на 6 портов. То есть, любая замена приёмного регистра сорвёт цепь конвейера.
Теоретически, можно сделать РФ и на 10 портов: Здесь есть над чем задуматься…
(Здесь обсуждается именно Койяанискаци-прототип, который просто должен выполнять код. Тогда как другой вариант (как процессорные секции), в принципе, вполне мог иметь бы механизмы наращивания ступеней конвейера и разрядности…)

 

Второе: Если каждый из 30 РОН заменить с регистра на память, то появится возможность переключать контексты задач за 1 такт.
Любопытно то, что на данный момент сделать это я могу в рамках схемы, но это совершенно бессмысленно, так как необходимо добиваться стабильной работы на уровне прототипа, а не разрывать архитектуру в клочья попытками перепрыгнуть свои возможности…
 

Третье: В ARM7 всю рутину работы с подпрограммами и стеком берёт на себя программист. У меня - та же ситуация, так как любой переход помещает в пару B0:C0 точку разрыва, которую, при необходимости, нужно самому поместить в стек, организовать поддержку которого, опять же, должен программист…

 

Если «первое» и «второе» я ещё осилить могу при желании и необходимости, впихнув в некий конвейер.
То «третье» - в конвейер у меня не ляжет (в смысле - в голове не укладывается пока)…

 

Спасибо за любопытный материал!
Но, позвольте поинтересоваться вот чем…
Ваша помощь в отсылках на такой сложный справочный материал чем мотивируется?
Простым желанием просветить акына в его попытках сделать хоть какую-то архитектуру?
Желанием довести начинание до презентабельного вида, чтобы хоть какой-то привлекательный вид имел и не канул в «анналы технологий»?

 

P.S.: Пока я понял одно: Использовать встроенный Регистровый Файл на 30 ячеек в FPGA будет неверным для мультиконтекстной реализации.
Необходимо использовать 30 независимых РФ на 64 Кб, чтобы иметь возможность переключаться хоть между 65536 различными задачами.
А в идеале - влепить 30 АЛУ и глубоким конвейером за 1 такт выполнить выражение из 30 действий…

 

P.P.S.: Есть ещё одно соображение, которым я занимался и отверг, опасаясь потери стабильности в гипотетической реализации в ТТЛ.

Если считывание новой команды из памяти совместить с исполнением уже считанной, опираясь на внутренние задержки…
(В анимации: Код из памяти в регистр заносится во время перехода выхода памяти в Z-состояние и инкремента счётчика команд. А значение в 1 из 4 регистров заносится в момент обновления регистра команд с переключением на другой регистр…)

Быстро, но опасно…

module foo
(input	wire		TICK
,input	wire		RESET
);
	reg	[7:0]	RAM[0:3];
	reg	[3:0]	IP;
	reg	[7:0]	IC;
	reg	[7:0]	R0, R1, R2, R3;
	wire	[7:0]	DATA;

	assign	DATA = TICK ? RAM[IP] : 8'Bzzzzzzzz;

	always	@(negedge TICK)
	begin
		IP <= IP + 1;
		IC <= DATA;
		case(IC[2:0])
		3'B000:	R0 <= IC;
		3'B001:	R1 <= IC;
		3'B010:	R2 <= IC;
		3'B011:	R3 <= IC;
		endcase
	end
endmodule

critical.gif

Изменено пользователем Alikberov
нестабильные модули?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, Alikberov said:

Первое: Теоретически конвейер в мою архитектуру можно добавить…

Да не надо вам сейчас реализовывать конвейер. У вас, повторюсь, архитектура системы команд не определена как следует. Для вас пока план действий - определить архитектуру, а потом реализовать ее для начала в виде многотактового процессорного ядра, делающего все по шагам (тактам). Когда такой вариант заработает - займетесь его конвейеризацией. К этому моменту у вас уже и знаний поднакопится, и верификационное обеспечение (testbench and tests) какое-никакое соберется, и если более-менее повылавливаете баги в этом варианте процессора - то и референсная модель будет. Плюс к тому времени вы в нормальном темпе (а не за одну ночь) поизучаете посоветованную вам книгу "Computer Architecture: Quantitative Approach", и будете более-менее представлять хотя бы ТЕОРЕТИЧЕСКИ пока, как эти конвейеры работают. "Не так быстро, приятель!" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описание архитектуры должно включать. как минимум, следующее:

  • описание всех команд, их битовых полей, и выполняемых ими действий (на таком уровне конкретики, чтобы прямо с листа можно было бы брать и реализовывать в HDL, а не вспоминать - что еще эта категория инструкций должна была делать, когда месяц назад я размышлял над ней, и мой полет фантазии был прерван увлекательной перспективой аппаратной поддержки переключения контекста на 64К задач). Посмотрите описание системы команд какого-нибудь процессора - хоть ARM, хоть Intel, и доведите уровень проработки до близкого к этому уровня.
  • регистры - РОНы (GPRs), системные/управляющие/статусные (CSRs) etc
  • системный уровень - исключения/прерывания (как они работают, какие ресурсы процессора задействуют), поддержка многозадачности (если она есть)
  • поддержка программной отладки (этот пункт - желателен, но обязательным, в общем-то, не является для первой реализации)

Оформите это все в виде какого-никакого документа. Или хотя бы начните оформлять по принципу сверху вниз (если уж совсем невмоготу, и хочется начать писать HDL код отдельных частей), создайте первую, черновую, неполную версию такого документа, а потом дополняйте, детализируйте и даже модифицируйте его по мере продвижения вперед. Но "сверху вниз" - это принципиально важно. Спроектируйте хотя бы сначала раму для шкафа, а потом заполняйте его полочки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, Alikberov said:

 если иметь 6 АЛУ и Регистровый Файл на 6 портов. То есть, любая замена приёмного регистра сорвёт цепь конвейера.
Теоретически, можно сделать РФ и на 10 портов: Здесь есть над чем задуматься…

Воистину есть над чем :) Я, конечно, мог бы сказать, что это нереально, но ... зачем так грубо топтать мечту. Я просто посоветую вам такой подход: освойте параметризацию своего кода (это тоже не за один наскок делается, не гоните лошадей, но навык все равно необходимый для серьезного дизайна), и начните проектировать свое ядро с N соответствующими элементами (ALU, портами регистрового файла и т.п.). А при проверках/моделировании пока, до поры до времени, ограничьтесь разумными значениями для N (2-3). Когда доберетесь до реализации в аппаратуре (в FPGA), то, подставляя бОльшие значения, попробуете "влепить 30 АЛУ и глубоким конвейером за 1 такт выполнить выражение из 30 действий…" :) И сразу увидите, к чему это приводит, уже не с моих слов, а из результатов синтеза и временнОго анализа.

Quote

Спасибо за любопытный материал!
Но, позвольте поинтересоваться вот чем…
Ваша помощь в отсылках на такой сложный справочный материал чем мотивируется?
Простым желанием просветить акына в его попытках сделать хоть какую-то архитектуру?
Желанием довести начинание до презентабельного вида, чтобы хоть какой-то привлекательный вид имел и не канул в «анналы технологий»?

Это не справочный материал. Это учебная литература, используемая в университетах по всему миру для обучения, в том числе, будущих проектировщиков процессоров (хотя и не только их). Сам учился по "Computer Architecture: Quantitative Approach". Вдогон к указанной есть и еще литература, но не все сразу. Эта - хороший стартовый фундамент.

 

Quote

Код из памяти в регистр заносится во время перехода выхода памяти в Z-состояние и инкремента счётчика команд.

Не надо так буквально следовать принципам подключения внешней RAM. Память еще бывает и внутренняя, и там никаких Z-состояний и двунаправленных передач нет и они не нужны. И вообще - в коде для внутренностей процессора не должно быть Z-состояний и inout'ов. Только однонаправленные сигналы. Для общения с внешним миром - там да, будут. А внутри - нет, и не должно быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В эльбрусе регистровый файл и 12 портов делали, тут ничего невозможного или оригинального.

Вот что действительно интересно увидеть, это самодельный проц с дата-флоу архитектурой. У дата-флоу существенное преимущество - реже обращения в память. Везь память, как известно, узкое место в дизайне. Это и перспективно и интересно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, Raven сказал:

Не надо так буквально следовать принципам подключения внешней RAM.

Простo следовал классике жанра

16 часов назад, Raven сказал:

И вообще - в коде для внутренностей процессора не должно быть Z-состояний и inout'ов.

Вообще-то. структурная схема i8080 как бы однозначно указывает на внутреннюю inout-шину данных, а микросхема К531ИР24 описывается именно для такого использования. Основной недостаток такой архитектуры - слишком много тактов и хранение результата в промежуточном регистре.
К сожалению (или нет), в самом начале проектирования данного процессора я торопился и хотел запустить всё с пол пинка, потому и не смог с ходу вникнуть в тонкости организации внутренней шины данных.
Хотя, визуально это выглядело бы довольно эффектно в схеме при обработке кода. До сих пор есть желание построить Койяанискаци-схему с такой архитектурой в жанре Ретро.

10 часов назад, Aleх сказал:

В эльбрусе регистровый файл и 12 портов делали, тут ничего невозможного или оригинального.

Слишком много мультиплексоров потребуется. А я - не для военки это делаю, а для «красоты».

17 часов назад, Raven сказал:

У вас, повторюсь, архитектура системы команд не определена как следует.

Вот тут как бы неопределенно всё.
Например, код «AA A1 14» сейчас означает «A1 += 14», хотя есть мысль интерпретировать его как «A1 = *(BYTE *)(B1C1 + 4)» или «A1 = *(BYTE *)(B1C1 + A4)».
Тем самым, если стек адресуется регистрами B9C9, то сослаться на данные в стеке легко можно будет одним кодом «94», но не записать их.
Тогда коды AE/BE/CE/DE можно упразднить как чтение из памяти. А вот запись - с добавлением префикса.
(Здесь уже играет роль некий кураж, так как схематически это достаточно легко реализуется. Но, архитектура - усложняется, что не по правилам, так как ещё дальше от RISC получается…)

 

P.S.: На самом деле реализовать можно многое. Данный проект - не первый, так как многие я загубил на нет бесконечным усложнением:download:

Сейчас пришёл к выводу, что «подчёркнутое выше» - слишком нестабильное решение с риском завалить всё.
Пока код, например, «23» переделал в «LEA B0C0,[B0C0+23₁₆]» добавлением 16-битного сумматора. И коротко, и просто…

Изменено пользователем Alikberov
LEA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Удивительнo, но факт: С заявлением о пандемии и объявлением карантина мне удалось за считанные недели перерисовать несколько вариантов схем этого процессора (именно эстетически, чтобы светофорики аккурат у регистров симпатично располагались) и отладить новые функции. А теперь - с трудом ввёл некоторые доработки и чуточку исказил и не без того плотную схему, в которой новые элементы и проводки с трудом уже добавляются…

Добавил черновое описание новых функций префиксов, обновил файлы репозитория.

 

Во всех процессорах, с которыми я работал (i8080/z80/x86) иногда сильно не хватало некоторых простейших операций. А именно - реверс битов регистра, который байт «01010011» обращал бы «11001010». Будь эта операция ещё в i8080, инструкция 29₁₆ «DAD H» могла бы прокручивать HL не только влево, но и вправо, что крайне выгодно в алгоритмах деления…
 

Теперь Койяанискации имеет подобные механизмы.
Увы, в кодах примеров их пока нету, так как отлаживал поведение схемы в этом плане.

Так, «A1 &= ~B2» теперь кодируется как «A1 AB 80 2C», а с реверсом бит «A3 ^= TWIDDLE(B4)» кодируется как «A3 AB 90 4E».
Естественно, одновременно нельзя сдвигать биты, инвертировать их и производить реверс одной операцией. Всё нужно производить отдельными операциями…
 

P.S.: Естественно, вариант схемы не проверялся на стабильность, но программа с примером не заглохла и выводит на терминал текст с опросом джойстика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Alikberov said:

Так, «A1 &= ~B2» теперь кодируется как «A1 AB 80 2C», а с реверсом бит «A3 ^= TWIDDLE(B4)» кодируется как «A3 AB 90 4E».

Как бы вы не стремились сделать систему команд понятной, похоже, что понятная она лишь вам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, Alikberov said:

Добавил черновое описание новых функций префиксов, обновил файлы репозитория.

Репозиторий на GitHub - это очень правильный шаг, вне всякого сомнения. Могу порекомендовать разделить содержимое на подпапки: docs, logisim, rtl, sim. Последние 2 - для HDL кода и файлов, относящихся к симуляции соответственно. В будущем к ним еще и папку fpga можно будет добавить - для проектов FPGA.

Полнота описания все еще под вопросом (детально не вникал, уж извините, но в сравнении с описанием Intel 8080 выглядит подозрительно минималистично). Но уже сделанное - хороший старт. Описание можно будет пополнять по мере написания кода на HDL, поскольку неизбежно будет возникать задача проработки структуры/поведения очередного модуля. Как и говорил уже, крайне рекомендую метод сверху - вниз. Хотя на некоторое время вам, возможно, надо будет отвлечься на изучение-освоение нового (см. ниже).

Пишу все это в расчете на то, что вы займетесь-таки основательно изучением какого-нибудь HDL (рекомендую все-таки начинать с Verilog, потом расширить знания до SystemVerilog) и методологии RTL-дизайна. "Нет таких крепостей, которых не могли бы взять большевики" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 час назад, haker_fox сказал:

Как бы вы не стремились сделать систему команд понятной, похоже, что понятная она лишь вам.

Из-зa префиксов она становится менее понятной даже для меня!:biggrin:
Здесь главное - вникнуть в основы. А в основах - практически все команды (без_префиксов) имеют аббревиатурное назначение…
«A4 AB 7A» следует читать как «A4 A,B7 Add» если действительно хочешь научиться программировать на нём.
(Ни один из существующих процессоров не имеет такую приветливую систему кодирования команд!
По сути, «битовые поля» - та же эзотерика в серьёзных индустриальных процессорах:sarcastic:)


Койяанискаци - хоть и эзотерический в общем плане, но самой эзотерики в нём меньше, чем в тех же z80/x86.
 

А вот под префиксами смысл некоторых кодов меняется - это да…
Плохо ли это?
Повторяю: В том же x86 mod/reg/r/m-поля откровенно пахнут эзотерикой, где порядок регистров следует как AL/CL/DL/BL - не по-алфавиту. И способы адресации все мудрёные, что при написании эмулятора/дизассемблера, обычно, начинаешь с функции разбора этих полей…
Потому, так как я не знал раньше, куда пристроить операции сдвига «SHL/SHR» в системе команд Койяанискаци, то просто внедрил их под префиксами в логические операции: Если программист понимает в логических операциях, разберётся и в их расширениях…:whistle3:

18 часов назад, Raven сказал:

Полнота описания все еще под вопросом (детально не вникал, уж извините, но в сравнении с описанием Intel 8080 выглядит подозрительно минималистично).

Никак не могу разобраться со структурой руководства, чтобы все основные сведения были кратко изложены и понятны.

18 часов назад, Raven сказал:

Пишу все это в расчете на то, что вы займетесь-таки основательно изучением какого-нибудь HDL (рекомендую все-таки начинать с Verilog, потом расширить знания до SystemVerilog) и методологии RTL-дизайна. "Нет таких крепостей, которых не могли бы взять большевики" :)

Дешифратор команд попытался описать так:
 

module	command_decoder
(input	wire	[7:0]	CODE	// Instruction
,input	wire		EN	// Enable decoding
//////////////////////////////////
,output	wire		QREG	// A0..A9 / B0..B9 / C0..C9 / D0..D9
,output	wire		QARG	// AA..AD / BA..BD / CA..CD / DA..DD
,output	wire		QEXT	//   AE   /   BE   /   CE   /   DE
,output	wire		QFIX	//   AF   /   BF   /   CF   /   DF
,output	wire		QRET	// E0..E7
,output	wire		QCND	// E8..EF
,output	wire		QHLT	// F0..FF /   00
,output	wire		QBCD	// 01::99
,output	wire		QREP	// 10::90
,output	wire		QALU	// 0A..9F (Add, suB, and, or, Eor, mov)
,output	wire		SHFT	// 0C..9F - Bits shifting (and, or, Eor, mov)
);
	wire		HREG, LREG;
	wire		HNUM, LNUM;

	function	is_reg;
	input	B3, B2, B1;
		begin
			is_reg = B3 & (B2 ^ B1);
		end
	endfunction

	function	is_num;
	input	B3, B2, B1;
		begin
			is_num = B3 & (B2 | B1);
		end
	endfunction

	assign	HREG = is_reg(CODE[7], CODE[6], CODE[5]);
	assign	LREG = is_reg(CODE[3], CODE[2], CODE[1]);
	assign	HNUM = is_num(CODE[7], CODE[6], CODE[5]);
	assign	LNUM = is_num(CODE[3], CODE[2], CODE[1]);

	assign	QREG = EN & (HREG & LNUM);
	assign	QARG = EN & (HREG & LREG);
	assign	QEXT = EN & (HREG & CODE[3] & CODE[2] & CODE[1] & ~CODE[0]);
	assign	QFIX = EN & (HREG & CODE[3] & CODE[2] & CODE[1] & CODE[0]);
	assign	QRET = EN & (CODE[7] & CODE[6] & CODE[5] & ~CODE[4] & ~CODE[3]);
	assign	QCND = EN & (CODE[7] & CODE[6] & CODE[5] & ~CODE[4] & CODE[3]);
`	assign	QHLT = EN & ((CODE == 8'H00) | (CODE >= 8'HF0));
	assign	QBCD = EN & (HNUM & LNUM & (CODE[3] | CODE[2] | CODE[1] | CODE[0]));
	assign	QREP = EN & (HNUM & ~(CODE[3] | CODE[2] | CODE[1] | CODE[0]));
	assign	QALU = EN & (HNUM & CODE[3] & (CODE[2] | CODE[1]));
	assign	SHFT = EN & (HNUM & CODE[3] & CODE[2]);

endmodule

Но не уверен, так как модуль описан в стиле примитива комбинаторики.
А по правилам FPGA его следует описывать через always-блоки и combo, на сколько я понял…
Просто взял и перевёл Logisim-схему дешифратора на Verilog-листинг.
Правда, ещё testbench не описывал и не уверен в её поведении…

 

P.S.: Обновил набросок дизассемблера

Изменено пользователем Alikberov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во всех процессорах, с которыми я работал (i8080/z80/x86) иногда сильно не хватало некоторых простейших операций. А именно - реверс битов регистра, который байт «01010011» обращал бы «11001010».


"Тому незачем черта искать, у кого он за плечами сидит..."
Исключающее ИЛИ (xor в просторечии) с 0хFF реверсит биты "на ура" ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 минут назад, Obam сказал:

Исключающее ИЛИ (xor в просторечии) с 0хFF реверсит биты "на ура" ;-)

Нe совсем так: Имелось ввиду именно реверс порядка битов:

{bit[7], bit[6], bit[5], bit[4], bit[3], bit[2], bit[1], bit[0]}
<=
{bit[0], bit[1], bit[2], bit[3], bit[4], bit[5], bit[6], bit[7]}

или

bit[7:0] <= bit[0:7]

Ссылку не просто так дал…:declare:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...