跳转到主要内容

走对这几步 让 I2S 收发器跑起来!

judy 提交于

<p><strong>文章概述&nbsp;&nbsp;</strong></p><p>本文介绍了I2S收发器的配置与实现,用于FPGA的VHDL编程。I2S是数字音频的标准化串行通信总线,由SCK、WS和SD三条线路组成。文章阐述了I2S收发器的工作原理,包括数据传输方式、操作理论、配置方法、端口描述以及音频数据事务传输。</p><p>本文详细介绍了一个主 I2S 收发器组件用于 FPGA,以 VHDL 编写。组件通过 I2S 接口接收音频数据,并将接收到的数据在某一采样率上传送给并行接口上的用户逻辑芯片。它还在某一采样率上从用户逻辑芯片上接收并行数据,并通过 I2S 接口将这些数据传输出去。图1说明了将 I2S 收发器集成到系统中的一个典型示例。</p><p style="text-align: center;"><img src="/files/ueditor/108/upload/image/20240822/1724291765948957.jpg" title="1724291765948957.jpg" alt="图 1 示例实现.JPG"/></p><section style="text-align: center;">图&nbsp;1&nbsp;示例实现</section><p><strong>背景</strong></p><p>I2S (也称为 IIS) 是用于数字音频的标准化串行通信总线。该总线由串行时钟 (SCK)、字段选择信号 (WS)和串行数据 (SD) 3条线路组成。图2显示了 I2S 通信链路的数据帧。</p><p style="text-align: center;"><img src="/files/ueditor/108/upload/image/20240822/1724291780748130.jpg" title="1724291780748130.jpg" alt="图 2. I2S 数据帧.JPG"/></p><section style="text-align: center;">图&nbsp;2.&nbsp;I2S 数据帧</section><p><br/></p><section>串行数据线传输两个时间复用的数据通道——左信道和右信道。数据首先以2’s 二进制补码形式传输最高有效位(MSB)。字段选择信号 (WS)表示当前正在传输的声道(低=左声道,高=右声道)。该通道数据字段的MSB在字段选择信号 (WS)切换后传输一个时钟周期,然后是数字节的其余部分。数据位在下降时钟沿上传输,在上升时钟沿上读取。</section><section>I2S发送器或I2S接收器都可以充当主机(master)。主机提供串行时钟和字段选择信号。</section><section>音频编解码器通常也需要一个“主时钟”(MCLK) 来运行其内部电路。MCLK 频率通常是采样率的倍数,例如 256*Fs (其中 Fs 是采样率)。要求取决于具体的音频编解码器。</section><p><br/></p><section><strong>操作理论</strong></section><p><br/></p><section>这个I2S 收发器输入一个主时钟,并通过计数器从它得到串行时钟和字段选择信号。串行时钟频率是主时钟的整数倍,字段选择频率(即采样率)是串行时钟的整数倍。</section><section>接收数据从串行时钟上升沿上的&nbsp;sd_rx&nbsp;端口时钟进入内部接收移位寄存器。在字段选择切换后,为适当的通道启用一个串行时钟周期的移位,并继续保持数据字段的宽度,然后再次禁用。在每个字段选择开关上,收发器分别在 r_data_rx 和&nbsp;l_data_rx&nbsp;端口上呈现右声道和左声道的接收数据。</section><section>相反,在&nbsp;r_data_tx&nbsp;和&nbsp;l_data_tx&nbsp;输入端口上呈现的左右数据在每个字段选择开关上并行加载到内部传输移位寄存器中。这些数据在串行时钟下降沿上的&nbsp;sd_tx&nbsp;端口被时钟输出。在字段选择切换后,为适当的通道启用一个串行时钟周期的移位,并在数据字段的宽度之外继续一个串行时钟,然后再次禁用。根据 I2S 总线规范,额外的传输位将&nbsp;sd_tx&nbsp;数据线设置为’ 0 &#39;,以防数据宽度与接收 I2S 设备不匹配。</section><p><br/></p><p><strong>配置I2S 收发器</strong></p><p>I2S 收发器通过在 ENTITY 中设置通用参数进行配置。</p><p>sclk_ws_ratio</p><p><br/></p><section>字段选择&nbsp;(ws)&nbsp;信号的频率是采样率。sclk_ws_ratio&nbsp;参数定义了每个字段选择周期的串行时钟*(sclk)* 周期数。</section><p><br/></p><p><img src="/files/ueditor/108/upload/image/20240822/1724291799898723.jpg" title="1724291799898723.jpg" alt="周期数.JPG"/></p><section>这并不需要等于一个字段选择半周期内串行时钟周期的数量(即在信道数据传输期间串行时钟的数量)。如果在字段选择半周期内有多余的时钟周期,那么在额外的串行时钟周期内串行数据接收端口&nbsp;(sd_rx)&nbsp;上的任何数据都将被忽略,并且串行数据传输端口&nbsp;(sd_tx)&nbsp;为这些额外的位输出 ’ 0 &#39;。</section><p><br/></p><section></section><p><br/></p><p><strong>提供主时钟 (Master Clock)</strong></p><p>I2S 收发器需要一个主时钟时钟输入来操作。该时钟是发送到 I2S 收发器正在通信的 I2S 从设备的同一主时钟信号。</p><p><br/></p><section>通常,期望的采样率 (Fs) 是已知的,I2S 设备需要一个该采样率的若干倍的主时钟。例如,假设期望的采样率是常用的 44.1 kHz,并且 I2S 设备接受 256*Fs 的主时钟。这意味着用户需要为 I2S 设备和 I2S 收发器提供11.29 MHz的&nbsp;mclk&nbsp;。</section><section>mclk信号可以在 FPGA 内部使用锁相环导出。</section><p><br/></p><p><strong>端口的描述</strong></p><p>I2S收发器接口说明如表1所示。</p><p style="text-align: center;"><img src="/files/ueditor/108/upload/image/20240822/1724291817802500.jpg" title="1724291817802500.jpg" alt="表 1 . 端口的描述.JPG"/></p><p style="text-align: center;">表&nbsp;1&nbsp;.&nbsp;端口的描述</p><p><strong>音频数据事务传输</strong></p><p>I2S 收发器使&nbsp;l_data_rx和r_data_rx端口上的用户逻辑可以使用接收到的数据。这两个接收数据端口在每次ws转换时都会更新。由于新的左声道数据仅在ws= ’ 0 &#39;时接收,因此l_data_rx端口与ws的上升沿同时获得新值,即当左声道数据字段完成时。同样,新的右声道数据仅在ws= &quot; 1 &quot; 时接收,因此r_data_rx端口与ws的下降沿并发获得新值,即当右声道数据字段完成时。用户逻辑可以使用ws&nbsp;信号来指示新数据可用,从而以采样率检索该数据。图3 说明了这种行为。</p><p><br/></p><p>类似地,I2S 收发器在每个&nbsp;ws转换的l_data_tx和r_data_tx端口上锁存新的传输数据。用户逻辑可以使用ws信号来指示何时将其输出数据锁存,因此可以自由地在这些端口上呈现下一组传输数据。锁存在ws下降沿上的l_data_tx值在左声道数据字段传输期间在sd_tx上传输。同样,锁存在ws上升沿上的r_data_tx值在右声道数据字段传输期间在sd_tx&nbsp;上传输。图3 显示了这种行为。</p><p style="text-align: center;"><img src="/files/ueditor/108/upload/image/20240822/1724291827238907.jpg" title="1724291827238907.jpg" alt="图 3. 时间图.JPG"/></p><p><br/></p><section style="text-align: center;">图&nbsp;3.&nbsp;时间图</section><p><strong>重置(Reset)</strong></p><p>reset_n&nbsp;输入端口必须具有逻辑高,I2S 收发器才能正常工作。该端口上的低信号将异步复位组件。复位期间,组件保持&nbsp;sclk&nbsp;、ws&nbsp;和&nbsp;sd_tx&nbsp;端口为低电平。任何当前正在进行的传输都将停止。任何当前正在进行的接收被放弃,l_data_rx&nbsp;和&nbsp;r_data_rx&nbsp;输出端口清空。清除所有内部数据缓冲区。一旦解除复位,I2S 收发器恢复工作。</p><p><strong>结论</strong></p><p>I2S 收发器是一种可配置的可编程逻辑组件,通过标准 I2S 总线传输和接收音频数据。它作为主控器工作,为接口提供串行时钟和选字信号。它允许用户为特定的采样频率、数据宽度、主时钟和每字串行时钟周期数进行配置。</p><p>文章来源:<a href="https://mp.weixin.qq.com/s/JRKPkbQarjKOE3UN8iaNKw&quot; target="_self">DigiKey得捷</a></p>