Jump to content

    
Sign in to follow this  
RUNVoVaN

Деление чисел (VHDL)

Recommended Posts

Это пример реализации последовательного деления с 24-битным делимым, 12-битным делителем, и 12-битным частным. Результат получается через 12 тактов после подачи делимого/делителя, что индицируется подачей сигнала we == 1.

Share this post


Link to post
Share on other sites
Случаем никто не пробовал запустить реализацию?

У меня ругается на строчку main: process (Rst,Clk)\

Запускать не пробовал, но могу сказать, что ругаться точно будет :) В указанной строчке последний символ "\" надо удалить ;)

Share this post


Link to post
Share on other sites

Подскажите пожалуйста, может кто-нибудь сталкивался с реализацией делителя на константу. Конкретно - необходимо делить 8-ми (в перспективе до 16) разрядные значения на 3, на 5, на 7 (и желательно общий случай - на Х). Деление не конвеерное - в одном такте!! Критично быстродействие (минимальное кол-во уровней логики при синтезе), но и ресурсы тоже важны.

 

Был бы рад коду на VHDL , ну или хотя бы детальному алгоритму (к сожалению сейчас нет времени самому велосипед изобретать :)

Share this post


Link to post
Share on other sites
Ежли делить будете на ограниченное количество фиксировааных чисел, то деление лучше заменить умножением на обратное.

 

Есть маленькая проблемка:

Например делим на 3 или, что тоже самое, умножаем на 1/3 или 0.01010101010101.... в двоичном коде. Если например делим 63 ("111111") - получим 10100.1111111..... т.е 20.9999999.... вместо 21. Как разрулить такую ситуацию. Просто округлять нельзя - целочисленное деление подразумевает отбрасывание остатка, а если отбросить в данном случае - будет неправильно...

И еще - на каком разряде при умножении (бесконечная дробь!) можно остановиться - интересует общий случай для произвольных разрядности и делителя?

Подскажите, где почитать по деталям реализации таких делителей?

Share this post


Link to post
Share on other sites

Почитать можно у Уорена младшего - Алгоритмические трюки для программистов. Там более-менее все расписано для 32 битной арифметики. А из собственного опыта - необходимо просто проверить весь диапазон входных чисел на соответствие результатов умножения на обратное результатам деления и все. Если результат не соответствует - просто увеличить разрядную сетку для обратного.

 

BTW, вычисление обратного для случая нормирования в 16-ти разрядной сетке: reciprocal = 65536 / divisor + 1. Без "+1" результат получается неправильным для большинства частных. В результате имеем: A / divisor = A * reciprocal / 65536 = (A * reciprocal) >> 16. При такой замене результат получается точным если A в диапазоне 0..2048 и divisor в диапазоне 1..64. Возможно, я заузил поле точных результатов, просто шире проверять необходимости не было. Хочу еще обратить внимание на такой пустячок - числа должны быть положительными. Для работы с отрицательными числами надо использовать особые премудрости.

Share this post


Link to post
Share on other sites
письмо получил, все 4 файла в архиве лежат здесь

http://rapidshare.de/files/18390856/divider.rar.html

фтп еще не поднялся, как поднимется выложу

2 Волощенко Бальшой пасиб :cheers:

не пашет ссылка ((

выложили бы куда-нить снова

или где эти доки могут на фтп лежать?

 

 

 

 

// ====================================

 

такая вот задачка: деление служит для некоей нормализации выходных значений (нечто вроде АРУ, но АРУ - инерционная система).

 

не задумывался ли кто для таких задач (где важна не точность, а чтобы конечный результат вычислений в алгоритме не выскочил за разрядную сетку (ну, условно)) использовать вычисление 1/x через кусочно-линейную аппроксимацию, как например сделано в стандарте G.711 для вычисления логарифма ?

по ресурсам весьма компактно вроде бы получается..

(если сверхъточностью пренебречь)

Share this post


Link to post
Share on other sites
...выложили бы куда-нить снова...

Все фото на описание матричного делителя в прикрепленных файлах многотомного архива...

 

 

Пишу через ник сына, потому как мой ник Волощенко почему-то заблокирован...

2.part1.rar

2.part2.rar

2.part3.rar

2.part4.rar

2.part5.rar

2.part6.rar

Share this post


Link to post
Share on other sites
Ваш пример никак не связан с точностью способа деления. например, можно напрямую целочисленно делить 29 на 10 , и получиться 2, в предельном случае единица младшего разряда все равно теряется. Вообще из простых способов деления умнажение на обратное наиболее эффективно.

 

Собственно, если 29 делить на 10 и получить 2 - то это правильно (деление ведь целочисленное).

 

А в целом с проблемой я разобрался, всем спасибо за советы, особенно за книжку Уорена младшего - Алгоритмические трюки для программистов.

Если имеешь дело с целочисленной математикой - эта книга, на мой взгляд, должна быть настольной.

:a14:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this