Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по алгоритму генерации синуса.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
inco
Есть такой проектик скачанный с opencores генратор синуса

`timescale 1ns / 1ps

module sin(
input reset, // async reset
input clock, // input clock
output [15:0] sin, // sin output: signed, 16-bit
output [15:0] cos, // cos output: signed, 16-bit
output sin_sqr, // sign(sin)
output cos_sqr // sign(cos)
);

parameter width = 16;
parameter InitCos = 32640;

reg [width-1:0] sin1, cos1;

always @(posedge clock, posedge reset) begin
if(reset) begin
sin1 <= 0;
cos1 <= InitCos;
end
else begin
sin1 <= sin;
cos1 <= cos;
end
end

//the computator
assign sin = sin1 + {{7{cos1[15]}}, cos1[15:7]};
assign cos = cos1 - {{7{sin[15]}}, sin[15:7]};

//sign
assign sin_sqr = !sin[15];
assign cos_sqr = !cos[15];

endmodule

Очень уж заманчивая реализация всего 40 ячеек на cyclone 3
Никто не знает что за алгоритм?

При частоте квантования 100 МГц частота синуса получается около 124 килогерц!
Как бы это дело пересчитать под нужную частоту например 400 Гц?
eugen_pcad_ru
Не уверен, но по-моему это реккурентный алгоритм... Характеризуется наращиванием ошибок формирования сигнала с течением времени (при достаточно длительном сигнале уплывает амплитуда, про фазу ничего не могу сказать)...
Может кто еще что скажет?wink.gif
DmitryR
sin(t)-sin(t+d)=2*sin(-d/2)*cos((2t+d)/2). Так как d мало, в косинусе им пренебрегаем, получаем sin(t)-sin(t+d)~A*cos(t), где A=const (2sin(-d/2); d=const так как это дельта времени). В приведенном примере A=1/128, получаем d~0.45 градусов.
IMHO алгоритм имеет лишь художественную ценность, ибо негибок и очень неточен. Достаточно лишь оценить первый такт работы после сброса: синус изменится, а косинус - нет.
Самурай
Цитата(inco @ Jan 28 2009, 15:07) *
Никто не знает что за алгоритм?

При частоте квантования 100 МГц частота синуса получается около 124 килогерц!
Как бы это дело пересчитать под нужную частоту например 400 Гц?


Хотелось бы уточнить, Вы проверяли этот генератор хотя бы на 10 периодах синуса/косинуса?smile.gif. Могу ошибаться, но по-моему данный генератор обладает ярко выраженной неустойчивостью, быстрая проверка показывает, что амплитуда генерируемых сигналов будет непрерывно возрастатьsmile.gif.

Неустойчивость также следует из эквивалентного разностного уравнения для (например) синуса (получено из кода путем несложных махинаций): S(i+1) = 2*S(i) - S(i-1)*(1+/(128^2)). Этому разностному уравнению соответствует два полюса ВНЕ единичной окружности на z плоскостиsmile.gif.
inco
Да проверял! Вот выкладываю проект с opencores. Проверял на modelsim 6.4c. Никаких подвохов не наблюдал! Чистый ровный синус и косинус! Интересно где-бы найти кнопку прикрепить файл?

Цитата(inco @ Jan 28 2009, 17:01) *
Да проверял! Вот выкладываю проект с opencores. Проверял на modelsim 6.4c. Никаких подвохов не наблюдал! Чистый ровный синус и косинус! Интересно где-бы найти кнопку прикрепить файл?
Самурай
Цитата(inco @ Jan 28 2009, 18:08) *
Да проверял! Вот выкладываю проект с opencores. Проверял на modelsim 6.4c. Никаких подвохов не наблюдал! Чистый ровный синус и косинус! Интересно где-бы найти кнопку прикрепить файл?


Прошу прощения, моя ошибка, был невнимателен, все должно работать правильно.
Теорию смотрите тут: Генератор SIN/COS на VHDL
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.