nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 20 May 2018 09:49



Reply to topic  [ 78 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6  Next
Гибрид 8085 и 6502 в FPGA 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
pvlad wrote:
Shaos wrote:
Замысел в том, чтобы одним и тем же контроллером пользовались и любители 8080, и любители 6502 и экспериментаторы типа меня :)

Я о том же - кому что нравится. Но я не представляю ситуации, чтобы часть кода выполнял 8085, потом встречается команда переключения процессора и остальной код выполняет 6502. Это что-то новое. В чем уникальное различие этих процессоров, чтобы в одной задаче необходимо было попеременно использовать два процессора?


Например если есть алгоритм, который на 6502 выглядит проще и логичнее и соответственно работает быстрее (кстати кое-кто до сих пор уверен, что 6502 на 1 МГц работал быстрее, чем Z80 на 3.5 МГц - я сам не знаю не проверял, но вполне возможно ибо в 6502 был конвейер команд - чуть ли не самый первый в истории процессоростроения)

pvlad wrote:
Shaos wrote:
По поводу шин адреса и данных - можно конечно всё напрямую вывести, но это будет уже 16+8+2=26 ног (27 если считать M/IO), которые можно было бы отдать под порты ввода-вывода.

Будем считать - это первый вариант:
Шина 29 ног (Adr+Data+M/IO+WR+RD), порты 4х8=32ноги. Это уже 61+остальное служебное управление, видео и т.д.=100ног.


У меня шина получается 27 ног :)
Или предполагается что будут ещё 2 адресных сигнала?
Всё таки хочется присмотреться к стандартному 40-ногому корпусу - чтобы заиметь прототип реального чипа (чем чёрт не шутит - может и дойдёт до производства ; ) ну или хотя бы с замашками на DIP-плату типа BASIC-stamp (современные хоббисты это дело любят, т.к. в бредборду втыкать легко)

pvlad wrote:
Shaos wrote:
А что если сделать настраиваемым формат использования портов ввода-вывода (как у многих микроконтроллеров - если цель в итоге получить микроконтроллер в одном корпусе)?

Пусть это будет второй вариант. Давайте прикинем, что мы выиграем, а что проиграем. Плюс: экономим ноги ПЛИС - шина, мсх-ма памяти, чуть меньше печатная плата. Минус: теряем 2-3 порта, мало внутренней памяти под код. При расширении памяти, все равно микросхему придется повесить, да и еще расхлебывать мультиплексирование. Ну и, видимо, дополнительная плата расширения.Если честно, то первый вариант более логичный. Я бы от второго отказался. Кроме того, можно для первого варианта сделать дополнительный режим: внешняя память не ставится (но место на печатке есть), а используется только внутренняя 8К, т.е 2К видео-ОЗУ+6К под код. Как переключать эти модификации первого варианта - не знаю. Может быть через дополнительную ножку ПЛИС?


Вот я и предлагаю 3 режима:
1) только порты ввода-вывода, память только внутренняя (в 40-ногом корпусе можем иметь до 5 портов (пятый не полный));
2) внешняя память допустима, но по мультиплексированной шине (в 40-ногом корпусе можем иметь 40-2-16-4=18 т.е. 2 порта или чуть больше);
3) внешняя память подключается по полной шине (в 40-ногом корпусе можем иметь 40-2-16-8-3=11 т.е. 1 порт и ещё чуть-чуть)
Режимы можно переключать через прошивку "микроконтроллера" (аналог прожигания "фьюзов" на современных микропроцессорах)

pvlad wrote:
Но здесь хотелось бы уточнить, какие варианты ПЛИС по ногам применимы в нашем случае. От чего плясать?


Не думаю что нужно выбирать плис на этом этапе - надо сделать универсальный вариант, который бы прижелании мог быть прошит как в FPGA (а может даже и в большую CPLD), так и в ASIC

pvlad wrote:
Shaos wrote:
По поводу времени выполнения команд - это будет CISC и скорее всего с микрокодом, т.е. времянки в любом случае будут отличаться от оригиналов и расчёт времени выполнения того или иного куска программы уже будет нетривиален...

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


Ок - убедили :)

pvlad wrote:
Другое дело, необходимо сделать несколько тактовых частот, переключаемых с помощью внутреннего порта. Например, минимальная, максимальная и 1-2 промежуточные. Частоты должны быть кратны под UART. Если останутся своб.ноги, то можно сделать выход тактовой частоты (после какого-то деления).


Насколько оправдано иметь программный переключатель тактовой частоты? Я не представляю ситуации, чтобы часть кода выполнялось на одной частоте, потом встречается запись в порт тактовой частоты и остальной код выполняется в два раза быстрее... :roll:

Логичнее иметь внутренний кварц (не сильно быстрый), но при желании пользователь может тактовую частоту подавать снаружи. По поводу выдачи поделённой частоты наружу - штука иногда может быть полезна, но она занимает лишнюю ногу - если пользователю сильно надо, то он может от того же внешнего TTL-осциллятора взять сигнал и поделить своим счётчиком на всё что угодно.

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


13 Dec 2009 16:39
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
Теперь перейдём к конкретике - у 8080 есть 12 неиспользуемых кодов, в 8085 заюзаны ещё два (RIM и SIM) итого остаётся 10. А вот у 6502 есть целых 105 неиспользуемых кодов (правда у 65C02 их только 46), и даже один из них также свободен в случае 8080/8085 - это код 0xCB, вот его и можно назначить кодом переключения процессора (до следующего вызова 0xCB).

По поводу битовых операций - в 65C02 (по сравнению с оригинальным 6502) добавились команды проверки битов (а также переходов в зависимости от состояния битов) в нулевой странице (память с адресами от 0x0000 до 0x00FF) - а это ведь можно представить как 256 портов! Вот отсюда идея - иметь префикс переключения типа процессора только на одну команду - в этом случае можно временно переключаться из 8080/8085 в 6502/65C02 чтобы проверить бит порта!

По поводу стека - в 6502 стек всегда находится в первой странице памяти (с адресами от 0x0100 до 0x01FF) - у меня есть пара мыслей как примирить это с 8080, но об этом позже.

По поводу флагов - 8080/8085 имеет следующий набор флагов:

0) C - carry
1) 1 - always "1"
2) P - parity
3) 0 - always "0"
4) AC - auxilary carry
5) 0 - always "0"
6) Z - zero
7) S - sign

а 6502/65C02 следующий:

0) C - carry
1) Z - zero
2) I - interrupt disabled
3) D - decimal mode
4) B - brk software interrupt
5) 1 - always "1"
6) V - overflow
7) S - sign

как видно тип процессора можно получить по биту 5: если он "0" то это 8080/8085, а если "1" то это 6502/65C02 (осталось придумать как универсально считывать состояние этого флага в любом процессоре)

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


Last edited by Shaos on 13 Dec 2009 22:11, edited 1 time in total.



13 Dec 2009 21:07
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
Интересно посмотреть что за команды у 65C02 находятся на месте неиспользуемых в 8085 (вдруг что-то можно сделать общим):
0x08 - PHP (положить байт флагов на стек по формуле [--S]=F)
0x10 - BPL byte (условный относительный переход если флаг S==0 по формуле PC=PC+1+offset где offset находится в диапазоне от -128 до +127)
0x18 - CLC (очистить флаг C=0 - у 8080/8085 кстатит только команды взвести и инвертировать есть)
0x28 - PLP (вытащить байт флагов из стека по формуле F=[S++])
0x38 - SEC (установить флаг C=1 - аналог команды STC у 8080/8085)
0xCB - команда свободна у обоих процессоров
0xD9 - CMP(ABS,Y) word (сравнить аккумулятор с содержимым ячейки памяти по адресу word+Y)
0xDD - CMP(ABS,X) word (сравнить аккумулятор с содержимым ячейки памяти по адресу word+X)
0xED - SBC(ABS) word (вычесть из аккумулятора содержимое ячейки памяти по адресу word с учётом заёма (инвертированный перенос) по формуле A=A-[word]-!C)
0xFD - SBC(ABS,X) word (вычесть из аккумулятора содержимое ячейки памяти по адресу word+X с учётом заёма (инвертированный перенос) по формуле A=A-[word+X]-!C)
Как видно с ходу можно заюзать команду CLC (очистка C) в 8080/8085 т.к. такого функционала там нет
Префиксом временного перехода с кодов 8085 на 6502 можно выбрать команду SEC (установка C), т.к. она относительно безобидная если процессор уже был в 6502 режиме
P.S. Напомню что свободные в 8080 команды 0x20 и 0x30 на 8085 заняты командами RIM и SIM соответственно

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


13 Dec 2009 21:53
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
С другой стороны ряд интересных команд из 8080/8085 могут быть заюзаны в 6502 под теми же кодами, например:
0x13 INX D (инкремент DE - в случае 6502 в роли DE будет выступать теневая пара XY)
0x1B DCX D (декремент DE - в случае 6502 в роли DE будет выступать теневая пара XY)
0x22 SHLD word (сохранить HL по адресу word - в случае 6502 в роли HL будет выступать XY)
0x23 INX H (инкремент HL - в случае 6502 в роли HL будет выступать XY)
0x2B DCX H (декремент HL - в случае 6502 в роли HL будет выступать XY)
0x33 INX SP (инкремент указателя стека)
0x3B DCX SP (декремент указателя стека)
0xC3 JMP word (безусловный переход - можно сделать единообразным)
0xD3 OUT byte (записать байт в порт)
0xDB IN byte (прочитать байт из порта)
0xE3 XTHL (меняет местами HL и слово с вершины стека - в случае 6502 в роли HL будет выступать XY)
0xEB XCHG (меняет местами DE и HL - в случае 6502 это будет значить заюзать теневые регистры XY вместо основных)
0xF3 DI (запрет прерываний)
0xFB EI (разрешение прерываний)

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


13 Dec 2009 22:09
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
Только что узнал, что существует ещё одна модификация 65C02 под названием W65C02S у которой пара ранее неиспользованных команд заюзана:
0xCB - WAI (ожидание прерывания)
0xDB - STP (останов)
Я не думаю что их нужно поддерживать...

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


13 Dec 2009 22:20
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
Для 6502 в нулевую страницу (0x0000...0x00FF) как я вижу действительно вставляли порты, правда не вовсю - а как минимум в конец, т.е. можно ввести некий регистр, где 6502 будет хранить границу, после которой в нулевой странице памяти будут распологаться порты (по умолчанию значение этого регистра будет 0x00, т.е. вся нулевая страница - это порты).

Одной ногой как я и говорил предполагается устанавливать начальное состояние процессора - "0" для 6502 и "1" (или висит в воздухе) для 8085. В случае прерываний - процессор автоматически попадает в режим задаваемый этой
ногой! Совмещение прерываний (заметим, что в случае 6502 адрес обработчиков прерываний лежит в памяти по адресам 0xFFxx):
RES - 8085:0000 6502:[FFFC] // начальное состояние адреса команд
NMI - 8085:0024 6502:[FFFA] // для 8085 вход немаскируемого прерывания называется "TRAP" и срабатывает по фронту, в отличие от 6502 где оно срабатывает по спаду
IRQ - 8085:0038 6502:[FFFE] // обычное маскируемое прерывание (для 8085 берём как RST 7, для 6502 может быть вызвано через BRK)
кроме того у 8085 (как и у 8080) есть RST-команды:
RST0 -> 0x0000
RST1 -> 0x0008
RST2 -> 0x0010
RST3 -> 0x0018
RST4 -> 0x0020
RST5 -> 0x0028
RST6 -> 0x0030
RST7 -> 0x0038 (проще всего получить без лишнего железа - подтягиванием резисторами шины данных к питанию)
и чисто аппаратные прерывания у 8085:
TRAP -> 0x0024 (аналогичен NMI у 6502 но инвертированный)
RST5.5 -> 0x002C
RST6.5 -> 0x0034
RST7.5 -> 0x003C
как подружить это многообразие с 6502 пока незнаю, но скорее всего по аналогии будут заведены адреса 0xFFxx для хранения точек входа для обработчиков (будет отключаемым для совместимости)

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


13 Dec 2009 22:57
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
Вот табличка в формате Open Office Spreadsheet для сравнения системы команды двух процессоров:

http://nedopc.org/nedopc/files/nedo6585.ods (15K)

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


14 Dec 2009 08:01
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
пока получается вот что

в 8080/8085 режиме появляются новые команды:
Code:
0x08 - PHP (положить на стек 1 байт флагов в формате 6502)
0x10 - ?
0x18 - CLC (очистить флаг C)
0x28 - PLP (прочитать со стека 1 байт флагов из формата 6502)
0x38 - SEC (префикс того, что следующая команда выполняется в режиме 6502)
0xCB - SWITCH (переключение режима процессора)
0xD9 - CMPL word (сравнить A с содержимым ячейки памяти по адресу word+L) надо?
0xDD - CMPH word (сравнить A с содержимым ячейки памяти по адресу word+H) надо?
0xED - ?
0xFD - ?

кроме того у 8080/8085 есть ряд "бессмысленных" команд MOV r,r - по идее вместо них тоже можно что-то более осмысленное заюзать?

в 6502/65C02 режиме появляются новые команды (в скобках после вопросов написано предпологаемое количество аргументов по даташиту W65C02S):
Code:
0x02 - ? (1)
0x03 - ? (0)
0x0B - ? (0)
0x13 - INC_XY2 (16-битный инкремент теневой пары XY)
0x1B - DEC_XY2 (16-битный декремент теневой пары XY)
0x22 - ? (1)
0x23 - INC_XY (16-битный инкремент пары XY)
0x2B - DEC_XY (16-битный декремент пары XY)
0x33 - INC_SP (инкремент указателя стека)
0x3B - DEC_SP (декремент указателя стека)
0x42 - ? (1)
0x43 - ? (0)
0x44 - ? (1)
0x4B - ? (0)
0x53 - ? (0)
0x54 - ? (1)
0x5B - ? (0) тут у 8080 стоит "бессмысленная" команда MOV E,E - воспользоваться?
0x5C - ? (2)
0x62 - ? (1)
0x63 - ? (0)
0x6B - ? (0)
0x73 - ? (0)
0x7B - ? (0)
0x82 - ? (1)
0x83 - ? (0)
0x8B - ? (0)
0x93 - ? (0)
0x9B - ? (0)
0xA3 - ? (0)
0xAB - ? (0)
0xB3 - ? (0)
0xBB - ? (0)
0xC2 - ? (0)
0xC3 - JMP word (безусловный переход в стиле 8080/8085)
0xCB - SWITCH (переключение режима процессора)
0xD3 - OUT byte (записать байт в порт)
0xD4 - ? (1)
0xDB - IN byte (прочитать байт из порта)
0xDC - ? (2)
0xE2 - ? (0)
0xE3 - XTXY (меняет местами пару XY и слово с вершины стека)
0xEB - XCHG (меняет местами теневые и основные регистры XY)
0xF3 - DI (запрет прерываний)
0xF4 - ? (1)
0xFB - EI (разрешение прерываний)
0xFC - ? (2)


Например в коде на 8085 команда установки бита 1 в порту 0x10 может выглядеть так:

SEC ; prefix of temporary 6502 command
SMB1 #10 ; set bit 1 of port 0x10

а сброса - так:

SEC ; prefix of temporary 6502 command
RMB1 #10 ; clear bit 1 of port 0x10

и как я уже говорил, отдельные номера портов можно будет привязать к физическим 8-битовым портам этого "микроконтроллера"

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


14 Dec 2009 08:31
Profile WWW
Novelist

Joined: 13 Sep 2009 09:37
Posts: 41
Location: Подмосковье
Reply with quote
Post 
Shaos wrote:
У меня шина получается 27 ног :)
Или предполагается что будут ещё 2 адресных сигнала? Всё таки хочется присмотреться к стандартному 40-ногому корпусу - чтобы заиметь прототип реального чипа

Видимо, у меня с арифметикой плохо, хотя, если ставить чип RAM 128К, то потребуется еще один вывод. "заиметь прототип реального чипа", боюсь не удастся - будут служебные выводы не совместимые с чип-прототипом. Вот с BASIC-stamp можно сделать выводы под DIP-40 совместимые с прототипом.

Shaos wrote:
Вот я и предлагаю 3 режима:
1) только порты ввода-вывода, память только внутренняя (в 40-ногом корпусе можем иметь до 5 портов (пятый не полный));
2) внешняя память допустима, но по мультиплексированной шине (в 40-ногом корпусе можем иметь 40-2-16-4=18 т.е. 2 порта или чуть больше);
3) внешняя память подключается по полной шине (в 40-ногом корпусе можем иметь 40-2-16-8-3=11 т.е. 1 порт и ещё чуть-чуть)
Режимы можно переключать через прошивку "микроконтроллера" (аналог прожигания "фьюзов" на современных микропроцессорах)

Не возражаю, но это требует осмысления.

Shaos wrote:
Насколько оправдано иметь программный переключатель тактовой частоты?

Во-первых это связано с периферийными устройствами, которые просто не смогут работать на таких частотах, во-вторых - потребление по питанию. Да и в сложных условиях МК работает устойчивее на более низких тактовых частотах.

Shaos wrote:
Логичнее иметь внутренний кварц (не сильно быстрый), но при желании пользователь может тактовую частоту подавать снаружи.

Не знаю на счет кварца (может ли ПЛИС иметь его внутри), а вот RC-генератор на 1Мгц внутри сделать можно.

И еще момент, упущенный мною ранее. "Прошивать фьюзы" - это современно для МК, но в нашем случае дополнительный гимор. Надо не забывать, что нам надо прошивать (заливать) ПЛИС - это один программатор, а затем заливать исполняемый код в память проца. Скорее всего, - это будет что-то другое, объединяющее, скорее всего, и какую-то систему отладки. Это еще одно устройство. Не слишком ли сложная технология работы с нашим "гибридом"? В предыдущих постах я уже обозначал о системе разработки. Это очень не маловажный вопрос - насколько трудоемко и гиморно работать с процессором. Вот пример: исторически так сложилось, что я работаю с процессорами Интел. Сначала 8080, а затем 8051. При этом я выбрал один: AT89C51ACx и решаю на нем все свои вопросы. С чем это связано? Да очень просто: этот МК программируется через RS-232. Достаточно трех проводков от РС, простенькая программка FLIP (работающая и с командной строки) и все вопросы с программированием решены. Поэтому я постоянно подчеркиваю: чтобы новый "гибрид" жил и имел хоть какую-то популярность, необходимо вопрос решать комплексно.

Shaos wrote:
Теперь перейдём к конкретике...

Я в восторге, от Вашего запала на столь масштабные работы. НО!
Поверьте мне на слово, моему опыту конструктора, программиста и постановщика задач, руководившего не одним проектом. При таком размахе сложности проекта на двух энтузиастов через океан - закончится либо содержательными разговорами, либо, в лучшем случае, экспериментами отдельных моментов. Я не хочу Вас обидеть - просто реально смотрю на сложность проекта. У нас нет НИИ!

Что я предлагаю?
1. Необходимо проект разбить на этапы, в результате, в конце каждого этапа, должно быть что-то законченное и пригодное жить самостоятельно.

2. Проект должен быть публичным, хотя бы на первом этапе! Должны быть помощники, вздыхатели и тестёры. Нужны свежие идеи и обсуждения удач и проблем. Этого не будет, пока не появится не сложный публичный вариант (даже с печатной платой под ЛУТ!!!) пригодный для исполнения. Согласитесь, "крутые" вряд-ли снизойдут до гибрида, если не припрет необходимость, а молодым придется помогать, чтобы стали нашими последователями.

На первом этапе я предлагаю сделать мой первый вариант. В ПЛИС разместить отдельно два процессора (остальные подробности обсудим позже) без потрошиния. Это позволит написать какие-то тест-программы и быть уверенным, что они работают правильно. Это будет точка отсчета, с чем можно будет сравнивать.
Кроме того, необходимо "разработать" (и выложить здесь) среду поддержки (хотя бы под DOS!): программатор, универсальный ассемблер для двух процессоров и др. прибамбасы. Это создаст основу на которой можно вести более глубокие работы по сращиванию процессоров. Надо как-то подготовиться! При этом - это уже будет этап, который может жить самостоятельно, а значит труд, затраченный на него, не пропадет даром, если не хватит сил на большее.

_________________
Если ты чего-то не знаешь, то это не значит, что этого не может быть.


15 Dec 2009 02:02
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
Shaos wrote:
pvlad wrote:
Shaos wrote:
По поводу времени выполнения команд - это будет CISC и скорее всего с микрокодом, т.е. времянки в любом случае будут отличаться от оригиналов и расчёт времени выполнения того или иного куска программы уже будет нетривиален...

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


Ок - убедили :)


С другой стороны - если разработчик программы будет чётко знать что у него находится по чётным адресам, а что по нечётным, то он сможет с достаточной точностью предсказать скорость работы программы, так что возможно этот вариант пока рано отбрасывать совсем...

pvlad wrote:
Во-первых это связано с периферийными устройствами, которые просто не смогут работать на таких частотах, во-вторых - потребление по питанию. Да и в сложных условиях МК работает устойчивее на более низких тактовых частотах.


С медленной переферией можно работать программно - с программными задержками или по прерываниям (от таймера например)

pvlad wrote:
Не знаю на счет кварца (может ли ПЛИС иметь его внутри), а вот RC-генератор на 1Мгц внутри сделать можно.


Ну там же будет не только ПЛИС :)

Заливать код в ПЛИС - это "производственная" прошивка, после чего получаем вариант для пользователя, куда он будет заливать свою программу для этого гибридного процессора в последовательное перерограммируемое пзу (т.е. предполагается, что в конечном итоге пользователь не будет менять прошивку ПЛИС).

pvlad wrote:
Проект должен быть публичным


Все материалы предлагаю покрыть GPL v3

pvlad wrote:
В ПЛИС разместить отдельно два процессора


Боюсь что это невозможно - процессоры слишком тесно связаны друг с другом - всё таки это ОДИН процессор, а не два...

Может быть имеет смысл начать не с железа, а с эмулятора?

P.S. Платка может выглядеть примерно так:
http://www.linuxfordevices.com/c/a/News ... ip-socket/
http://www.grifo.com/MM_Type/uk_F_mm.htm
http://www.beck-ipc.com/en/products/sc2x/sc24.asp
и т.д.

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


15 Dec 2009 04:35
Profile WWW
Novelist

Joined: 13 Sep 2009 09:37
Posts: 41
Location: Подмосковье
Reply with quote
Post 
Shaos wrote:
С другой стороны - если разработчик программы будет чётко знать что у него находится по чётным адресам, а что по нечётным, то он сможет с достаточной точностью предсказать скорость работы программы, так что возможно этот вариант пока рано отбрасывать совсем...

Во имя каких интересов я должен сидеть и вычислять какая команда у меня сядет на четный адрес, а какая на не четный? Это не серьезный аргумент.

Shaos wrote:
С медленной переферией можно работать программно - с программными задержками или по прерываниям (от таймера например)

С медленной периферией (и памятью) работают через Wait или понижают тактовую частоту.

Shaos wrote:
Заливать код в ПЛИС - это "производственная" прошивка, после чего получаем вариант для пользователя, куда он будет заливать свою программу для этого гибридного процессора в последовательное перерограммируемое пзу (т.е. предполагается, что в конечном итоге пользователь не будет менять прошивку ПЛИС).

Я, что-то не въехал...

Shaos wrote:
Все материалы предлагаю покрыть GPL v3

Я не против - было бы что покрывать.

Shaos wrote:
pvlad wrote:
В ПЛИС разместить отдельно два процессора

Боюсь что это невозможно - процессоры слишком тесно связаны друг с другом - всё таки это ОДИН процессор, а не два...

Это как?

Shaos wrote:
Может быть имеет смысл начать не с железа, а с эмулятора?
Может, но здесь я Вам ничем помочь не могу.


Я себе это так и представлял. Но до этого так же далеко, как от меня до Вас, к сожалению.

_________________
Если ты чего-то не знаешь, то это не значит, что этого не может быть.


15 Dec 2009 11:28
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
pvlad wrote:
Shaos wrote:
С другой стороны - если разработчик программы будет чётко знать что у него находится по чётным адресам, а что по нечётным, то он сможет с достаточной точностью предсказать скорость работы программы, так что возможно этот вариант пока рано отбрасывать совсем...

Во имя каких интересов я должен сидеть и вычислять какая команда у меня сядет на четный адрес, а какая на не четный? Это не серьезный аргумент.


Во имя тех же интересов, что заставляют помнить растактовки каждой команды :)
Вон создателей спарка не смущает, что разработчики программ должны учитывать, что после команды перехода процессор успевает выполнить одну, а то и две команды идущие следом за командой перехода ;)
Ну и опять же - эта фича опциональная - ей можно не пользоваться

pvlad wrote:
Shaos wrote:
С медленной переферией можно работать программно - с программными задержками или по прерываниям (от таймера например)

С медленной периферией (и памятью) работают через Wait или понижают тактовую частоту.


Вроде уже давно не работают - не припомню ни один современный микроконтроллер, у которого есть WAIT...
Да и тактовую частоту на лету никто не понижает - только засыпают если что

pvlad wrote:
Shaos wrote:
Заливать код в ПЛИС - это "производственная" прошивка, после чего получаем вариант для пользователя, куда он будет заливать свою программу для этого гибридного процессора в последовательное перерограммируемое пзу (т.е. предполагается, что в конечном итоге пользователь не будет менять прошивку ПЛИС).

Я, что-то не въехал...


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

pvlad wrote:
Shaos wrote:
Все материалы предлагаю покрыть GPL v3

Я не против - было бы что покрывать.

Shaos wrote:
pvlad wrote:
В ПЛИС разместить отдельно два процессора

Боюсь что это невозможно - процессоры слишком тесно связаны друг с другом - всё таки это ОДИН процессор, а не два...

Это как?


А вот так - это один процессор, который поддерживает две системы команд

pvlad wrote:
Shaos wrote:
Может быть имеет смысл начать не с железа, а с эмулятора?
Может, но здесь я Вам ничем помочь не могу.


Я себе это так и представлял. Но до этого так же далеко, как от меня до Вас, к сожалению.


Угу - это понятно, но есть к чему стремиться :)

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


15 Dec 2009 17:54
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
Shaos wrote:
пока получается вот что

в 8080/8085 режиме появляются новые команды:
Code:
0x08 - PHP (положить на стек 1 байт флагов в формате 6502)
0x10 - ?
0x18 - CLC (очистить флаг C)
0x28 - PLP (прочитать со стека 1 байт флагов из формата 6502)
0x38 - SEC (префикс того, что следующая команда выполняется в режиме 6502)
0xCB - SWITCH (переключение режима процессора)
0xD9 - CMPL word (сравнить A с содержимым ячейки памяти по адресу word+L) надо?
0xDD - CMPH word (сравнить A с содержимым ячейки памяти по адресу word+H) надо?
0xED - ?
0xFD - ?



Мне напомнили, что у 8085 есть недокументированные команды:

Quote:
Hex 8085 Meaning
---------------------
08 SUB HL-BC
10 Shift right HL
18 Rotate right DE
20 RIM Read Interrupt Mask [legal 8085, but new from 8080]
28 Add HL and Immidiate nnnn into DE
30 SIM Set Interrupt Mask [legal 8085, but new from 8080]
38 Add SP and Immidiate nnnn into DE
CB ReSTart on Overflow to 0040h
D9 Load [DE] from HL
DD Jump on 'Not X5'
ED Load Hl from [DE]
FD Jump on 'X5'


часть из них можно было бы заюзать и у нас, однако честно говоря я не вижу в них особого смысла - разве что 16-битное вычитание могло бы пригодиться, но я бы сделал HL=HL-DE и видимо с другим номером кода (например 0x10)

теперь интересная задачка - как программно определить в каком режиме находится процессор? :)

а вот так:
CLC ; очистить флаг C в обоих режимах
SEC ; взвести флаг C в режиме 6502, но в случае 8085 временно переключить режим в 6502 (не трогая флаги)
BCC is8085 ; перейти если C==0, т.е. это 8085 т.к. только в нём команда SEC не взедёт флаг C
; если код дошёл до сюда, то это 6502 (причём этот код будет правильно работать и на настоящем 6502)

потом как-то можно заюзать флаг D5 который у 8080/8085 должен быть 0, а у 6502/65C02 должен быть 1 (однако у настоящего 8085 этот флаг меняется, т.е. этот вариант будет работать только на нашем гибриде!) - предположим, что у нас также существует команда 6502 которая временно переключает режим в 8085 на время выполнения одной команды - для безобидности возьмем 0x5B что в 8080 называется MOV E,E, далее предположим, что флаг D5 меняется только если режим переключен полностью (через команду 0xCB SWITCH), значит если мы из режима 6502 временно (на одну команду) переключимся в 8085 через MOV E,E то D5 останется единицей (т.к. основной режим процессора всё ещё 6502), далее предположим что у нас поддержана недокументированная команда 8085 FD jump on X5, тогда:
#5B ; MOV E,E - ничего не делает в случае 8085, но временно переключает режим для 6502
#FD is6502 ; jump if X5=1 - если перескочили, то режим был 6502
; если код дошёл до сюда, то это 8085
наверное сложновато - слишком много "предположим"

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


15 Dec 2009 18:24
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
в режиме 8080/8085 возможно надо ещё добавить команду выкладывания на стек и считывания со стека аккумулятора (один байт) - аналоги PHA/PLA (раз у нас уже есть PHP/PLP), также включим недокументированные команды переходов из 8085 по состоянию флага D5 (у нас он определяет режим работы процессора), а вот команды CMPL/CMPH может быть и не нужны вовсе:
Code:
0x08 - PUSH_F (переименованная для 8085 команда PHP - положить на стек 1 байт флагов в формате 6502)
0x10 - DSU_D (16-ричное вычитание HL=HL-DE)
0x18 - CLC (очистить флаг C)
0x28 - POP_F (переименованная для 8085 команда PLP - прочитать со стека 1 байт флагов из формата 6502)
0x38 - P65 (переименовання для 8085 команда SEC - префикс того, что следующая команда выполняется в режиме 6502)
0xCB - SWITCH (переключение режима процессора)
0xD9 - MOV_Z,A (перенести содержимое аккумулятора в регистр отображения памяти на Zero Page) ???
0xDD - PUSH_A (положить аккумулятора на вершину стека)
0xED - POP_A (считать аккумулятор с вершины стека)
0xFD - J65 word (перейти по адресу, если постоянный режим процессора 6502/65C02)


Для режима 6502:

0x5B - вместо MOV_E,E можно по аналогии переименовать в P80 (типа сокращения от Prefix8085, как и P65 для Prefix6502)
0xCB - таже команда SWITCH

возможно для 6502 также надо заиметь команды перехода по флагу D5 (хотя бы по его нулевому значению, что будет означать что текущий режим есть 8085)

граница по которой Zero Page будет поделена между ОЗУ и портами может задаваться программно, как и старший байт адреса страницы, отображаемой на Zero Page, а вот первая страница (там где стек) скорее всего будет автоматически отображаться на тот учаток памяти, куда будет показывать старшая часть регистра SP

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


15 Dec 2009 19:09
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 16518
Location: Colorado
Reply with quote
Post 
Пока прикидываю что влезет в DIP-40 шириной 0.6 дюймов (15 мм) - из спартанов это похоже только FPGA Spartan-3E в корпусе CP132 8x8 мм (вручную непаябельно):
XC3S100E-4CPG132C ($11.10) - 100K гейтов, max 83 I/O
XC3S250E-4CPG132C ($15.30) - 250K гейтов, max 92 I/O
XC3S500E-4CPG132C ($20.76) - 500K гейтов, max 92 I/O
Цены указаны по состоянию на сегодняшний день в digikey.com

Кроме спартана (который 3.3В) на этой платке будут регуляторы питания (спартану нужны три напряжения), пром для программирования FPGA, быстрое ОЗУ, S-Video (и возможно конвертер RGB->NTSC/PAL), стерео-коннектор для выхода стерео-звука (цап ненужен - шимом обойдёмся), возможно RS-232 разъём и соответствующий конвертер уровней (а надо ли?)

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

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


20 Dec 2009 18:35
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 78 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6  Next

Who is online

Users browsing this forum: No registered users and 1 guest


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.