User Tag List

Страница 35 из 41 ПерваяПервая ... 313233343536373839 ... ПоследняяПоследняя
Показано с 341 по 350 из 404

Тема: Изучение с "нуля" VHDL и ПЛИС Xilinx

  1. #341

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    >> Оставлю пока так, увеличить всегда можно, изменив одну цифру.

    Если бы одну, придется поправлять все паттерны сравнения, к тому же необходимо сразу в коды операции зарезервировать биты, гораздо проще, неиспользуемые биты не подключать, синтезатор оптимизирует и ни одного лишнего логического вентиля не будет

    Цитата Сообщение от Viktor2312 Посмотреть сообщение
    Я уже писал об этом, но ещё детально не читал по этому поводу
    а что читать, умножение десятичных 100х100 (по 2 нуля) = 10000 (4 нуля) тоже самое и с числами с основанием 2

    ---------- Post added at 02:05 ---------- Previous post was at 01:49 ----------

    Еще не хватает в алу сигналов от флагов

    по флагам тоже могу кое какие вспомнить, которые можно в 32битный регистр флагов добавить

    1. антипереполнение - это когда результат деления настолько мал оказался, что из за ограничений разрядной стеки стал равен = 0
    2. для математики с фиксированной точкой, надо флаг Z для старших 24 и 16 бит, а так же для младших 8 и 16 бит, что бы можно было определять что целая часть 0 и дробная часть 9
    3. опять же для математики с фиксированной точкой, надо флаги переноса из 7 в 8 разряд и из 15 в 16
    4. надо флаги которые показываю, дробная часть больше .5 или меньше, опять же для форматов fixed point 24:8 и 16:16, нужно для работы с округлениями
    5. нужен флаг, который показывает что было деление на 0
    6. очень полезен флаг, который говорит что число в регистре является степенью 2, для быстрых делений
    7. опять же нужен флаг четности, именно тот что копирует младший бит числа
    8. не обязательно, но плезно, флаг который показывает что число делится на 3, глобально ускоряет троичную логику.
    9. для работы с двоично десятичным числами можно добавить пару флагов, однин что в регистре корректное двоично десятично число, второй, флаг переноса/заема для двоично десятично арифметики
    10. иногда полезен флаг, что число в регистре акроним, то есть младшая часть и старшая часть регистра, зеркально одинаковы

    на память больше вспомнить не могу, можно по документации на процессоры покопаться, посмотреть какие еще флаги забыл
    там еще куча флагов с тригонометрией есть, но они были мне скучны, я даже не читал особо про них

  2. #342

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию 5-РИМВ версия 0.0.0003

    Дело было вечером, делать было нечего.

    Предлагаю разработать процессорный элемент, пока Viktor2312 ищет какие флаги добавить в регистр флагов
    Процессор будет называться 5-РИМВ

    Технические требования:

    0. стеково/регистровый, ну что бы как стековый мог работать и как регистровый
    1. 8 регистров общего назначения, ширина 64бит
    2. фиксированная ширина кода операции 16бит!
    4. регулируемая ширина слова стека данных
    5. команд алу 32, кодировать 12 битами
    6. указатель инструкций 12 битный
    7. только относительные переходы
    8. процессор без флагового регистра
    9. возможность при синтезе задать максимальную разрядность процессора, но так что бы на коды инструкций не влияло


    И да, писать придется на Verilog, думаю Viktor2312 поможет на VHDL перевести


    У кого какие мнения по поводу ТЗ? реально?

    ---------- Post added at 21:17 ---------- Previous post was at 21:11 ----------

    Команда ALU
    Код:
    15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
     1  1 [siz] [ aluop ][ dst  ][ left  ][ right ]
    команды будут 4 видов 3х адресные, 2х адресные, 1н адресные, безадресные

    3х адресные, код операции задается в 3х битном поле aluop
    0 - add dst, left, right // dst = left + right
    1 - adc dst, left, right // dst = left + right + flag
    2 - sub dst, left, right // dst = left - right
    3 - sbc dst, left, right // dst = left - right - flag
    4 - and dst, left, right // dst = left & right
    5 - or dst, left, right // dst = left | right
    6 - xor dst, left, right // dst = left ^ right
    7 - 2х адресные команды, код операции 2х адресных команд задает поле left

    2х адресные команды:
    0 - shr dst, right // dst = right >> 1, младший бит в флаг, старший 0
    1 - ror dst, right // dst = right >> 1, младший бит в флаг, старший из флага
    2 - add dst, right // dst = right + left left, используется как непосредственный параметр, только не от 0до7 а от 1 до 8
    3 - sub dst, right // dst = right - left, left опять же imm
    4 - == // flag = (dst == right)
    5 - < // flag = (dst < right)
    6 - > // flag = (dst > right)
    7 - 1 адресная команда, код одноадресных команд в поле right

    1но адресные команды
    0 - neg // dst = 0-dst
    1 - inv // dst = fffffffff^dst
    2 - not // dst = !dst
    3 - ==0 // dst==0
    4 - <0 // dst < 0
    5 - parity
    6 - четность
    7 - безадресные команды алу, код команды задает поле dst

    безадресные команды
    0 - set flag // flag = 1
    1 - reset flag // flag = 0
    2 - invert flag // flag = !flag
    3..7 резерв

    Команда условного перехода
    И команда вызова процедуры

    b[15:13] == 3'b010 JR
    b[15:13] == 3'b011 CALL
    b[12] - F, срабатывает при равном значении F=flag
    b[11:0] для jr относительный адрес в словах, ширина слова задается максимально разрядностью процедуры, то есть если продура maxsize = 64бит, то прыгать будет кратно 8 байт, если адрес == 0 то это команда halt
    для call - номер процедуры в каталоге процедур, если номер процедуры 0, то это команда ret

    Каталог процедур это табличка, на табличку процедур указывает указатель из дескриптора задачи.
    В каталоге задается физический адрес процедуры (Физический адрес инструкции это PROC_BASE + PC), максимальная ширина слова, ну там можно, длина процедуры, к примеру для защиты, можно максимальную глубину стека, что бы защита от переполнения была, итд, пусть пока будет табличка из элементов скажем по 8 байт, аля дескрипторы 80386
    отсюда и PC = 12 битам, нефик делать процедуру больше 4к слов, для 64бит процедур это аж 32кб

    Команда const, загружает в регистр константу
    b[15:12] == 4'b0000
    b[11] - imm, если 1 то 8бит констранта непосредственно в команде, если 0, то указатель на таблицу констант процедуры
    b[10:9] - imm8 старшие 2 бита для непосредственно заданной 8 бит константы
    b[8:6] - dst, номер регистра куда загружать константу
    b[5:0] - если imm ==0 то тут номер констатны в таблице констант, если imm==1 то тут младшие 6 бит непосредственной 8 бит константы

    константы в коде будут храниться перед телом процедуры, адресация будет как в стеке в сторону уменьшения адресов, то есть если процедура юзает 2 константы, то перед текло процедуры будет пару слов с константами, ширина слова константы, равна разрядности процедуры из дескриптора


    Команды обмена с памятью

    команд 6
    b[15:11] = 5'b10010 // select var, выставляет для чтения адрес переменной в стеке
    b[15:11] = 5'b10011 // select [base + index*mul + offs], выставляет адрес для чтения из памяти
    эти 2 команды игнорируют прерывания
    b[15:11] = 5'b10000 // ld чтение с шины данных

    b[15:11] = 5'b10100 // st var, сохраняет регистр в переменную в стеке
    b[15:11] = 5'b10101 // st [base+offs], сохраняет регистр в памяти
    b[15:11] = 5'b10111 // st [base+index], сохраняет регистр в памяти

    для чтения, получилось более гибкая адресация, но это не все, команды еще стараются быть полезными

    форматы команд:
    команда select var
    b[10:9] - mode, определяет доп действия, 00-если следующая команда ALU, то данные с шины будут левым аргументом алу, 01-если следующая команда ALU, то данные с шины будут правым аргументом, 10-11 на поведение АЛУ не влияет, 10-декремент регистра dst, 11-инкремент регистра dst
    b[8:6] - dst регистр, который инкрементируется/декрементируется если заданно параметром mode
    b[5:0] - номер переменной в стеке

    команда select [base + index*mul + offset]
    b[10:9] - mul 00-x0, 01-x1, 10-x2, 11-x4, то есть mul=00 регистр index не используется (на 0 умножил)
    b[8:6] - base
    b[5:3] - offset
    b[2:0] - index

    команда ld, читает данные с шины в регистр, применима после команд select и const с чтением константы из памяти
    b[10:9] - sz, размер читаемого аргумента
    b[8:6] - dst, регистр для записи результата
    b[5:3] - aluop - команды алу, пока придумал следующие
    000-nop
    001-знаковое расширение

    команда st var
    b[10:9] - size
    b[8:6] - src, сохраняемый регистр
    b[5:0] - номер переменной

    команда st [base + offset]
    b[10:9] - size
    b[8:6] - base
    b[5:3] - offset
    b[2:0] - right - записываемый регистр

    команда st [base + index], аналогично предыдущей, только b[5:3] номер регистра index
    Последний раз редактировалось s_kosorev; 28.05.2015 в 01:28.

  3. #343

    Регистрация
    21.04.2015
    Адрес
    г. Всеволожск
    Сообщений
    52
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от MVV Посмотреть сообщение
    Тут с Z80 разобраться не все могут, как насчет улучшить NextZ80
    Z80 - CISC, поэтому его не просто улучшать. RISC в этом плане значительно проще

    ---------- Post added at 21:52 ---------- Previous post was at 21:50 ----------

    Цитата Сообщение от Viktor2312 Посмотреть сообщение
    На тебе может ошибки есть, поправишь
    Нет там ошибок. Это известный Forth процессор из статьи на Хабре. Он чисто стэковый, без регистрового доступа.

    ---------- Post added at 21:55 ---------- Previous post was at 21:52 ----------

    0. стеково/регистровый, ну что бы как стековый мог работать и как регистровый
    Что имеется ввиду? Стек но с возможностью адресации к любому элементу? Не только в TOS и NOS как обычно?

    1. 8 регистров общего назначения, ширина 64бит
    4. регулируемая ширина слова стека данных
    Какой практический смысл иметь разную ширину слова в стэке и в регистре?

    Предложение - может отделить темы? А то получается уже каша на 60 страницах
    Радио-86РК, Апогей БК01

  4. #344

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Продолжаем, комада ALU это команда для АЛУ

    команды будут 4 видов 3х адресные, 2х адресные, 1н адресные, безадресные

    3х адресные, код операции задается в 3х битном поле aluop
    0 - add dst, left, right // dst = left + right
    1 - adc dst, left, right // dst = left + right + flag
    2 - sub dst, left, right // dst = left - right
    3 - sbc dst, left, right // dst = left - right - flag
    4 - and dst, left, right // dst = left & right
    5 - or dst, left, right // dst = left | right
    6 - xor dst, left, right // dst = left ^ right
    7 - 2х адресные команды, код операции 2х адресных команд задает поле left

    2х адресные команды:
    0 - shr dst, right // dst = right >> 1, младший бит в флаг, старший 0
    1 - ror dst, right // dst = right >> 1, младший бит в флаг, старший из флага
    2 - add dst, right // dst = right + left left, используется как непосредственный параметр, только не от 0до7 а от 1 до 8
    3 - sub dst, right // dst = right - left, left опять же imm
    4 - == // flag = (dst == right)
    5 - < // flag = (dst < right)
    6 - > // flag = (dst > right)
    7 - 1 адресная команда, код одноадресных команд в поле right

    1но адресные команды
    0 - neg // dst = 0-dst
    1 - inv // dst = fffffffff^dst
    2 - not // dst = !dst
    3 - ==0 // dst==0
    4 - <0 // dst < 0
    5 - parity
    6 - четность
    7 - безадресные команды алу, код команды задает поле dst

    безадресные команды
    0 - set flag // flag = 1
    1 - reset flag // flag = 0
    2 - invert flag // flag = !flag
    3..7 резерв

    ---------- Post added at 22:07 ---------- Previous post was at 22:06 ----------

    Цитата Сообщение от Strijar Посмотреть сообщение
    Не только в TOS и NOS как обычно?
    да, 8 верхних элементов в регистрах, дальше уже к стеку идет оращение, добавление на вершину, выталкивает 8 регистр в стек

    ---------- Post added at 22:07 ---------- Previous post was at 22:07 ----------

    а можно просто как с регистрами работать

  5. #345

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Strijar Посмотреть сообщение
    Какой практический смысл иметь разную ширину слова в стэке и в регистре?
    а не надо разделять, в заголовке процедурины сказать что максимум 32бит, все, стек 32бит, регистры могут быть максимум 32бит в этой процедуре, попытка 64бит доступа игнорируется

    ---------- Post added at 22:15 ---------- Previous post was at 22:12 ----------

    MVV товарищ какой то странный, по удалял сообщения, даже ответить не успел

  6. #346

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так, дальше, команда условного отностительного перехода
    И команда вызова процедуры

    b[15:13] == 3'b010 JR
    b[15:13] == 3'b011 CALL
    b[12] - F, срабатывает при равном значении F=flag
    b[11:0] для jr относительный адрес в словах, ширина слова задается максимально разрядностью процедуры, то есть если продура maxsize = 64бит, то прыгать будет кратно 8 байт, если адрес == 0 то это команда halt

    для call - номер процедуры в каталоге процедур, если номер процедуры 0, то это команда ret

  7. #346
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #347

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Каталог процедур это табличка
    где задается физический адрес процедуры, максимальная ширина слова, ну там можно, длина процедуры, к примеру для защиты, можно максимальную глубину стека, что бы защита от переполнения была, итд, пусть пока будет табличка из элементов скажем по 8 байт, аля дескрипторы 80386
    отсюда и PC = 12 битам, нефик делать процедуру больше 4к слов, для 64бит процедур это аж 32кб

  9. #348

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Указатель на табличку процедур может быть в дескрипторе задачи к примеру, сейчас получается что проц может адресовать максимум 32к * 4к = 128мб кода на задачу, как бы с головой

    ---------- Post added at 22:37 ---------- Previous post was at 22:29 ----------

    обновил пост http://zx-pk.ru/showpost.php?p=806353&postcount=588

    ---------- Post added at 22:48 ---------- Previous post was at 22:37 ----------

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

    ---------- Post added at 22:57 ---------- Previous post was at 22:48 ----------

    о! как же без констант, нужно же в регистры что то записывать, так как в ТЗ фиксированная длина инструкции 16 бит и нини, будем делать команду загрузки констант, в конце концов 64бит регистр загрузить при 16бит коде операций - сложно

    Команда const, загружает в регистра константу
    b[15:12] == 4'b000
    b[11] - imm, если 1 то 8бит констранта непосредственно в команде, если 0, то указатель на таблицу констант процедуры
    b[10:9] - imm8 старшие 2 бита для непосредственно заданной 8 бит константы
    b[8:6] - dst, номер регистра куда загружать константу
    b[5:0] - если imm ==0 то тут номер констатны в таблице констант, если imm==1 то тут младшие 6 бит непосредственной 8 бит константы

    константы в коде будут храниться перед телом процедуры, адресация будет как в стеке в сторону уменьшения адресов, то есть если процедура юзает 2 константы, то перед текло процедуры будет пару слов с константами, ширина слова константы, равна разрядности процедуры из дескриптора

    ---------- Post added at 23:08 ---------- Previous post was at 22:57 ----------

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

  10. #349

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Viktor2312 Посмотреть сообщение
    Ты темой ошибся, тут только VHDL, а всё что касается Verilog - это флейм и оффтоп.
    а я писать про себя буду, я тебе проц придумываю, а ты уже на VHDL реализацию оформишь, стековый проц ты за вечер написал, без ошибок, думаю этот за пару вечерков реализуеш

  11. #350

    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот, странны команды обмена с памятью

    команд 6
    b[15:11] = 5'b10010 // select var, выставляет для чтения адрес переменной в стеке
    b[15:11] = 5'b10011 // select [base + index*mul + offs], выставляет адрес для чтения из памяти
    эти 2 команды игнорируют прерывания
    b[15:11] = 5'b10000 // ld чтение с шины данных

    b[15:11] = 5'b10100 // st var, сохраняет регистр в переменную в стеке
    b[15:11] = 5'b10101 // st [base+offs], сохраняет регистр в памяти
    b[15:11] = 5'b10111 // st [base+index], сохраняет регистр в памяти

    для чтения, получилось более гибкая адресация, но это не все, команды еще стараются быть полезными

    форматы команд:
    команда select var
    b[10:9] - mode, определяет доп действия, 00-если следующая команда ALU, то данные с шины будут левым аргументом алу, 01-если следующая команда ALU, то данные с шины будут правым аргументом, 10-11 на поведение АЛУ не влияет, 10-декремент регистра dst, 11-инкремент регистра dst
    b[8:6] - dst регистр, который инкрементируется/декрементируется если заданно параметром mode
    b[5:0] - номер переменной в стеке

    команда select [base + index*mul + offset]
    b[10:9] - mul 00-x0, 01-x1, 10-x2, 11-x4, то есть mul=00 регистр index не используется (на 0 умножил)
    b[8:6] - base
    b[5:3] - offset
    b[2:0] - index

    команда ld, читает данные с шины в регистр, применима после команд select и const с чтением константы из памяти
    b[10:9] - sz, размер читаемого аргумента
    b[8:6] - dst, регистр для записи результата
    b[5:3] - aluop - команды алу, пока придумал следующие
    000-nop
    001-знаковое расширение

    команда st var
    b[10:9] - size
    b[8:6] - src, сохраняемый регистр
    b[5:0] - номер переменной

    команда st [base + offset]
    b[10:9] - size
    b[8:6] - base
    b[5:3] - offset
    b[2:0] - right - записываемый регистр

    команда st [base + index], аналогично предыдущей, только b[5:3] номер регистра index


    Ухххх, все, у проца есть весь базовый набор, добавить только разных системных управляющих и готово

    ---------- Post added at 01:25 ---------- Previous post was at 01:08 ----------

    void memcpy(void* dst, void* src, uint16_t cnt)
    {
    while (cnt--) *dst++ = *src++;
    }

    как бы выглядела на псевдоасме псевдопроца

    proc: memcpy (dword dst, dword src, word cnt)
    size: 32
    stack: 4 // dst+src+cnt+tmp

    byte tmp;

    m1: if.16 (cnt ==0) m2 // 16bit aluop "=="; jr m2
    sub cnt,1
    select [src]
    add src,1
    ld.8 tmp
    st.8 [dst]
    add dst,1
    fres // flag=0
    jrn m1
    m2:
    ret

    много инструкций конечно, не pdp11
    но тут стек до 8 переменных, особо не видно преимуществ от команд, может их вообще нет
    надо с флагом придумать политику, что бы были безусловные преходы

    Viktor2312 теперь дело за тобой
    Последний раз редактировалось s_kosorev; 28.05.2015 в 01:44.

Страница 35 из 41 ПерваяПервая ... 313233343536373839 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 172
    Последнее: 28.11.2017, 13:28
  2. Микроконтроллеры STM32, "с нуля".
    от Viktor2312 в разделе Для начинающих
    Ответов: 279
    Последнее: 07.11.2016, 19:45
  3. Техническая литература: Языки описания аппаратуры "AHDL, VHDL и Verilog"
    от Viktor2312 в разделе Техническая литература
    Ответов: 1
    Последнее: 14.09.2014, 22:29
  4. Ответов: 71
    Последнее: 31.07.2014, 19:42

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •