МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Реализация тригонометрических функций на ПЛИС

Реализация тригонометрических функций на ПЛИС 3 года 1 мес. назад #4728

  • kortyev
  • kortyev аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 1
  • Спасибо получено: 0
Здравствуйте, занимаюсь с ПЛИС недавно, по железной части все очень удобно и здорово в плис, а вот что делать с математикой? Бибилиотека для VHDL работает только с типом реал. В разделе проектов выложена программа тоже для типа реал. А задача стоит такая - с АЦП идет 24 разрядный код, тип интегер, требуется делать с данным кодом преобразования, включая например арксинус. VHDL отказывается конвертировать интегер в реал. Как вообще производить вычисления чуть сложнее чем сложение и вычитание? Процессор не получится, ПЛИС - макс 2. :dry:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Реализация тригонометрических функций на ПЛИС 3 года 1 мес. назад #4729

Честная реализация тригонометрических функций это большая инженерная задача.

Вашу задачу можно решить таким способом:
1. Анализируете количество доступной внутренней памяти ПЛИС. Например, 32768 бита. Если использовать 32-х битный результат, то в этой памяти можно поместить таблицу на 1024 значения.
2. Используя старшие 10 бит АЦП, по необходимым формулам на компьютере формируете таблицу и "зашиваете" эту таблицу в память ПЛИС (использую соответствующую мегафункцию в Квартусе).
3. Используете старшие 10 бит как адрес ПЗУ, на шине данных которого будет искомый результат.

Недостатком этого способа является потеря точности из-за неиспользуемых младших 14 бит данных АЦП. Эту проблему можно ослабить если использовать младшие биты для апроксимации данных, полученных из "виртуального" ПЗУ. Например, брать значение из соседней ячейки, считать разность с предыдущей, делить разность на 2^14 и умножать на число из младших бит. Используя при этом только целочисленную арифметику. Для многих задач такой точности будет вполне достаточно.

Альтернативное решение проблемы - искать исходники простейшего 8-битного микропроцессора, типа i8080 или z80. Затем найти программные библиотеки для работы с плавающей запятой и решать задачу программно. Это будет на порядок медленнее, зато можно повысить точность вычислений. Или даже реализовать заданную точность.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Реализация тригонометрических функций на ПЛИС 3 года 1 мес. назад #4730

Ой. С апроксимацией я наплёл чепухи. Её надо делать так.
1. Посчитать разницу между текущим и следующим значением из ПЗУ (адрес выборки - старшие биты данных изАЦП).
2. Умножить разницу на значение из младших бит.
3. Сдвинуть полученный результат вправо на количество младших бит.
4. Прибавить результат полученный на шаге 3 к значению в выбранному из ПЗУ значению - это и будет искомое значение

Для недопущения потери точности умножение надо производить перед сдвигом.
Схема сдвига предельно проста и в данном случае полностью заменяет деление.
Однотактовое умножение 14 битной величины займёт несколько тысяч логических элементов.
Можно попытаться оптимизировать умножение таким образом, чтобы сдвиг не понадобился, т.е. на этапе умножения можно попытаться отбросить младшие биты.

В общем, чтобы избежать потери точности, сначала надо выполнить умножение, а уже затем сдвиг или деление. И конечно же надо позаботиться чтобы не было переполнения при умножении. Т.е. если 32-бита умножаются на 14 бит, то результат может занять 46 бит. Вот как-то так это работает.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.119 секунд

facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Языки программирования Реализация тригонометрических функций на ПЛИС