摘 要:采用TOP-DOWN設(shè)計(jì)方法,在DE2開發(fā)平臺(tái)上完成音頻播放器設(shè)計(jì)。設(shè)計(jì)主要包括Nios Ⅱ軟核處理器、音頻控制器、I2C控制器和IDE接口等IP核構(gòu)成的Nios Ⅱ系統(tǒng),在此基礎(chǔ)上完成μClinux操作系統(tǒng)移植以及完成基于HAL層的音頻驅(qū)動(dòng)器的驅(qū)動(dòng)程序開發(fā),最后用C語言在Nios Ⅱ系統(tǒng)上編寫應(yīng)用程序進(jìn)行測試。該實(shí)現(xiàn)方法即是下一代消費(fèi)類電子發(fā)展的趨勢,也是集成電路發(fā)展的一個(gè)趨勢。
關(guān)鍵詞:SoPC;音頻控制器;HAL;系統(tǒng)移植
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1004-373X(2010)04-097-05
Design and Driver Development of Audio Player Based on Nios Ⅱ
FENG Xinyu,JIANG Hongbo,QI Hongyan
(Heilongjiang Institute of Science and Technology,Harbin,150027,China)
Abstract:Using TOP-DOWN design method to develop audio player in the DE2 platform.The system mainly consists of Nios Ⅱ soft-core processor,audio controller,I2C controller,IDE interface and other IP core.It completes the μClinux operating system transplantation and driver drives of HAL,using C language write test bench for it.The method is trend of the next generation of consumer electronics and IC.
Keywords:SoPC;audio controller;HAL;system transplantation
0 引 言
隨著集成電路的發(fā)展,嵌入式系統(tǒng)發(fā)生了深刻的變革,各種消費(fèi)類電子產(chǎn)品、終端設(shè)備都采用了嵌入設(shè)計(jì)技術(shù)。SoPC技術(shù)[1]作為嵌入式系統(tǒng)的重要分支,最近兩年發(fā)展迅猛,使用軟核處理器的概念[2]更加明確,但目前市場上還沒有軟核控制器的產(chǎn)品。隨著軟核處理器的不斷成熟,軟核處理器必將應(yīng)用在各種設(shè)備上,使得終端產(chǎn)品的價(jià)格也會(huì)因此而降低。在此,采用SoPC技術(shù),設(shè)計(jì)了由Nios Ⅱ軟核處理器作為中央處理單元、開發(fā)音頻控制器及I2C控制器等IP核[3]構(gòu)成的音頻播放器系統(tǒng)。在此基礎(chǔ)上,完成了μClinux操作系統(tǒng)移植及相應(yīng)驅(qū)動(dòng)程序開發(fā),用C語言在該系統(tǒng)上編寫應(yīng)用程序進(jìn)行測試,實(shí)現(xiàn)了一個(gè)完整的音頻播放器功能。
1 系統(tǒng)的整體結(jié)構(gòu)
在此使用的硬件開發(fā)平臺(tái)是DE2開發(fā)板,它是Altera公司針對大學(xué)教學(xué)以及研究機(jī)構(gòu)推出的FPGA開發(fā)平臺(tái)。DE2平臺(tái)上提供的硬件資源有Altera CycloneⅡ系列的EP2C35F672C6;主動(dòng)串行配置器件EPCS16U30;編程調(diào)試和用戶API設(shè)計(jì)的USB Blaster,支持JTAG模式和AS模式;512 KB SRAM;8 MB SDRAM;4 MB FLASH;SD卡接口;兩個(gè)板上時(shí)鐘源,50 MHz和27 MHz;24位音頻編解碼器等。音頻播放器的系統(tǒng)硬件框圖如圖1所示。
圖1 系統(tǒng)硬件框圖
在圖1中,處理器的工作由Nios Ⅱ軟核處理器完成;存儲(chǔ)器是存放音頻文件,DE2開發(fā)板外接了SD卡擴(kuò)展口,該設(shè)計(jì)采用SD卡作為數(shù)據(jù)的存儲(chǔ),音頻編解碼處理單元使用的是音頻編解碼芯片WM8731。
實(shí)現(xiàn)音頻播放器需要開發(fā)二個(gè)接口,一個(gè)是處理器控制WM8731的控制接口,WM8731有3線和2線兩種控制方式,在此采用的是兩線的I2C控制模式;第二個(gè)接口是音頻編解碼控制器接口,也是設(shè)計(jì)的核心重點(diǎn),最后把這二個(gè)接口包裝成IP。IP與系統(tǒng)之間的互聯(lián)使用Avalon總線結(jié)構(gòu),與系統(tǒng)之間的關(guān)系[3]如圖2所示,其他IP由Altera公司免費(fèi)提供。
圖2 SoPC Builde系統(tǒng)模塊
2 I2C控制模塊與音頻編解碼控制接口設(shè)計(jì)
2.1 I2C控制模塊接口設(shè)計(jì)
在I2C控制器中,輸入SCLK是I2C控制器的時(shí)鐘輸入,頻率為20 kHz,通過外部晶振分頻可以得到。WM8731總線接口時(shí)序如圖3所示。
圖3 WM8731 I2C總線控制時(shí)序
WM8731控制接口采用兩線接口模式,起始條件是SDIN為下降沿而SCLK為上升沿的時(shí)刻。接下來的7位是設(shè)備地址,確定使用哪一個(gè)設(shè)備(這里使用就是WM8731),之后一位為確定數(shù)據(jù)的傳輸方向,0說明為寫狀態(tài)。設(shè)備在第9個(gè)時(shí)鐘周期通過SDIN,它為低電平態(tài),用于確定寄存器地址和讀/寫控制,應(yīng)答數(shù)據(jù)傳輸(ACK,一共需要3個(gè)應(yīng)答信號(hào))。B[15:8]包括了要控制的寄存器地址,B[7:0]包含的是數(shù)據(jù)信息。結(jié)束條件是傳輸數(shù)據(jù)后SDIN和SCLK均為高電平。
由時(shí)序圖和WM8731芯片的具體控制過程得知,I2C控制器每次傳輸24 b數(shù)據(jù),前8 b是從設(shè)備地址,接下來的8 b是從設(shè)備寄存器地址,最后8 b是數(shù)據(jù),但是WM8731的寄存器地址是7 b,數(shù)據(jù)是9 b。所以實(shí)際傳輸時(shí),從設(shè)備寄存器地址的最后一位為數(shù)據(jù)的最高位,即第9 b。
I2C控制器使用33個(gè)I2C時(shí)鐘周期,完成1次傳輸24 b數(shù)據(jù),第一個(gè)時(shí)鐘周期用于初始化控制器,第2,3個(gè)周期用于啟動(dòng)傳輸,第4~30個(gè)周期用于傳輸數(shù)據(jù)。其中,包括3個(gè)ACK信號(hào),最后3個(gè)時(shí)鐘周期用以停止傳輸??刂破髦惺褂昧艘粋€(gè)6 b計(jì)數(shù)器對傳輸周期計(jì)數(shù)。在開始傳輸之前和結(jié)束傳輸之后,總線的時(shí)鐘信號(hào)應(yīng)該保持高電平,并且起始條件和結(jié)束條件由I2C的兩個(gè)信號(hào)共同配合完成。
I2C傳輸一次數(shù)據(jù)的控制流程如圖4所示。結(jié)合WM8731 I2C總線控制時(shí)序圖,SD0為控制器發(fā)送的串行數(shù)據(jù),END為傳輸結(jié)束標(biāo)志。當(dāng)復(fù)位信號(hào)為有效電平時(shí),發(fā)送計(jì)數(shù)器置為6′b111111,因?yàn)楫?dāng)計(jì)數(shù)器值為32時(shí),I2C控制總線停止傳輸數(shù)據(jù);當(dāng)復(fù)位電平無效時(shí),計(jì)數(shù)器賦值為0,等待數(shù)據(jù)傳輸開始標(biāo)志。當(dāng)傳輸標(biāo)志有效時(shí),計(jì)數(shù)器開始計(jì)數(shù),完成I2C控制器數(shù)據(jù)傳輸?shù)目刂乒δ?,?jì)數(shù)同時(shí)對計(jì)數(shù)器的值進(jìn)行判斷。當(dāng)計(jì)數(shù)器值為0(第1個(gè)時(shí)鐘周期)時(shí),對控制器進(jìn)行初始化;當(dāng)計(jì)數(shù)器為值1和2時(shí),啟動(dòng)傳輸,依次類推,與控制時(shí)序完全對應(yīng)。
圖4 音頻控制器程序流程圖
2.2 I2C配置模塊
I2C配置模塊是通過例化I2C控制模塊完成對WM8731內(nèi)部11個(gè)寄存器包括工作模式、采樣率、音量等參數(shù)的設(shè)定。WM8731的寄存器以及參數(shù)值設(shè)置如表1所示。
表1 WM8731的寄存器參數(shù)設(shè)置
寄存器地址設(shè)置參數(shù)值寄存器地址設(shè)置參數(shù)值
00H1AH0AH06H
02H1AH0CH00H
04H7BH0EH01H
06H7BH10H02H
08HF8H12H01H
配置數(shù)據(jù)指通過查表的方式對數(shù)據(jù)進(jìn)行配置。從表中可以看出,數(shù)據(jù)為16 b,包括寄存器地址和寄存器數(shù)據(jù)。
最后,把用Verilog代碼編寫的I2C控制器模塊程序,利用SoPC Builder工具進(jìn)行包裝,用IP的形式連接到系統(tǒng)的Avalon總線上。I2C控制功能所需的Avalon總線信號(hào)類型、傳輸方向及接口名稱如表2所示。
2.3 音頻編解碼控制接口設(shè)計(jì)
音頻控制模塊主要是完成對音頻編解碼芯片WM8731的接口控制。在接口的拓?fù)浣Y(jié)構(gòu)中,從端口需要接收或者發(fā)送音頻數(shù)據(jù),因而需要加一個(gè)音頻控制器,負(fù)責(zé)數(shù)據(jù)的傳輸。Nios Ⅱ把音頻控制器中的數(shù)據(jù)送給WM8731的數(shù)據(jù)接收引腳DACDAT,可以完成音頻的播放。同理,錄音過程也需要在WM8731中完成ADC轉(zhuǎn)換后,通過音頻控制器送給Nios Ⅱ處理。這里主要是一個(gè)音頻控制器和Avalon總線之間的相互通信,圖5為接口拓?fù)浣Y(jié)構(gòu)。
表2 I2C信號(hào)和Avalon接口信號(hào)類型
信號(hào)名稱方向位寬/b描述
Avalon接口信號(hào)
iCLKinput1時(shí)鐘
iRST_Ninput1復(fù)位信號(hào)
I2C_SCLKinput1總線時(shí)鐘信號(hào)
I2C_SDATbidir1數(shù)據(jù)信號(hào)
圖5 接口拓?fù)浣Y(jié)構(gòu)
Nios Ⅱ處理器與WM8731之間的數(shù)據(jù)交換要求音頻控制器功能包括FIFO單元、數(shù)據(jù)并入串出轉(zhuǎn)換模塊、位時(shí)鐘發(fā)生器模塊、數(shù)據(jù)鎖存模塊等,音頻控制器結(jié)構(gòu)模塊如圖6所示。
圖6 音頻控制器結(jié)構(gòu)模塊圖
通過外部晶振分頻為音頻控制器提供一個(gè)WM8731所需的18 MHz工作頻率,這個(gè)頻率從引腳oAUD_XCK(WM8731主時(shí)鐘)輸出,數(shù)字音頻位時(shí)鐘(oAUD_BCK),left/right 采樣時(shí)鐘(oAUD_LRCK)都是從18 MHz經(jīng)過分頻處理得到。其中,oAUD_BCK信號(hào)頻率為3 MHz;oAUD_LRCK信號(hào)頻率為96 kHz,FIFO接收的數(shù)據(jù)經(jīng)過鎖存器控制后送到并入串出模塊,這時(shí)信號(hào)可以直接給音頻編解碼芯片來使用。音頻控制器端口信號(hào)如表3所示。
最后還是利用SoPC Builder將編寫好的音頻控制器中Verilog代碼封裝成IP,在使用時(shí)調(diào)用即可。
表3 音頻接口信號(hào)和Avalon接口信號(hào)類型
信號(hào)名稱方向位寬/b
Avalon接口信號(hào)
iRST_ninput1
iDATA[15:0]input16
iWR_CLKinput1
iCLK_18_4input1
iWRinput1
輸出信號(hào)
oAUD_DATAoutput1
oDATAoutput16
oAUD_BCKoutput1
oAUD_XCKoutput1
oAUD_LRCKoutput1
3 操作系統(tǒng)移植
操作系統(tǒng)移植的實(shí)驗(yàn)環(huán)境為PC上采用虛擬機(jī)的方法來訪問Linux系統(tǒng),Linux操作系統(tǒng)使用的是Red Hat Enterprise 4 AS。在這個(gè)環(huán)境下進(jìn)行系統(tǒng)移植[4,5],需要下載一些Nios Ⅱ開發(fā)工具,如下:
(1) nios2gcc.tar.bz2:nios2gcc交叉編譯工具;
(2) μClinux-dist-20070130-nios2-02.diff.gz μClinux源代碼包;
(3) μClinux-dist-20070130-nios2-02.diff.gz μClinux補(bǔ)丁。
系統(tǒng)移植主要設(shè)計(jì)問題有bootloader配置、內(nèi)核配置和文件系統(tǒng)的配置。
μClinux系統(tǒng)的日益完善,現(xiàn)行大部分操作系統(tǒng)移植屬于板級(jí)移植,即所用的處理器已經(jīng)被μClinux支持,板級(jí)移植需要修改或添加linux/arch/Nios2 nommu/scripts目錄中的文件,該目錄中主要是與具體硬件平臺(tái)相關(guān)的配置,可以利用Nios Ⅱ自帶的SoPC Builder軟件生成具體平臺(tái)對應(yīng)的配置文件[6,7]。但具體的細(xì)節(jié)略有不同。這里重點(diǎn)要修改兩個(gè)文件:altera.c和dm9000x.c。altera.c文件主要是文件本身默認(rèn)的存儲(chǔ)單元,其大小與實(shí)際的開發(fā)板略有出入,把默認(rèn)的的寄存器大小改為與開發(fā)板一致即可。第二個(gè)要修改的文件dm9000x.c,將其中的na_dm9000全部改為na_DM9000A,保存后退出。內(nèi)核的配置與一般μClinux內(nèi)核配置過程基本相同,配置好后,保存,重新編譯。最后可在make生成所需要的內(nèi)核,把編譯好的內(nèi)核文件通過jtag下載到系統(tǒng)中,得到如圖7所示的啟動(dòng)界面,它表明系統(tǒng)啟動(dòng)成功,可以對其進(jìn)行一般Linux的系統(tǒng)操作。
4 音頻驅(qū)動(dòng)程序的編寫
設(shè)備驅(qū)動(dòng)程序可以使用模塊的方式動(dòng)態(tài)地加載到內(nèi)核中去。它們之間的關(guān)系如圖8所示。
設(shè)備注冊:設(shè)備注冊使用函數(shù)register_chrdev,調(diào)用后函數(shù)就可以向系統(tǒng)申請主設(shè)備號(hào),如果register_chrdev操作成功,設(shè)備名就會(huì)出現(xiàn)在/proc/devices文件里。設(shè)備注冊需要的頭文件為fs.h,具體的各個(gè)形式參數(shù)意義與注冊函數(shù)的形參相同[8],若函數(shù)返回值為0,說明關(guān)閉設(shè)備成功,否則返回-1。
圖7 系統(tǒng)啟動(dòng)界面
圖8 設(shè)備驅(qū)動(dòng)程序流程圖
I/O設(shè)備的讀/寫:在PIO設(shè)備寄存器范圍內(nèi)使用結(jié)構(gòu)體變量訪問使用和分配PIO設(shè)備,可以提高驅(qū)動(dòng)程序的開發(fā)效率。-linux-2.6.x/include/asm-nios2nommu/pio_struct.h中定義了np_pio結(jié)構(gòu)體,如下:
typedef volatile struct
{
int np_piodata;
int np_piodirection;
int np_piointerruptmask;
int np_pioedgecapture;
}np_pio;
I/O內(nèi)存分配和映射:在使用之前,必須首先分配I/O內(nèi)存區(qū)域[9,10](memory region)的接口。該設(shè)計(jì)的設(shè)備驅(qū)動(dòng)程序申請內(nèi)存區(qū)域可以被定義為:
request_mem_region((unsigned long)WM8731_BASE,sizeof(np_pio),\"de2_wm8731\");
該函數(shù)從WM8731_BASE開始分配sizeof(np_pio)長的內(nèi)存區(qū)域。如果成功,返回非NULL指針;否則返回NULL值。
設(shè)備操作:假定設(shè)備文件代表物理設(shè)備,這些物理設(shè)備一些用作輸入,一些用作輸出。因此,在內(nèi)核中驅(qū)動(dòng)程序?qū)τ谳敵鲈O(shè)備可以通過打開設(shè)備文件對它寫操作,就像寫一個(gè)文件,也可以通過打開設(shè)備完成如讀設(shè)備等操作,最后關(guān)閉文件,這些操作在file_operation結(jié)構(gòu)體[5]中定義。
5 測 試
對驅(qū)動(dòng)程序的驗(yàn)證主要是通過幾個(gè)應(yīng)用程序?qū)崿F(xiàn)的。在μClinux里,驅(qū)動(dòng)程序的編寫是在IDE里完成的,編譯通過后,與μClinux一起下載到開發(fā)板上進(jìn)行測試。當(dāng)驅(qū)動(dòng)程序加載到系統(tǒng)后,首先查看設(shè)備是否被加載上,利用命令查看設(shè)備號(hào),確認(rèn)設(shè)備是否被掛載上,在提示符后面,所用命令為:
mount –n –t proc proc /proc
cat /proc/devices
顯示信息為:
Character devices:
1 men
2 pty
…
243 de2_wm8731
可以看出設(shè)備de2_wm8731已經(jīng)被加載,其設(shè)備號(hào)為243。
5.1 在IDE中編寫應(yīng)用程序
編寫應(yīng)用程序的方法與普通C編程相同,主要是把音樂數(shù)據(jù)送到音頻控制器音頻數(shù)據(jù)接口,這里播放的是WAV格式的音頻文件。由于受到存儲(chǔ)空間的限制,首先要將WAV文件轉(zhuǎn)換成十進(jìn)制文件(二,八進(jìn)制亦可),選取其中的很小一段,以數(shù)組的形式放到應(yīng)用程序里,這些數(shù)組中存放的就是音頻測試數(shù)據(jù)。
5.2 把WAV文件轉(zhuǎn)換成十進(jìn)制數(shù)據(jù)的方法
當(dāng)音頻控制器不在μClinux操作系統(tǒng)下播放音頻數(shù)據(jù)時(shí),而是通過存儲(chǔ)媒質(zhì)(如SD卡)播放的,則可以把從buffer里讀出的數(shù)據(jù)以十進(jìn)制的方式打印出來,主要程序代碼為:
while(1)
{ SD_read_lba(Buffer,j,1);
printf(\"{\");
while(i<512)
{ if(!IORD(WM8731_BASE,0))
{ Tmp1=(Buffer[i+1]<<8)|Buffer[i];
printf(\",%d\",Buffer[i]);
IOWR(WM8731_BASE,0,Tmp1);
i+=1;
}
}
printf(\"},\");
這樣就把音頻數(shù)據(jù)以下列十進(jìn)制形式打印出來:
37,255,52,255,38,0,84,255,94,0,119,255,148,0,157,255,202,0,196,255,255,0,238,255[HJ1〗
5.3 應(yīng)用程序編譯
編譯應(yīng)用程序需要編寫一小段makefile文件。這里把其他應(yīng)用程序的makefile拷貝過來進(jìn)行修改使用,該驗(yàn)證把系統(tǒng)中自帶的samples/hello/Makefile拷貝到應(yīng)用程序testaudio工程中,然后修改Makefile。
Hello程序的Makefile文件主要程序段為:
DEBUG = 1
PROJ_NAME = hello
INSTALL_DIR =
PROGS :=$(PROJ_NAME).exe
CFLAGS +=
#
# You should not need to modify anything beyond this point
#
TOPDIR = ..
include $(TOPDIR)/Rules.mak
修改的方法為:
將Debug = 1 改為 Debug = 0
將PROJ_NAME =hello 改為 PROJ_NAME = testaudio
將TOPDIR = ..改為 TOPDIR = .
在include $(TOPDIR)/Rules.mak 前面加上 include $(TOPDIR)/Settings.mak
完成修改后,在工程中單擊右鍵,選擇Create Make Target,這時(shí)生成testaudio.exe文件,將其拷貝到文件系統(tǒng)里的bin文件夾下,再對文件系統(tǒng)進(jìn)行編譯,此后文件系統(tǒng)的/bin中就含有testaudio.exe程序。這時(shí)在μClinux下運(yùn)行該應(yīng)用程序即可。
其他驅(qū)動(dòng)程序,如顯示、按鍵和LED采用類似的方法編寫測試程序,再向相應(yīng)的數(shù)據(jù)緩沖區(qū)內(nèi)寫數(shù)據(jù),這些數(shù)據(jù)都可以在相應(yīng)終端看到,且可以實(shí)現(xiàn)相應(yīng)的功能,驅(qū)動(dòng)成功。
6 結(jié) 語
這里主要是將嵌入式眾多技術(shù)中發(fā)展比較快的FPGA,SoPC、嵌入式操作系統(tǒng)等有機(jī)結(jié)合起來,利用DE2開發(fā)平臺(tái),主要完成以下幾方面工作:
(1) 對DE2開發(fā)平臺(tái)功能模塊進(jìn)行劃分,掌握其開發(fā)平臺(tái)特性、使用方法,及SoPC系統(tǒng)設(shè)計(jì)過程、Avalon總線規(guī)范和使用方法;
(2) 掌握音頻編解碼芯片的工作原理, 完成其接口設(shè)計(jì), 主要包括控制接口和音頻數(shù)字接口兩部分,并結(jié)合第三方IP,完成基于Nios Ⅱ音頻系統(tǒng)的FPGA的設(shè)計(jì);
(3) 研究嵌入式操作系統(tǒng)相關(guān)知識(shí),完成μClinux系統(tǒng)中基于Nios Ⅱ硬件平臺(tái)的移植工作;
(4) 研究嵌入式驅(qū)動(dòng)程序的基本方法,完成音頻驅(qū)動(dòng)程序的設(shè)計(jì)和調(diào)試。實(shí)現(xiàn)音頻驅(qū)動(dòng)程序的功能,可以正常播放音頻文件。
參考文獻(xiàn)
[1]李蘭英.Nios Ⅱ嵌入式軟核SoPC設(shè)計(jì)原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2006.
[2]Deng Qingxu,Xu Hai.An Embedded SoPC System using Automation Design[A].International Conference on Parallel Processing[C].IEEE Computer Society,2005:232-239.
[3]張春生.面向SoPC的IP核設(shè)計(jì)與IP復(fù)用技術(shù)研究[D].長沙:國防科技大學(xué),2006.
[4]ChinChen Chang,YungChen Chou.High Payload Data Embedding with Hybrid Strategy[J].Intelligent Information Hiding and Multimedia Signal Processing,2007,1:505-508.
[5]Chen M C,F(xiàn)ang Y J,Zhang D H.Development of an Embedded Industrial Vision System[A].2006 1st IEEE Conference,Industrial Electronics and Applications[C].Singapore,2006:1-4.
[6]Yingshieh Kung,Guashieh Shu.Development of a FPGA-based Motion Control IC for Robot Arm[A].IEEE International Conference on Industrial Technology[C].IEEE Computer Society,2005:1 397-1 402.
[7]Onatban Corbet,Alessandro Rubini,Greg Kroab Hartman.Linux Device Driver[M].3版.魏永明,譯.北京:中國電力出版社,2006.
[8]蔡偉綱.Nios Ⅱ軟件架構(gòu)解析[M].西安:西安電子科技大學(xué)出版社,2007.
[9]Tam Nguyen,Zaliznyak.Architecture and Methodology of a SoPC with 3.25Gbps CDR Based SERDES and 1Gbps Dynamic Phase Alignment[A].Custom Integrated Circuits Confe-rence[C].IEEE Computer Society,2003:659-662.
[10]Kuan Jen Lin,Chuang Hsiang Huang.Design and Implementation of a Schedulable DMAC on an AMBA-Based SoPC Platform[A].IEEE Asia Pacific on Conference Circuits and Systems[C].IEEE Computer Society,2005:279-282.