Мы знаем, что выход FPGA является цифровым, но можем ли мы сгенерировать чисто аналоговую синусоидальную волну, используя код VHDL. также я могу указать частоту синусоидальной волны.
Генерация чистой синусоидальной волны на выходе из ПЛИС с использованием кода VHDL
Ответы (5)
Определите "чистый" - сколько "битов" квантования вы можете использовать... и с какой частотой?
Для низких частот с низким битом вы можете построить простой ЦАП с ШИМ или дельта-сигма в FPGA и поставить фильтр нижних частот «снаружи» (извините, это должно быть настоящее аналоговое оборудование :). Этот пример может быть информативным
Однако без некоторых внешних компонентов ничего не получится.
Вы можете ознакомиться с Direct Digital Synthesis. В основном он использует ПЗУ для хранения синусоидальных отсчетов и использует накопитель фазы для индексации в ПЗУ для генерации выходного сигнала с желаемой частотой. Разрешение и максимальная частота ограничены тактовой частотой fpga и размером ПЗУ.
Однако вам по-прежнему нужен фильтр реконструкции аналогового сигнала.
Метод генерации чистых синусоидальных волн из ранее сохраненных семплов в памяти и считывания памяти с различной скоростью / ячейками памяти для изменения частоты и/или спектральной чистоты синусоидальной волны называется прямым цифровым синтезом.
Это позволяет генерировать широкий диапазон синусоидальных частот с требуемой спектральной чистотой. Полезно в мобильных устройствах и программно-определяемых радиостанциях и любых других подобных приложениях. DDS ASIC также доступны, но обычно стоят дорого.
FPGA - более дешевая альтернатива. FPGA может генерировать только требуемый цифровой выход, но аналоговый сигнал не может быть сгенерирован без фильтра или ЦАП и некоторой базовой фильтрации.
Большинство поставщиков FPGA имеют бесплатное IP-ядро DDS со своей IDE (интегрированной средой разработки). Проверьте IP-адреса Actel/Xilinx/Altera. Они свободны. Если вам не удается получить IP-адрес, вы можете извлечь функциональный блок DDS в Matlab и использовать сторонний инструмент ... (доступный у всех трех вышеперечисленных поставщиков) для синтеза DDS через интерфейс Matlab. DDS иногда также называют DDFS: прямой цифровой синтез частоты.
За исключением очень немногих моделей смешанных сигналов (например, некоторых продуктов Actel), ПЛИС не имеют компонентов для необходимого фильтра аналоговой реконструкции. Их нужно было добавить снаружи.
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.