2

我们知道 FPGA 的输出是数字的,但我们可以使用 vhdl 代码生成纯模拟正弦波。我也可以指定正弦波的频率。

4

5 回答 5

2

定义“纯”——你可以接受多少“比特”的量化......以及什么频率?

对于低位的低频率,您可以在 FPGA 中构建一个简单的 PWM 或 delta-sigma DAC,并在“外部”放置一个低通滤波器(对不起,这必须是真正的模拟硬件:)。这个例子可能会提供信息

但是,如果没有一些外部组件,就不会到达那里。

于 2010-07-02T12:08:57.460 回答
1

从先前存储在内存中的样本生成纯正弦波并以不同的速率/内存位置读取内存以改变正弦波的频率和/或频谱纯度的方法称为直接数字合成。

这使您可以生成具有所需频谱纯度的各种正弦频率。在手机和软件定义无线电和任何其他类似应用程序中很有用。DDS ASIC 也可用,但通常很昂贵。

FPGA 是更便宜的替代品。FPGA 只能生成所需的数字输出,但没有滤波器或 DAC 和一些基本滤波就无法生成模拟信号。

大多数 FPGA 供应商在他们的 IDE(集成开发环境)中都有一个免费的 DDS IP 内核。查看 Actel/Xilinx/Altera IP。他们是免费的。如果您无法获得 IP,您可以在 Matlab 中提取 DDS 功能块并使用第 3 方工具 ..(以上三个供应商都可用)通过 Matlab 接口合成 DDS。DDS 有时也称为 DDFS:直接数字频率合成。

于 2013-01-16T11:25:49.717 回答
1

您可以查看直接数字合成。它基本上使用 ROM 来存储正弦样本,并使用相位累加器来索引 ROM 以生成具有所需频率的输出信号。分辨率和最大频率受 fpga 时钟和 ROM 大小的限制。

不过,您仍然需要一个模拟重建滤波器。

于 2010-10-01T01:49:50.867 回答
0

除了极少数混合信号模型(例如一些 Actel 产品)外,FPGA 没有所需的模拟重建滤波器组件。它们必须添加到外部。

于 2010-07-06T07:33:47.387 回答
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 预期的常量值

于 2015-10-09T05:21:24.933 回答