|
Генератор синуса на FPGA Altera |
|
|
|
 |
Ответов
|
Aug 29 2011, 13:38
|
Знающий
   
Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107

|
Нда... Количество советов по вариантам цифровой генерации синуса скоро превысит число доказательств теоремы Пифагора  Вот самый простой способ, описан тут: http://www.ti.com/lit/an/spra096a/spra096a.pdf, раздел A.1 на странице 16. Для совсем ленивых описываю суть алгоритма: y(i+1) = 2*cos(phi)*y(i) - y(i-1), где: y(i) - последовательность целочисленных значений синусоиды cos(phi) - отвечает за частоту, phi - это приращение фазы синусоиды за один период частоты дискретизации. phi = 2*pi*f / f0. начальные значения y(0) и y(-1) определяют фазу и амплитуду генерируемого сигнала. Если на начальную фазу плевать, то подойдут такие значения: y(0) = 0, y(-1) = -A * sin(phi), где А - амплитуда синусоиды. Вы можете выбрать любую разрядность, какую потянут умножители. Единственное, нужно так выбрать частоту дискретизации, чтобы ошибка от округления косинуса до ближайшего целого была не очень большой. например, для очень малого приращения фазы косинус может быть очень близок к 1, и после перевода на целочисленную арифметику ограниченной разрядности давать заметный сдвиг частоты. Если Вам будет жалко тратить целый умножитель на каждый из 18 каналов, то Вы можете организовать конвейер и контексты на большей частоте, которые будут кормить общий умножитель. Контекст каждого канала полностью определяется тремя величинами y(i), y(i-1) и cos(phi), последняя, впрочем, константа и допускает некоторую оптимизацию. Успехов!
|
|
|
|
|
Aug 30 2011, 07:23
|
Местный
  
Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893

|
Цитата(Hoodwin @ Aug 29 2011, 17:38)  Нда... Количество советов по вариантам цифровой генерации синуса скоро превысит число доказательств теоремы Пифагора  Вот самый простой способ, описан тут: http://www.ti.com/lit/an/spra096a/spra096a.pdf, раздел A.1 на странице 16. Для совсем ленивых описываю суть алгоритма: y(i+1) = 2*cos(phi)*y(i) - y(i-1), где: y(i) - последовательность целочисленных значений синусоиды cos(phi) - отвечает за частоту, phi - это приращение фазы синусоиды за один период частоты дискретизации. phi = 2*pi*f / f0. начальные значения y(0) и y(-1) определяют фазу и амплитуду генерируемого сигнала. Если на начальную фазу плевать, то подойдут такие значения: y(0) = 0, y(-1) = -A * sin(phi), где А - амплитуда синусоиды. Вы можете выбрать любую разрядность, какую потянут умножители. Единственное, нужно так выбрать частоту дискретизации, чтобы ошибка от округления косинуса до ближайшего целого была не очень большой. например, для очень малого приращения фазы косинус может быть очень близок к 1, и после перевода на целочисленную арифметику ограниченной разрядности давать заметный сдвиг частоты. Если Вам будет жалко тратить целый умножитель на каждый из 18 каналов, то Вы можете организовать конвейер и контексты на большей частоте, которые будут кормить общий умножитель. Контекст каждого канала полностью определяется тремя величинами y(i), y(i-1) и cos(phi), последняя, впрочем, константа и допускает некоторую оптимизацию. Успехов! Спасибо, эта штука заработала, и как я только умудрился забыть то что сдавал давным давно в универе когда только пришли комплекты "Умка" на базе КР580, я тогда с преподом наспор за зачот сделал расчёт таблицы синусов по этой итерационной формуле ньютона если не ошибаюсь с названием. Штука заработала но я не осилил расчёт погрешностей статических и динамических в итоге чуток частота плавает и не точно задаётся, например задал pi*200 = 628.318531Hz, а вышла pi*203=637.743309Hz в арифметике с фикс. запятой 16/16. 16 бит на числа после запятой по идее должно хватить, странно что частота не точно выставлена оказалось, умножитель 64 битный, округляю правильно по правилам арифметики округления.
|
|
|
|
Сообщений в этой теме
Porty Генератор синуса на FPGA Altera Aug 29 2011, 12:07 soldat_shveyk Тут квартус с его компонентами не важны.
Вы заяви... Aug 29 2011, 12:17 Porty Мне нужно получить внутри ПЛИС цифровые отсчёты як... Aug 29 2011, 12:20 iosifk Цитата(Porty @ Aug 29 2011, 16:07) Разряд... Aug 29 2011, 12:32 Porty Цитата(iosifk @ Aug 29 2011, 16:32) На са... Aug 29 2011, 12:44  iosifk Цитата(Porty @ Aug 29 2011, 16:44) Спасиб... Aug 29 2011, 12:57 =SSN= Цитата(iosifk @ Aug 29 2011, 16:32) На са... Aug 29 2011, 12:46  Porty Цитата(=SSN= @ Aug 29 2011, 16:46) И как ... Aug 29 2011, 12:51   =SSN= Цитата(Porty @ Aug 29 2011, 16:51) нужны ... Aug 29 2011, 13:14  mse Цитата(=SSN= @ Aug 29 2011, 16:46) И как ... Aug 29 2011, 16:48 eugen_pcad_ru Используйте ядро NСО из состава встроенных ядер - ... Aug 30 2011, 05:58 Мур Цитата(eugen_pcad_ru @ Aug 30 2011, 08:58... Aug 30 2011, 06:42 Hoodwin 1. Вообще, насколько я себе представляю, 16 разряд... Aug 30 2011, 08:37 Porty Цитата(Hoodwin @ Aug 30 2011, 12:37) 1. В... Aug 30 2011, 09:02 Hoodwin А как проверяли, что плавает то? Может, если через... Aug 30 2011, 10:01 Porty Цитата(Hoodwin @ Aug 30 2011, 14:01) А ка... Aug 30 2011, 10:49 dde29 А с алгоритмом CORDIC - не знакомы? занимает не бо... Sep 1 2011, 14:59 Porty Цитата(dde29 @ Sep 1 2011, 18:59) А с алг... Sep 2 2011, 05:41  dde29 Цитата(Porty @ Sep 2 2011, 08:41) алгорит... Sep 3 2011, 03:43   Porty Цитата(dde29 @ Sep 3 2011, 07:43) У меня ... Sep 3 2011, 09:56    dde29 Цитата(Porty @ Sep 3 2011, 12:56) 16 звен... Sep 4 2011, 13:40 anatolich Cделал такой же генератор, на 14 бит целочисленный... Jul 4 2013, 13:24 Maverick Цитата(anatolich @ Jul 4 2013, 16:24)
по... Jul 4 2013, 13:50 anatolich Вот мой пример
library ieee;
use ieee.std_logic_11... Jul 4 2013, 14:00 anatolich 2+6*14=86ДБл
Такое примерно число получается если ... Jul 5 2013, 05:14
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|