LV26 0 5 октября, 2006 Опубликовано 5 октября, 2006 · Жалоба Может кто объяснить принцип работы? Какая математика тут "подвязана"? Может ссылка где есть? library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity sine_cos is port ( clk : in std_logic; reset : in std_logic; en : in std_logic; sine : buffer std_logic_vector(7 downto 0); cos : buffer std_logic_vector(7 downto 0)); end sine_cos; architecture behave_sine_cos of sine_cos is signal sine_r, cos_r : std_logic_vector(7 downto 0); begin -- behave_sine_cos sine <= sine_r + (cos_r(7) & cos_r(7) & cos_r(7) & cos_r(7 downto 3)); cos <= cos_r - (sine(7) & sine(7) & sine(7) & sine(7 downto 3)); registers: process (clk, reset) begin -- process registers if reset = '0' then -- asynchronous reset (active low) sine_r <= "00000000"; cos_r <= "00111000"; elsif clk'event and clk = '1' then -- rising clock edge if (en = '1') then sine_r <= sine; cos_r <= cos; end if; end if; end process registers; end behave_sine_cos; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 5 октября, 2006 Опубликовано 5 октября, 2006 · Жалоба Ну, после несложных преобразований приведенных формул, можно получить следующее выражение для косинуса (для синуса наверно тоже можно, но что-то лень :)) : cos((n+2)*h) = cos((n+1)*h)*(2-1/64) - cos(n*h) А это не что иное, как известная формула рекурсивного вычисления косинуса нового значения, по двум предыдущим! В данном случае будет генерироваться косинус с частотой : arccos((2-1/64)/2)/(2*pi*dt) Что кстати подтверждается и моделированием в Simulink: графики косинусов совпадают практически полностью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 5 октября, 2006 Опубликовано 5 октября, 2006 · Жалоба Ну, после несложных преобразований приведенных формул, можно получить следующее выражение для косинуса (для синуса наверно тоже можно, но что-то лень :)) : cos((n+2)*h) = cos((n+1)*h)*(2-1/64) - cos(n*h) А это не что иное, как известная формула рекурсивного вычисления косинуса нового значения, по двум предыдущим! В данном случае будет генерироваться косинус с частотой : arccos((2-1/64)/2)/(2*pi*dt) Что кстати подтверждается и моделированием в Simulink: графики косинусов совпадают практически полностью. еще не разбирался... но вот в arccos((2-1/64)/2)/(2*pi*dt) чутье мне подсказывает, что что-то не то... просьба не пинать - не математики мы... :ohmy: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 5 октября, 2006 Опубликовано 5 октября, 2006 · Жалоба Да все достаточно просто: cos( (n+2)*h ) = cos( (n+1)*h )*(2-1/64) - cos( n*h ) => cos( (n+2)*h ) + cos( n*h ) = cos( (n+1)*h )*(2-1/64) => 2*cos( (((n+2)*h + n*h)/2 )*cos( (((n+2)*h - n*h)/2 ) = cos( (n+1)*h )*(2-1/64) => 2*cos( (n+1*h) )*cos( h ) = cos( (n+1)*h )*(2-1/64) => 2*cos( h ) = (2-1/64) Так как мы генерим последовательность cos (n*h), то записав ее как cos(2*pi*F*n*dt), мы получаем : n*h = 2*pi*F*n*dt Откуда: F = h/(2*pi*dt) = arccos((2-1/64)/2)/(2*pi*dt) В этой формуде dt - это длительность периода clk из Вашего примера. Вот собственно и все. Можно только добавить, что косинус, генерируемой по этим формулам, будет в принципе обладать неустойчивостью, т.к. это по сути формулы цифрового резонатора 2-ого порядка с полюсами, рассположенными на единичной окружности. Т.е. со временем амплитуда генерируемого сигнала будет стремиться либо к нулю, либо к бесконечности. Время устойчивой работы определяеться разрядностью, с которой выпоняються все вычисления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 5 октября, 2006 Опубликовано 5 октября, 2006 · Жалоба Да, есть еще один момент: в плане реализации схема, описываемая vhdl кодом, похоже будет устойчивее, чем прямая реализации по той формуле что я из нее получил! Очевидно сказываеться последовательность вычислений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 6 октября, 2006 Опубликовано 6 октября, 2006 · Жалоба Да, есть еще один момент: в плане реализации схема, описываемая vhdl кодом, похоже будет устойчивее, чем прямая реализации по той формуле что я из нее получил! Очевидно сказываеться последовательность вычислений. Спасибо за содержательный ответ! :a14: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oldring 0 7 октября, 2006 Опубликовано 7 октября, 2006 · Жалоба Да, есть еще один момент: в плане реализации схема, описываемая vhdl кодом, похоже будет устойчивее, чем прямая реализации по той формуле что я из нее получил! Очевидно сказываеться последовательность вычислений. То, что будет устойчивее - несомненно. Конечный автомат не может быть неустойчивым :) Для полного анализа хорошо бы посмотреть на предельный цикл. Он не может быть длиннее 65535 тактов , скорее всего, он равен одному или нескольким периодам синусоиды, раз этот генератор работает :laugh: . Получив предельный цикл можно детально проанализироать спектр генерируемого сигнала. Дл получения предельного цикла проще всего пропустить 65536 первых тактов, потом запомнить внутреннее состояние генератора и выводить куда-нибудь выход генератора до тех пор, пока внутреннее состояние не повторится. Затем перегнать в Матлаб и смотреть, пока не снизойдет просветление. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться