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

Есть ли в VHDL оператор деления?

Вот формула: Y = X*(Y1 - Y0)/(X1 - X0) + (Y0*X1 - Y1*X0)/(X1-X0), где

X0, X1, X - это 8-разрядные std_logic_vector, а

Y0, Y1 - 14-разрядные std_logic_vector.

Оператора / в VHDL нет - уже проверил, а вот может есть какой-нибудь другой?

Хотя впринципе меня здесь спас бы обычный логический сдвиг влево! Но я так и не разобрался как пользоваться SHL, потомучто там нужно преобразовывать тип! Help =) PLZ!!!

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


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

Оператора / в VHDL нет

Ойданупрям. Я бы не был столь категоричен.

уже проверил

Как проверяли?

 

По поводу реализации деления используйте поиск по форуму, уже обсуждалось.

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


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

напр.,у меня еще ни разу не возникала необходимость реализации аппаратного деления при работе с алгоритмами ЦОС.

Не знаю вашего случая, но сгодится ли домножение на (X1 - X0) части, которая у вас впоследствии используется потом в выражениях совместно с Y ? (своеобразная нормировка)

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


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

Деление - это самая большая головная боль в проектах на FPGA. Остальные простейшие арифметические операции (суммирование, вычитание и умножение) реализуемы, хотя все зависит от входных разрядностей и рабочих частот.

 

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

 

Так обстоят дела с делением на нефиксированную константу. Деление на фиксированную, или загружаемую константу аппроксимируется умножением.

R = Y / X трансформируется в R = (Y * K) >> 16, где K = 65536 / X + 1

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

 

Входным параметром для SHR есть bitvector. Не самый распространеный тип представления данных в VHDL. Гораздо проще снять информацию с тех битов, которые вас непосредственно интересуют без формального использования SHR или SHL. За все мое время использования VHDL мне только один раз пришлось использовать SHR и SHL - это было синтезируемое описание баррел-шифтера.

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


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

Уже был, если не ошибаюсь, аналогичный топик: http://electronix.ru/forum/index.php?showt...=15135&st=0

Там в 6 сообщении я сослался на аппаратный делитель, одного из моих авторских свидетельств СССР. В рисунке приведена принципиальная схема, которую можно описать в HDL, возможно, однотактный матричный делитель Вам подойдет.

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


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

В ActiveHDL тоже есть своя корка делителя...

 

Она есть и в квартусе: LPM_DIVIDE

 

И в synopsys DC: DW_div

 

Да и вообще во всех нормальных синтезаторах. Потому как (не знаю про vhdl), но верилоговское деление, "/", и нахождение остатка, "%" обязано синтезироваться в делитель.

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


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

Потому как (не знаю про vhdl), но верилоговское деление, "/", и нахождение остатка, "%" обязано синтезироваться в делитель.

И что, Кавртус на

 

reg [...] a;

reg [...] b;

reg [...] c;

 

...

 

c <= a/b;

 

родит настоящий делитель? Или скажет, что, дескать, b не кратно степени 2, поэтому до свидания?

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


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

Потому как (не знаю про vhdl), но верилоговское деление, "/", и нахождение остатка, "%" обязано синтезироваться в делитель.

И что, Кавртус на

 

reg [...] a;

reg [...] b;

reg [...] c;

 

...

 

c <= a/b;

 

родит настоящий делитель? Или скажет, что, дескать, b не кратно степени 2, поэтому до свидания?

настоящий или не настоящий, но родит :)

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


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

Потому как (не знаю про vhdl), но верилоговское деление, "/", и нахождение остатка, "%" обязано синтезироваться в делитель.

И что, Кавртус на

 

reg [...] a;

reg [...] b;

reg [...] c;

 

...

 

c <= a/b;

 

родит настоящий делитель? Или скажет, что, дескать, b не кратно степени 2, поэтому до свидания?

настоящий или не настоящий, но родит :)

Не понял. LPM_DIVIDE инстанцирует? Наш опыт показывает, что при делителе, не кратном степени 2, выдается ошибка. Точно так же ведет себя и Синплифай. Т.е. полноценный аппаратный делитель надо самому руками ставить. По крайней мере так было года полтора назад, с тех пор не проверял, может что-то и изменилось. Почему и спрашиваю.

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


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

Потому как (не знаю про vhdl), но верилоговское деление, "/", и нахождение остатка, "%" обязано синтезироваться в делитель.

И что, Кавртус на

 

reg [...] a;

reg [...] b;

reg [...] c;

 

...

 

c <= a/b;

 

родит настоящий делитель? Или скажет, что, дескать, b не кратно степени 2, поэтому до свидания?

настоящий или не настоящий, но родит :)

Не понял. LPM_DIVIDE инстанцирует? Наш опыт показывает, что при делителе, не кратном степени 2, выдается ошибка. Точно так же ведет себя и Синплифай. Т.е. полноценный аппаратный делитель надо самому руками ставить. По крайней мере так было года полтора назад, с тех пор не проверял, может что-то и изменилось. Почему и спрашиваю.

 

LPM_DIVIDE инстанцирует :)

 

при делителе, не кратном степени 2, выдается ошибка :cranky: гложут странные сомнения

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


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

LPM_DIVIDE инстанцирует :)

 

при делителе, не кратном степени 2, выдается ошибка :cranky: гложут странные сомнения

Таки да, Quartus и для VHDL, и для Verilog инстанцирует LPM_DIVIDE и для частного, и для остатка. Вот только если мне надо

quotient <= numer / denom;
remain   <= numer % denom;

то инстанцируются две мегафункции.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...