Мы знаем, что выход FPGA является цифровым, но мы можем разделить чистую аналоговую синусоидальную волну, используя код vhdl. также можно указать частоту синуса wav.Создание чистой синусоидальной волны в качестве выходной формы FPGA с использованием кода VHDL
ответ
Определите «чистый» - сколько «бит» квантования вы можете жить с ... и на какой частоте?
Для низких частот на низких битах вы можете создать простой PWM или дельта-сигма ЦАП в FPGA и поставить фильтр нижних частот на «снаружи» (извините, это должно быть реальное аналоговое оборудование :) , This example may be informative
Не собираюсь туда добраться без внешние компоненты.
Да, о чем я думал, когда впервые об этом говорил, но они сказали, что вы можете сделать это без каких-либо внешних устройств ADC. Они сказали, что вы получите синусоидальную волну, как будто она была создана из аналогового генератора без рябь, и вы также можете выбрать частоту синусоидальной волны. – SultanSh
Кто они? Это академический вопрос или проблема с реальной жизнью? Вам действительно нужно прокручивать некоторые цифры на основе ваших требований (с точки зрения частоты синуса, квантования и т. Д.) –
Thanx ребята, они сказали мне, что они спрашивают о том, чтобы генерировать его как цифровой сигнал и использовать dac после этого, но то, что я, хотя они хотят его без dac, потому что они были настолько захватывающими, что это очень тяжелое условие, извините за это. :) – SultanSh
За исключением очень небольшого количества моделей смешанного сигнала (например, некоторых продуктов Actel), FPGA не имеют компонентов для необходимого аналогового восстанавливающего фильтра. Их нужно было бы добавить снаружи.
Вы можете посмотреть Direct Digital Synthesis. Он в основном использует ПЗУ для хранения отсчетов синуса и использует фазовый накопитель для индексации в ПЗУ для генерации выходного сигнала с требуемой частотой. Разрешение и максимальная частота связаны часами fpga и размером ПЗУ.
Вам все еще нужен фильтр реконструкции журнала.
Способ генерации чистых синусоидальных волн из ранее сохраненных выборок в памяти & чтение памяти с различной скоростью/памятью для изменения частоты и/или спектральной чистоты синусоидальной волны называется Direct Digital Synthesis.
Это позволяет создавать широкий спектр синусоидальных частот с требуемой спектральной чистотой. Полезно в мобильных телефонах & Программное обеспечение Defined Radio's & любое другое подобное приложение. DDS ASIC также доступны, но обычно дороги.
FPGA - более дешевая альтернатива. FPGA может генерировать только требуемый цифровой выход, но аналоговый синтаксический сигнал может генерироваться без фильтра или DAC & некоторой базовой фильтрацией.
Большинство поставщиков ПЛИС имеют бесплатное IP-ядро DDS с их интегрированной средой разработки (IDE). Оформить заказ Actel/Xilinx/Altera IP. Они свободны. Если вам не удастся получить IP-адрес, вы можете потянуть функциональный блок DDS в Matlab &, используя сторонний инструмент .. (доступный со всеми тремя вышеперечисленными поставщиками) для синтеза DDS через интерфейс Matlab. DDS иногда также известен как DDFS: Direct Digital Frequency Synthesis.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
-- use this library as much as possible.
entity sinewave is
port (clk :in std_logic;
dataout : out real range -1.0 to 1.0);
end sinewave;
architecture Behavioral of sinewave is
signal i : integer range 0 to 77:=0;
type memory_type is array (0 to 71) of real range -1.0000 to 1.0000 ;
--ROM for storing the sine values generated.
signal temp : memory_type :=(0.0,0.0872, 0.1736, 0.2588, 0.3420, 0.4226, 0.5000, 0.5736, 0.6428, 0.7071, 0.7660,
0.8191, 0.8660, 0.9063, 0.9397, 0.9659, 0.9848, 0.9962, 1.0000,0.9962,0.9848,0.9659,
0.9397, 0.9063, 0.8660, 0.8191, 0.7660, 0.7071, 0.6428, 0.5000, 0.4226, 0.3420, 0.2588,
0.1736, 0.0872,0.0, 0.0,-0.0872,-0.1736, -0.2588, -0.3420,-0.4226, -0.5000, -0.5736,
-0.6428, -0.7071, -0.7660, -0.8191, -0.8660, -0.9063, -0.9397, -0.9659, -0.9848, -0.9962,
-1.0000,-0.9962,-0.9848,-0.9659,-0.9397, -0.9063, -0.8660, -0.8191,
-0.766, -0.7071, -0.6428, -0.5000, -0.4226, -0.3420, -0.2588, -0.1736, -0.0872,0.0);
begin
process(clk)
begin
--to check the rising edge of the clock signal
if(rising_edge(clk)) then
dataout <= temp(i);
i <= i+ 1;
if(i = 71) then
i <= 0;
end if;
end if;
end process;
end Behavioral;
Решить эту реализацию Это показывает ошибку, чем постоянное значение ожидаемого для выражения 1.000
для FPGAs и аналоговых сигналов попробовать [electronics.stackexchange.com] (http://electronics.stackexchange.com/questions/ tagged/sine + pwm) – maxy