Comments 9
Алгоритм довольно известный однако можно ли (навскидку):
- использовать комбинацию с рядом Тейлора, которым иногда считают синус в качестве начального условия
- симметрию по двоичным операциям, может даже как-то корректировать таблицу в процессе вычислений
- доуточнение с двоично-адаптированным методом наподобие Ньютона-Рафсона особенно для квадратного корня
- вычисление по фронту нарастания/спада одновременно - некий конвейер с разделением по фазе такта
- микроконвейер на счётчиках и компараторах
- железобетонная оптимизация вручную исходя из тех LUT/макроячеек которые имеются для заданной ПЛИС-ины с учётом их свойств и разрядности
- оптимизация по знаку - прямой, дополнительный и обратный код - может что-то будет более оптимальным, включая кратное "заимствование" знака с запоминанием в триггерах, этакий стек переносов
Благодарю!
1. По поводу ряда Тейлора - а какой плюс это может дать?
2. По поводу двоично-адаптированного метода Ньютона-Рафсон - честно говоря не сталкивался с ним, имеется ли у вас наиболее вкусная ссылка чтоб почитать про него?)
3. "вычисление по фронту нарастания/спада одновременно " - вы имеете в виду, чтобы реализовать два вычисления за один так клока?
4. "оптимизация по знаку" - вот много вариантов оптимизации, это один из них, согласен
Начальные условия для вычислений или как коэффициенты для интерполяции. На DSP например тригонометрия считается именно так - таблица синусов/косинусов и ряд Тейлора
Тоже самое - корень квадратный считается методом Ньютона-Рафсона по таблице, которая является затравкой для начальных условий рекуррентного алгоритма по нахождению корня. Есть даже интересная история про это.
Да наподобие того как в микроконтроллере Тесей (боюсь ошибиться - поправьте если это не так),да фактически за один период клока 2 вычисления.
Это фактически определяющее лицо для комбинационной логики и защёлок переноса - именно там и появляются отложенные вычисления на следующий такт, оптимизация между сумматорами, умножителями (макроячейками) и защёлками (регистрами)
Вроде многовато ресурсов. 12бит вход/16бит выход в районе 1200..1300lut. 240МГц на gw5a
Мысль 1:
Я правильно понимаю что вы сделали DDS модуль( модуль который генерирует квадратурную синусоиду)?
почему бы было не реализовать просто функцию косинуса/синуса алгоритмами CORDIC ? на вход подавать угол на выход значение.
либо функцию тангенса? на вход X/Y на выходе значение.
вроде бы сделали доброе дело , рассказали про CORDIC, и предоставили код, но чтото тут не так...
Мысль 2:
Максимальное число итераций ограничено массивом atan[26], тоесть максимум 26 итераций(речь про параметризируемый модуль), верно ?
Мысль 3:
попробуйте собрать проект под другую ПЛИС. Сделать аналогичный сравнительный анализ частоты и ресурсов на чипах серии Cyclone V или MAX 10(например плата Terasic DE10-Lite).
Мысль 4:
ссылка из списка литературы не ведет на статью. Я так понимаю ссылались на эту статью https://kit-e.ru/cordic/
1 "Мысль 1" - Вы говорите про конвейерезированную функцию?? Можно пример?
2. "Мысль 2" - вот это как раз один из дискуссионных вопросов, которые я имел в виду... Если имеете варианты, как реализовать рассчет поворотных коэффициентов средствами только System Verilog с удольствием бы изучил этот момент)
3. "Мысль 3" - хорошая идея, учту
4. "Мысль 4" - да, это именно та статья, поправлю ссылку, чтобы вела туда, куда нужно...
Спасибо!
1.
input clk,
input on,
input [ACC_W-1:0] step,
input [DAT_W-1:0] level,
output logic [DAT_W-1:0] X,
output logic [DAT_W-1:0] Yну смотрите, у вас в проекте есть только два выходных сигнала. видимо вы этого и добивались, чтобы получить квадратурные отсчеты.
Но по сути вы реализовали вычисление кордика внутри, и этот кусок можно было бы вынести в отдельный модуль. Я так понял, вы вычисляете функцию tan(Z). На вход нее подаете угол, на выходе значение.
Если говорить еще проще: почему не реализовали tan(Z) из кордик алгоритмов?
Разработка параметризируемого модуля CORDIC-алгоритма на System Verilog