关键词: FPGA, VHDL,数字音频, 电路设计, 编程
本文详细介绍了一个主 I2S 收发器组件用于 FPGA,以 VHDL 编写。组件通过 I2S 接口接收音频数据,并将接收到的数据在某一采样率上传送给并行接口上的用户逻辑芯片。它还在某一采样率上从用户逻辑芯片上接收并行数据,并通过 I2S 接口将这些数据传输出去。图1说明了将 I2S 收发器集成到系统中的一个典型示例。
背景
I2S (也称为 IIS) 是用于数字音频的标准化串行通信总线。该总线由串行时钟 (SCK)、字段选择信号 (WS)和串行数据 (SD) 3条线路组成。图2显示了 I2S 通信链路的数据帧。
串行数据线传输两个时间复用的数据通道——左信道和右信道。数据首先以2’s 二进制补码形式传输最高有效位 (MSB)。字段选择信号 (WS)表示当前正在传输的声道(低=左声道,高=右声道)。该通道数据字段的MSB在字段选择信号 (WS)切换后传输一个时钟周期,然后是数字节的其余部分。数据位在下降时钟沿上传输,在上升时钟沿上读取。
I2S发送器或I2S接收器都可以充当主机(master)。主机提供串行时钟和字段选择信号。
音频编解码器通常也需要一个“主时钟” (MCLK) 来运行其内部电路。MCLK 频率通常是采样率的倍数,例如 256*Fs (其中 Fs 是采样率)。要求取决于具体的音频编解码器。
操作理论
这个 I2S 收发器输入一个主时钟,并通过计数器从它得到串行时钟和字段选择信号。串行时钟频率是主时钟的整数倍,字段选择频率(即采样率)是串行时钟的整数倍。
接收数据从串行时钟上升沿上的 sd_rx 端口时钟进入内部接收移位寄存器。在字段选择切换后,为适当的通道启用一个串行时钟周期的移位,并继续保持数据字段的宽度,然后再次禁用。在每个字段选择开关上,收发器分别在 r_data_rx 和 l_data_rx 端口上呈现右声道和左声道的接收数据。
相反,在 r_data_tx 和 l_data_tx 输入端口上呈现的左右数据在每个字段选择开关上并行加载到内部传输移位寄存器中。这些数据在串行时钟下降沿上的 sd_tx 端口被时钟输出。在字段选择切换后,为适当的通道启用一个串行时钟周期的移位,并在数据字段的宽度之外继续一个串行时钟,然后再次禁用。根据 I2S 总线规范,额外的传输位将 sd_tx 数据线设置为’ 0 ‘,以防数据宽度与接收 I2S 设备不匹配。
I2S 收发器通过在 ENTITY 中设置通用参数进行配置。
sclk_ws_ratio
字段选择 (ws) 信号的频率是采样率。sclk_ws_ratio 参数定义了每个字段选择周期的串行时钟*(sclk)* 周期数。
mclk_sclk_ratio
mclk_sclk_ratio 参数定义了每个串行时钟*(sclk)* 周期的主时钟 (mclk) 周期数。
d_width
参数 d_width 以位为单位定义每个数据字段的大小。
这并不需要等于一个字段选择半周期内串行时钟周期的数量(即在信道数据传输期间串行时钟的数量)。如果在字段选择半周期内有多余的时钟周期,那么在额外的串行时钟周期内串行数据接收端口 (sd_rx) 上的任何数据都将被忽略,并且串行数据传输端口 (sd_tx) 为这些额外的位输出 ’ 0 ‘。
I2S 收发器需要一个主时钟时钟输入来操作。该时钟是发送到 I2S 收发器正在通信的 I2S 从设备的同一主时钟信号。
通常,期望的采样率 (Fs) 是已知的,I2S 设备需要一个该采样率的若干倍的主时钟。例如,假设期望的采样率是常用的 44.1 kHz,并且 I2S 设备接受 256*Fs 的主时钟。这意味着用户需要为 I2S 设备和 I2S 收发器提供11.29 MHz的 mclk 。
mclk 信号可以在 FPGA 内部使用锁相环导出。
I2S收发器接口说明如表1所示。
音频数据事务传输
I2S 收发器使 l_data_rx 和 r_data_rx 端口上的用户逻辑可以使用接收到的数据。这两个接收数据端口在每次 ws 转换时都会更新。由于新的左声道数据仅在 ws = ’ 0 ‘时接收,因此 l_data_rx 端口与 ws 的上升沿同时获得新值,即当左声道数据字段完成时。同样,新的右声道数据仅在 ws = ” 1 ” 时接收,因此 r_data_rx 端口与 ws 的下降沿并发获得新值,即当右声道数据字段完成时。用户逻辑可以使用 ws 信号来指示新数据可用,从而以采样率检索该数据。图3 说明了这种行为。
类似地,I2S 收发器在每个 ws 转换的 l_data_tx 和 r_data_tx 端口上锁存新的传输数据。用户逻辑可以使用 ws 信号来指示何时将其输出数据锁存,因此可以自由地在这些端口上呈现下一组传输数据。锁存在 ws 下降沿上的 l_data_tx 值在左声道数据字段传输期间在 sd_tx 上传输。同样,锁存在 ws 上升沿上的 r_data_tx 值在右声道数据字段传输期间在 sd_tx 上传输。图3 显示了这种行为。
reset_n 输入端口必须具有逻辑高,I2S 收发器才能正常工作。该端口上的低信号将异步复位组件。复位期间,组件保持 sclk 、ws 和 sd_tx 端口为低电平。任何当前正在进行的传输都将停止。任何当前正在进行的接收被放弃,l_data_rx 和 r_data_rx 输出端口清空。清除所有内部数据缓冲区。一旦解除复位,I2S 收发器恢复工作。
结论
I2S 收发器是一种可配置的可编程逻辑组件,通过标准 I2S 总线传输和接收音频数据。它作为主控器工作,为接口提供串行时钟和选字信号。它允许用户为特定的采样频率、数据宽度、主时钟和每字串行时钟周期数进行配置。
更多 VHDL 设计相关技术内容, 请参考下面帖子
- 奇偶校验发生器 ( VHDL )
- 实现一个健壮的微控制器到 FPGA SPI 接口: 第1部分 – FPGA 的挑战
- Arduino 环境中的 FPGA:使用 Alorium 的 Snō 模块支持预配置和定制 IP
- 下一代可编程逻辑开发人员
- 使用 Efinix 已启用 Quantum 的 FPGA 实现低功耗、高性能的边缘计算
******
如有任何问题,欢迎联系得捷电子DigiKey客服团队。
中国(人民币)客服
- 400-920-1199
- service.sh@digikey.com
- QQ在线实时咨询 |QQ号:4009201199
中国(美金)/ 香港客服
- 400-882-4440
- 8523104-0500
- china.support@digikey.com
到微信搜寻“digikey”或“得捷电子”
关注我们官方微信
并登记成会员,
每周接收工程师秘技,
赚积分、换礼品、享福利