FPGA Verilog开发实战指南:基于Intel Cyclone IV(进阶篇)
上QQ阅读APP看书,第一时间看更新

1.1 理论学习

1.1.1 声音的基本概念

声音是通过一定介质传播的连续的波。声音信号可分为两种类型,一种是模拟信号(如自然界的物理信号),一种是数字信号(如计算机中的信号)。声音信号的数字化过程和波形示意图分别如图1-1和图1-2所示。

图1-1 声音信号的数字化过程

图1-2 声音信号数字化过程中的波形示意图

声音信号数字化的三要素为采样频率、量化位数和声道数,详情如表1-1所示。

表1-1 声音信号数字化三要素

1.1.2 I2S音频总线

1. I2S总线概述

音频数据的采集、处理和传输是多媒体技术的重要组成部分。众多数字音频系统已经进入消费市场,例如数字音频录音带、数字声音处理器等。对于设备和生产厂家来说,标准化的信息传输结构可以提高系统的适应性。I2S(Inter-IC Sound)总线又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门用于音频设备之间的数据传输,广泛应用于各种多媒体系统。

2. I2S总线接口

I2S总线接口主要有三个,如下所示。

▪ SD(Serial Data):串行数据线,用于发送或接收两个时分复用的数据通道上的数据,数据的最高位总是被最先传输。

▪ SCK(Continuous Serial Clock):串行时钟,对应数字音频的每一位数据,SCK都有一个脉冲。SCK的频率= 2×采样频率×采样位数。

▪ WS(Word Select):字段选择线,也称帧时钟(LRC)线,表明当前传输数据的声道,不同的标准有不同的定义。WS线的帧率等于采样频率(Fs)。

1.1.3 WM8978芯片

WM8978是欧胜(Wolfson)推出的一款全功能音频处理器。它带有一个Hi-Fi级数字信号处理内核,支持增强3D硬件环绕音效以及5频段的硬件均衡器,可以有效改善音质。

WM8978具有高级的片上数字信号处理功能,包含一个5路均衡功能,一个用于ADC和麦克风或者线路输入之间的混合信号的电平自动控制功能,一个纯粹的录音或者重放的数字限幅功能。另外,在ADC的线路上提供了一个数字滤波的功能,可以更好地应用滤波,比如“减少风噪声”。

图1-3所示为WM8978芯片的内部结构示意图,参考来自WM8978的数据手册。该图给人的第一印象就是很复杂,有很多“开关”。实际上,每个开关对应着WM8978内部寄存器的一位,通过控制寄存器就可以控制开关的状态。

图1-3 WM8978内部结构

1. 输入部分

WM8978结构图的左边是输入部分,可用于模拟声音输入,即录音输入。有三个输入接口,一个是由LIN和LIP、RIN和RIP组合而成的伪差分立体声麦克风输入,一个是由L2和R2组合而成的立体声麦克风输入,还有一个是由AUXL和AUXR组合而成的线输入或用来传输警告声的输入。

2. 输出部分

WM8978结构图的右边是声音放大输出部分,LOUT1和ROUT1用于耳机驱动,LOUT2和ROUT2用于扬声器驱动,OUT3和OUT4也可以配置成立体声线输出,OUT4也可以用于提供一个左右声道的单声道混合。

3. ADC和DAC

WM8978结构图的中间部分是芯片的核心内容,用于处理声音的AD和DA转换。ADC部分对声音输入进行处理,包括ADC滤波处理、音量控制、输入限幅器/电平自动控制等。DAC部分控制声音输出效果,包括DAC 5路均衡器、DAC 3D放大、DAC输出限幅以及音量控制等。

4. 通信接口

WM8978有两个通信接口,一个是数字音频通信接口,另外一个是控制接口。音频通信接口可选用I2S接口,支持左对齐、右对齐和I2S标准模式,以及DSP模式A和模式B。控制接口用于控制器发送控制命令配置WM8978运行状态,它提供2线或3线控制接口,对于我们使用的FPGA控制器,我们选择2线接口方式,其芯片地址固定为0011010。通过控制接口可以访问WM8978内部寄存器,实现芯片工作环境的配置。对于2线接口方式,其时序图如图1-4所示。

图1-4 2线接口时序图

该模式只有两个控制信号,我们只需控制SDIN和SCLK即可。通过时序图可以发现该时序就是I2C接口时序,所以在这里可以调用I2C的控制时序来给WM8978配置寄存器。关于I2C的详细介绍,可参考基础篇中的相关内容。

WM8978有两种工作模式,分别为主模式和从模式。在主模式下,WM8978为主控设备,LCR与BCLK由WM8978内部产生。而在从模式下,外部设备(本实验中为FPGA)作为主控设备,同时LRC和BCLK需要由外部设备产生。WM8978工作模式可通过配置寄存器来选择。

WM8978有30多个接口,下面将介绍此次实验用到的接口。音频有一个ADCDAT输出接口,通过这个接口将ADC音频数据传给FPGA,同时它有一个DACDAT输入接口,FPGA通过这个接口将DAC音频数据传回给WM8978,从而达到音频回环的目的。LRC为音频的左右声道的数据对齐时钟信号。BCLK(位时钟)用于同步数据输入和输出,音频数据就是在这个时钟沿下进行传输的。另外,为使系统间更好地同步,还要传输一个主时钟(MCLK),MCLK=256fs,fs为音频的采样频率,一般为48kHz,所以其频率为256×48kHz=12.288MHz。我们输入一个频率为12MHz的时钟给WM8978即可,WM8978会通过其内部的PLL和时钟选择电路将时钟配置成12.288MHz频率输出。

本次实验选用的音频通信接口为I2S音频总线接口,其传输时序图如图1-5所示,LRC为左右声道的对齐时钟。当LRC为低电平时,传输左声道的音频数据,LRC为高电平时,传输右声道的数据。1位的音频数据的持续时间是一个BCLK位时钟,且从高位开始传送,所以位时钟BCLK的频率=2×采样频率×采样位数。如果将WM8978的工作模式设置为主模式,那么BCLK和LRC就由WM8978产生,可以直接使用;若设置为从模式,BCLK和LRC则需要由外部设备产生。所以,如果设置为主模式,那就能省去很多麻烦。从图1-5中可以看到,DACDAT/ADCDAT音频数据是在LRC变化后的第二个BCLK脉冲处产生的,且在LRC变化后BCLK第二个上升沿开始采集数据。

图1-5 I2S音频接口时序图(假设n位字长)

5. WM8978寄存器配置

WM8978寄存器为16位长,高7位(bit[15:9])用于表示寄存器地址,低9位(bit[8:0])用于表示数据。所以在控制器向芯片发送控制命令时,必须传输长度为16位的指令,芯片会根据所接收命令的高7位值寻址。

使用WM8978的第一步就是对其内部的寄存器进行配置,简单地说,就是对其进行功能设置。WM8978内部有多个寄存器,本章实验我们要实现音频回环播放功能,只需对其部分寄存器进行设置即可。下面将对使用到的寄存器配置进行介绍。

▪ 寄存器R0(00h)

该寄存器用于控制WM8978的软复位,通过写任意值到R0寄存器即可实现该功能。

▪ 寄存器R1(01h)

该寄存器需要设置bit[1:0]为2’b11,让其以最快的速度启动;禁用BUFIOEN(bit[2] = 0)或BUFDCOPEN(bit[8] = 0)时,可能会导致爆音,所以需要将bit[2]和bit[8]设置为1;同时需要启动BIASEN(bit[3] = 1),否则模拟放大器不会工作;WM8978具有片上锁相环(PLL)电路,可用于从另一个外部时钟为WM8978的音频功能生成主时钟。PLL可以由该寄存器的bit5设置启用或禁用。这里需要启用(bit[5] = 1)来配置内部MCLK时钟。

由上所述,设置R1为8’b1_0010_1111。

▪ 寄存器R2(02h)

该寄存器用于设置ADCENL(bit0)、ADCENR(bit1)为1,启用左右声道的ADC功能;设置BOOSTENR(bit5)、BOOSTENL(bit4)为1,启用左右声道BOOST;设置LOUT1EN(bit7)、ROUT1EN(bit8)为1,启用耳机输出。

由上所述,设置R2为8’b1_1011_0011。

▪ 寄存器R3(03h)

该寄存器用于设置DACENL(bit0)、DACENR(bit1)为1,启用左右声道的DAC功能,使数字音频信号转换为模拟音频信号;设置LMIXEN(bit2)、RMIXEN(bit3)为1,启用左右输出通道混合器;设置ROUT2EN(bit5)、LOUT2EN(bit6)为1,启用左右扬声器。

由上所述,设置R3为8’b0_0110_1111。

▪ 寄存器R4(04h)

该寄存器用于设置FMT(bit[4:3])为2’b10,音频数据模式选择为I2S模式,其中2’b00为右对齐模式、2’b01为左对齐模式、2’b11为DSP/PCM模式,这里选择I2S音频接口(其他模式的时序图可查看数据手册了解)。设置WL(bit[6:5]),WL为字长,即为表1-1中的量化位数,2’b00为16位,2’b01为20位,2’b10为24位,2’b11为32位,这里我们选择24位即可,也就是2’b10。

由上所述,设置R4为8’b0_0101_0000。

▪ 寄存器R6(06h)

该寄存器可设置WM8978的工作模式,前面提及WM8978有两种工作模式,此处我们将其设置为主模式,左右对齐时钟(LRC)和位时钟(BCLK)由WM8978产生,直接使用即可,这样可以节省资源。该寄存器的bit0为0时为从模式,为1时为主模式,所以这里设置bit0为1即可。

由上所述,设置R6为8’b0_0000_0001。

▪ 寄存器R10(0Ah)

该寄存器用于设置DAC的过采样率,通过将该寄存器的DACOSR128(bit3)设置为1可得到最好的信噪比。

由上所述,设置R10为8’b0_0000_1000。

▪ 寄存器R14(0Eh)

该寄存器用于设置ADC的过采样率,同样地,设置该寄存器ADCOSR128(bit3)为1可得到最好的信噪比。同时设置HPFEN(bit8)为1,启用高通滤波器,可去掉信号中的低频干扰。

由上所述,设置R14为8’b1_0000_1000。

▪ 寄存器R43(2Bh)

该寄存器需要设置INVROUT2(bit4)为1,反转ROUT2输出,使扬声器输出的音效更好。

由上所述,设置R43为8’b0_0001_0000。

▪ 寄存器R47(2Fh)

该寄存器可用于设置左声道输入增益,可由该寄存器的bit[6:4]控制,在此我们将其设置为2’b111,获得+ 6dB增益。

由上所述,设置R47为8’b0_0111_0000。

▪ 寄存器R48(30h)

该寄存器可用于设置右声道输入增益,同R47一样,将bit[6:4]设置为2’b111即可,获得+ 6dB增益。

由上所述,设置R48为8’b0_0111_0000。

▪ 寄存器R49(31h)

该寄存器的SPKBOOST(bit2)可用于设置扬声器增益,我们将其设置为1即可。WM8978有过热保护功能,通过将该寄存器的TSDEN(bit1)设置为1,可开启过热保护。

由上所述,设置R49为8’b0_0000_0110。

▪ 寄存器R50(32h)

该寄存器需要设置DACL2LMIX(bit0)为1,将左DAC输出到左输出混合器。

由上所述,设置R50为8’b0_0000_0001。

▪ 寄存器R51(33h)

该寄存器需要设置DACR2RMIX(bit0)为1,将右DAC输出到右输出混合器。

由上所述,设置R51为8’b0_0000_0001。

▪ 寄存器R52(34h)

该寄存器可用于设置耳机左声道的音量,通过对LOUT1VOL(bit[5:0])的设置,从6’b000000到6’b111111依次增大。将bit7、bit8都设置为1,可用于更新增益和音量。

▪ 寄存器R53(35h)

该寄存器用于设置耳机右声道的音量,同上面寄存器R52的设置一致即可。

▪ 寄存器R54(36h)

该寄存器用于设置左扬声器的音量,同上面寄存器R52的设置方法一致。

▪ 寄存器R55(37h)

该寄存器用于设置右扬声器的音量,同上面寄存器R54的设置一致即可。

以上为该实验的参考寄存器设置,大家也可尝试更改部分配置,只要能实现实验功能即可。