《音频编解码芯片毕业论文.doc》由会员分享,可在线阅读,更多相关《音频编解码芯片毕业论文.doc(66页珍藏版)》请在三一办公上搜索。
1、 基于 FPGA 的音频编解码芯片控制器设计 摘要 现如今随着可编程逻辑器件及相关技术的不断发展和完善,其技术在现代电子技术领域表现出的明显技术领先性,具有传统方法无可比拟的优越性。近几年,嵌入式数字音频产品受到越来越多消费者的青睐。在 MP3、手机等电子产品中,音频处理功能已成为不可或缺的重要组成部分,而高质量的音效是当前发展的重要趋势。数字语音集成电路与嵌入式微处理器相结合,既实现了系统的小型化、低功耗,又降低了产品开发成本,提高了设计的灵活性,具有体积小、扩展方便等诸多特点,具有广泛的发展前景。本设计基于SOPC技术,利用Verilog HDL硬件描述语言开发的基于FPGA的音频编解码芯
2、片控制器,以实现对音频编解码芯片 WM8731 的控制。并根据 Verilog HDL 可移植性和不依赖器件的特点。经过适当的修改,该控制器可以移植到各类 FPGA 中,以控制兼容 I2C 和 I2S 总线的音频编解码芯片。避免了重复开发,这样既缩短了设计周期又降低了设计成本,可大大提高设计的效率。系统在功能扩展上具有极大的潜力,有很好的应用前景和科研价值。关键关键词词:WM8731,FPGA,I2C 总线,音频控制器 The design of audio codec chip controller based by FPGA Abstract Nowadays,with the progr
3、ammable logic devices and related technologies continue to develop and 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 more and more cons
4、umers 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 integrated circuits and embedded microprocessors,which not only realized the systems s
5、mall 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 development.The design is based on SOPC technology,the use of Verilog HDL hardware description language developed FPGA-based au
6、dio 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 audio codec chip.Avoid dup
7、lication 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,I2C Bus,Audio controller 目 录 1 绪论.1 1.1 研究的背景及意义.1 1.2 本设计的主要目的
8、.2 2 器件介绍.3 2.1 语音编/解码芯片 WM8731.3 2.2 FPGA 器件 EP2C35F672C6.4 3 协议介绍.6 3.1 I2C 总线.6 3.1.1 I2C 总线的数据的有效性.6 3.1.2 I2C 总线的数据格式及时序.7 3.1.3 I2C 总线的寻址方式.7 3.2 I2S 总线.8 3.1.1 I2S 总线的数据格式及时序.8 3.1.2 I2S 总线的数据采样率.9 4 硬件设计.10 4.1 硬件方框图.10 4.2 ED-2 开发板.11 4.3 语音芯片 WM8731 外围电路.12 5 硬件模块设计与实现.13 5.1 开发环境.13 5.1.1
9、 Quartus II.13 5.1.2 Verilog HDL.13 5.2 硬件模块设计框图.14 5.3 功能模块的实现.15 5.3.1 顶层控制器模块.15 5.3.2 时钟分频模块.16 5.3.3 I2C 时序接口模块.18 5.3.4 I2C 控制字配置模块.21 5.3.5 I2S 时序接口及音频数据处理模块.28 5.3.6 I2S 串行数据转并行数据模块.30 6 系统调试.32 结论.33 致谢.34 参考文献.35 附录.37 附录 1 电路图.37 附录 2 源代码.38 AUD_TOP.v.38 set_wm8731.v.40 i2c_com.v.46 I2S_c
10、om.v.50 I2S_data.v.54 clkdivz.v.56 外文资料翻译(附原文).61 1 绪论 1.1 研究的背景及意义 FPGA(FieldProgrammable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速烧录下载至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。这些可编
11、辑元件可以被用来实现一些基本的逻辑门电路或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的 FPGA 里面,这些可编辑的元件里也包含记忆元件例如触发器(Flipflop)或者其他更加完整的记忆块。系统设计师可以根据需要通过可编辑的连接把 FPGA 内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品 FPGA的逻辑块和连接可以按照设计者而改变,所以 FPGA 可以完成所需要的逻辑功能。可以说,FPGA 芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。现如今随着 FPGA 技术的飞速发展,几十万门乃至几百万门的可变成逻辑阵列使用起来越来越普遍。其技术在现代
12、电子技术领域表现出的明显技术领先性,具有传统方法无可比拟的优越性。再者近几年,嵌入式数字音频产品受到越来越多消费者的青睐。在 MP3、手机等消费类电子产品中,人们对于这些个人终端的要求早已不限于单纯通话和简单的文字处理,音频处理功能已成为不可或缺的重要组成部分,而高质量的音效是当前发展的重要趋势。相对于模拟语音系统而言,数字化语音系统抗干扰能力强,数据传输可靠,开发周期较短,调试容易,便于计算机存储和处理。而专用的语音芯片是数字化语音系统的核心。正是基于上述优点,数字语音集成电路与嵌入式微处理器相结合,这样既实现了系统的小型化、低功耗,又降低了产品开发成本,提高了设计的灵活性,具有体积小、扩展
13、方便等诸多特点,具有广泛的发展前景,如电脑语音钟、语音型数字万用表、手机话费查询系统、排队机、监控系统语音报警以及公共汽车报站器等。1.2 本设计的主要目的 本设计是针对音频编解码芯片 WM8731,基于 FPGA 器件利用 Verilog HDL 硬件描述语言实现对该芯片的控制,设计出基于 FPGA 的音频编解码芯片控制器。该控制器只要进行适当的修正,更改寄存器的地址和数据,就可实现控制电路的移植。其主要内容包括对音频编/解码芯片 WM8731 的 I2C 总线配置模块的设计方法、I2S 总线数据传输的实现等。将 FPGA 与数字语音系统的优点相结合,设计出一个高质量、易操作、易于移植的语音
14、录放系统。2 器件介绍 本设计主要用到了 Wolfson Microelectronics 公司生产的一款低功耗高品质双声道数字信号编/解码芯片 WM8731,以及控制该语音芯片工作的 FPGA器件 EP2C35F672C6。2.1 语音编/解码芯片 WM8731 WM8731 是一款低功耗的高品质双声道数字信号编/解码芯片,其高性能耳机驱动器、低功耗设计、可控采样频率、可选择的滤波器使得 M8731 芯片广泛使用于便携式 MP3、CD 播放器。其结构框图如图 2.1 所示。图 2.1 WM8731 结构框图 该芯片内置耳机输出放大器,支持 MIC 和 LINE IN 两种输入方式,且对输入和
15、输出都具有可编程增益调节,针对音频领域的应用,该芯片高度集成了模拟电路功能。它能为用户提供在单个时钟源下可独立编程 ADC 和 DAC 的采样率的独特能力,其中模数转换和数模转换部件高度集成在芯片内部,且其采样频率为8KHZ-96KHZ 可调,可转换的数据位长度为 16-32 位可调。WM8731 带有一个片上时钟发生器,支持多种时钟模式。通过一个 12MHz时钟,该器件可以直接生成 44.1kHz、48kHz 和 96kHz 等采样率,以及 MP3标准定义的其他采样率,完全不需要一个独立的锁相环或晶振,并支持其他公用的主时钟频率。WM8731 内部有 11 个寄存器。该芯片的初始化和内部功能
16、设置是以控制接口对其内部的这 11 个寄存器进行相应的配置来实现的。控制器可通过控制接口对 WM8731 中的寄存器进行编程配置,该控制接口符合的 SPI(三线操作)和 I2C(双线操作)规范。通过对 MODE 端口的状态来选择控制接口类型。WM8731 支持右对齐、左对齐、I2S 以及 DSP 四种数字音频接口模式,通过数字音频接口读写数据音频信号。由于具有上述优点,使得 WM8731 是一款非常理想的音频模拟 I/O 器件,可以很好地应用在各种数字音频领域。2.2 FPGA 器件 EP2C35F672C6 本设计用到的是 Altera 公司的 FPGA 器件 EP2C35F672C6,该器
17、件隶属于 Cyclone II 系列,它采用了 TSMC 验证的 90 nm 低 K 介电质工艺制造的成本优化架构,具有更大的容量和极低的单位逻辑单元成本。从结构上看,该器 件具有多达150个嵌入1818乘法器,适合于实现低成本数字信号处理(DSP)应用;它包含每块具有 4608 bit 的 M4K 存储块,提供高达 1.1Mbit 的片内存储器,支持多种配置;它能以 688 Mbps 的速率同 DDR、DDR II 和 SDR SDRAM 器件及 QDRII SRAM 器件相连接,并支持多种单端和差分 I/O 标准;支持 Nios II 系列嵌入式处理器,具有低成本和完整的软件开发工具。Al
18、tera也为Cylcone II器件客户提供了40多个可定制IP核,Altera和Altera Megafunction 伙伴计划(AMPPSM)合作者提供的不同的 IP 核是专为 Cyclone II架构优化的,包括:Nios II 嵌入式处理器;DDR SDRAM 控制器;FFT/IFFT;PCI 编译器;FIR 编译器;NCO 编译器;POS-PHY 编译器;Reed Solomon 编译器;Viterbi 编译器等等。3 协议介绍 本设计主要涉及 I2C 总线和 I2S 总线两种总线协议。I2C 总线主要运用在控制接口,FPGA 器件通过该接口对语音编/解码芯片 WM8731 控制字的
19、写入。而 I2S 总线则是用在音频数据接口,主要负责 FPGA 器件与语音编/解码芯片的音频数据传输。3.1 I2C 总线 I2C(Inter-Integrated Circuit,内部集成电路)总线是 Philips 公司开发的芯片间串行通讯总线,它利用 SDI(串行数据线)和 SCLK(串行时钟线)两根信号线将外围通讯模块连接起来,进行数据传输。它具有冲突侦测和仲裁能力,可防止两个或两个以上主机同时控制总线时数据被破坏。I2C 总线以其接口简单、总线通讯模块可裁剪等特点获得了广泛的应用。I2C 总线控制器是处理器与 I2C 器件之间的接口,它要完成接收处理器的控制信号、命令和数据,还需发送
20、 I2C 器件的数据和状态响应到处理器,实现处理器与 I2C 器件之间的通信。随着可编程器件的飞速发展,用 FPGA 器件实现 I2C 总线控制器接口,可以带来很多方面的便利:不但能够增加系统的扩展能力,而且控制方式极其灵活。3.1.1 I2C 总线的数据的有效性 SCLK 为高电平期间,SDI 线上的数据需保持不变,在器件之间传递数据。SCLK 为低电平时,数据线上的数据发生跳变,改变为下一位数据的状态。3.1.2 I2C 总线的数据格式及时序 一个标准的 I2C 总线通信数据由开始信号、从机地址信号、传输的数据和终止信号 4 部分组成。在 I2C 总线协议的技术规范中,规定每次发送到 I2
21、C 总线 SDI 上的数据必须是一个字节,每次传输可以发送的字节数量是不受限制的。传输的数据字节按照由高位到低位的顺序发送,每发送一个字节后必须跟一个响应位(应答信号),即发送器每发送完一个字节,将数据线 SDI 拉高,由主控制器产生第 9 个脉冲,接收器将 SDI 拉低,以此作为接收器对发送器的应答。发送器在第 9 个脉冲探测 SDI 为低,表明接收器已成功接收到发送器发送的一个字节,可以继续进行后面的通信。该过程如图 3.1 所示。图 3.1 I2C 总线的数据时序 3.1.3 I2C 总线的寻址方式 在起始条件产生后,主机向总线发送一个从机地址,第一个字节的头 7位(D7-D1)为从机地
22、址,最低位(D0)R/W 决定数据的传输方向。最低位R/W 若为0,表示向从机填写数据;为1,表示从从机读取数据。当发送一个地址后,连接到总线的每个设备都会将头 7 位同设备自身地址进行比较,若相同,则该设备为被主控设备寻址,并发送应答信号,根据 R/W 位决定读写工作方式。3.2 I2S 总线 I2S(InterIC Sound)总线是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专责于音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备
23、的费用。3.1.1 I2S 总线的数据格式及时序 I2S 总线一般具有 5 根信号线,如图 3.2 所示,包括位时钟频率(BCLK)、DAC 采样率时钟(DACLRC)、ADC 采样率时钟(ADCLRC)、串行数据输入(DACDAT)和串行数据输出(ADCDAT)。其中 DACLC、ADCLC 和 BCLK时钟信号在主模式下由编解码芯片提供,而在从模式下由 FPGA 或 DSP 提供。图 3.2 I2S 总线的数据时序 I2S 格式的信号无论有多少位有效数据,数据的最高位总是出现在 LRC 变化(也就是一帧开始)后的第 2 个位时钟频率(BCLK)脉冲处。这就使得接收端与发送端的有效位数可以不
24、同。如果接收端能够处理的有效位数少于发送端,可以放弃数据帧中多余的低位数据;如果接收端能够处理的有效位数多于 发送端,可以自行补足剩余的位。这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错位。3.1.2 I2S 总线的数据采样率 I2S 总线的数据采样率可以通过主设备的时钟频率(MCLK)以及采样频率类型(256fs 或 384fs)来选择。其计算公式为:数据采样率=MCL K/采样频率类型。例如主设备的时钟频率为 18.432 MHz,若选择采样频率类型为 384fs,则 MCLK 经过 384 分频,即得到 I2S 总线的数据采样率为 48KHz。而位时钟频率(BCLK)的计
25、算公式为:位时钟频率=数据采样率数据位2。则上例中令数据位为 17,则位时钟频率为 1.632MHz。4 硬件设计 4.1 硬件方框图 硬件方框图如图 4.1 所示。错误错误!错误错误!I2S总线 Altera FPGA 器件 EP2C35F672C6 按键 I2C 总线 麦克风 Line In WM8731 Line Out 图 4.1 硬件方框图 其中 FPGA 器件处于中心地位,FPGA 器件主要通过 I2C 总线给语音芯片WM8731 经行控制字配置。初始化完成后,音频数据从 MIC 或 Line In 输入,经过 A/D 转换后,成为串行的数字信号并由 I2S 总线传入 FPGA 器
26、件。经过串并变换等处理之后,再经过 D/A 转换由 Line Out 输出。4.2 ED-2 开发板 本设计主要用到了 Altera 公司推出的 ED-2 开发板,该开发板是以 FPGA器件 EP2C35F672C6 为核心,板上含有 Flash、SRAM 等存储器,标准 MIC、Line-in、Line-out 接口,Video-in 和 VGA 等音频视频接口,以及各种输入输出设备。利用该开发板能方便设计开发,以利于后续的功能扩展。4.3 语音芯片 WM8731 外围电路 ED-2 开发板上已集成了语音芯片 WM8731。并连接标准 MIC、Line-in、Line-out 接口以连接麦克
27、风和耳机等外部设备。其电路图如图 4.2 所示。图 4.2 WM8731 外围电路 5 硬件模块设计与实现 5.1 开发环境 在硬件模块设计部分,主要是利用 Altera 公司推出的 FPGA/CPLD 集成开发环境 Quartus II,并使用硬件描述语言 Verilog HDL 对 FPGA 器件的编程设计,以控制 WM8731 高品质语音芯片正常工作,达到预期的功能。5.1.1 Quartus II Quartus II 是 Altera 公司的综合性 PLD 开发软件,支持原理图、VHDL、Verilog HDL 以及 AHDL(Altera Hardware Description
28、Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整 PLD 设计流程。提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。Quartus II 支持 Altera 的 IP 核,包含了 LPM/Mega Function 宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。5.1.2 Verilog HDL Verilog HDL 是一种硬件描述语言,是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。Ve
29、rilog HDL 由 Gateway Design Automation公司开发,是目前世界上最流行的硬件描述语言之一。5.2 硬件模块设计框图 硬件模块设计框图,如图 5.1 所示。图 5.1 硬件模块设计框图 硬件模块的设计大致包含顶层控制器模块、时钟分频模块、I2C 控制字配置模块、I2C 时序接口模块、I2S 时序接口及音频数据处理模块、I2S 串行数据转并行数据模块等 6 个模块。I2C 时序 接口模块 音频数据写出 音频数据读入 WM8731 I2C 控制字 配置模块 音频控制字写出 时钟 分频模块 WM8731 音频数据处理 I2S 时序 接口模块 I2S 串行数据 转并行数据
30、模块 顶层控制器模块 5.3 功能模块的实现 5.3.1 顶层控制器模块 此模块主要实现的功能是对上述其余 5 个模块的配置以及连线。图 5.2 所示为该模块的设计结果。图 5.2 顶层控制器模块 其 Verilog HDL 描述的设计关键代码如下:module AUD_TOP(clock_50m,sclk,sdat,dacclk,dacdat,bclk,adcdat,adcclk,rst_n,key1,key2,led1,led2,led,MCLK,sw1,sw2,LED);/端口定义 assign led=rst_n;/复位按钮连接一个 LED 灯,显示按钮状态 assign MCLK=c
31、0;/18.432MHz 主时钟输入 set_wm8731(.clock_50m(clock_50m),/I2C 控制字配置模块端口连接 .i2c_sclk(sclk),.i2c_sdat(sdat),.reset_n(rst_n),.key1(key1),.key2(key2),.led1(led1),.led2(led2),.sw1(sw1),.sw2(sw2);I2S_com(.clock_ref(c0),/I2S 时序接口及音频数据处理模块端口连接 .dacclk(dacclk),.bclk(bclk),.dacdat(dacdat),.reset_n(rst_n),.adcclk(a
32、dcclk),.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 中频率可选。在本设计中,选择 WM8731 工作在普通模式(Normal mode)下,并选择18.432 MHz 为其主时钟频率。该频率可以通过 XTI 和 XTO 端口,由晶振提供。但本
33、设计利用 FPGA 自带的锁相环(PLL)和全局时钟网络,将 DE2 开发板上自带的50MHz晶振分频得到。因此本模块主要运用Quartus II环境下的Mega Wizard 定制功能自动生成的。但由于 50MHz 不能精确地分频到 18.432MHz,所以采用了一个能分到一个最接近的频率,即 18.421053MHz。如图 5.3 所示,该模块以 50MHz 的时钟为输入,输出 18.432MHz 分别连接到 MCLK 以及 I2S 时序接口及音频数据处理模块的时钟输入。图 5.3 时钟分频模块 该模块 Verilog HDL 描述的设计关键代码如下:module clkdivz(/端口定
34、义 inclk0,/50MHz 时钟输入 c0);/18.432MHz 时钟输出 altpll altpll_component(.inclk(sub_wire3),/调用 altpll IP 核 .clk(sub_wire0),.vcounderrange();defparam altpll_component.clk0_divide_by=3125,altpll_component.clk0_duty_cycle=50,altpll_component.clk0_multiply_by=1152,altpll_component.clk0_phase_shift=0,altpll_pens
35、ate_clock=CLK0,altpll_component.inclk0_input_frequency=20000,altpll_component.intended_device_family=Cyclone II,endmodule 5.3.3 I2C 时序接口模块 该模块主要实现对 I2C 时序的模拟,控制 SCLK(数据时钟)和 SDAT(数据线)将存放在 i2c_data 中的 24 位控制字串行发送给 WM8731,该模块例化于 I2C 控制字配置模块之中,以实现对该芯片的控制字写入。如图 5.4 所示,在此模块中 i2c_data 为 24 位控制字写入;reset_n 为
36、复位输入;clock_i2c 为 I2C 接口传输时钟;start 为传输开始标志输入;ack 为 I2C 时序中 3 位应答位进行或操作合并为一个应答位的输出;tr_end 为传输结束信号输出;i2c_sclk 为 I2C 接口数据时钟输出;i2c_sdat 为 I2C 接口串行数据输出。图 5.4 I2C 时序接口模块 I2C 时序接口模块时序仿真,如图 5.5 所示。此处以 i2c_data 中 24 位数据 为 0111 0011 1000 0100 1100 0111 为例,当 start 信号拉低后,i2c_sclk 开始传输串行数据时钟。这里 I2C 时序采用 33 个 I2C
37、时钟周期进行,其中 4-11 位、13-20 位、22-29 位传送数据,12、21、30 为应答位。传输状态时,数据高位在前低位在后,24 位数据每 8 位为一字节,每发送 1 个字节的数据,就应返回一个应答信号将 i2c_sdat 状态拉高。空闲状态时,i2c_sdat 为高阻态,i2c_sclk为高电平状态。图 5.5 I2C 时序接口模块时序仿真 该模块的 Verilog HDL 设计,关键代码如下:module i2c_com(clock_i2c,reset_n,ack,i2c_data,start,tr_end,i2c_sclk,i2c_sdat);assign ack=ack1|
38、ack2|ack3;/应答信号 assign i2c_sclk=sclk|(cyc_count=4)&(cyc_count=30)?clock_i2c:0);/数据时钟 assign i2c_sdat=reg_sdat?1bz:0;/串行数据线 always(posedge clock_i2c or negedge reset_n)/模拟 I2C 传输数据时钟 begin if(!reset_n)/复位 cyc_count=6b111111;else begin if(start=0)cyc_count=0;else if(cyc_count6b111111)cyc_count=cyc_cou
39、nt+1;end end always(posedge clock_i2c or negedge reset_n)/模拟 I2C 传输串行数据 begin if(!reset_n)/复位 begin else case(cyc_count)/I2C 时钟周期赋值 0:begin ack1=1;ack2=1;ack3=1;tr_end=0;sclk=1;reg_sdat=1;end 1:reg_sdat=0;/开始传输 10:reg_sdat=i2c_data16;11:reg_sdat=1;/应答信号 1 12:begin reg_sdat=i2c_data15;ack1=i2c_sdat;e
40、nd 19:reg_sdat=i2c_data8;20:reg_sdat=1;/应答信号 2 21:begin reg_sdat=i2c_data7;ack2=i2c_sdat;end 28:reg_sdat=i2c_data0;29:reg_sdat=1;/应答信号 3 32:begin reg_sdat=1;tr_end=1;end endcase end endmodule 5.3.4 I2C 控制字配置模块 该模块是基于 I2C 时序接口模块之上的控制单元。如图 5.6 所示,该模块主要实现对语音芯片 WM8731 的初始配置、生成 I2C 控制时钟、输出音量控制以及输出模式选择等功能
41、。以下将以实现的功能为单位来介绍该模块。图 5.6 I2C 控制字配置模块(1)初始配置 初始配置功能是本模块要实现的主要功能。该部分主要是对 I2C 时序接口模块例化,并向该模块写入预设定的控制字以及开始信号、等待结束信号、校验应答信号,以实现 I2C 设置过程。针对语音芯片 WM8731 的10 个控制寄存器预设控制字,并逐个周期将预设定的控制字写入该芯片。该部分关键 Verilog HDL 代码如下所示。i2c_com u1(.clock_i2c(clock_20k),.reset_n(reset_n),.ack(ack),.i2c_data(i2c_data),.start(start
42、),.tr_end(tr_end),.i2c_sclk(i2c_sclk),.i2c_sdat(i2c_sdat);/例化 I2C 时序接口模块 always(posedge clock_20k or negedge reset_n)/配置过程控制 begin if(!reset_n)begin else /I2C 设置过程 begin if(reg_index11)begin case(config_step)0:begin i2c_data=8h34,reg_data;/写入地址与控制字 start=1;/写入开始信号 config_step=1;end 1:begin if(tr_end
43、)/等待结束信号 begin if(!ack)/校验应答信号 config_step=2;else config_step=0;start=0;end end 2:begin reg_index=reg_index+1;config_step=0;always(reg_index)/I2C 配置预设数值 begin case(reg_index)0:reg_data=16h011f;10:reg_data=left;default:reg_data=16h001a;endcase end(2)生成 I2C 控制时钟 该部分是主要功能是产生 I2C 控制时钟,由于 WM8731 允许的 I2C
44、控制时钟在 400KHz 内有效,所以无法直接用外设的 50MHz 的晶振频率。出于简单、易分频的原则,本设计选用 20KHz 作为 I2C 总线的控制时钟。该部分关键代码如下:always(posedge clock_50m or negedge reset_n)/产生I2C控制时钟-20KHz begin if(!reset_n)begin else if(clock_20k_cnt2499)/计数到 2500 跳变一次 clock_20k_cnt=clock_20k_cnt+1;else begin clock_20k=!clock_20k;clock_20k_cnt=0;end end
45、 (3)输出模式选择 由于WM8731同时支持如图5.7所示的Bypass、Side Tone和DACSEL三种模式,因此在预设控制字代码段中加入了模式选择控制。图 5.7 WM8731 模式示意图 通过读取开关 Sw1 和 Sw2 的值来改变预设控制字,以达到模式切换的功能。其 Verilog HDL 代码如下所示:4:if(sw1=1)reg_data=16h080a;/Bypass 模式 else if(sw2=1)reg_data=16h0825;/Side Tone 模式 else reg_data=16h0810;/DACSEL 模式 (4)输出音量控制 该部分主要是实现通过按键来
46、增大或减小音量的功能。由于存在利用按键改值的要求,所以去抖动是必不可少的。因此该部分主要涉及两个方面的程序。按键计时检测程序 在这一部分的程序中,主要是利用供给 I2C 总线的 20KHz 的时钟频率,计时每 20ms 检测一次按键值。如果两次相邻时间的键值不同,则可判断有按键按下,进而触发音量增减程序。具体程序代码如下所示:always (posedge clock_20k or negedge reset_n)/按键计时程序 begin if(!reset_n)cnt=cnt+1b1;end always (posedge clock_20k)begin if(cnt=10d400)/每隔
47、 20Ms 检测一次按键 begin key1_f=key1;key2_f=key2;end key1_f_w=key1_f;key2_f_w=key2_f;end wire key1_ctrl=key1_f_w&(key1_f);/检测两次相邻时间键值,wire key2_ctrl=key2_f_w&(key2_f);/若不同则改变 ctrl 的值 音量增减程序 若有按键按下,则变量 key1(2)_ctrl 的值将置为一,进而触发对应的音量增减程序。以增加音量为例,当有 Key1 按键按下时,key1_ctrl 的值变为 1,此时对应控制音量的预设值会增加一个音量档位。若多次增加音量以至于
48、超过最大音量,预设值将以最大音量送入语音芯片,则音量不会继续增大,减小音量与之类似。具体程序代码如下所示:else if(key1_ctrl)/按键增加音量 begin left=16h057f)begin left=16h057f;end reg_index=(CLOCK_REF/(CLOCK_SAMPLE*2*17*2)-1)begin bclk=(CLOCK_REF/(CLOCK_SAMPLE*2)-1)begin dacclk=(CLOCK_REF/(CLOCK_SAMPLE*2)-1)begin adcclk=adcclk;assign dacdat=adcdat;/将 ADC 的数
49、据直接从 DAC 输出 always(negedge adcclk)/生成串并变换的起始标志 begin if(!reset_n)else if(bclk)state=0;else state=1;end endmodule 5.3.6 I2S 串行数据转并行数据模块 该模块已例化在 I2S 时序接口及音频数据处理模块之中。其功能是逐位将adcdat 串行输入的音频数据转化成并行数据由 data 端口输出,在整个系统中并行 data 输出端口为后续开发的预留端口。module I2S_data(bclk,adcclk,adcdat,data,state);always(posedge bclk
50、 or posedge state)begin if(state)/开始转化标志 begin num=5h0;end else if(!adcclk)/随着 bclk 的变化逐位转化 begin num=num+1b1;end end always(num)/串并转化 case(num)1:data_reg15=adcdat;17:data=data_reg;/转化完成赋值给端口 default:data=16h0;endcase endmodule 6 系统调试 本系统是基于 FPGA 的音频编解码芯片控制器,用以实现对语音芯片WM8731 的控制。在整个系统中,用到了标准 MIC、Line