2010-07-02 81 views
2

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

+0

FPGA和模拟信号尝试[electronics.stackexchange.com](http://electronics.stackexchange.com/questions/恒定值tagged/sine + pwm) – maxy 2015-10-09 06:47:38

回答

2

定义“纯” - 您可以生活多少“比特”量化......以及什么频率?

对于较低的低频率,您可以在FPGA中构建一个简单的PWM或delta-sigma DAC,并在“外部”放置一个低通滤波器(对不起,那必须是真正的模拟硬件:) 。 This example may be informative

不会去没有一些虽然外部元件。

+0

是的,当我第一次谈论这个时,我想到了什么,但他们说你可以在没有任何外部ADC设备的情况下做到这一点。他们说你会得到正弦波,就像它是从没有涟漪的模拟发生器产生的,你也可以选择正弦波的频率。 – SultanSh 2010-07-02 13:12:37

+0

他们是谁?这是一个学术问题还是现实生活中的问题?你真的需要根据你的要求来调整一些数字(在正弦频率,量化等方面)。) – 2010-07-05 12:26:01

+0

Thanx家伙,他们告诉我,他们要求将其生成为数字信号,并在此之后使用dac,但是尽管如此,他们在没有dac的情况下需要使用dac,因为它们非常令人兴奋,因此非常难对付。 :) – SultanSh 2010-07-23 19:27:35

0

除了极少数混合信号模型(例如某些Actel产品)外,FPGA不具备用于所需模拟重构滤波器的组件。他们必须添加在外面。

1

你可以看看Direct Digital Synthesis。它基本上使用ROM来存储正弦采样,并使用相位累加器来索引ROM以产生具有所需频率的输出信号。分辨率和最大频率受fpga时钟和ROM大小的限制。

虽然你仍然需要anlog重建过滤器。

1

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

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

FPGA的更便宜的选择。 FPGA只能生成所需的数字输出,但模拟信号不能在没有滤波器或DAC的情况下生成一些基本的滤波。

大多数FPGA供应商都在其IDE(集成开发环境)中提供免费的DDS IP核。结帐Actel/Xilinx/Altera IP。他们是免费的。如果你不能设法获得一个IP,你可以在Matlab &中使用DDS功能块,利用第三方工具..(与上述所有三家供应商一起提供)通过Matlab接口合成DDS。 DDS有时也称为DDFS:直接数字频率合成。

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