基于FPGA的音頻編解碼芯片控制器設(shè)計_第1頁
基于FPGA的音頻編解碼芯片控制器設(shè)計_第2頁
基于FPGA的音頻編解碼芯片控制器設(shè)計_第3頁
基于FPGA的音頻編解碼芯片控制器設(shè)計_第4頁
基于FPGA的音頻編解碼芯片控制器設(shè)計_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、基于FPGA的音頻編解碼芯片控制器設(shè)計 摘要 現(xiàn)如今隨著可編程邏輯器件及相關(guān)技術(shù)的不斷發(fā)展和完善,其技術(shù)在現(xiàn)代 電子技術(shù)領(lǐng)域表現(xiàn)出的明顯技術(shù)領(lǐng)先性,具有傳統(tǒng)方法無可比擬的優(yōu)越性。近 兒年,嵌入式數(shù)字音頻產(chǎn)品受到越來越多消費者的青睞。在MP3、手機等電 子產(chǎn)品中,音頻處理功能已成為不可或缺的重要組成部分,而高質(zhì)量的音效是 當(dāng)前發(fā)展的重要趨勢。 數(shù)字語音集成電路與嵌入式微處理器相結(jié)合,既實現(xiàn)了系統(tǒng)的小型化、低 功耗,乂降低了產(chǎn)品開發(fā)成本,提高了設(shè)計的靈活性,具有體積小、擴展方便 等諸多特點,具有廣泛的發(fā)展前景。 本設(shè)計基于SOPC技術(shù),利用Verilog HDL硬件描述語言開發(fā)的基于FPGA 的音

2、頻編解碼芯片控制器,以實現(xiàn)對音頻編解碼芯片WM8731的控制。并根 據(jù)Verilog HDL可移植性和不依賴器件的特點。經(jīng)過適當(dāng)?shù)男薷?,該控制器?以移植到各類FPGA中,以控制兼容FC和FS總線的音頻編解碼芯片。避免 了重復(fù)開發(fā),這樣既縮短了設(shè)計周期乂降低了設(shè)計成本,可大大提高設(shè)計的效 率。系統(tǒng)在功能擴展上具有極大的潛力,有很好的應(yīng)用前景和科研價值。 關(guān)鍵詞:WM8731, FPGA, FC總線,音頻控制器 The design of audio codec chip controller based by FPGA Abstract Nowadays, with the programma

3、ble logic devices and related tech no logies continue to develop and improve its technology in the field of moder n electronic tech no logy was demonstrated technology leadership, has in comparable superiority of traditi onal methods .In recent years, embedded digital audio products are more and mor

4、e con sumers of all ages .In MP3, mobile phones and other electronic products, audio processing features have become an indispensable part of the current development of high-quality audio is an important trend. Digital voice in teg rated circuits and embedded microprocessors, which not only realized

5、 the systems small size, low power consumption, and reduced product development costs and improve design flexibility, small size, easy expansion, and many other features, a broad prospects for developme nt. The design is based on SOPC technology, the use of Verilog HDL hardware description Ianguage

6、developed FPGA-based audio codec chip controller, to achieve the WM8731 audio codec chip control. Verilog HDL based on portability and does not rely on the device characteristics After appropriate modifications, the controller can be ported to a variety of FPGA, to control I2C and I2S bus compatible

7、 audio codec chip. Avoid duplicati on of development, then it will shorten the design cycle and reducing design cost, can greatly improve design efficiency. Extensions on the system has great potential, there are good prospects, and scientific value. Keywords: WM8731, FPGA,卩C Bus, Audio controller 1

8、 緒論1 1.1研究的背景及意義1 1.2本設(shè)計的主要目的2 2器件介紹3 2.1語音編/解碼芯片WM87313 2.2 FPGA 器件 EP2C35F672C64 3協(xié)議介紹6 3.1 FC 總線6 3.1.1 FC總線的數(shù)據(jù)的有效性6 3.1.2 FC總線的數(shù)據(jù)格式及時序7 3.1.3 FC總線的尋址方式7 3.2 FS 總線8 3.1.1 FS總線的數(shù)據(jù)格式及時序8 3.1.2 FS總線的數(shù)據(jù)釆樣率9 4 硬件設(shè)計10 4.1 硬件方框圖10 4.2 ED-2 開發(fā)板II 4.3 語音芯片 WM8731外圍電路11 5硬件模塊設(shè)計與實現(xiàn)12 5.1開發(fā)環(huán)境12 5.1.1 Quartus

9、 II12 5.1.2 Verilog HDL12 5.2硬件模塊設(shè)計框圖13 5.3功能模塊的實現(xiàn)14 5.3.1頂層控制器模塊14 5.3.2 時鐘分頻模塊15 5.3.3 FC時序接口模塊17 5.3.4 FC控制字配置模塊20 5.3.5 IS時序接口及音頻數(shù)據(jù)處理模塊27 5.3.6 IS串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)模塊29 6系統(tǒng)調(diào)試31 結(jié)論32 致謝33 參考文獻34 附錄36 附錄1 電路圖36 附錄2源代碼37 AUD_TOP .v37 set_wm873 l.v39 i2c_com.v45 I2S_com.v49 I2S_data.v53 clkdivz .v55 外文資料翻譯(附

10、原文)錯誤!未定義書簽。 II 1緒論 1.1研究的背景及意義 FPGA (Field Programmable Gate Array),即現(xiàn)場可編程lJ陣列,它是在 PAL、GAL、CPLD等可編程器件的基礎(chǔ)上進一步發(fā)展的產(chǎn)物。它是作為專用 集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的 不足,艾克服了原有可編程器件門電路數(shù)有限的缺點。 tl前以硬件描述語言(Verilog或VHDL)所完成的電路設(shè)計,可以經(jīng)過 簡單的綜合與布局,快速燒錄下載至FPGA上進行測試,是現(xiàn)代IC設(shè)計驗 證的技術(shù)主流。這些可編輯元件可以被用來實現(xiàn)一些基本的邏輯門電路或者更 復(fù)雜一些的組合功能

11、比如解碼器或數(shù)學(xué)方程式。在大多數(shù)的FPGA里面,這 些可編輯的元件里也包含記憶元件例如觸發(fā)器(Flip flop)或者其他更加完 整的記憶塊。 系統(tǒng)設(shè)計師可以根據(jù)需要通過可編輯的連接把FPGA內(nèi)部的邏輯塊連接 起來,就好像一個電路試驗板被放在了一個芯片里。一個出廠后的成品FPGA 的邏輯塊和連接可以按照設(shè)訃者而改變,所以FPGA可以完成所需要的邏輯 功能。 可以說,F(xiàn)PGA芯片是小批量系統(tǒng)提高系統(tǒng)集成度、可靠性的最佳選擇之 一。現(xiàn)如今隨著FPGA技術(shù)的飛速發(fā)展,兒十萬門乃至兒白萬門的可變成邏 輯陣列使用起來越來越普遍。其技術(shù)在現(xiàn)代電子技術(shù)領(lǐng)域表現(xiàn)出的明顯技術(shù)領(lǐng) 先性,具有傳統(tǒng)方法無可比擬的優(yōu)越

12、性。 再者近兒年,嵌入式數(shù)字音頻產(chǎn)品受到越來越多消費者的青睞。在MP3、 手機等消費類電子產(chǎn)品中,人們對于這些個人終端的要求早已不限于單純通話 和簡單的文字處理,音頻處理功能已成為不可或缺的重要組成部分,而高質(zhì)量 的音效是當(dāng)前發(fā)展的重要趨勢。 相對于模擬語音系統(tǒng)而言,數(shù)字化語音系統(tǒng)抗干擾能力強,數(shù)據(jù)傳輸可靠, 開發(fā)周期較短,調(diào)試容易,便于訃算機存儲和處理。而專用的語音芯片是數(shù)字 化語音系統(tǒng)的核心。 正是基于上述優(yōu)點,數(shù)字語音集成電路與嵌入式微處理器相結(jié)合,這樣既 實現(xiàn)了系統(tǒng)的小型化、低功耗,乂降低了產(chǎn)品開發(fā)成本,提高了設(shè)計的靈活性, 具有體積小、擴展方便等諸多特點,具有廣泛的發(fā)展前景,如電腦語

13、音鐘、語 音型數(shù)字萬用表、手機話費查詢系統(tǒng)、排隊機、監(jiān)控系統(tǒng)語音報警以及公共汽 車報站器等。 1.2本設(shè)計的主要目的 本設(shè)計是針對音頻編解碼芯片WM8731,基于FPGA器件利用Verilog HDL硬件描述語言實現(xiàn)對該芯片的控制,設(shè)計出基于FPGA的音頻編解碼芯 片控制器。該控制器只要進行適當(dāng)?shù)男拚?,更改寄存器的地址和?shù)據(jù),就可實 現(xiàn)控制電路的移植。 其主要內(nèi)容包括對音頻編/解碼芯片WM8731的FC總線配置模塊的設(shè)計 方法、FS總線數(shù)據(jù)傳輸?shù)膶崿F(xiàn)等。將FPGA與數(shù)字語音系統(tǒng)的優(yōu)點相結(jié)合, 設(shè)計出一個高質(zhì)量、易操作、易于移植的語音錄放系統(tǒng)。 2器件介紹 本設(shè)汁主要用到 Wolfson Mic

14、roelectronics公司生產(chǎn)的一款低功耗咼品 質(zhì)雙聲道數(shù)字信號編/解碼芯片WM8731,以及控制該語音芯片工作的FPGA 器件 EP2C35F672C6。 2.1語音編/解碼芯片WM8731 WM8731是一款低功耗的高品質(zhì)雙聲道數(shù)字信號編/解碼芯片,其高性能 耳機驅(qū)動器、低功耗設(shè)計、可控采樣頻率、可選擇的濾波器使得M8731芯片 廣泛使用于便攜式MP3、CD播放器。其結(jié)構(gòu)框圖如圖2.1所示。 W83 X-I0S zos so MICWAS RLtEIP4 Micm AvrD VMIO AGMO CCKTRCt IMTFQFACE ADC 6必 OAC WW731 HPVDD HPGII

15、D DIGITAL FlLTEfiS LLIHFIM 12CO-34S SRAM等存儲器,標(biāo)準(zhǔn)MIC、 Line-in. Line-out接口,Video-in和VGA等音頻視頻接口,以及各種輸入輸 出設(shè)備。利用該開發(fā)板能方便設(shè)計開發(fā),以利于后續(xù)的功能擴展。 4.3語音芯片WM8731外圍電路 ED-2開發(fā)板上已集成了語音芯片WM8731o并連接標(biāo)準(zhǔn)MIC、Line-in. Line-out接口以連接麥克風(fēng)和耳機等外部設(shè)備。其電路圖如圖4.2所示。 8.端 口定義 assign led=rst_n; assign MCLK=cO; 復(fù)位按鈕連接一個LED燈,顯示按鈕狀態(tài) / 18.432MHz

16、主時鐘輸入 set_wm8731 (clock_50m(clock_50m), /I2C控制字配置模塊端口連接 14 .i2c_sclk(sclk)vi2c_sdat(sdat)vreset_n(rst_n),.key 1 (key 1), .key2(key2),.led 1 (led I),.led2(led2),.sw l(sw I),.sw2(sw2); I2S_com(.clockef(cO), / I2S時序接口及音頻數(shù)據(jù)處理模塊端口連接 dacclk(dacclk),.bclk(bclk),.dacdat(dacdat),.reset_n(rst_n), 時鐘分頻模塊端口連接 a

17、dcclk(adcclk),.adcdat(adcdat),.data(data); clkdivz (inclk0(clock_50m),c0(c0); endmodule 5.3.2時鐘分頻模塊 由于要使WM8731工作,必須給其提供一個主時鐘頻率。此主時鐘頻率 依照該芯片工作的不同模式有12.288MHz、18.432 MHz、11.2896 MHz以及 16.9344 MHz這4中頻率可選。 在本設(shè)計中,選擇WM8731工作在普通模式(Normal mode)下,并選擇 18.432 MHz為其主時鐘頻率。該頻率可以通過XTI和XTO端口,山晶振提供。 但本設(shè)計利用FPGA自帶的鎖相環(huán)

18、(PLL)和全局時鐘網(wǎng)絡(luò),將DE2開發(fā)板 上自帶的50MHz品振分頻得到。因此本模塊主要運用Quartus II環(huán)境下的Mega Wizard定制功能自動生成的。但由于50MHz不能精確地分頻到18.432MHz, 所以采用了一個能分到一個最接近的頻率,即18.421053MHzo 如圖5.3所示,該模塊以50MHz的時鐘為輸入,輸出18.432MHz分別連 接到MCLK以及I2S時序接口及音頻數(shù)據(jù)處理模塊的時鐘輸入。 15 圖5.3時鐘分頻模塊 mclkO k肝廳MCLK :ckxck 50m inst clkdivz Clk Ratio Ph (dg : cO -152/3125 0.00

19、 50.00 incIkO frequency: 50.20 MHz Operation Wode: Normal Cyclone II 該模塊Verilog HDL描述的設(shè)計關(guān)鍵代碼如下: module clkdivz ( /端口定義 inclkO、 / 50MHz時鐘輸入 c0); / 18.432MHz時鐘輸出 altpll altpll_component (.inclk (sub_wire3),/ 調(diào)用 altpll IP 核 .elk (sub_wiwO), vcounderrange (); defparam altplLcomponent.clkO_divide_by = 31

20、25, 16 altpn_component.clkO_duty_cycle = 50, altpll_component.clkO_miiltiply_by = 1152, altplLcomponent.clkO_phase_shift = altpH_pensate_clock = HCLK0H, altpll_component.inclkO_input_frequency = 20000, altplLended_device_family = Cyclone IF endmodule 5.3.3 FC時序接口模塊 該模塊主要實現(xiàn)對FC時序的模擬,控制SCL

21、KC數(shù)據(jù)時鐘)和SDATC數(shù) 據(jù)線)將存放在i2c_data中的24位控制字串行發(fā)送給WM8731,該模塊例化 于FC控制字配置模塊之中,以實現(xiàn)對該芯片的控制字寫入。 如圖5.4所示,在此模塊中i2c_data為24位控制字寫入;reset_n為復(fù)位輸 入:clock_i2c為I2C接口傳輸時鐘;start為傳輸開始標(biāo)志輸入;ack為卩C時 序中3位應(yīng)答位進行或操作合并為一個應(yīng)答位的輸出;tr.end為傳輸結(jié)束信號 輸出;i2c_sclk為I2C接口數(shù)據(jù)時鐘輸出;i2c_sdat為I2C接口串行數(shù)據(jù)輸出。 PC時序接口模塊時序仿真,如圖5.5所示。此處以i2c_data中24位數(shù)據(jù) 17為 0

22、111 0011 10000100 11000111 為例,當(dāng) start 信號拉低后,i2c_sclk 開始傳 輸串行數(shù)據(jù)時鐘。這里I2c時序采用33個FC時鐘周期進行,其中4-11位、 13-20位、22-29位傳送數(shù)據(jù),12、21、30為應(yīng)答位。傳輸狀態(tài)時,數(shù)據(jù)高位 在前低位在后,24位數(shù)據(jù)每8位為一字節(jié),每發(fā)送1個字節(jié)的數(shù)據(jù),就應(yīng)返 回一個應(yīng)答信號將i2c_sdat狀態(tài)拉高??臻e狀態(tài)時,i2c_sdat為高阻態(tài),i2c_sclk 為高電平狀態(tài)。 么.7 、九 c4t rwt_n Cl4Tt c 3 0 r.t ICO 120 a c 40 ? *C ruuuy一ruunummuyiru

23、iTL AO AO KliajUTaj ruutruuuLnjTJTjtrLj 圖5. 5 I2C時序接口模塊時序仿真 該模塊的Verilog HDL i2i|s關(guān)鍵代碼如下: module i2c_com(clock_i2c,reset_n,ackj2c_data,start,tr_end,i2c_sclkj2c_sdat); assign ack=ackllack2lack3;/ 應(yīng)答信號 assign i2c_sclk=sclkl(cyc_count=4) /數(shù)據(jù)時鐘 assign i2c_sdat二rejsdat?lbz:O;/ 串行數(shù)據(jù)線 always(posedge clock_i

24、2c or negedge reset_n) 模擬 PC 傳輸數(shù)據(jù)時鐘 begin if(!reset_n)/ 復(fù)位 cyc_count=6,b 111111; else begin 18 if(start=O) cyc_count=0; else if(cyc_count6*b 111111) cyc_cou nt=c yc_cou nt+1; end end always(posedge clock_i2c or negedge resetn) / 模擬卩C 傳輸?shù)跣袛?shù)據(jù) begin if(!reset_n)/ 復(fù)位 begin else case(cyc_count)/ I2C 時鐘周期

25、賦值 0: begin ack 1 = 1 ;ack2= 1 ;ack3= 1 ;tr_end=0;sclk= 1 ;reg_sdat= 1; end 1:reg_sdat=0;/ 開始傳輸 10:reg_sdat=i2c_data 16; 11: reg_sdat= 1;應(yīng)答信號 1 12:begin reg_sdat=i2c_data 15;ack 1 =i2c_sdat;end 19 應(yīng)答信號2 19: reg_sdat=i 2c_d ata8; 20:reg_sdat=l; 21:begin reg_sdat=i2c_data7;ack2=i2c_sdat;end 28: reg_sd

26、at=i2c_data0; 29:reg_sdat=l;應(yīng)答信號 3 32:begin reg_sdat= 1 ;tr_end= 1 ;end endcase end endmodule 5.3.4 FC控制字配置模塊 該模塊是基于FC時序接口模塊之上的控制單元。如圖5.6所示,該模塊 主要實現(xiàn)對語音芯片WM8731的初始配置、生成FC控制時鐘、輸出音量控 制以及輸出模式選擇等功能。以下將以實現(xiàn)的功能為單位來介紹該模塊。 20 # :set_wm573t 圖5. 612C控制字配置模塊 (1)初始配置 初始配置功能是本模塊要實現(xiàn)的主要功能。該部分主要是對i2c時療; 接口模塊例化,并向該模塊寫

27、入預(yù)設(shè)定的控制字以及開始信號、等待結(jié)束 信號、校驗應(yīng)答信號,以實現(xiàn)I2C設(shè)置過程。針對語音芯片WM8731的 10個控制寄存器預(yù)設(shè)控制字,并逐個周期將預(yù)設(shè)定的控制字寫入該芯片。 該部分關(guān)鍵Verilog HDL代碼如下所示。 i2c_com u 1 (.clock_i2c(clock_20k),.reset_n(reset_n),.ack(ack), .i2c_data(i2c_data),.start(start),.tr_end(tr_end),.i2c_sclk(i2c_sclk), i2c_sdnt(i2c_sdat); / 例化 I2C 時序接 口模塊 always(posedge

28、clock_20k or negedge reset_n)/ 配置過程控制 begin if(!reset_n) begin else 卩C i殳置過程 21 begin if(reg_indexl 1) begin case(config_step) O:begin i2c_data= 8h34,reg_data寫入地址與控制字 start=l;/寫入開始信號 config_step= 1; end l:begin if(tr_end)/等待結(jié)束信號 begin if(!ack) /校驗應(yīng)答信號 config_step=2; else config_step=0; start=0; end

29、end 2:begin reg_index=reg_index+l; config_step=0; 22 always (reg_index) begin /I2C配置預(yù)設(shè)數(shù)值 case(reg_index) O:reg_data= 16*hO 11 f; 10:reg_data=left; defau 11: reg_d ata= 16h001 a; endcase end (2)生成I2C控制時鐘 該部分是主要功能是產(chǎn)生I2C控制時鐘,山于WM8731允許的I2C控 制時鐘在400KHz內(nèi)有效,所以無法直接用外設(shè)的50MHz的晶振頻率。 出于簡單、易分頻的原則,本設(shè)計選用20KHz作為FC

30、總線的控制時鐘。 該部分關(guān)鍵代碼如下: always(posedge clock_50m or negedge reset_n) / 產(chǎn)生 I2C 控制時鐘-20KHz begin if(!reset_n) begin else if(clock_20k_cnt2499) 計數(shù)到 2500 跳變一次 clock_20k_cntv二clock_20k_cnt+1; else begin clock_20kv=!clock_20k; 23 clock_20k_cnt Side Tone和DACSEL 三種模式,因此在預(yù)設(shè)控制字代碼段中加入了模式選擇控制。 SIDETONE 圖5. 7 WM8731

31、模式示意圖 通過讀取開關(guān)Swl和Sw2的值來改變預(yù)設(shè)控制字,以達到模式切換 的功能。其Verilog HDL代碼如下所示: 4: if (swl=l ) reg_data= 1611080a;/ Bypass 模式 else if(sw2=l) reg_data= 16110825;/ Side Tone 模式 24 else regdata= 16110810;/ DACSEL 模式 (4)輸出音量控制 該部分主要是實現(xiàn)通過按鍵來增大或減小音量的功能。山于存在利用 按鍵改值的要求,所以去抖動是必不可少的。因此該部分主要涉及兩個方 面的程序。 按鍵計時檢測程序 在這一部分的程序中,主要是利用供

32、給I2C總線的20KHz的時鐘 頻率,計時每20ms檢測一次按鍵值。如果兩次相鄰時間的鍵值不同, 則可判斷有按鍵按下,進而觸發(fā)音量增減程序。具體程序代碼如下所 示: always (posedge clock_20k or negedge reset_n) /按鍵汁時程序 begin if (!reset_n) cnt=cnt+Tbl; end always (posedge clock_20k) begin if(cnt=10*d400)/ 每隔 2OMs 檢測一次按鍵 begin keyl_f=keyl; 25 key2_f=key2; end key 1 _f_wv 二 key l_f;

33、 key2_f_w=key2_f; end wire key l_ctrl = key l_f_w / 檢測兩次相鄰時間鍵值, wire key2_ctrl = key2_f_w / 若不同則改變 Ctrl 的值 音量增減程序 若有按鍵按下,則變量keyl (2) .Ctrl的值將置為一,進而觸發(fā) 對應(yīng)的音量增減程序。以增加音量為例,當(dāng)有Keyl按鍵按下時, keyl-ctrl的值變?yōu)?,此時對應(yīng)控制音量的預(yù)設(shè)值會增加一個音量檔 位。若多次增加音量以至于超過最大音量,預(yù)設(shè)值將以最大音量送入 語音芯片,則音量不會繼續(xù)增大,減小音量與之類似。具體程序代碼 如下所示: else if (keyl_c

34、trl)/ 按鍵增加音量 begin left= 16h057f) begin left=16h057f; end reg_index=(CLOCK_REF/(CLOCK_SAMPLER* 17*2)-1) begin bclkv=bclk; always(posedge clock_ref or negedge reset_n) /生產(chǎn) 48KHz 的 DAC 時鐘 dacclk begin if(!reset_n) else if(dacclk_cnt=(CLOCK_REF/(CLOCK_SAMPLE*2) 1) begin dacclk=(CLOCK_REF/(CLOCK_SAMPLE*

35、2)-l) begin adcclkv=adcclk; assign dacdat二adcdat; / 將 ADC 的數(shù)據(jù)直接從 DAC 輸出 always(negedge adcclk)/生成宙并變換的起始標(biāo)志 begin if(!reset_n) else if (bclk) state=0; else state= 1; end endmodule 5.3.6 PS串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)模塊 該模塊已例化在FS時療:接口及音頻數(shù)據(jù)處理模塊之中。其功能是逐位將 adcdat串行輸入的音頻數(shù)據(jù)轉(zhuǎn)化成并行數(shù)據(jù)山data端口輸出,在整個系統(tǒng)中并 行data輸出端口為后續(xù)開發(fā)的預(yù)留端口。 29 mod

36、ule I2S_data(bclk. adcclk, adcdat, data, state); always (posedge bclk or posedge state) begin if(sta/開始轉(zhuǎn)化標(biāo)志 begin mjmv=5h0; end else if(!adcclk) 隨著bclk的變化逐位轉(zhuǎn)化 begin num=num+rbl; end end always (num) 串并轉(zhuǎn)化 case(num) 1: data_reg 15=adcdat; 17:data=data_reg; /轉(zhuǎn)化完成賦值給端口 default:data Side Tone和 DACSEL三種模式

37、的切換。三個按鈕式按鍵用以實現(xiàn)增大或減小音量,以及 復(fù)位的功能。 在測試中,上述功能均已實現(xiàn),并能正??刂芖M8731輸出預(yù)期的音頻 數(shù)據(jù)。 31 結(jié)論 隨著可編程邏輯器件及相關(guān)技術(shù)的不斷發(fā)展和完善,人們越來越多的利用 EDA技術(shù)進行數(shù)字系統(tǒng)的設(shè)計和開發(fā)。本設(shè)計方案基于SOPC技術(shù),將I2C 總線控制器、音頻數(shù)據(jù)處理I2S總線模塊和各個數(shù)字控制模塊都設(shè)計在FPGA 內(nèi)部。極大地提高了系統(tǒng)的集成度和穩(wěn)定性。 利用Verilog HDL碩件描述語言開發(fā)的基于FPGA的音頻編解碼芯片控制 器,經(jīng)過驗證功能完整正確,可以實現(xiàn)對音頻編解碼芯片WM8731的控制。 不僅如此,根據(jù)Verilog HDL可移

38、植性和不依賴器件的特點,經(jīng)過適當(dāng)?shù)?修正該控制器可以移植到各類FPGA中,以控制兼容I2C和FS總線的音頻編 解碼芯片。避免了重復(fù)開發(fā),這樣既縮短了設(shè)計周期乂降低了設(shè)計成本,可大 大提高設(shè)訃的效率。系統(tǒng)在功能擴展上具有極大的潛力,有很好的應(yīng)用前景和 科研價值。 32 致謝 經(jīng)過將近一個學(xué)期的努力,終于如期完成了本次畢業(yè)設(shè)訃。首先我要感謝 我的畢設(shè)導(dǎo)師楊揚老師,在整個完成畢設(shè)的過程中,楊老師給予了我很大的幫 助,在一些關(guān)鍵點上給我思路和技術(shù)上的點撥,以使我少走了很多的彎路。從 楊老師那里我不僅學(xué)習(xí)到了知識,更重要的是他嚴(yán)格要求,精益求精,嚴(yán)謹求 實的治學(xué)態(tài)度給我留下深刻印象,這定會讓我受益終身。

39、在此,我特別要向楊 老師表達我深深的謝意。 感謝信息工程學(xué)院所有幫助過我、指導(dǎo)過我的老師,是他們細心的指導(dǎo)和 耐心的教誨,讓我學(xué)到了很多,懂得了很多。 另外還要感謝通信07A-4班的所有同學(xué)。在與他們共同學(xué)習(xí),共同生活的 四年里,我們一同經(jīng)歷了四年的風(fēng)風(fēng)雨雨,與他們的交流和討論,擴展了我的 思路,鍛煉了我的能力,對論文的完成頗有益處。 最后,再次對關(guān)心、幫助我的老師和同學(xué)表示衷心地感謝。 33 參考文獻 1 王杰玉,杜煒,潘紅兵.基于FPGA的音頻編解碼芯片接口設(shè)計.現(xiàn)代電子 技術(shù),2009, (05). 2 徐峰,葉輝.音頻解碼芯片在嵌入式系統(tǒng)中的應(yīng)用.黑龍江科技信息, 200 input

40、clock_50m; input rst_n; output sclk; inout sdat; inout dacclk; output dacdat; inout bclk; input adcdat; inout adcclk; input keyl,key2; output ledl ,led2Jed; output MCLK; input swl,sw2; output 15:0 data; assign led=rst_n; assign MCLK=cO; 37 set_wm8731 (clock_50m(clock_50m), i2c_sclk(sclk), .i2c_sdat(

41、sdat), reset_n(rst_n), key 1 (key 1), key2(key2), .led 1 (led 1), .Ied2(led2), .swl(swl), sw2(sw2); I2S_com(clock_ref(cO), .dacclk(dacclk), bclk(bclk), dacdat(dacdat), reset_n(rst_n), .adcclk(adcclk), adcdat(adcdat), .data(data); clkdivz (inclk0(clock_50m), cO(cO); 38 endmodule set_wm8731.v module s

42、et_wm8731 (clock_50m、i2c_sclk,i2c_sdat jeset_n,key 1 ,key2Jed 1 Jed2,sw 1 ,sw2); input clock_50m; input reset】; output i2c_sclk; inout i2c_sdat; input keyLkey2; output ledl Jed2; input swl,sw2; reg clock_20k; reg 15:0clock_20k_cnt; reg l:0config_step; reg 3:0reg_index; reg 23:0i2c_data; reg 15:0reg_

43、data; reg start; reg 9:0 ent; reg 15:0 left; reg 15:0 right; reg keyl_f.key2_f; 39 reg keyl_fLw,key2_fLw; assign Iedl=!keyl; assign Ied2=!key2; initial begin left=16hO55f; key 1 _fv=0;key2_fv=0; end i2c_com u l(.clock_i2c(clock_20k), .reset_n(reset_n), .ack(ack), i2c_data(i2c_data), start(start), .t

44、r_end(tr_end), i2c_sclk(i2c_sclk), i2c_sdat(i2c_sdat); always (posedge clock_50m or negedge reset_n) 產(chǎn)生 I2C 控制時鐘-20khz begin if(!reset_n) begin 40 clock_20k=0; clock_20k_cntv=0; end else if(clock_20k_cntv2499) clock_20k_cntv 二 clock_20k_cnt+l; else begin clock_20kv=!clock_20k; clock_20k_cntv=0; end

45、end always (posedge clock_20k or negedge reset_n) /按鍵 訃時程序 begin if (!reset_n) cnt=10,d0; else cnt=cnt+rbl; always (posedge clock_20k) begin if (cnt=10*d400)每隔 2OMs 檢測一次按鍵 20Khz 400 次 begin 41 keyl_f=keyl; key2_f=key2; end key 1 _f_w v二 key 1 _f; key2_f_wv=key2_f; end wire key 1 _ctrl = keyl_f_w wir

46、e key2_ctrl = key2_f_w always(posedge clock_20k or negedge resetn)配置過程控制 begin if(!reset_n) begin config_step=0; start=0: reg_index=0; left=16hO55f; end else if(keyl_ctrl)按鍵改音量 begin left= 16hO57f) begin 42 leftv=16b057f; end reg_index=4,b 1010; end else if(key2_ctrl) begin left=IefM6*h0008; if(left

47、 = 16h051f) begin leftv=16h051f; end reg_index=4,b 1010; end else/I2C設(shè)置過程 begin if(reg_indexl 1) begin case(config_step) 0:begin i2c_datav= 8*h34,reg_data; start=l; config_step= 1; end 1: begin 43 if(tr_end) begin if(!ack) config_step=2; else config_step=0; start=0; end end 2:begin reg_index=reg_ind

48、ex+1; config_step=0; end endcase end end end always(regjndex)/I2C 配置數(shù)值 begin case(reg_index) 0:reg_data=16,h01 If; 1: reg_data= 16h021 f; 2:reg_data= 16bO55f; 44 3:reg_data= 16*h065f; 4:if(swl=l) reg_data= 16fh080a; else if(sw2=l) reg_data= 16*hO825; else reg_data= 16*h0810; 5:reg_data= 16hOaO 1; 6:

49、reg_data= 16h0c00; 7:reg_data= 16*h0e 12; 8:reg_data= 16h 1002; 9:reg_data= 16h 1201; 10:reg_data=left; default:reg_data=4) assign i2c_sdat=reg_sdat? 1 bz:0; always(posedge clock_i2c or negedge reset_n) 根據(jù) SCLK 模擬 I2C 傳輸位 時鐘 46 begin if(!reset_n) cyc_count=6,b 111111; else begin if(start=O) cyc_coun

50、t=0; else if(cyc_count6b 111111) cyc_count=cyc_count+l; end end always (posedge clock_i2c or negedge reset_n) begin if(!reset_n) begin tr_end=0; ack 1=I; ack2=l; ack3v=l; sclk=l; reg_sdat= 1; end else case(cyc_count) 47 O:begin ack 1 = 1 ;ack2= 1 ;ack3= 1 ;tr_end=O;sclk= 1 ;reg_sdat= 1 ;end 1:reg_sd

51、at=0;開始傳輸 2:sclk=0; 3: reg_sdat=i2c_data23; 4:reg_sdat=i2c_data22; 5:reg_sdat=i2c_data21; 6:reg_sdat=i2c_data20; 7:reg_sdat=i2c_data 19; 8: reg_sd at=i 2c_d ata 18; 9:reg_sdat=i2c_data 17; 10:reg_sdat=i2c_data 16; 1 l:reg_sdat=l;應(yīng)答信號 1 12:begin reg_sdat=i2c_data 1 習(xí);ack 1 v二i2c_sdat;end 13 :reg_sdat

52、=i2c_data 14; 14:reg_sdat=i2c_data 13; 15 :reg_sdat=i2c_data 12; 16:reg_sdat=i2c_data 11 ; 17:reg_sdat=i2c_data 10; 18: reg_sdat =i 2c_d ata9; 19:reg_sdat=i2c_data 8; 應(yīng)答信號2 20:reg_sdat=l; 48 21:begin reg_sdat=i2c_data7;ack2=i2c_sdat;end 22:reg_sdat=i2c_data6; 23:reg_sdat=i2c_data5 ; 24: reg_sdat=i 2

53、c_d ata4; 25:reg_sdat=i2c_data3; 26:reg_sdat=i2c_data2; 27:reg_sdat=i2c_data 1; 2 29:reg_sdat=l;應(yīng)答信號 3 30:begin ack3=i2c_sdat;sclk=O;reg_sdat=O:end 31:sclk=l; 32:begin reg_sdat= 1 ;tr_end= 1 ;end endcase end endmodule I2S_com.v module I2S_com(clock_ref,dacclk,bclk,dacdat,reset_n,adcclk,adcdat,data);

54、 input clock_ref;/MCLK 輸入時鐘,1 input resetn; input adcdat; inout adcclk; inout dacclk; 49 output dacdat; inout bclk; output 15:0 data; reg dacclk; reg adcclk; reg 8:0dacclk_cnt; reg 8:0adcclk_cnt; reg bclk; reg 3:0bclk_cnt; reg state; I2S_data ul(.bclk(bclk), .adcclk(adcclk), adcdat(adcdat), data(dat

55、a), .state(state); parameter CLOCK_REF= 18432000; parameter CLOCK_SAMPLE=48000; always(posedge clock_ref or negedge reset_n) /生產(chǎn) 17 位數(shù)據(jù)傳輸時鐘 bclk begin if(!reset_n) begin 50 bclk=(CLOCK_REF/(CLOCK_SAMPLE*2* 17*2)-1) begin bclkv 二bclk; bclk_cntv=O; end else bclk_cnt=bclk_cnt+1; end always(posedge cloc

56、k_ref or negedge reset_n) 生產(chǎn) dac 時鐘 48khz dacclk begin if(!reset_n) begin dacclk=0; dacclk_cnt=(CLOCK_REF/(CLOCK_SAMPLE*2)-1) begin dacclk=-dacclk; dacclk_cnt=0; 51 end else dacclk_cntv 二 dacclk_cnt+l; end always (posedge clock_ref or negedge reset_n)生產(chǎn) ndc 時鐘 48khz adcclk begin if(!reset_n) begin a

57、dcclk=0; adcclk_cnt=(CLOCK_REF/(CLOCK_SAMPLE*2)-1) begin adcclk=-adcclk; adcclk_cnt=0; end else adcclk_cnt=adcclk_cnt+l; end assign dacdat=adcdat; always (negedge adcclk) 52 begin if(!reset_n) begin state=0; end else if (bclk) state=0; else state(posedge bclk or posedge state) begin if(state) begin

58、num=5,h0; end else if(!adcclk) begin num=num+rbl; end end always (num) case(num) 1: data_reg 15=adcdat; 2:data_reg 14=adcdat; 3:data_reg 13=adcdat; 4:data_reg 12=adcdat; 5:data_reg 11 =adcdat; 6:data_reg 10=adcdat; 7:data_reg9=adcdat; 8:data_reg8=adcdat; 9: d ata_reg 7 =adcd at; 10:data_reg6=adcdat;

59、 54 11:data_reg5=adcdat; 12:data_reg4=adcdat; 13:data_reg3=adcdat; 14: data_reg 2 =adcdat; 15:data_reg l=adcdat; 16:data_reg0=adcdat; 17: data=data_reg; default :data= 16hO; endcase endmodule clkdivz .v module clkdivz ( inclkO, cO); inputinclkO; outputcO; wire 5:0 sub_wire0; wire 0:0 sub_wire4 = 1hO

60、; wire 0:0 sub_wirel = sub_wire00:0; wire cO = sub_wire 1; 55 wire sub_wire2 = inclkO; wire 1:0 sub_wire3 = sub_wire4, sub_wire2; altpll altpll_component ( inclk (sub_wire3), .elk (sub_wire0), activeclock (), .areset (TbO), .clkbad (), .clkena (6 lbl), .clkloss (), .clkswitch (TbO), configupdate (Tb

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論