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

Генератор SIN/COS на VHDL

Может кто объяснить принцип работы?

Какая математика тут "подвязана"?

Может ссылка где есть?

 

 

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;

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


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

Ну, после несложных преобразований приведенных формул, можно получить следующее выражение для косинуса (для синуса наверно тоже можно, но что-то лень :)) :

 

cos((n+2)*h) = cos((n+1)*h)*(2-1/64) - cos(n*h)

 

А это не что иное, как известная формула рекурсивного вычисления косинуса нового значения, по двум предыдущим! В данном случае будет генерироваться косинус с частотой : arccos((2-1/64)/2)/(2*pi*dt)

 

Что кстати подтверждается и моделированием в Simulink: графики косинусов совпадают практически полностью.

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


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

Ну, после несложных преобразований приведенных формул, можно получить следующее выражение для косинуса (для синуса наверно тоже можно, но что-то лень :)) :

 

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:

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


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

Да все достаточно просто:

 

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-ого порядка с полюсами, рассположенными на единичной окружности. Т.е. со временем амплитуда генерируемого сигнала будет стремиться либо к нулю, либо к бесконечности. Время устойчивой работы определяеться разрядностью, с которой выпоняються все вычисления.

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


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

Да, есть еще один момент: в плане реализации схема, описываемая vhdl кодом, похоже будет устойчивее, чем прямая реализации по той формуле что я из нее получил! Очевидно сказываеться последовательность вычислений.

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


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

Да, есть еще один момент: в плане реализации схема, описываемая vhdl кодом, похоже будет устойчивее, чем прямая реализации по той формуле что я из нее получил! Очевидно сказываеться последовательность вычислений.

 

Спасибо за содержательный ответ!

:a14:

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


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

Да, есть еще один момент: в плане реализации схема, описываемая vhdl кодом, похоже будет устойчивее, чем прямая реализации по той формуле что я из нее получил! Очевидно сказываеться последовательность вычислений.

 

То, что будет устойчивее - несомненно. Конечный автомат не может быть неустойчивым :)

Для полного анализа хорошо бы посмотреть на предельный цикл. Он не может быть длиннее 65535 тактов :biggrin:, скорее всего, он равен одному или нескольким периодам синусоиды, раз этот генератор работает :laugh: . Получив предельный цикл можно детально проанализироать спектр генерируемого сигнала.

 

Дл получения предельного цикла проще всего пропустить 65536 первых тактов, потом запомнить внутреннее состояние генератора и выводить куда-нибудь выход генератора до тех пор, пока внутреннее состояние не повторится. Затем перегнать в Матлаб и смотреть, пока не снизойдет просветление. :biggrin:

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


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

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

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

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

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

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

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

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

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

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