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

    

Посоветуйте литературу по микропрограмному управлению.

Не уверен что в правильном разделе, но так как разрабатываю я на ПЛИС, то пусть будет здесь.

Появилась задача выполнять на ПЛИС очень длинные (тысячи и десятки тысяч) последовательности команд. Последовательности вычисляются нехитрым алгоритмом и представляют собой что-то типа:

P+=A+B;
P+=A+B;
(8x repeat)
P=P*A;
BRAM(Addr)=P;
P+=A+B;
(64x repeat)...
P=P*A;
BRAM(Addr+1)=P;
..and so on and on and on...

Хотя алгоритм вычисления и нехитрый, есть несколько десятков последовательностей которые надо выполнять. Сейчас на рассыпухе сделан генератор адресов и опкодов который это делает, но любое изменение алгоритма это огромный гемморой и недели отладки. Добавление новой последовательности приводит к ощутимому росту ресурсов. Процессор не справится - надо выдавать команды на 300+ МГц.  Решил сделать это микропрограммным секвенсером - тем более что ветвлений (кроме циклов заданной длины) в алгоритме нет, вся последовательность строго детерминистична. К сожалению, не нашел ничего достойного в современной литературе на эту тему, сейчас работаю по разрозненных публикациях в интернете и руководству по серии Ам2900 из 80х годов. Не хотелось бы изобретать свой велосипед для в общем типовой задачи. Будут ли рекомендации?

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


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

Altera State/Micro Sequencer можно взять. Как готовый велосипед. Ну или ваш проапгрейдить написав "ассемблер."  Когда то, очень давно, выкладывал, правда в чужой теме, вот подобное

PS. Программировать я не умею почти, поэтому там детский сад, но как умел в то время)

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


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

Из книг по микропрограммному управлению подойдет  "Майоров С.А., Новиков Г.И. Структура электронных вычислительных машин" - это классика.

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

Сори, за жуткий шрифт, исправить не могу.

 

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


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

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

Конечные автоматы различной степени вложенности используем сейчас, но как я говорил, отладка затруднена (любое изменение задержек в выч. устройстве - переписывай код и отлаживай по новой), гибкость недостаточна, а ресурсов сожрали как почти полноценный процессор.  Майорова пока найти не удалось, с альтеровским секвенсером знакомлюсь. Пока что мой секвенсер выглядит похоже на это: https://vak.dreamwidth.org/573813.html .

Сейчас размышляю над двумя вариантами:

- Вариант без циклов и переходов(линейный проход). Каждое слово в формате "опкод: количество повторений". МА очень простой тогда. Недостаток: может быть недостаточно эффективным. Пусть будет 1к 18-битных слов, 9 под команду, 9 под количество повторений. Тогда у нас может быть только 1024 смены опкода в программе, каждый опкод можно повторить 512 раз. Вроде хватает, но надо считать.

- Вариант с переходами. Более близок к классическому МА, но мне жаль отдавать половину или больше каждого слова под адрес перехода.

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


Ссылка на сообщение
Поделиться на другие сайты
6 hours ago, count_enable said:

- Вариант без циклов и переходов(линейный проход). Каждое слово в формате "опкод: количество повторений". МА очень простой тогда. Недостаток: может быть недостаточно эффективным. Пусть будет 1к 18-битных слов, 9 под команду, 9 под количество повторений. Тогда у нас может быть только 1024 смены опкода в программе, каждый опкод можно повторить 512 раз. Вроде хватает, но надо считать.

- Вариант с переходами. Более близок к классическому МА, но мне жаль отдавать половину или больше каждого слова под адрес перехода.

Вот уж что, что, а память каскадиовать на плисе элементарно. как минимум в 4 раза количество команд вы увеличите легко. (4 блока 4к*9). Более того, вы можете использовать индексируемую таблицу задержек. Например вам нужно всего 16 разных задержек, вместо 512. вот и выделите место под меньшее количество) + можно каскадировать задержки

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


Ссылка на сообщение
Поделиться на другие сайты
9 часов назад, count_enable сказал:

любое изменение задержек

Как его получаете?

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


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

Приветствую!

 

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

 

Удачи! Rob.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация