2010-07-02 6 views
2

Мы знаем, что выход FPGA является цифровым, но мы можем разделить чистую аналоговую синусоидальную волну, используя код vhdl. также можно указать частоту синуса wav.Создание чистой синусоидальной волны в качестве выходной формы FPGA с использованием кода VHDL

+0

для FPGAs и аналоговых сигналов попробовать [electronics.stackexchange.com] (http://electronics.stackexchange.com/questions/ tagged/sine + pwm) – maxy

ответ

2

Определите «чистый» - сколько «бит» квантования вы можете жить с ... и на какой частоте?

Для низких частот на низких битах вы можете создать простой PWM или дельта-сигма ЦАП в FPGA и поставить фильтр нижних частот на «снаружи» (извините, это должно быть реальное аналоговое оборудование :) , This example may be informative

Не собираюсь туда добраться без внешние компоненты.

+0

Да, о чем я думал, когда впервые об этом говорил, но они сказали, что вы можете сделать это без каких-либо внешних устройств ADC. Они сказали, что вы получите синусоидальную волну, как будто она была создана из аналогового генератора без рябь, и вы также можете выбрать частоту синусоидальной волны. – SultanSh

+0

Кто они? Это академический вопрос или проблема с реальной жизнью? Вам действительно нужно прокручивать некоторые цифры на основе ваших требований (с точки зрения частоты синуса, квантования и т. Д.) –

+0

Thanx ребята, они сказали мне, что они спрашивают о том, чтобы генерировать его как цифровой сигнал и использовать dac после этого, но то, что я, хотя они хотят его без dac, потому что они были настолько захватывающими, что это очень тяжелое условие, извините за это. :) – SultanSh

0

За исключением очень небольшого количества моделей смешанного сигнала (например, некоторых продуктов Actel), FPGA не имеют компонентов для необходимого аналогового восстанавливающего фильтра. Их нужно было бы добавить снаружи.

1

Вы можете посмотреть Direct Digital Synthesis. Он в основном использует ПЗУ для хранения отсчетов синуса и использует фазовый накопитель для индексации в ПЗУ для генерации выходного сигнала с требуемой частотой. Разрешение и максимальная частота связаны часами fpga и размером ПЗУ.

Вам все еще нужен фильтр реконструкции журнала.

1

Способ генерации чистых синусоидальных волн из ранее сохраненных выборок в памяти & чтение памяти с различной скоростью/памятью для изменения частоты и/или спектральной чистоты синусоидальной волны называется 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.

0
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