Я реализовал блок в FPGA, который поддерживает аппаратное умножение. Этот блок делает некоторое деление, используя едва ли какие-либо логические элементы, потому что он может использовать некоторые внутренние DSP.FPGA: Разделить диапазон по фиксированному номеру с помощью справочной таблицы
Этот блок должен быть перенесен в другой дизайн, но здесь у меня есть 2k меньше логических элементов и нет аппаратного множителя.
Моей мыслью было реализовать это разделение с помощью таблицы поиска в памяти, просто потому, что у меня есть 60 килобайт, но мне трудно найти правильный способ сделать это. Вот что мне нужно сделать:
Разделите числа от 62720 до 65279 на 20, используя очень мало логических элементов. Я получаю только 128 различных результатов после округления чисел, поэтому таблица не должна быть такой тяжелой, но проблема для меня заключается в том, чтобы удалить все аналогичные результаты и по-прежнему использовать таблицу для поиска результата для точного деления.
Первые записи из таблицы выглядят следующим образом:
62720/20 = 3136
62721/20 = 3136
62722/20 = 3136
62723/20 = 3136
62724/20 = 3136
62725/20 = 3136
62726/20 = 3136
62727/20 = 3136
62728/20 = 3136
62729/20 = 3136
62730/20 = 3137
62731/20 = 3137
62732/20 = 3137
62733/20 = 3137
62734/20 = 3137
62735/20 = 3137
62736/20 = 3137
62737/20 = 3137
62738/20 = 3137
62739/20 = 3137
62740/20 = 3137
62741/20 = 3137
62742/20 = 3137
62743/20 = 3137
62744/20 = 3137
62745/20 = 3137
62746/20 = 3137
62747/20 = 3137
62748/20 = 3137
62749/20 = 3137
62750/20 = 3138
62751/20 = 3138
62752/20 = 3138
62753/20 = 3138
62754/20 = 3138
62755/20 = 3138
...
Для каждого результата у меня 20 похоже, за исключением первого 3136, который только дает мне 10 подобных результатов. Моя мысль заключалась в том, чтобы написать пару строк для этого шаблона, но просто не могу понять это.
Просьба высказать свое мнение по этому вопросу. Это не должно быть полным решением, просто некоторые материалы, потому что я застрял :) Спасибо.
Это было бы очень просто, чтобы засунуть в блок RAM. Какую FPGA вы используете? Сколько блоков памяти вы имеете в наличии? – Russell
Вычитайте 62710 (не 62720, чтобы сделать первый диапазон того же размера, что и другие). Обратите внимание, что 20 = 5 * 4, поэтому разделите на 4 (опустите два младших разряда). Теперь у вас есть гораздо меньший диапазон, чтобы вписаться в LUT. Также вычесть 3072 из каждой записи LUT. (Вам нужно только установить 2 бита, чтобы добавить его обратно: не требуется сумматор). Чтобы сделать больше (например, разделить на 5), потребуется некоторый математический анализ, чтобы убедиться, что вы не округлили неправильно. –
@BrianDrummond - это ответ! Нам нужно больше ответов в теге VHDL и меньше ответов на вопросы в комментарии. – Josh