畢業(yè)論文----基于fpga的音頻編解碼芯片控制器設計_第1頁
已閱讀1頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  基于FPGA的音頻編解碼芯片控制器設計</p><p><b>  摘要 </b></p><p>  現(xiàn)如今隨著可編程邏輯器件及相關技術的不斷發(fā)展和完善,其技術在現(xiàn)代電子技術領域表現(xiàn)出的明顯技術領先性,具有傳統(tǒng)方法無可比擬的優(yōu)越性。近幾年,嵌入式數(shù)字音頻產品受到越來越多消費者的青睞。在MP3、手機等電子產品中,音頻處理功能已成為不可或缺的重要組

2、成部分,而高質量的音效是當前發(fā)展的重要趨勢。</p><p>  數(shù)字語音集成電路與嵌入式微處理器相結合,既實現(xiàn)了系統(tǒng)的小型化、低功耗,又降低了產品開發(fā)成本,提高了設計的靈活性,具有體積小、擴展方便等諸多特點,具有廣泛的發(fā)展前景。</p><p>  本設計基于SOPC技術,利用Verilog HDL硬件描述語言開發(fā)的基于FPGA的音頻編解碼芯片控制器,以實現(xiàn)對音頻編解碼芯片WM8731的

3、控制。并根據(jù)Verilog HDL可移植性和不依賴器件的特點。經(jīng)過適當?shù)男薷?,該控制器可以移植到各類FPGA中,以控制兼容I2C和I2S總線的音頻編解碼芯片。避免了重復開發(fā),這樣既縮短了設計周期又降低了設計成本,可大大提高設計的效率。系統(tǒng)在功能擴展上具有極大的潛力,有很好的應用前景和科研價值。</p><p>  關鍵詞:WM8731,F(xiàn)PGA,I2C總線,音頻控制器</p><p>  

4、The design of audio codec chip controller based by FPGA</p><p><b>  Abstract</b></p><p>  Nowadays, with the programmable logic devices and related technologies continue to develop a

5、nd improve its technology in the field of modern electronic technology was demonstrated technology leadership, has incomparable superiority of traditional methods. In recent years, embedded digital audio products are mor

6、e and more consumers 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-qualit</p><p>  Digital v

7、oice integrated circuits and embedded microprocessors, which not only realized the system's small size, low power consumption, and reduced product development costs and improve design flexibility, small size, easy ex

8、pansion, and many other features, a broad prospects for development.</p><p>  The design is based on SOPC technology, the use of Verilog HDL hardware description language developed FPGA-based audio codec chi

9、p 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 o

10、f FPGA, to control I2C and I2S bus compatible audio codec chip. Avoid duplication of development, then it will shorten the design cycle and reducing de</p><p>  Keywords: WM8731, FPGA, I2C Bus, Audio control

11、ler</p><p><b>  目 錄</b></p><p><b>  1 緒論1</b></p><p>  1.1研究的背景及意義1</p><p>  1.2本設計的主要目的2</p><p><b>  2 器件介紹3</b>

12、;</p><p>  2.1 語音編/解碼芯片WM87313</p><p>  2.2 FPGA器件EP2C35F672C64</p><p><b>  3 協(xié)議介紹6</b></p><p>  3.1 I2C總線6</p><p>  3.1.1 I2C總線的數(shù)據(jù)的有效性

13、6</p><p>  3.1.2 I2C總線的數(shù)據(jù)格式及時序7</p><p>  3.1.3 I2C總線的尋址方式7</p><p>  3.2 I2S總線8</p><p>  3.1.1 I2S總線的數(shù)據(jù)格式及時序8</p><p>  3.1.2 I2S總線的數(shù)據(jù)采樣率9</p>

14、;<p>  4 硬件設計10</p><p>  4.1 硬件方框圖10</p><p>  4.2 ED-2 開發(fā)板11</p><p>  4.3 語音芯片WM8731 外圍電路11</p><p>  5 硬件模塊設計與實現(xiàn)12</p><p>  5.1 開發(fā)環(huán)境12&l

15、t;/p><p>  5.1.1 Quartus II12</p><p>  5.1.2 Verilog HDL12</p><p>  5.2 硬件模塊設計框圖13</p><p>  5.3 功能模塊的實現(xiàn)14</p><p>  5.3.1 頂層控制器模塊14</p><p>

16、;  5.3.2 時鐘分頻模塊15</p><p>  5.3.3 I2C時序接口模塊17</p><p>  5.3.4 I2C控制字配置模塊20</p><p>  5.3.5 I2S時序接口及音頻數(shù)據(jù)處理模塊27</p><p>  5.3.6 I2S串行數(shù)據(jù)轉并行數(shù)據(jù)模塊29</p><p>

17、;  6 系統(tǒng)調試31</p><p><b>  結論32</b></p><p><b>  致謝33</b></p><p><b>  參考文獻34</b></p><p><b>  附錄36</b></p><p

18、>  附錄1 電路圖36</p><p>  附錄2 源代碼36</p><p>  AUD_TOP .v37</p><p>  set_wm8731.v39</p><p>  i2c_com.v45</p><p>  I2S_com.v49</p><p>  I2

19、S_data.v53</p><p>  clkdivz .v55</p><p>  外文資料翻譯(附原文)60</p><p><b>  1 緒論</b></p><p>  1.1研究的背景及意義</p><p>  FPGA(Field-Programmable Gate Arr

20、ay),即現(xiàn)場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎上進一步發(fā)展的產物。它是作為專用集成電路(ASIC)領域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。</p><p>  目前以硬件描述語言(Verilog 或 VHDL)所完成的電路設計,可以經(jīng)過簡單的綜合與布局,快速燒錄下載至 FPGA 上進行測試,是現(xiàn)代 IC設計驗證的技術主流。這些

21、可編輯元件可以被用來實現(xiàn)一些基本的邏輯門電路或者更復雜一些的組合功能比如解碼器或數(shù)學方程式。在大多數(shù)的FPGA里面,這些可編輯的元件里也包含記憶元件例如觸發(fā)器(Flip-flop)或者其他更加完整的記憶塊。</p><p>  系統(tǒng)設計師可以根據(jù)需要通過可編輯的連接把FPGA內部的邏輯塊連接起來,就好像一個電路試驗板被放在了一個芯片里。一個出廠后的成品FPGA的邏輯塊和連接可以按照設計者而改變,所以FPGA可以完

22、成所需要的邏輯功能。</p><p>  可以說,F(xiàn)PGA芯片是小批量系統(tǒng)提高系統(tǒng)集成度、可靠性的最佳選擇之一?,F(xiàn)如今隨著FPGA技術的飛速發(fā)展,幾十萬門乃至幾百萬門的可變成邏輯陣列使用起來越來越普遍。其技術在現(xiàn)代電子技術領域表現(xiàn)出的明顯技術領先性,具有傳統(tǒng)方法無可比擬的優(yōu)越性。</p><p>  再者近幾年,嵌入式數(shù)字音頻產品受到越來越多消費者的青睞。在MP3、手機等消費類電子產品中,

23、人們對于這些個人終端的要求早已不限于單純通話和簡單的文字處理,音頻處理功能已成為不可或缺的重要組成部分,而高質量的音效是當前發(fā)展的重要趨勢。</p><p>  相對于模擬語音系統(tǒng)而言,數(shù)字化語音系統(tǒng)抗干擾能力強,數(shù)據(jù)傳輸可靠,開發(fā)周期較短,調試容易,便于計算機存儲和處理。而專用的語音芯片是數(shù)字化語音系統(tǒng)的核心。</p><p>  正是基于上述優(yōu)點,數(shù)字語音集成電路與嵌入式微處理器相結合

24、,這樣既實現(xiàn)了系統(tǒng)的小型化、低功耗,又降低了產品開發(fā)成本,提高了設計的靈活性,具有體積小、擴展方便等諸多特點,具有廣泛的發(fā)展前景,如電腦語音鐘、語音型數(shù)字萬用表、手機話費查詢系統(tǒng)、排隊機、監(jiān)控系統(tǒng)語音報警以及公共汽車報站器等。</p><p>  1.2本設計的主要目的</p><p>  本設計是針對音頻編解碼芯片WM8731,基于FPGA器件利用Verilog HDL硬件描述語言實現(xiàn)對

25、該芯片的控制,設計出基于FPGA的音頻編解碼芯片控制器。該控制器只要進行適當?shù)男拚?,更改寄存器的地址和?shù)據(jù),就可實現(xiàn)控制電路的移植。</p><p>  其主要內容包括對音頻編/解碼芯片WM8731的I2C總線配置模塊的設計方法、I2S總線數(shù)據(jù)傳輸?shù)膶崿F(xiàn)等。將FPGA與數(shù)字語音系統(tǒng)的優(yōu)點相結合,設計出一個高質量、易操作、易于移植的語音錄放系統(tǒng)。</p><p><b>  2

26、器件介紹</b></p><p>  本設計主要用到了Wolfson Microelectronics公司生產的一款低功耗高品質雙聲道數(shù)字信號編/解碼芯片WM8731,以及控制該語音芯片工作的FPGA器件EP2C35F672C6。</p><p>  2.1 語音編/解碼芯片WM8731</p><p>  WM8731是一款低功耗的高品質雙聲道數(shù)字信號

27、編/解碼芯片,其高性能耳機驅動器、低功耗設計、可控采樣頻率、可選擇的濾波器使得M8731 芯片廣泛使用于便攜式MP3、CD播放器。其結構框圖如圖2.1 所示。</p><p>  圖2.1 WM8731結構框圖</p><p>  該芯片內置耳機輸出放大器,支持MIC和LINE IN 兩種輸入方式,且對輸入和輸出都具有可編程增益調節(jié),針對音頻領域的應用,該芯片高度集成了模擬電路功能。&l

28、t;/p><p>  它能為用戶提供在單個時鐘源下可獨立編程ADC和DAC的采樣率的獨特能力,其中模數(shù)轉換和數(shù)模轉換部件高度集成在芯片內部,且其采樣頻率為8KHZ- 96KHZ可調,可轉換的數(shù)據(jù)位長度為16- 32位可調。</p><p>  WM8731帶有一個片上時鐘發(fā)生器,支持多種時鐘模式。通過一個12MHz時鐘,該器件可以直接生成44.1kHz、48kHz和96kHz等采樣率,以及MP

29、3標準定義的其他采樣率,完全不需要一個獨立的鎖相環(huán)或晶振,并支持其他公用的主時鐘頻率。</p><p>  WM8731內部有11個寄存器。該芯片的初始化和內部功能設置是以控制接口對其內部的這11個寄存器進行相應的配置來實現(xiàn)的。控制器可通過控制接口對WM8731中的寄存器進行編程配置,該控制接口符合的SPI(三線操作)和I2C(雙線操作)規(guī)范。通過對MODE端口的狀態(tài)來選擇控制接口類型。WM8731支持右對齊、左

30、對齊、I2S以及DSP四種數(shù)字音頻接口模式,通過數(shù)字音頻接口讀寫數(shù)據(jù)音頻信號。</p><p>  由于具有上述優(yōu)點,使得WM8731是一款非常理想的音頻模擬I/O 器件,可以很好地應用在各種數(shù)字音頻領域。</p><p>  2.2 FPGA器件EP2C35F672C6</p><p>  本設計用到的是 Altera公司的 FPGA器件EP2C35F672C6,

31、該器件隸屬于Cyclone II系列,它采用了TSMC驗證的90 nm低K介電質工藝制造的成本優(yōu)化架構,具有更大的容量和極低的單位邏輯單元成本。從結構上看,該器件具有多達150個嵌入18×18乘法器,適合于實現(xiàn)低成本數(shù)字信號處理(DSP)應用;它包含每塊具有4608 bit的M4K存儲塊,提供高達1.1Mbit的片內存儲器,支持多種配置;它能以688 Mbps 的速率同DDR、DDR II 和SDR SDRAM 器件及QDRI

32、I SRAM 器件相連接,并支持多種單端和差分I / O 標準;支持Nios II系列嵌入式處理器,具有低成本和完整的軟件開發(fā)工具。</p><p>  Altera也為Cylcone II器件客戶提供了40多個可定制IP核,Altera和Altera Megafunction伙伴計劃(AMPPSM)合作者提供的不同的IP核是專為Cyclone II架構優(yōu)化的,包括:Nios II嵌入式處理器;DDR SDRAM

33、控制器;FFT/IFFT;PCI編譯器;FIR編譯器;NCO編譯器;POS-PHY編譯器;Reed Solomon編譯器;Viterbi編譯器等等。</p><p><b>  3 協(xié)議介紹</b></p><p>  本設計主要涉及I2C總線和I2S總線兩種總線協(xié)議。I2C總線主要運用在控制接口,F(xiàn)PGA器件通過該接口對語音編/解碼芯片WM8731控制字的寫入。而

34、I2S總線則是用在音頻數(shù)據(jù)接口,主要負責FPGA器件與語音編/解碼芯片的音頻數(shù)據(jù)傳輸。</p><p>  3.1 I2C總線</p><p>  I2C(Inter-Integrated Circuit,內部集成電路)總線是Philips 公司開發(fā)的芯片間串行通訊總線,它利用SDI(串行數(shù)據(jù)線)和SCLK(串行時鐘線)兩根信號線將外圍通訊模塊連接起來,進行數(shù)據(jù)傳輸。它具有沖突偵測和仲裁

35、能力,可防止兩個或兩個以上主機同時控制總線時數(shù)據(jù)被破壞。I2C總線以其接口簡單、總線通訊模塊可裁剪等特點獲得了廣泛的應用。I2C總線控制器是處理器與I2C器件之間的接口,它要完成接收處理器的控制信號、命令和數(shù)據(jù),還需發(fā)送I2C器件的數(shù)據(jù)和狀態(tài)響應到處理器,實現(xiàn)處理器與I2C器件之間的通信。隨著可編程器件的飛速發(fā)展,用FPGA 器件實現(xiàn)I2C總線控制器接口,可以帶來很多方面的便利:不但能夠增加系統(tǒng)的擴展能力,而且控制方式極其靈活。<

36、/p><p>  3.1.1 I2C總線的數(shù)據(jù)的有效性</p><p>  SCLK為高電平期間,SDI線上的數(shù)據(jù)需保持不變,在器件之間傳遞數(shù)據(jù)。SCLK為低電平時,數(shù)據(jù)線上的數(shù)據(jù)發(fā)生跳變,改變?yōu)橄乱晃粩?shù)據(jù)的狀態(tài)。</p><p>  3.1.2 I2C總線的數(shù)據(jù)格式及時序</p><p>  一個標準的I2C總線通信數(shù)據(jù)由開始信號、從機地址

37、信號、傳輸?shù)臄?shù)據(jù)和終止信號4部分組成。在I2C總線協(xié)議的技術規(guī)范中,規(guī)定每次發(fā)送到I2C總線SDI上的數(shù)據(jù)必須是一個字節(jié),每次傳輸可以發(fā)送的字節(jié)數(shù)量是不受限制的。傳輸?shù)臄?shù)據(jù)字節(jié)按照由高位到低位的順序發(fā)送,每發(fā)送一個字節(jié)后必須跟一個響應位(應答信號),即發(fā)送器每發(fā)送完一個字節(jié),將數(shù)據(jù)線SDI拉高,由主控制器產生第9個脈沖,接收器將SDI拉低,以此作為接收器對發(fā)送器的應答。發(fā)送器在第9個脈沖探測SDI為低,表明接收器已成功接收到發(fā)送器發(fā)送的

38、一個字節(jié),可以繼續(xù)進行后面的通信。該過程如圖3.1所示。</p><p>  圖3.1 I2C總線的數(shù)據(jù)時序</p><p>  3.1.3 I2C總線的尋址方式</p><p>  在起始條件產生后,主機向總線發(fā)送一個從機地址,第一個字節(jié)的頭7位(D7-D1)為從機地址,最低位(D0)R/W決定數(shù)據(jù)的傳輸方向。最低位R/W若為‘0’,表示向從機填寫數(shù)據(jù);為‘1

39、’,表示從從機讀取數(shù)據(jù)。當發(fā)送一個地址后,連接到總線的每個設備都會將頭7位同設備自身地址進行比較,若相同,則該設備為被主控設備尋址,并發(fā)送應答信號,根據(jù)R/W位決定讀寫工作方式。</p><p>  3.2 I2S總線</p><p>  I2S (Inter—IC Sound)總線是飛利浦公司為數(shù)字音頻設備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標準,該總線專責于音頻設備之間的數(shù)據(jù)傳輸,廣泛

40、應用于各種多媒體系統(tǒng)。它采用了沿獨立的導線傳輸時鐘與數(shù)據(jù)信號的設計,通過將數(shù)據(jù)和時鐘信號分離,避免了因時差誘發(fā)的失真,為用戶節(jié)省了購買抵抗音頻抖動的專業(yè)設備的費用。</p><p>  3.1.1 I2S總線的數(shù)據(jù)格式及時序</p><p>  I2S總線一般具有5根信號線,如圖3.2所示,包括位時鐘頻率(BCLK)、DAC采樣率時鐘(DACLRC)、ADC采樣率時鐘(ADCLRC)、串

41、行數(shù)據(jù)輸入( DACDAT)和串行數(shù)據(jù)輸出(ADCDAT)。其中DACLC、ADCLC和BCLK時鐘信號在主模式下由編解碼芯片提供,而在從模式下由FPGA或DSP提供。</p><p>  圖3.2 I2S總線的數(shù)據(jù)時序</p><p>  I2S格式的信號無論有多少位有效數(shù)據(jù),數(shù)據(jù)的最高位總是出現(xiàn)在LRC變化(也就是一幀開始)后的第2個位時鐘頻率(BCLK)脈沖處。這就使得接收端與發(fā)送

42、端的有效位數(shù)可以不同。如果接收端能夠處理的有效位數(shù)少于發(fā)送端,可以放棄數(shù)據(jù)幀中多余的低位數(shù)據(jù);如果接收端能夠處理的有效位數(shù)多于發(fā)送端,可以自行補足剩余的位。這種同步機制使得數(shù)字音頻設備的互連更加方便,而且不會造成數(shù)據(jù)錯位。</p><p>  3.1.2 I2S總線的數(shù)據(jù)采樣率</p><p>  I2S總線的數(shù)據(jù)采樣率可以通過主設備的時鐘頻率(MCLK)以及采樣頻率類型( 256fs或

43、384fs)來選擇。其計算公式為:數(shù)據(jù)采樣率= MCL K / 采樣頻率類型。例如主設備的時鐘頻率為18.432 MHz,若選擇采樣頻率類型為384fs,則MCLK經(jīng)過384分頻,即得到I2S總線的數(shù)據(jù)采樣率為48KHz。</p><p>  而位時鐘頻率(BCLK)的計算公式為:位時鐘頻率 = 數(shù)據(jù)采樣率×數(shù)據(jù)位×2。則上例中令數(shù)據(jù)位為17,則位時鐘頻率為1.632MHz。</p>

44、;<p><b>  4 硬件設計</b></p><p>  4.1 硬件方框圖</p><p>  硬件方框圖如圖4.1所示。</p><p>  圖4.1 硬件方框圖</p><p>  其中FPGA器件處于中心地位,F(xiàn)PGA器件主要通過I2C總線給語音芯片WM8731經(jīng)行控制字配置。初始化完成

45、后,音頻數(shù)據(jù)從MIC或Line In輸入,經(jīng)過A/D轉換后,成為串行的數(shù)字信號并由I2S總線傳入FPGA器件。經(jīng)過串并變換等處理之后,再經(jīng)過D/A轉換由Line Out輸出。</p><p>  4.2 ED-2 開發(fā)板</p><p>  本設計主要用到了Altera公司推出的ED-2開發(fā)板,該開發(fā)板是以FPGA器件EP2C35F672C6為核心,板上含有Flash、SRAM等存儲器,

46、標準MIC、Line-in、Line-out接口,Video-in和VGA等音頻視頻接口,以及各種輸入輸出設備。利用該開發(fā)板能方便設計開發(fā),以利于后續(xù)的功能擴展。</p><p>  4.3 語音芯片WM8731 外圍電路</p><p>  ED-2開發(fā)板上已集成了語音芯片WM8731。并連接標準MIC、Line-in、Line-out接口以連接麥克風和耳機等外部設備。其電路圖如圖4.

47、2所示。</p><p>  圖4.2 WM8731外圍電路</p><p>  5 硬件模塊設計與實現(xiàn)</p><p><b>  5.1 開發(fā)環(huán)境</b></p><p>  在硬件模塊設計部分,主要是利用Altera公司推出的FPGA/CPLD集成開發(fā)環(huán)境Quartus II,并使用硬件描述語言Verilog

48、 HDL對FPGA器件的編程設計,以控制WM8731高品質語音芯片正常工作,達到預期的功能。</p><p>  5.1.1 Quartus II</p><p>  Quartus II 是Altera公司的綜合性PLD開發(fā)軟件,支持原理圖、VHDL、Verilog HDL以及AHDL(Altera Hardware Description Language)等多種設計輸入形式,內嵌自有

49、的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計流程。提供了完善的用戶圖形界面設計方式。具有運行速度快,界面統(tǒng)一,功能集中,易學易用等特點。</p><p>  Quartus II支持Altera的IP核,包含了LPM/Mega Function宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了設計速度。</p><p>  5.1.2 Verilog

50、 HDL</p><p>  Verilog HDL是一種硬件描述語言,是一種以文本形式來描述數(shù)字系統(tǒng)硬件的結構和行為的語言,用它可以表示邏輯電路圖、邏輯表達式,還可以表示數(shù)字邏輯系統(tǒng)所完成的邏輯功能。 Verilog HDL由Gateway Design Automation公司開發(fā),是目前世界上最流行的硬件描述語言之一。</p><p>  5.2 硬件模塊設計框圖</p>

51、;<p>  硬件模塊設計框圖,如圖5.1所示。</p><p>  圖5.1 硬件模塊設計框圖</p><p>  硬件模塊的設計大致包含頂層控制器模塊、時鐘分頻模塊、I2C控制字配置模塊、I2C時序接口模塊、I2S時序接口及音頻數(shù)據(jù)處理模塊、I2S串行數(shù)據(jù)轉并行數(shù)據(jù)模塊等6個模塊。</p><p>  5.3 功能模塊的實現(xiàn)</p>

52、<p>  5.3.1 頂層控制器模塊</p><p>  此模塊主要實現(xiàn)的功能是對上述其余5個模塊的配置以及連線。圖5.2所示為該模塊的設計結果。</p><p>  圖5.2 頂層控制器模塊</p><p>  其Verilog HDL描述的設計關鍵代碼如下:</p><p>  module AUD_TOP(clock

53、_50m,sclk,sdat,dacclk,dacdat,bclk,adcdat,adcclk,rst_n,key1,key2,led1,led2,led,MCLK,sw1,sw2,LED); // 端口定義</p><p><b>  …… ……</b></p><p>  assign led=rst_n; // 復位按鈕連接一個LED燈,顯示按鈕狀

54、態(tài)</p><p>  assign MCLK=c0; // 18.432MHz主時鐘輸入</p><p>  set_wm8731(.clock_50m(clock_50m), // I2C控制字配置模塊端口連接</p><p>  .i2c_sclk(sclk),.i2c_sdat(sdat),.reset_n(rst_n),.key1(ke

55、y1),</p><p>  .key2(key2),.led1(led1),.led2(led2),.sw1(sw1),.sw2(sw2)); </p><p>  I2S_com(.clock_ref(c0), // I2S時序接口及音頻數(shù)據(jù)處理模塊端口連接</p><p>  .dacclk(dacclk),.bclk(bclk),.dacdat(d

56、acdat),.reset_n(rst_n),</p><p>  .adcclk(adcclk),.adcdat(adcdat),.data(data));</p><p>  clkdivz (.inclk0(clock_50m),.c0(c0)); //時鐘分頻模塊端口連接</p><p><b>  endmodule</b>

57、</p><p>  5.3.2 時鐘分頻模塊</p><p>  由于要使WM8731工作,必須給其提供一個主時鐘頻率。此主時鐘頻率依照該芯片工作的不同模式有12.288MHz、18.432 MHz、11.2896 MHz以及16.9344 MHz這4中頻率可選。</p><p>  在本設計中,選擇WM8731工作在普通模式(Normal mode)下,并選擇

58、18.432 MHz為其主時鐘頻率。該頻率可以通過XTI和XTO端口,由晶振提供。但本設計利用FPGA自帶的鎖相環(huán)(PLL)和全局時鐘網(wǎng)絡,將DE2開發(fā)板上自帶的50MHz晶振分頻得到。因此本模塊主要運用Quartus II環(huán)境下的Mega Wizard定制功能自動生成的。但由于50MHz不能精確地分頻到18.432MHz,所以采用了一個能分到一個最接近的頻率,即18.421053MHz。</p><p>  如

59、圖5.3所示,該模塊以50MHz的時鐘為輸入,輸出18.432MHz分別連接到MCLK以及I2S時序接口及音頻數(shù)據(jù)處理模塊的時鐘輸入。</p><p>  圖5.3 時鐘分頻模塊</p><p>  該模塊Verilog HDL描述的設計關鍵代碼如下:</p><p>  module clkdivz ( // 端口定義</p>

60、<p>  inclk0, // 50MHz時鐘輸入</p><p>  c0); // 18.432MHz時鐘輸出</p><p><b>  …… ……</b></p><p>  altpll altpll_component (.inclk (sub_wire3), //

61、 調用altpll IP核</p><p>  .clk (sub_wire0),</p><p><b>  …… ……</b></p><p>  .vcounderrange ());</p><p><b>  defparam</b></p><p>  altpl

62、l_component.clk0_divide_by = 3125,</p><p>  altpll_component.clk0_duty_cycle = 50,</p><p>  altpll_component.clk0_multiply_by = 1152,</p><p>  altpll_component.clk0_phase_shift = &q

63、uot;0",</p><p>  altpll_component.compensate_clock = "CLK0",</p><p>  altpll_component.inclk0_input_frequency = 20000,</p><p>  altpll_component.intended_device_famil

64、y = "Cyclone II",</p><p><b>  …… ……</b></p><p><b>  endmodule</b></p><p>  5.3.3 I2C時序接口模塊</p><p>  該模塊主要實現(xiàn)對I2C時序的模擬,控制SCLK(數(shù)據(jù)時鐘)和SDA

65、T(數(shù)據(jù)線)將存放在i2c_data中的24位控制字串行發(fā)送給WM8731,該模塊例化于I2C控制字配置模塊之中,以實現(xiàn)對該芯片的控制字寫入。</p><p>  如圖5.4所示,在此模塊中i2c_data為24位控制字寫入;reset_n為復位輸入;clock_i2c為I2C接口傳輸時鐘;start為傳輸開始標志輸入;ack為I2C時序中3位應答位進行或操作合并為一個應答位的輸出;tr_end為傳輸結束信號輸出

66、; i2c_sclk為I2C接口數(shù)據(jù)時鐘輸出;i2c_sdat為I2C接口串行數(shù)據(jù)輸出。</p><p>  圖5.4 I2C時序接口模塊</p><p>  I2C時序接口模塊時序仿真,如圖5.5所示。此處以i2c_data中24位數(shù)據(jù)為0111 0011 1000 0100 1100 0111為例,當start信號拉低后,i2c_sclk開始傳輸串行數(shù)據(jù)時鐘。這里I2C時序采用33個

67、I2C時鐘周期進行,其中4-11位、13-20位、22-29位傳送數(shù)據(jù),12、21、30為應答位。傳輸狀態(tài)時,數(shù)據(jù)高位在前低位在后,24位數(shù)據(jù)每8位為一字節(jié),每發(fā)送1個字節(jié)的數(shù)據(jù),就應返回一個應答信號將i2c_sdat狀態(tài)拉高。空閑狀態(tài)時,i2c_sdat為高阻態(tài),i2c_sclk為高電平狀態(tài)。</p><p>  圖5.5 I2C時序接口模塊時序仿真</p><p>  該模塊的Ver

68、ilog HDL設計,關鍵代碼如下:</p><p>  module i2c_com(clock_i2c,reset_n,ack,i2c_data,start,tr_end,i2c_sclk,i2c_sdat); </p><p><b>  …… ……</b></p><p>  assign ack=ack1|ack2|ac

69、k3; // 應答信號</p><p>  assign i2c_sclk=sclk|(((cyc_count>=4)&(cyc_count<=30))?~clock_i2c:0);</p><p><b>  // 數(shù)據(jù)時鐘</b></p><p>  assign i2c_sdat=reg_sdat?

70、1'bz:0; // 串行數(shù)據(jù)線</p><p>  always@(posedge clock_i2c or negedge reset_n) // 模擬I2C傳輸數(shù)據(jù)時鐘</p><p><b>  begin</b></p><p>  if(!reset_n) // 復位</p>

71、;<p>  cyc_count<=6'b111111;</p><p>  else begin</p><p>  if(start==0)</p><p>  cyc_count<=0;</p><p>  else if(cyc_count<6'b111111)</p>&

72、lt;p>  cyc_count<=cyc_count+1;</p><p><b>  end</b></p><p><b>  end</b></p><p>  always@(posedge clock_i2c or negedge reset_n) // 模擬I2C傳輸串行數(shù)據(jù)</p>

73、<p><b>  begin</b></p><p>  if(!reset_n) // 復位</p><p><b>  begin</b></p><p><b>  …… ……</b></p><p><b>  else

74、</b></p><p>  case(cyc_count) // I2C時鐘周期賦值</p><p>  0:begin ack1<=1;ack2<=1;ack3<=1;tr_end<=0;sclk<=1;reg_sdat<=1;</p><p><b>  end</b>&l

75、t;/p><p>  1:reg_sdat<=0; // 開始傳輸</p><p><b>  …… ……</b></p><p>  10:reg_sdat<=i2c_data[16];</p><p>  11:reg_sdat<=1; /

76、/應答信號1</p><p>  12:begin reg_sdat<=i2c_data[15];ack1<=i2c_sdat;end</p><p><b>  …… ……</b></p><p>  19:reg_sdat<=i2c_data[8];</p><p>  20:reg_sdat<

77、;=1; //應答信號2</p><p>  21:begin reg_sdat<=i2c_data[7];ack2<=i2c_sdat;end</p><p><b>  …… ……</b></p><p>  28:reg_sdat<=i2c_data[0];</p><p&

78、gt;  29:reg_sdat<=1; //應答信號3</p><p><b>  …… ……</b></p><p>  32:begin reg_sdat<=1;tr_end<=1;end</p><p><b>  endcase</b></p><

79、p><b>  end</b></p><p><b>  endmodule</b></p><p>  5.3.4 I2C控制字配置模塊</p><p>  該模塊是基于I2C時序接口模塊之上的控制單元。如圖5.6所示,該模塊主要實現(xiàn)對語音芯片WM8731的初始配置、生成I2C控制時鐘、輸出音量控制以及輸出模式

80、選擇等功能。以下將以實現(xiàn)的功能為單位來介紹該模塊。</p><p>  圖5.6 I2C控制字配置模塊</p><p><b>  初始配置</b></p><p>  初始配置功能是本模塊要實現(xiàn)的主要功能。該部分主要是對I2C時序接口模塊例化,并向該模塊寫入預設定的控制字以及開始信號、等待結束信號、校驗應答信號,以實現(xiàn)I2C設置過程。針對語

81、音芯片WM8731的10個控制寄存器預設控制字,并逐個周期將預設定的控制字寫入該芯片。該部分關鍵Verilog HDL代碼如下所示。</p><p>  i2c_com u1(.clock_i2c(clock_20k),.reset_n(reset_n),.ack(ack),</p><p>  .i2c_data(i2c_data),.start(start),.tr_end(tr_en

82、d),.i2c_sclk(i2c_sclk),</p><p>  .i2c_sdat(i2c_sdat)); // 例化I2C時序接口模塊</p><p>  always@(posedge clock_20k or negedge reset_n) // 配置過程控制</p><p><b>  begin</b></p

83、><p>  if(!reset_n)</p><p><b>  begin</b></p><p><b>  …… ……</b></p><p>  else // I2C設置過程</p><p><b>  begin&l

84、t;/b></p><p>  if(reg_index<11)</p><p><b>  begin</b></p><p>  case(config_step)</p><p><b>  0:begin</b></p><p>  i2c_data<

85、;={8'h34,reg_data}; // 寫入地址與控制字</p><p>  start<=1; // 寫入開始信號</p><p>  config_step<=1;</p><p><b>  end</b></p><p><b>  1:begin<

86、;/b></p><p>  if(tr_end) // 等待結束信號</p><p><b>  begin</b></p><p>  if(!ack) // 校驗應答信號</p><p>  config_step<=2;</p><p><b> 

87、 else</b></p><p>  config_step<=0;</p><p><b>  start<=0;</b></p><p><b>  end</b></p><p><b>  end</b></p><p>

88、;<b>  2:begin</b></p><p>  reg_index<=reg_index+1;</p><p>  config_step<=0;</p><p><b>  …… ……</b></p><p>  always@(reg_index) // I2

89、C配置預設數(shù)值</p><p><b>  begin</b></p><p>  case(reg_index)</p><p>  0:reg_data<=16'h011f;</p><p><b>  …… ……</b></p><p>  10:reg_

90、data<=left;</p><p>  default:reg_data<=16'h001a;</p><p><b>  endcase</b></p><p><b>  end</b></p><p><b>  生成I2C控制時鐘</b><

91、/p><p>  該部分是主要功能是產生I2C控制時鐘,由于WM8731允許的I2C控制時鐘在400KHz內有效,所以無法直接用外設的50MHz的晶振頻率。出于簡單、易分頻的原則,本設計選用20KHz作為I2C總線的控制時鐘。該部分關鍵代碼如下:</p><p>  always@(posedge clock_50m or negedge reset_n) // 產生I2C控制時鐘-20K

92、Hz</p><p><b>  begin</b></p><p>  if(!reset_n)</p><p><b>  begin</b></p><p><b>  …… ……</b></p><p>  else if(clock_20k_c

93、nt<2499) // 計數(shù)到2500跳變一次</p><p>  clock_20k_cnt<=clock_20k_cnt+1;</p><p><b>  else</b></p><p><b>  begin</b></p><p>  clock_20k<=!clo

94、ck_20k;</p><p>  clock_20k_cnt<=0;</p><p><b>  end</b></p><p><b>  end</b></p><p><b>  輸出模式選擇</b></p><p>  由于WM8731同

95、時支持如圖5.7所示的Bypass、Side Tone和DACSEL三種模式,因此在預設控制字代碼段中加入了模式選擇控制。</p><p>  圖5.7 WM8731模式示意圖</p><p>  通過讀取開關Sw1和Sw2的值來改變預設控制字,以達到模式切換的功能。其Verilog HDL代碼如下所示:</p><p>  4: if (sw1==1)</

96、p><p>  reg_data<=16'h080a; // Bypass模式</p><p>  else if(sw2==1)</p><p>  reg_data<=16'h0825; // Side Tone模式</p><p><b>  else</b></p>

97、<p>  reg_data<=16'h0810; // DACSEL模式</p><p><b>  輸出音量控制</b></p><p>  該部分主要是實現(xiàn)通過按鍵來增大或減小音量的功能。由于存在利用按鍵改值的要求,所以去抖動是必不可少的。因此該部分主要涉及兩個方面的程序。</p><p><b> 

98、 按鍵計時檢測程序</b></p><p>  在這一部分的程序中,主要是利用供給I2C總線的20KHz的時鐘頻率,計時每20ms檢測一次按鍵值。如果兩次相鄰時間的鍵值不同,則可判斷有按鍵按下,進而觸發(fā)音量增減程序。具體程序代碼如下所示:</p><p>  always @ (posedge clock_20k or negedge reset_n) //按鍵計時程序<

99、/p><p><b>  begin</b></p><p>  if (!reset_n) </p><p><b>  …… ……</b></p><p>  cnt<=cnt+1'b1;</p><p><b>  end</b><

100、/p><p>  always @ (posedge clock_20k) </p><p><b>  begin</b></p><p>  if (cnt==10'd400) // 每隔20Ms檢測一次按鍵 </p><p><b>  begin</b></p>

101、<p>  key1_f<=key1;</p><p>  key2_f<=key2;</p><p><b>  end</b></p><p>  key1_f_w<=key1_f;</p><p>  key2_f_w<=key2_f;</p><p>&

102、lt;b>  end</b></p><p>  wire key1_ctrl = key1_f_w & ( ~key1_f); // 檢測兩次相鄰時間鍵值,</p><p>  wire key2_ctrl = key2_f_w & ( ~key2_f); // 若不同則改變ctrl的值</p><p><b>  

103、音量增減程序</b></p><p>  若有按鍵按下,則變量key1(2)_ctrl的值將置為一,進而觸發(fā)對應的音量增減程序。以增加音量為例,當有Key1按鍵按下時,key1_ctrl的值變?yōu)?,此時對應控制音量的預設值會增加一個音量檔位。若多次增加音量以至于超過最大音量,預設值將以最大音量送入語音芯片,則音量不會繼續(xù)增大,減小音量與之類似。具體程序代碼如下所示:</p><p&

104、gt;  else if (key1_ctrl) // 按鍵增加音量</p><p><b>  begin</b></p><p>  left<=left+16'h0008; </p><p>  if(left >= 16'h057f) </p><p><b

105、>  begin</b></p><p>  left<=16'h057f;</p><p><b>  end</b></p><p>  reg_index<=4'b1010;</p><p><b>  end</b></p><

106、;p>  else if(key2_ctrl) // 按鍵減小音量</p><p><b>  begin</b></p><p><b>  …… ……</b></p><p>  5.3.5 I2S時序接口及音頻數(shù)據(jù)處理模塊</p><p>  該模塊主要是對I2S時序

107、的模擬以實現(xiàn)音頻數(shù)據(jù)的傳輸。對于I2S時序的模擬主要是將18.432MHz的主時鐘分頻,產生均為48KHz的數(shù)模轉換和模數(shù)轉換采樣率時鐘以及對應的數(shù)字音頻時鐘(BCLK)。除此之外,在此模塊中還調用了I2S串行數(shù)據(jù)轉并行數(shù)據(jù)模塊,并定義變量state作為串并變換的起始標志。</p><p>  如圖5.8所示,在該模塊中DACLC、DACDAT、ADCLC、ADCDAT以及BCLK這五個接口與WM8731相連。其

108、中DACLC、ADCLC和BCLK時鐘信號在主模式下由WM8731提供,而在從模式下由FPGA提供,因此在本設計中這三個信號均作為輸出端口。16位的data接口是串并轉換后的并行輸出;adcdat是串行音頻數(shù)據(jù)輸入;dacdat是串行音頻數(shù)據(jù)輸出;該模塊的時鐘輸入clock_ref是時鐘分頻模塊產生的18.432MHz的主時鐘。</p><p>  圖5.8 I2S時序接口及音頻數(shù)據(jù)處理模塊</p>

109、<p>  該模塊Verilog HDL描述的設計關鍵代碼如下:</p><p>  module I2S_com(clock_ref,dacclk,bclk,dacdat,reset_n,adcclk,adcdat,data);</p><p><b>  …… ……</b></p><p>  I2S_data u1(.bcl

110、k(bclk),.adcclk(adcclk),.adcdat(adcdat),</p><p>  .data(data),.state(state)); // 例化I2S串并轉化模塊</p><p>  always@(posedge clock_ref or negedge reset_n) // 生產17位數(shù)據(jù)傳輸時鐘bclk</p><p>&l

111、t;b>  begin</b></p><p>  if(!reset_n)</p><p><b>  …… ……</b></p><p>  else if(bclk_cnt>=(CLOCK_REF/(CLOCK_SAMPLE*2*17*2)-1))</p><p><b>  be

112、gin</b></p><p>  bclk<=~bclk;</p><p><b>  …… ……</b></p><p>  always@(posedge clock_ref or negedge reset_n) //生產48KHz的DAC時鐘dacclk</p><p><b>  

113、begin</b></p><p>  if(!reset_n)</p><p><b>  …… ……</b></p><p>  else if(dacclk_cnt>=(CLOCK_REF/(CLOCK_SAMPLE*2)-1))</p><p><b>  begin</b>

114、;</p><p>  dacclk<=~dacclk;</p><p><b>  …… ……</b></p><p>  always@(posedge clock_ref or negedge reset_n) //生產48KHz的ADC時鐘adcclk</p><p><b>  begin<

115、;/b></p><p>  if(!reset_n)</p><p><b>  …… ……</b></p><p>  else if(adcclk_cnt>=(CLOCK_REF/(CLOCK_SAMPLE*2)-1))</p><p><b>  begin</b></p&

116、gt;<p>  adcclk<=~adcclk;</p><p><b>  …… ……</b></p><p>  assign dacdat=adcdat; // 將ADC的數(shù)據(jù)直接從DAC輸出</p><p>  always@(negedge adcclk) // 生成串并變換的起始標志</p>

117、<p><b>  begin</b></p><p>  if(!reset_n)</p><p><b>  …… ……</b></p><p>  else if (bclk)</p><p><b>  state<=0;</b></p>

118、<p><b>  else</b></p><p><b>  state<=1;</b></p><p><b>  end</b></p><p><b>  endmodule</b></p><p>  5.3.6 I2S串

119、行數(shù)據(jù)轉并行數(shù)據(jù)模塊</p><p>  該模塊已例化在I2S時序接口及音頻數(shù)據(jù)處理模塊之中。其功能是逐位將adcdat串行輸入的音頻數(shù)據(jù)轉化成并行數(shù)據(jù)由data端口輸出,在整個系統(tǒng)中并行data輸出端口為后續(xù)開發(fā)的預留端口。</p><p>  module I2S_data(bclk, adcclk, adcdat, data, state); </p><

120、;p><b>  …… ……</b></p><p>  always@(posedge bclk or posedge state) </p><p><b>  begin</b></p><p>  if(state) // 開始轉化標志</p><p><b>  

121、begin</b></p><p>  num<=5'h0;</p><p><b>  end</b></p><p>  else if(!adcclk) // 隨著bclk的變化逐位轉化</p><p><b>  begin</b></p>&

溫馨提示

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

評論

0/150

提交評論