摘要:針對基于ARM9框架下AC`97控制器在錄放音時有噪音的不足以及在FPGA驗證下頻繁出現(xiàn)異常重啟的缺點,該文對該控制器的異步FIFO進(jìn)行改進(jìn)——重新設(shè)計FIFO狀態(tài)判斷標(biāo)志以正確地配合DMA對其進(jìn)行讀寫的時序。在對其進(jìn)行Verilog 硬件代碼的修改后,在Altera公司的StratixⅡ系列FPGA上進(jìn)行功能驗證。
關(guān)鍵詞:AC`97控制器;異步FIFO;噪聲
中圖分類號:TP331文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)34-1765-02
The Improvement of AC`97 Controller Based on the ARM9
FU Xing-shuang
(IC College, Southeast University, Nanjing 210096, China)
Abstract: In allusion of the defect that the AC`97 controller will make noses as recording and playing under ARM9 Frame, as well unconventionally restart when FPGA Validating. This text improves the Controller's asynchronous FIFO for FIFO state judgment system in order to work with DMA reading or writing in certain sequence. And also can function validating on Altera's Stratix seriesⅡ- FPGA, after revise FIFO on Verilog code.
Key words: AC`97 controller; asynchronous FIFO; nose
1 引言
在一般的ASIC教程中,大家接觸的都是同步時鐘的設(shè)計,即單時鐘的設(shè)計。但在實際工程中,純粹單時鐘設(shè)計的情況很少,特別是設(shè)計模塊與外圍芯片的通訊過程中,跨時鐘域的情況經(jīng)常不可避免。作者在SEP5020(基于ARM9的芯片G6P)工程中遇到的一系列問題中就有因為是異步FIFO的問題而導(dǎo)致需要處理的數(shù)據(jù)溢出,從而在錄放音時產(chǎn)生噪聲。該文就是著重解決這個問題。
2 電路改進(jìn)的實現(xiàn)方法
2.1 AC`97控制器在芯片G6P中所處的位置
本款芯片是基于ARM926EJ內(nèi)核的,其在芯片中的位置如圖1。
2.2 AC`97控制器結(jié)構(gòu)及其工作原理
AC`97控制器結(jié)構(gòu)如圖2,其中包含的具體模塊有:PWM模塊,APB接口模塊,CONTROL 模塊,F(xiàn)IFO模塊。
功能如下:
PWM模塊:對控制器進(jìn)行功耗管理
APB接口模塊:通過該接口與DMA進(jìn)行數(shù)據(jù)交換
CONTROL模塊:控制各個通道的數(shù)據(jù)傳輸
因為本文重點關(guān)注的是FIFO模塊,故對其具體描述如下:
APB總線對數(shù)據(jù)Fifo的存取是以Pclk為時鐘的,而AC_LINK上是以bit_clk為時鐘,二者是異步的,當(dāng)它們要對一個FIFO進(jìn)行操作時,需要以一個時鐘為標(biāo)準(zhǔn),對另一個時鐘進(jìn)行同步操作。其中不同時鐘對同一FIFO的操作如圖3所示,紅色框內(nèi)即是具體的同步操作。另外,F(xiàn)IFO中的溢出信號、讀寫完成信號也都需要進(jìn)行同步操作。
工作原理:
AC97控制器(Audio Codec97 Controller)主要是通過AC-Link實現(xiàn)與AC97 Codec的通訊(見圖4)。本模塊實現(xiàn)了AC97 Controller左右聲道放音,和Microphone或者左右聲道的錄音功能。AC97控制器與Codec之間的通訊遵循Intel AC97(Audio Codec97)協(xié)議。本設(shè)計只支持與單個AC97 Codec的通訊。其功能特性如下:
1) 支持AC97 Controller左右聲道到Codec的數(shù)據(jù)傳送;
2) 錄音通道可配,支持Codec Microphone和左右單聲道(三選一)到AC97 Controller數(shù)據(jù)傳輸;
3) 支持DMA功能,可以通過DMA實現(xiàn)數(shù)據(jù)的傳輸;
4) 支持固定采樣率和可調(diào)采樣率,最大采樣率為48KHz。
具體工作過程如下:
數(shù)據(jù)的發(fā)起必須等待SYNC變高后的第二個時鐘周期開始,SYNC的高電平將會維持16個BIT_CLK周期,稱為“tag phase”,主要傳遞一些當(dāng)前幀的狀態(tài)信息(幀信息將在后面給出)。SYNC為低的階段主要是進(jìn)行數(shù)據(jù)的傳輸,稱為“data phase”。數(shù)據(jù)發(fā)送是在BIT_CLK的上升沿開始的,接收設(shè)備在每一個時鐘的下降沿采樣發(fā)出的數(shù)據(jù)。
2.3 工程中出現(xiàn)的問題
當(dāng)初次對硬件代碼進(jìn)行功能測試時,發(fā)現(xiàn)在錄放音的過程中總是出現(xiàn)嗡嗡的雜音,經(jīng)過檢測發(fā)現(xiàn)問題出現(xiàn)在兩個異步FIFO的狀態(tài)標(biāo)志上:IN_FIFO(16bit×8),OUT_FIFO(32bit×8)。如圖5,使用空滿標(biāo)志產(chǎn)生DMA搬運(yùn)數(shù)據(jù)請求時的前仿真圖。由下面的波形圖可以看出由于DMA中斷操作的延時,codec需要數(shù)據(jù),而controller還沒接收到數(shù)據(jù),就發(fā)生了左右聲道數(shù)據(jù)下溢,產(chǎn)生中斷。該問題的解決方法將在下面給出。
2.4 噪聲問題的解決
解決此問題的一個辦法是對該控制器中的兩個異步FIFO狀態(tài)標(biāo)志邏輯進(jìn)行修改,將原來有空滿標(biāo)志請求DMA進(jìn)行數(shù)據(jù)傳輸改為現(xiàn)在的半空半滿請求DMA進(jìn)行數(shù)據(jù)傳輸。由于對IN_FIFO電路改進(jìn)和OUT_FIFO的相似,故下面僅給出對OUT_FIFO的改進(jìn)后的硬件代碼。
AC`97控制器中的OUT_FIFO部分代碼:
module AC97_outfifo( ….
out_dmareq,
out_overflowleft,
out_overflowright,
sync_out_underflowleft,
sync_out_underflowright
);
………
reg halffull_left;
reg halffull_right;
reg [3:0]wptrl;
reg [3:0]wptrr;
…….
//=======================
//generate halffull signal
//=======================
always@( posedge in_Pclk or negedge in_n_Preset)
begin
if(in_n_Preset == 0)
begin
halffull_left <= 1’b0;
halffull_right <= 1’b0;
end
else
begin
halffull_left <= (((wptrl[3] == sync_wptrl[3]) (wptrl[2] != sync_wrptrl[2] (wptrl[1] != sync_wrptrl[1]) (wptrl[0] == sync_wrptrl[0])) || ((wptrl[3] != sync_wrptrl[3]) (wptrl[2] == sync_wrptrl[2]) (wptrl[1] != sync_wrptrl[1] (wptrl[0] == sync_wrptrl[0])));
halffull_right <= (((wptrr[3] == sync_wptrr[3]) (wptrr[2] != sync_wrptrr[2] (wptrr[1] != sync_wrptrr[1]) (wptrr[0] == sync_wrptrr[0])) || ((wptrr[3] != sync_wrptrr[3]) (wptrr[2] == sync_wrptrr[2]) (wptrr[1] != sync_wrptrr[1] (wptrr[0] == sync_wrptrr[0])));(下轉(zhuǎn)第1769頁)
(上接第1766頁)
end
end
3 仿真結(jié)果
AC`97控制器的OUTFIFO模塊通過VCS仿真后波形如圖6所示。在信號ac97enable信號起來后,通過軟件配置DMA,要求其發(fā)送有規(guī)律的一組數(shù)字0,1,2,3………126,標(biāo)有紅色的信號和圖5中的信號比較可以明顯看出該FIFO未發(fā)生上下溢出的情況。在前仿通過后,我們又進(jìn)行了FPGA(StratixⅡ系列)驗證,通過播放一段PCM碼流的音頻數(shù)據(jù),并使用Cool Edit Pro 2.1對其播放的音頻數(shù)據(jù)進(jìn)行監(jiān)測,顯示的波形結(jié)果為標(biāo)準(zhǔn)的PCM波形,最后通過真人試聽來驗證改進(jìn)后的硬件電路的正確性。限于篇幅,本文未寫出INFIFO模塊的改進(jìn)代碼和仿真結(jié)果,其原理和上面的OUTFIFO模塊的改進(jìn)、驗證是一樣。
4 結(jié)束語
本文結(jié)合實際工程中遇到的問題,介紹了在某一個特定環(huán)境中正確使用異步FIFO,為如何在實際工程正確使用異步FIFO提供了一個借鑒。由于篇幅關(guān)系,本文未全面描述異步FIFO的工作原理而偏重于如何解決由FIFO引發(fā)的問題。
參考文獻(xiàn):
[1] AC`97 Component Specification Revision 2.3[S].Intel Inc.
[2] Paluch E,Synthesis Optimized Universal Synchronous/Asynchronous Generic FIFO Design[S].Sony Electronics,Inc.
[3] SEP5020操作手冊[S].東南大學(xué)ASIC工程中心.