歡迎您光臨本站 登入註冊首頁

脈寬調製(PWM)和1位數模轉換

admin @ 2014-03-26 , reply:0

概述

在FPGA的一個引腳連接一個揚聲器,然後用來聽MP3?當然可以。這裡我們採用的方法是:使用PC來解碼MP3,然後將解碼后的數據送到配置為1位DAC的FPGA。音頻輸出我們需要一個部件來連接FPGA的輸……

在FPGA的一個引腳連接一個揚聲器,然後用來聽MP3?當然可以。
這裡我們採用的方法是:使用PC來解碼MP3,然後將解碼后的數據送到配置為1位DAC的FPGA。


音頻輸出
我們需要一個部件來連接FPGA的輸出引腳(數字)和揚聲器(模擬),以完成數模轉換。最簡單的辦法是用一個電阻網路或者數模轉換器件實現。
由於相當於聲音信號的頻域來說,FPGA是在是太快了,所以採用1位DAC是更好的選擇。最簡單的實驗1位DAC的辦法是:使用脈寬調製(PWM)

脈寬調製
脈寬調製在輸出引腳上產生一系列脈衝輸出。輸出有這樣的特性:輸出信號幅度的平均值正比於輸入調製器的數值的大小。想辦法對輸出進行濾波,就可以在輸出端得到與數字輸入對應的模擬信號。
脈寬調製器的輸入可以是任意寬度,通常是8位或16位
其輸出則是1位的(一個輸出)
脈寬調製也廣泛的應用於微控制器,詳見應用筆記AN665.

累加器
生成脈寬調製信號的最簡單的辦法就是使用硬體累加器。一旦累加結果溢出,就輸出1(高電平),否則輸出0(低電平)。
這在FPGA中很容易實現。
Verilog 代碼:

module PWM(clk, PWM_in, PWM_out);
input clk;
input [7:0] PWM_in;
output PWM_out;

reg [8:0] PWM_accumulator;
always @(posedge clk) PWM_accumulator <= PWM_accumulator[7:0] + PWM_in;

assign PWM_out = PWM_accumulator[8];
endmodule 

VHDL 代碼:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity PWM is
  port (
   clk : in std_logic;
   PWM_in : in std_logic_vector (7 downto 0) := "00000000";
   PWM_out : out std_logic
  );
end PWM;

architecture PWM_arch of PWM is
  signal  PWM_Accumulator : std_logic_vector(8 downto 0);
begin
  process(clk, PWM_in)
  begin
    if rising_edge(clk) then     
      PWM_Accumulator  <=  ("0" & PWM_Accumulator(7 downto 0)) + ("0" & PWM_in);
    end if;
  end process;

  PWM_out <= PWM_Accumulator(8);
end PWM_arch;

輸入數據越大,累加器越快溢出,從而使得輸出1的頻率越高,這正是我們希望的。
通常使用計數器和比較其來生成PWM信號,但是這樣要消耗更多的邏輯資源,所以採用累加器的方法來的更加容易。

1位的DAC
為了得到模擬輸出,我們連接一個低通網路到這個輸出。如果產生的脈衝的頻率足夠高,就可以用一個簡單的RC濾波器來實現。

播放MP3
第一步:解碼mp3數據。解碼后的數據成為“PCM”數據
為了簡化設計,通過串口完成數據從PC到FPGA的傳輸,串口上的最大波特率為115200,大約11.5KByte每秒。所以mp3的採樣率必須降到11K以下,並且採樣精度為8位,這些對於PC機來說是很容易的。這裡是使用的軟體(帶源程序)

好了現在該連接FPGA跟揚聲器了,通常有三中方案,如下所示。
 

1.直接連接。應為揚聲器基本上是根導線,我們通過控制通過它的電路來產生聲音,為了不致損壞器件,通常要求揚聲器的阻抗較大,如使用耳機等。
2.通過RC網路連接。同樣要求揚聲器有較大的輸入阻抗,不至於影響RC濾波器。
3.通過RC網路和運放連接。得到最好音質的最佳方案。


最後我們修改HDL代碼,使用從串口接收的數據。
module PWM(clk, RxD, PWM_out);
input clk, RxD;
output PWM_out;

wire RxD_data_ready;
wire [7:0] RxD_data;
async_receiver deserialer(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data));

reg [7:0] RxD_data_reg;
always @(posedge clk) if(RxD_data_ready) RxD_data_reg <= RxD_data;

////////////////////////////////////////////////////////////////////////////
reg [8:0] PWM_accumulator;
always @(posedge clk) PWM_accumulator <= PWM_accumulator[7:0] + RxD_data_reg;

assign PWM_out = PWM_accumulator[8];
endmodule 

好了,現在開始用FPGA來聽mp3吧。

補充材料
數字音頻是一個非常廣泛的主題,下面是一些重要的補充材料
1.segma-delta調製簡介
2.數字濾波器


[admin via 研發互助社區 ] 脈寬調製(PWM)和1位數模轉換已經有3042次圍觀

http://cocdig.com/docs/show-post-43096.html