2015-02-13 3 views
2

Я реализовал блок в 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 подобных результатов. Моя мысль заключалась в том, чтобы написать пару строк для этого шаблона, но просто не могу понять это.

Просьба высказать свое мнение по этому вопросу. Это не должно быть полным решением, просто некоторые материалы, потому что я застрял :) Спасибо.

+0

Это было бы очень просто, чтобы засунуть в блок RAM. Какую FPGA вы используете? Сколько блоков памяти вы имеете в наличии? – Russell

+4

Вычитайте 62710 (не 62720, чтобы сделать первый диапазон того же размера, что и другие). Обратите внимание, что 20 = 5 * 4, поэтому разделите на 4 (опустите два младших разряда). Теперь у вас есть гораздо меньший диапазон, чтобы вписаться в LUT. Также вычесть 3072 из каждой записи LUT. (Вам нужно только установить 2 бита, чтобы добавить его обратно: не требуется сумматор). Чтобы сделать больше (например, разделить на 5), потребуется некоторый математический анализ, чтобы убедиться, что вы не округлили неправильно. –

+1

@BrianDrummond - это ответ! Нам нужно больше ответов в теге VHDL и меньше ответов на вопросы в комментарии. – Josh

ответ

4

Вычесть 62710 (не 62720, чтобы первый диапазон был того же размера, что и другие). Обратите внимание, что 20 = 5 * 4, поэтому разделите на 4 (опустите два младших разряда). Теперь у вас есть гораздо меньший диапазон, чтобы вписаться в LUT.

Также вычесть 3072 из каждой записи LUT. (Вам нужно только установить 2 бита, чтобы добавить его обратно: не требуется сумматор).

Результат меньше 1024 на 8, 1 BlockRam - в некоторых технологиях ПЛИС.

Чтобы сделать больше (например, разделите на 5), потребуется некоторый математический анализ, чтобы убедиться, что вы не округлили неправильно.

+0

Спасибо, Брайан. Поскольку у меня есть только 128 различных результатов, я думал, что должна быть возможность иметь таблицу только с этими 128 записями. Ваше предложение дает мне «меньше» 1024, но не может ли это быть меньше? Или я не понял это правильно? –

+0

Его можно уменьшить с помощью некоторых очевидных трюков, однако они включают либо деление на 5, либо умножение на масштабированную и округлую версию 1/5 (что может быть упрощено), и вам нужно будет убедиться, что после масштабирования и округления вы получите правильный вывод для каждого входа. В этот момент: стоит ли времени и сил? (Это замечательное упражнение, если время не рассматривается, и может быть полезным уроком в трудностях, связанных с правильным округлением ...) –

+0

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