2010-07-02 54 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