我们知道FPGA的输出是数字的,但我们可以使用vhdl代码生成纯模拟正弦波。我也可以指定正弦波的频率。
答案 0 :(得分:2)
定义“纯粹” - 您可以使用多少“量”的量化......以及频率是多少?
对于低位的低频率,您可以在FPGA中构建一个简单的PWM或delta-sigma DAC,并在“外部”放置一个低通滤波器(抱歉,这必须是真正的模拟硬件:)。 This example may be informative
虽然没有某些外部组件但不会到达那里。
答案 1 :(得分:1)
您可以查看Direct Digital Synthesis。它基本上使用ROM来存储正弦样本,并使用相位累加器索引到ROM中以产生具有所需频率的输出信号。分辨率和最大频率受fpga时钟和ROM大小的限制。
但是你仍然需要一个anlog重建过滤器。
答案 2 :(得分:1)
从存储器中的先前存储的样本生成纯正弦波的方法&以不同的速率/存储位置读取存储器以改变正弦波的频率和/或频谱纯度称为直接数字合成。
这使您可以生成具有所需光谱纯度的各种正弦频率。在手机和手机中很有用软件定义无线电&任何其他类似的申请。 DDS ASIC也可用,但通常很昂贵。
FPGA是更便宜的选择。 FPGA只能生成所需的数字输出,但模拟信号不能在没有滤波器或DAC和DAC的情况下生成。一些基本的过滤。
大多数FPGA供应商都有一个免费的DDS IP核及其IDE(集成开发环境)。检查Actel / Xilinx / Altera IP。他们是自由的。如果您无法获得IP,可以在Matlab&amp ;;中拉出DDS功能块。利用第三方工具(可与上述三家供应商一起使用)通过Matlab接口合成DDS。 DDS有时也称为DDFS:直接数字频率合成。
答案 3 :(得分:0)
除了极少数混合信号模型(例如某些Actel产品)外,FPGA没有所需模拟重建滤波器的组件。它们必须在外面添加。
答案 4 :(得分: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
的预期值