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

ARCCOS FPGA

Доброго времени суток, уважаемые форумчане.

Необходимо сделать вычисление арккосинуса. Делал систему следующим образом. Получая результат с 16-битной шины нужно выдавать значение угла.

Решил сделать следующим образом

ttt <= $signed(($signed(fractional_angle)*1000 >> 15)); 
angle <= $signed(9000) - 9*$signed(ttt);

То есть - зная что ко мне приходит функция косинуса максимум функции при 0, минимум при 180 (т.е. если 32767 - это 0 градусов, а -32767 - 180).

Для простоты разбиваю свой диапазон на два участка [999;0] и [0; -999] что соответствует углам [0;90], [90;180].

С этим, вроде, все нормально, но вот результаты меня разочаровали. Во первых, значения немного не те всегда - в том плане, что отличаются на какую-то дельту.

Необходимо также углы вращать и все в таком духе.

Кто-нибудь подскажет как мне нужно "вращать" эти углы, чтобы все норм было?

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


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

я чего то не понимаю, или вы функцию арккосинуса попытались заменить линейной и разочаровались в результате?

 

чтобы честно вам нужно либо

1. таблицу

либо

2. кордик

либо

3. самопальный ряд

 

ИМХО

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


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

я чего то не понимаю, или вы функцию арккосинуса попытались заменить линейной и разочаровались в результате?

 

чтобы честно вам нужно либо

1. таблицу

либо

2. кордик

либо

3. самопальный ряд

 

ИМХО

 

Ну по поводу кордика - у меня не так много ресурсов и времени... просто для просчета арккосинуса, я так понимаю, мне нужно

1. разделить значение (x/sqrt(1-x^2)), где x - значение со входа

2. найти арктангенс

 

Таблица - это не так изящно. Хотя, в крайнем случае можно будет и ее.

Что значит самопальный ряд?

 

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


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

1. разделить значение (x/sqrt(1-x^2)), где x - значение со входа

2. найти арктангенс

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

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


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

Вы представляете во что это выльется на железе?

Я уже оговорился перед описанием проблемы "у меня не так много ресурсов и времени...".

И да, я знаю про готовые корки в CORE GENERATOR'е к Xilinx-совской продукции))

 

лучший вариант таблица

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

Я прочел - и ничего не понял как ее можно практически реализовать...

Поэтому и хотелось, чтобы на форуме мне раскрыли основные таинства этой методики

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


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

метод цифра за цифрой - это и есть кордик

 

если функция симметрична, то только 1/4 от всех возможных вариантов потребуется для хранения

она симметрична относительно 0, таблица нужна на половину значений,

функция на самом деле имеет бесконечное число значения для одной координаты, но обычно это отбрасывается, потому и не четверть, а половина, (половина половины)

 

Более того надо оценить точность, там будет много одинаковых значений, на этом можно сыграть.

 

 

1. разделить значение (x/sqrt(1-x^2)), где x - значение со входа

2. найти арктангенс

не факт что арктангенс у вас найдется проще арккосинуса, также не факт что вычисления корня и деления пойдут глаже...

 

Про ряд - это я имел ввиду что функция в окрестностях точки может быть разложена в ряд, дальше там выбираете кого, там у вас будут только суммы и умножения, что на ПЛИС реализуемо в целом, но кордик этот метод победит....

 

 

так что на самом деле вам надо выбрать кордик или таблица, все остальное от лукавого, ничего не выиграете...

 

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

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


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

метод цифра за цифрой - это и есть кордик

:smile3009: вот так поворот)))

Значит таблица)))

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


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

smile3009.gif вот так поворот)))

Значит таблица)))

 

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

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


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

:smile3009: вот так поворот)))

Значит таблица)))

 

Таблица может быть эффективнее кордика только на совсем небольших размерах аргумента.

 

При этом кордик можеть быть:

1. Конвейеризованным. Много ресурсов, высокая скорость.

2. Итеративным. Мало ресурсов, низкая скорость.

3. Смешанный вариант.

 

Если вкратце, то итеративный кордик требует ресурсов:

3 сумматора размером N, где N - разрядность

2 barrel shifter'а

Счетчик до M, где M - разряд, до которого вычисляем

Память размером M*N для хранения констант

При этом M ~= N.

 

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

 

Разрядность сумматоров правда можно(и нужно) сделать поболее, т.к. нужны guard bits для уменьшения ошибки округления(точнее отбрасывания).

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


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

Таблица может быть эффективнее кордика только на совсем небольших размерах аргумента.

 

При этом кордик можеть быть:

1. Конвейеризованным. Много ресурсов, высокая скорость.

2. Итеративным. Мало ресурсов, низкая скорость.

3. Смешанный вариант.

 

Если вкратце, то итеративный кордик требует ресурсов:

3 сумматора размером N, где N - разрядность

2 barrel shifter'а

Счетчик до M, где M - разряд, до которого вычисляем

Память размером M*N для хранения констант

При этом M ~= N.

 

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

 

Разрядность сумматоров правда можно(и нужно) сделать поболее, т.к. нужны guard bits для уменьшения ошибки округления(точнее отбрасывания).

А не подскажете какую-нибудь практическую литературу на тему организации КОРДИКа в ПЛИС? Я имею не теоретическую... Потому что читая Буйкова ничего для себя не вынес.

 

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


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

А не подскажете какую-нибудь практическую литературу на тему организации КОРДИКа в ПЛИС? Я имею не теоретическую... Потому что читая Буйкова ничего для себя не вынес.

 

Завтра найду название одной работы, где хорошо все рассказано, правда на английском. Если с англ тяжко, то тогда печаль :) Для начала пока можете полистать CORDIC for dummies.pdf - в гугле на ура ищется, там пошагово разобрано на примерах как работает алгоритм. К тому же, на этом самом форуме есть не один десяток тем про кордик, тоже имеет смысл почитать ;)

 

Вообще, емнип, есть тулы для генерации ядер кордика под плис. Там в общем и знать то особо ничего не надо...

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


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

А не подскажете какую-нибудь практическую литературу на тему организации КОРДИКа в ПЛИС?

Вот тут выкладывал

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


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

Нашел, вот название: CORDIC IP Block Design, Vitaliy Kuhar, KTH/ICT/ECS-2008-16

На мой взгляд это одна из наиболее полных и подробных работ по cordic'у в принципе.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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