inco 1 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Есть такой проектик скачанный с 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 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Не уверен, но по-моему это реккурентный алгоритм... Характеризуется наращиванием ошибок формирования сигнала с течением времени (при достаточно длительном сигнале уплывает амплитуда, про фазу ничего не могу сказать)... Может кто еще что скажет?;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба 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 алгоритм имеет лишь художественную ценность, ибо негибок и очень неточен. Достаточно лишь оценить первый такт работы после сброса: синус изменится, а косинус - нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Никто не знает что за алгоритм? При частоте квантования 100 МГц частота синуса получается около 124 килогерц! Как бы это дело пересчитать под нужную частоту например 400 Гц? Хотелось бы уточнить, Вы проверяли этот генератор хотя бы на 10 периодах синуса/косинуса?:). Могу ошибаться, но по-моему данный генератор обладает ярко выраженной неустойчивостью, быстрая проверка показывает, что амплитуда генерируемых сигналов будет непрерывно возрастать:). Неустойчивость также следует из эквивалентного разностного уравнения для (например) синуса (получено из кода путем несложных махинаций): S(i+1) = 2*S(i) - S(i-1)*(1+/(128^2)). Этому разностному уравнению соответствует два полюса ВНЕ единичной окружности на z плоскости:). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inco 1 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Да проверял! Вот выкладываю проект с opencores. Проверял на modelsim 6.4c. Никаких подвохов не наблюдал! Чистый ровный синус и косинус! Интересно где-бы найти кнопку прикрепить файл? Да проверял! Вот выкладываю проект с opencores. Проверял на modelsim 6.4c. Никаких подвохов не наблюдал! Чистый ровный синус и косинус! Интересно где-бы найти кнопку прикрепить файл? sinus.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Да проверял! Вот выкладываю проект с opencores. Проверял на modelsim 6.4c. Никаких подвохов не наблюдал! Чистый ровный синус и косинус! Интересно где-бы найти кнопку прикрепить файл? Прошу прощения, моя ошибка, был невнимателен, все должно работать правильно. Теорию смотрите тут: Генератор SIN/COS на VHDL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться