4-bit Processor

4-битные микроконтроллеры и микропроцессоры (прошлое, настоящее, будущее)

Moderator: Lavr

User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:Чувствую, что программирование этого проца будет экстремальным :). Мы уже настолько привыкли к роскошам типа неограниченной вложенности подпрограмм, прерываний и прочая...
Не думаю, что экстремальнее PIC-a...
И вложение подпрограмм практически не хуже PIC-a можно сделать.

Вот в том виде, как он сейчас, это реально экстремально! :o
И то - работая с моделью, я уже привык программить его в кодах. :wink:
Для 15 комманд - ассемблер как-то извращенно заводить. :D


Когда берёшься за PIC после i8080, всё тоже кажется криво...
но привыкаешь! 8)
.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:Префикс, думаю, будет выполняться как команда без параметра, задача
которой - включить один из старших битов адреса в ПЗУ микрокоманд.
Префикс с параметром, кстати, согласно схеме, выполнить тоже нетрудно.
Даже можно сделать префикс типа prefix N:

Image

Нижние 4 линии адреса обеих ПЗУ микрокоманд - отцепить от общего провода,
и подключить к ним регистр 155ТМ8.
(На рисунке - в левом нижнем углу.)

Если префикс выбрать как ниббл F, то по команде prefix N это N
защелкиваем в регистр типа 155ТМ8, и получаем другой набор команд.

ПЗУ хуже чем здесь в схеме уже не найти... :wink: Так что надо его объём задействовать полностью!
Вот только не знаю пока - сбрасывать ли префикс после выполненной команды,
или новой командой префикса?
То есть распространять ли префикс на группу команд?
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

RISC vs CISC

Post by Lavr »

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

Если посмотреть определение RISC архитектуры:
Главными требованиями архитектуры RISC являются:
1. Любая операция должна выполняться за один такт.
2. Система команд должна содержать минимальное количество наиболее часто используемых команд одинаковой длины.
3. Операции обработки данных реализуются только в формате регистр-регистр. Обмен между регистрами и памятью выполняется только командами загрузки-записи.
В дальнейшем эти требования были несколько смягчены. Выполнение команды за один такт стало трактоваться, как загрузка конвейера команд в темпе "команда за такт". Набор команд современных RISC-процессоров возрос и содержит до 150 команд и более.
Незыблемым для архитектуры RISC остается только требование: обработка данных ведется только командами в формате регистр-регистр.
Среди других особенностей RISC архитектур следует отметить:
наличие достаточно большого файла РОНов (32 и более регистров),
для обработки используются трехадресные регистровые команды,
команды регистр/память используются только для загрузки (Ld) РОН из памяти и сохранения (ST) содержимого РОН в памяти,
как следствие упрощения команд, использование аппаратной, а не микропрограммной логики выполнения команд.
То есть, как я понимаю, операции с содержимым ячейки памяти - не приветствуются?
По моим прикидкам, на схемотехнику это влияет довольно значително...
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Думаю, нам тоже нужно следовать такому принципу - доступ к памяти только для обмена с регистрами. Мы же хотим простой процессор?

Кстати, по поводу тестирования на быстродействие. Точно не помню, но предлагалось ли использовать сигнатурный анализ? Мне кажется, сделав простенький анализатор и написав тестовую программу, можно вполне себе решить эту проблему "малой кровью" :)
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:Думаю, нам тоже нужно следовать такому принципу - доступ к памяти только для обмена с регистрами.
Мы же хотим простой процессор?
Конечно! Но простота простоте рознь. :roll:

Просто вырисовывыается вот что (командами 8080):
Работаем с памятью только через аккумулятор А, т.е.
есть загрузка в А из памяти значением ячейки или константой,
и выгружаем в память только из А.
Типа LDAX и STAX.

Все остальные регистры (а я планирую их 16, раз уж я купил К155РУ2 :wink: )
получают значения только из А, и только через А могут отдать значение
в память.

Т.е. "ортогональности", о которой мы упоминали - не будет.
Всё упирается в простоту схемотехники, хотя мне нравится у PIC-ов,
результат можно вернуть не в аккумулятор, а в регистр-операнд.
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Ну и нормально! "Нищебродская" философия требует максимального упрощения.
В АВРах тоже, если память не изменяет, не все регистры равноправны.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:Ну и нормально! "Нищебродская" философия требует максимального упрощения. В АВРах тоже, если память не изменяет, не все регистры равноправны.
Наверное, ты прав... и MC68k - тоже прав... и боги - по-своему мудры,
раз уж речь зашла об гносеологических корнях агностицизма... :wink:


PS. Что меня конкретно смущает: аккумулятор А становится слишком
привилегерованным регистром
:
Непосредственная загрузка становится возможной только в
А .

MVI A,LIT
LDAX
STAX


Загрузка регистров возможна только через А:

MVI A,LIT
MOV R,A


Операции возможны только между А и регистром, или А и константой.

Операции типа INR R и MVI R,LIT - невозможны. Насколько это удобно?
Мне кажется несколько непривычным... :-?
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

И ещё меня несколько смущает вот такой способ включения АЛУ:

Image

Его приводят в большинстве книг по компьютерной архитектуре.

Если R0 принять за аккумулятор, то R1 - это что-то типа темп-регистра результата
и второго операнда одновременно.
Но получается, что загрузить его можно только операцией через АЛУ типа R1 = R0... :roll:

Кстати говоря, и в Машине Мано решение такое же.

Поучается, чтобы выполнить действие, скажем сумму R1 и R0
здесь надо:

1. загрузить R0;
2. передать R0 через АЛУ в R1 (R1 = R0);
3. загрузить R0 новым операндом;
4. выполнить операцию ADD между R0 и R1, результат поместить в R1.

Не слишком ли хитрозадумчиво? :-?
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:Адрес возврата мы нигде сохранять не будем. Он так и останется в РС. :wink:
Раз уж полюбому надо вводить в конструкцию ещё один регистр, шириной в РС,
то пусть это будет дополнительный программный счётчик для подпрограммы!
...
В принципе и третий РС так можно ввести. Чтобы хотя бы два уровня вложения
подпрограмм
было.
Вобщем-то - что-то напоминающее RCA 1802:
Процессор не имеет обычных команд вызова и возврата из подпрограммы (CALL и RET) и поддержки стека. Возможность размещения указателя текущей команды в любом регистре позволяет реализовать необычные способы вызова подпрограмм, однако, в основном подходящих для программ небольшого размера. Адреса нескольких наиболее часто используемых подпрограмм могут размещаться в нескольких регистрах...
Но вот с отсылкой Хардыча на MIPS с одним регистром в стеке возврата -
ничего не нахожу
.

Впрочем, аппаpатный стек на 2 вложения - у семейства PIC16C5x. А я с ним работал
и особых неудобств не испытал.
Правда, быстро отпрыгнул на более популярный PIC16F84, но алгоритмов сильно
не менял.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Lavr wrote: Но получается, что загрузить его можно только операцией через АЛУ типа R1 = R0...
Он нужен скорее для того, чтобы следующее действие АЛУ могло использовать предыдущий результат без его сохранения в память. Если же нужен второй операнд, то там есть стрелочка к АЛУ в обход R1.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Ну что же ты?
Нууууууууу батенька... :( спасибо, конечно, ибо настойчиво я просил...
Но за ссылку на Вику в определённых кругах и по морде бьют... :wink:

Я думал - у тебя конкретный мануал на конкретное изделие... А Вику я видел.
Собственно, хотел узреть где-либо образец, как они с одним адресом возврата
программируют.


PS. Ну раз на то пошло - из Вики не следует, что "у МИПСов 1 уровень стека.
Точнее, у них специальный регистр адреса возврата, куда сохраняется адрес при
вызове подпрограммы.
"

Может я чего-то не увидел, но по Вике - у МИПСов есть указатель стека.
А по другим источниками глубина стека у МИПСов - 4 вложения.
Поэтому я так настойчиво вопрошал тут:"откуда дровишки?"
Last edited by Lavr on 20 Mar 2012 09:55, edited 1 time in total.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:
Lavr wrote: Но получается, что загрузить его можно только операцией через АЛУ типа R1 = R0...
Он нужен скорее для того, чтобы следующее действие АЛУ могло использовать предыдущий результат без его сохранения в память. Если же нужен второй операнд, то там есть стрелочка к АЛУ в обход R1.
Нет... "стрелочка к АЛУ в обход R1" - это чтобы R1 считать;


Источник

Точно такое-же решение видим в Машине Мано:

Image

Все они друг у друга книги списывают, похоже... :D
Поскольку у Intell мы видим всё несколько по-другому.

Image

Аккумулятор получает результат через внутреннюю магистраль,
и с неё же может быть загружен.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:
HardWareMan wrote:Ну что же ты?
Нууууууууу батенька... :( спасибо, конечно, ибо настойчиво я просил... Но за ссылку на Вику в определённых кругах и по морде бьют... :wink:

Симметрично к применению "батенька". :3 Поэтому и не давал до последнего - думал сам догадаешься и скажешь типо "МИПС МИПСу рознь, у одних есть у других нету". Но, видимо, лыжи не той системы.
Lavr wrote:Я думал - у тебя конкретный мануал на конкретное изделие... А Вику я видел. Собственно, хотел узреть где-либо образец, как они с одним адресом возврата программируют.
Конкретный экземпляр ядра: R3000.
Lavr wrote:PS. Ну раз на то пошло - из Вики не следует, что "у МИПСов 1 уровень стека. Точнее, у них специальный регистр адреса возврата, куда сохраняется адрес при вызове подпрограммы."
Может я чего-то не увидел, но по Вике - у МИПСов есть указатель стека. А по другим источниками глубина стека у МИПСов - 4 вложения.
Поэтому я так настойчиво вопрошал тут:"откуда дровишки?"
Если ты внимательно курил Вику, то MIPS сама по себе не делает процессоры, они только продают лицензию на архитектуру. Дровишки я подкидывал по конкретной версии МИПСа: R3000. Он много где применяется, в первоЗЫЧе, например, в РМР плеерах. И вот при дизасме кода от ЗЫЧа или РМР плеера и видно, что уровень стека 1 - тот самый регистр возврата. А книжки мои все взяты из интернетов:
Image
Image
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Конкретный экземпляр ядра: R3000.
Спасибо - вот этой фразы изначально было бы вполне достаточно.


http://vhouten.home.xs4all.nl/mipsel/r3000-isa.html

Когда человек конкретно спрашивает, то он явно не хочет в самодогадки играть, нет? :3



PS. Если проц 32-разрядный и 32-разрядная шина адреса, или если проц
16-разрядный и 16-разрядная шина адреса, то ухватить адрес возврата
в регистр - не трудно.
Даже 16-разрядный адрес в 8-битном проце удобно ухватить в 8-битные
регистры можно за 2 захода.
В 4-битном проце 12-разрядный адрес можно сохранять в 4-битные регистры
в 3 захода.
Либо ничего не сохранять, а грузить сразу 12 бит в дополнительный РС за один
цикл.