基于I2S接口的FPGA的音频数据传输

摘要

福州大学物理与信息工程学院的研究人员林嘉、陈素琼等,在2018年第12期《电气技术》杂志上撰文指出,4K原始数据转换成4路3G-SDI,需对音、视频进行分别处理。

本文设计了一种I2S音频数据处理电路,以I2S协议为基础,使用HV2芯片和FPGA开发板,实现I2S音频数据的传输,解决跨时钟域传输数据的问题。利用CTS生成器改善电源抑制,降低输出抖动和噪声性能。仿真测试表明音频数据能够被完整的传输。

4K电视画面质量明显提升,已经成为当今电视的主流发展方向。电影电视工程师学会(SMPTE)定义了4K视频传输的SDI接口。原始的4K音频数据无法直接被SDI接口利用。本文基于SMPTE协议,利用FGPA开发板进行数据转换和处理,再插入视频数据流中。I2S协议能够将数据信号和时钟信号分开传输,避免了时差诱发的失真,故采用I2S协议制作音频接口。

1  I2S协议

I2S(inter-IC sound bus)是飞利浦公司为数字音频设备之间的音频数据传输制定的一种总线标准,既规定了硬件接口规范,也规定了数字音频数据的格式。如图1所示,对应数字音频的每一位数据,BCLK(串行时钟)都有1个脉冲。LRCLK(帧时钟)是应用于变更左右声道数据的时钟,其频率等于采样频率。LRCLK必须与BCLK保持同步。

图1  I2S通信时序图

2  I2S接口硬件设计

利用HV2芯片接收并处理音频数据。HV2芯片是由socionext研发的影像接口转换器,主要用于2~4K视频数据的转换,并能处理与传输I2S音频数据[6]。HV2处理后的I2S音频数据对应于不同的声道进行音频数据传输,再由FPGA的I2S模块接收。

本文将HV2的采样时钟设定为48kHz,同时规定LRCLK的高电平表示传输的是左声道,低电平表示传输右声道,并设定传输数据的最大数据位宽为32bit。实际测试中只接收到24bit数据。根据I2S协议,在数据传输过程中,若LRCLK的单次脉冲宽度不能将需要传输的全部bit数据完整传输,则截断低位的bit数据,而在完整的bit数据传输完成之后,LRCLK的周期还没有结束,则系统会在低位处自动补齐。故在配置输出时设置位宽32bit,可避免将尾部的bit数据截断,从而传输完整的bit数据。

SDATA数据线上的有效数据也是24bit。时钟频率是由HV2中的晶振产生并控制,LRCLK为48kHz,而BCLK为3.072MHz。如图2所示,4路串行数据线I2S_SD0、I2S_SD1、I2S_SD2和I2S_SD3分别对应着不同方位的声道,从而传输7.1立体声音频。

图2  I2S电路设计图

如图3所示,传输sd_i0的数据,经过i_ws左右声道选择,并经过数据拼接和补码转换最终得到o_Left_LFE_data和o_Right_FC_data。ws_reg_i和left_code_flag是标志位,根据其状态判断当前是否需要进行数据拼接和补码转换。

图3  I2S数据的传输

3  在FPGA中传输音频数据

本文所用的FPGA开发板是代号为XC7A50T- 3FGG484的芯片(以下简称“X3芯片”),能够实现音视频的接收、发送等功能内嵌I2S模块。X3芯片的核心逻辑功能电压是2.5V,I/O端口的电压是3.3V,满足HV2数字端口的所规定电平的要求。

如图4所示,图中既标识了I2S接口的引脚信息,也标记了FIFO的引脚信息。FIFO_D0至FIFO_D15、FIFO_FULL和FIFO_EMPTY用于测试异步FIFO跨时钟域的空满状态,根据不同状态将进行不同的反馈。

设计中FPGA的音频接收模块,其内部时钟是27MHz,而HV2的内部时钟为3.072MHz,导致接收和发送处于不同的时钟域,使得这些域中的动作间没有关联性,无法完成同步,系统循环进入亚稳态[7]。为减少亚稳态的影响,应对跨时钟域问题的进行处理。异步FIFO[8]能实现大量数据的跨时钟域传输,并保证较高的数据传输速度。

如图5所示,本设计中采用双端口存储器RAM[9]来缓存系统数据,并设定其数据宽度为32bit,深度为1024bit。读、写控制端分别控制wrdata(写入)信号与rddata(读出)信号,利用wrfull(写满)和rdempty(读空)标志转换这两个不同时钟域的运行状态。

在异步FIFO的设计中,关键环节之一是检测并判断缓存器是否产生wrfull或者rdempty信号。不同的时钟域提供不同的时钟信号,当写控制器接收到写请求信号时,相应的wrcontrol(写控制)信号随之产生,此时指针也指向将写入数据的地址。在数据写入的过程中,不断检测FIFO缓存器是否已经写满。

若未写满,则继续传输数据;否则产生wrfull信号反馈给FIFO缓存器。当读控制器接收到读请求信号时,相应的rdcontrol(读控制)信号随之产生,此时指针指向将读出数据的地址。在数据不断读出的过程中,检测FIFO缓存器是否已经读空。若未读空,则继续读出数据;否则产生rdempty信号反馈给FIFO缓存器。

图5  异步FIFO结构框图

格雷码具有循环特性和单步特性,当用其表示一个连续变化的数值时,仅有一个位会翻转,因此大幅度的降低位翻转的频率,从而保证传输的稳定性,减少传输误码率,故在实际操作中指针地址使用格雷码表示。正是利用了这一特点,使得能减少亚稳态的产生概率[10]。

为说明如何得到写满和读空信号,以位宽为8bit,深度为16bit为例,如图6所示。此处要设置addr(地址信号)为5bit,当读地址指针的速度高于写地址指针时,则两个指针会在某一时刻指向同一个值,意味着已经读空数据,将产生rdempty信号,此时w_addr=r_addr。

而当写地址指针循环一次并追上读地址指针时,此时w_addr[4]与r_addr[4]相反,w_addr[3:0]=r_addr[3:0],表示已写满数据,产生wrfull信号。wrfull信号有效并反馈给系统时,系统将停止写入数据;rdempty信号有效并反馈给系统时,系统将停止读取FIFO的数据,如此就能够保证数据的正确稳定的传输。

图6  读空写满标志信号的产生

在传输音频数据时,为了能改善电源抑制,降低输出抖动和噪声性能,加入了一个CTS(cycle time stamp)生成器。在LSI(大规模集成电路)上有发射器TX Pure CTS和接收器RX Pure CTS。通过调节TX ACR(audio clock regeneration)分组和RX ACR分组的CTS的变化来减少音频时钟抖动。

如图7所示。原始的CTS经过发生器产生新的CTS,并封包成ACRPacket。CTS与NormalCTS有明显区别,CTS的变化周期变长,减少音频时钟抖动。ACR数据包是音频时钟再生数据包,这是控制FIFO传输之后的时钟域的标准时钟。

而输入的Fs(参考信号)用于调节锁相环内部振荡信号的频率和相位,并将信号传入FIFO中,使音频数据封包成为ASP(audio sample packet)。封包输出的ASP将与HBASP(high bitrate audio stream packet)共同组成完整的音频数据包[11]。

图7  TX Pure CTS发生器的框图和信号图

4  仿真结果

音频模块的仿真是调用了vivado的库并在modelsim中实现的。仿真过程中,i_sck的周期为20000ps,i_sd的周期为34000ps。而从图8中可知,对应每个i_sck的上升沿所采样的i_sd数据都能准确的获取,所得到的数据对应于sd_i数据。

说明I2S接口可以准确的接到收HV2传来的音频数据。当ws_reg_i为低电平时,left_data_reg_i从10101001010110101001010010101101到010100101 01101010010100101011010再到1010010101101010 0101001010110101,每一次数据采样之后,二进制编码均舍弃最高位bit,在最末位拼接所采样的bit,可知数据能够正确拼接。当left_code_flag为高电平时,o_Left_LFE_data为11011010100101011010110 101001011,与10100101011010100101001010110101对比,除首位与末尾,其余均是取相反数,即说明能正确得到补码。

用发送和接收文本文件的方法验证数据是否发送正确。如图9所示,o_FR_data传输32bit左声道数据,而o_FL_data传输32bit右声道数据,两者均是携带24bit有效数据并在其后拼接8bit无效数据。data则是左右声道串行之后形成64bit数据用于传输。而o_sd0_Left_Right是左右声道各截断了末尾的8个位数之后的拼接数据,输出o_sd0_Left_Right,便能得到完整的有效数据。

图8  I2S接口接收数据仿真图

图9  FPGA中发送数据的仿真图

结论

本文为了解决I2S音频数据的传输、跨时钟域问题,同时改善电源抑制、降低输出抖动和噪声性能。选择HV2芯片、X3芯片和CTS生成器,以支撑本文所涉及的硬件设计部分。对如何利用I2S接口在两个芯片间进行音频数据的传输以及如何解决跨时钟域的数据传输给出了基本的方案和流程。

仿真验证了数据能正确稳定地传输。用于本次实验的设备也将投入市场,实用价值和参考价值都将得以体现。

(0)

相关推荐