nckm пишет: по поводу процессора на CPLD.
После реализации reduced AVR процессора мне пришла в голову мысль, что конкретно для этого чипа наверное правильно было бы делать процессор с "последовательным АЛУ". Проблема в том, что флеш память в Altera CPLD последовательная, следовательно команды и операнды читаются из нее последовательно. Это конечно сильно снижает скорость работы процессора, но зато можно вычислять операции то же последовательно. Зачем делать скажем 8ми битный сумматор, если можно складывать побитно? это наверное может помочь сэкономить место
Николай да мы с вами по этому поводу списывались, а давайте оценим выигрыш от применения однобитного сумматора? Ведь экономим мы в этом случае не регистровую часть LE, а только LUT. Верно? Регистровая же часть (триггерная) скорее всего пойдет в небольшой перерасход на обеспечение состояний автомата декодирования, на прием адреса регистра источника и приемника. Предположительно от (5...6)*2 триггеров на хранение адресов.
Возьмем наиболее часто используемую команду с константой SUBI Rd, K, она использует сумматор в АЛУ и константу получаемую индеректно (непосредственно в поле операнда). Имеем вот такую разбивку по полям машинного слова SUBI - 0101 .KKKK dddd KKKK.
Константу мы получаем побитно и кроме того получаем еще и адрес регистра приемника результата. Предположим что код операции 0101 мы получим заранее, хотя там все у Atmel-а очень не просто с длинной декодируемой части она переменная, да и еще к тому же размазанная по машинному слову. Предположим так же что и адрес приемника мы тоже получим до константы (допустим что мы перетасуем поля в нужном порядке). Тогда с 8 такта мы можем начать потактовое сложение или логические операции. С константой вроде бы все срастается. Есть выигрыш в LUT, не очень большой но есть - (6..7)*4 LUT-ов. 4 это кол-во операций в АЛУ ADD, AND, XOR (EOR), OR. Хотя при желании можно реализовать все эти операции на базисе Шеффера, размениваться не имеет смысла, выигрыш будет ничтожный а вот автомат состояний вырастит.
Возьмем команду между регистрами - ADD 0000 11.rd dddd rrrr. Очевидно что как бы не тусовали поля машинного слово, мы вынуждены принять оба операнда в промежуточные регистры и начать с 16 такта побитную операцию над значением извлекаемым по адресам r и d. Тут у нас явный проигрыш по регистровой части потому что принятые r и d нужно где то "осаживать" до результирующей дешифрации и извлечения побитно из регистрового файла значений.
На унарных операциях мы тоже получим выигрыш, но они используются не часто их можно было бы и убрать. Кроме того некоторые унарные операции в AVR реализуются спекулятивно как макросы уже имеющихся конструкций.
Что на выходе отыграем на LUT-ах на 20..25 LUT-ов. Проиграем в регистровой части, а ведь она нам нужней. Кроме того а как реализовывать ST и LD?
В тот же медленный флеш писать? Как вариант наверное можно, но не очень то практично.
Что делать с регистровым файлом? От силы 8-16 регистров влезет.
Николай а почему если не секрет AVR? Почему не reduced PIC или reduced STM8 или 65xx или тот же 8051?