Генерация чистой синусоидальной волны на выходе из ПЛИС с использованием кода VHDL

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


person SultanSh    schedule 02.07.2010    source источник
comment
для ПЛИС и аналоговых сигналов попробуйте electronics.stackexchange.com   -  person maxy    schedule 09.10.2015


Ответы (5)


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

Для низких частот с низким битом вы можете построить простой ЦАП с ШИМ или дельта-сигма в FPGA и поставить фильтр нижних частот «снаружи» (извините, это должно быть настоящее аналоговое оборудование :). Этот пример может быть информативным

Однако без некоторых внешних компонентов ничего не получится.

person Martin Thompson    schedule 02.07.2010
comment
Да, это то, о чем я думал, когда впервые заговорил об этом, но они сказали, что это можно сделать без каких-либо внешних устройств АЦП. Они сказали, что вы получите синусоидальную волну, как если бы она была сгенерирована аналоговым генератором без пульсаций, и вы также можете выбрать частоту синусоидальной волны. - person SultanSh; 02.07.2010
comment
Кто они? Это академический вопрос или реальная проблема? Вам действительно нужно прокрутить некоторые числа в зависимости от ваших требований (с точки зрения частоты синуса, квантования и т. д.). - person Martin Thompson; 05.07.2010
comment
Спасибо, ребята, они сказали мне, что они спрашивали о генерировании его как цифрового сигнала и использовании ЦАП после этого, но я думал, что они хотят его без ЦАП, потому что они были настолько захватывающими, что это очень сложный вопрос, извините за это. :) - person SultanSh; 23.07.2010

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

Однако вам по-прежнему нужен фильтр реконструкции аналогового сигнала.

person user450766    schedule 01.10.2010

Метод генерации чистых синусоидальных волн из ранее сохраненных семплов в памяти и считывания памяти с различной скоростью / ячейками памяти для изменения частоты и/или спектральной чистоты синусоидальной волны называется прямым цифровым синтезом.

Это позволяет генерировать широкий диапазон синусоидальных частот с требуемой спектральной чистотой. Полезно в мобильных устройствах и программно-определяемых радиостанциях и любых других подобных приложениях. DDS ASIC также доступны, но обычно стоят дорого.

FPGA - более дешевая альтернатива. FPGA может генерировать только требуемый цифровой выход, но аналоговый сигнал не может быть сгенерирован без фильтра или ЦАП и некоторой базовой фильтрации.

Большинство поставщиков FPGA имеют бесплатное IP-ядро DDS со своей IDE (интегрированной средой разработки). Проверьте IP-адреса Actel/Xilinx/Altera. Они свободны. Если вам не удается получить IP-адрес, вы можете извлечь функциональный блок DDS в Matlab и использовать сторонний инструмент ... (доступный у всех трех вышеперечисленных поставщиков) для синтеза DDS через интерфейс Matlab. DDS иногда также называют DDFS: прямой цифровой синтез частоты.

person Aditya    schedule 16.01.2013

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

person Ben Voigt    schedule 06.07.2010

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.

person Priya Ambekr    schedule 09.10.2015