尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

FPGA I2S音频接口验证全流程:IP核配置、回环测试与Codec对接实战

FPGA I2S音频接口验证全流程:IP核配置、回环测试与Codec对接实战 搞FPGA的同行应该都有体会音频接口这种活儿看着简单真动起手来却全是细节。我最近刚做完一个基于Xilinx平台的I2S音频收发验证工程用官方I2S Receiver IP核和I2S Transmitter IP核把整条通路跑通了。这篇文章就把这个项目从IP核配置、验证环境搭建到坑点排查的完整过程记录下来给准备在FPGA上做音频采集、播放、或者对接音频Codec的朋友一个可以直接参考的实操样本。这个验证工程的核心目标很明确在Xilinx FPGA上使用官方I2S收发IP核搭建一条完整的数字音频通路验证I2S协议时序、AXI4-Stream数据接口、以及音频数据的完整性。项目覆盖了协议理解、IP核配置、回环测试、ILA波形分析、外部Codec对接等内容。适合正在学习FPGA音频处理、准备用I2S接口连接音频芯片、或者想搞清楚官方IP核内部机制的人。1. 为什么要用IP核来做I2S音频验证1.1 I2S协议核心概念快速梳理I2SInter-IC Sound是数字音频设备之间传输PCM音频数据的串行总线协议最早由飞利浦提出。它一共就三根关键信号线位时钟BCLK、帧时钟LRCLK也叫WS、串行数据DATA再加上一根可选的主时钟MCLK。这三根线的配合关系是所有I2S调试工作的基础。以标准的48kHz采样率、24bit位深、双声道配置为例LRCLK频率等于采样率也就是48kHz每个声道传输24bit数据一帧包含左右两个声道共48bit所以BCLK频率等于48kHz乘以48也就是2.304MHzMCLK通常是采样率的整数倍常见的是256倍算下来是12.288MHz。数据在BCLK的上升沿被接收端采样发送端在BCLK下降沿更新数据MSB先行传输。标准I2S格式下数据比LRCLK边沿延迟一个BCLK周期。很多第一次接触I2S的人会把注意力全放在数据线上结果波形抓出来怎么看怎么不对。实际上I2S调试的第一要务是先把BCLK、LRCLK的频率和相位关系理顺这三根线的时钟对了数据基本就通了一半。1.2 自己写RTL与调用官方IP核的取舍做I2S接口摆在面前的有两条路自己写RTL或者用Xilinx官方IP核。我这次选择后者但原因不是自己写不出来而是性价比问题。自己写I2S控制器代码量其实不大一个发送模块加一个接收模块总共也就两三百行Verilog。但问题在于I2S虽然协议简单边缘情况一点也不少左右声道对齐方式、不同位深的兼容、FIFO空满处理、主从模式切换、以及和各种音频Codec的时序匹配。这些细节如果没有足够经验写出来容易调通需要的时间却不好说。官方IP核最大的优势是经过充分验证时序参数、FIFO控制、AXI接口这些都不用自己操心。Vivado里把IP拖出来配置界面点几下生成的模块直接可以用。对于整个验证项目来说节省的时间非常可观。另外IP核带标准的AXI4-Stream接口后续如果要接DMA、接MicroBlaze或者Zynq的PS侧扩展非常方便。当然用IP核也有代价。它是个黑盒子出了问题看不到内部逻辑只能通过外部信号和状态寄存器去推测。这就反过来要求你更深入地理解I2S协议本身否则IP配置错了、波形抓出来不对你连该从哪个方向排查都不知道。所以我的建议是项目时间紧、后续要扩展复杂功能就用IP核但协议基础必须自己先补上如果是学习目的还是建议手写一遍踩过的坑才会变成真正的经验。1.3 项目整体目标与验证策略这个项目的验证目标是分层次的不是一把梭直接上真实音频。整体策略分三步走第一步纯数字回环验证。在FPGA内部把I2S Transmitter输出的串行数据直接接到I2S Receiver的输入端用内部产生的音频测试数据送入发送端接收端把数据收回来做比对。这一步完全在数字逻辑层面验证IP核配置和协议时序。第二步ILA逻辑分析仪抓波形。在回环通路的关键节点挂上ILA观察BCLK、LRCLK、DATA三根线的实际时序关系确认和I2S协议标准完全吻合。第三步对接外部音频Codec。把FPGA的I2S接口和开发板上的音频编解码芯片连起来FPGA做Master产生时钟Codec做Slave接收数据通过Codec的模拟输出接耳机或示波器验证实际听感。这个策略的核心思路是把问题域逐层隔离——先证明纯数字逻辑没问题再碰物理接口和模拟电路每一步出了问题都能快速定位到具体环节。实际执行下来非常有效回环验证通过后对接Codec几乎是一次成功的。2. IP核配置详解与接口信号梳理2.1 I2S Transmitter IP核配置项解析在Vivado的IP Catalog里搜索I2S可以看到Xilinx提供的I2S Transmitter和I2S Receiver两个独立IP核。我这次用的是Vivado 2021.2版本配置页面主要包含以下几个关键参数。数据位宽Data Width是第一个要确定的参数。我配置的是24bit这是市面上大多数音频Codec支持的典型位深。IP核允许的范围通常是4到32bit如果后续要接24bit的Codec就选24。通道数Number of Channels我配置为2对应标准的左右双声道。如果做多声道音频可以选择更多通道IP核支持TDM模式但通道数越多BCLK频率就要相应提高这点在时钟设计时一定要提前算好。FIFO深度直接关系到数据传输的稳定性。我配置的是512这个数值在48kHz采样率下绰绰有余。FIFO的作用是缓冲AXI4-Stream侧的数据突发避免I2S串行输出因为总线延迟出现欠载。如果不确定选多深往大了选不会错资源占用增加非常有限。还有一个容易被忽略的选项是方向配置。Transmitter IP核只负责发送Receiver只负责接收收发方向是独立的。所以在工程里需要分别例化一个Transmitter和一个Receiver不能指望一个IP同时搞定收发。这个设计有好有坏好处是灵活坏处是配置的时候容易漏掉某个方向。2.2 I2S Receiver IP核配置要点Receiver IP核的配置项和Transmitter基本对称数据位宽、通道数、FIFO深度这些参数要保持一致确保收发两端对数据的解释完全相同。接收方向多了一个需要注意的点输入数据在什么时刻被采样。IP核内部已经按标准I2S时序处理了采样点位置你只需要保证送入的BCLK和LRCLK频率正确、相位关系正确就行。Receiver的数据输出同样是AXI4-Stream接口每收到一个完整的采样点就会在AXI总线上产生一次有效传输。这里有个实际经验调试初期先用单通道、24bit、固定频率的测试数据把所有变量减到最少。等单通道完全稳定了再扩展到双通道这样一旦数据比对不一致原因会好找得多。2.3 接口信号与外部Codec的连接方式IP核配置完成后和外部音频Codec的物理连接也是关键一环。I2S的几根信号线接法很直接FPGA的MCLK引脚接Codec的MCLK输入BCLK接BCLKLRCLK接LRCLK发送数据线接Codec的DAC数据输入接收数据线接Codec的ADC数据输出。但这里有一个必须一开始就确定的问题谁做主谁做从。如果FPGA做Master那么MCLK、BCLK、LRCLK全部由FPGA产生Codec被动接收如果FPGA做Slave那么这些时钟由Codec产生FPGA只负责收发数据。两种模式都有应用场景但调试初期我强烈建议让FPGA做Master因为时钟完全可控频率是多少、相位怎么样自己心里有数出了任何问题都能从源头查起。需要注意的是有些音频Codec芯片内部需要配置为Slave模式才能接收外部时钟有些则默认就是Slave。这个配置通常在Codec的I2C或SPI寄存器里设置和I2S接口本身的接线无关。我第一次调试时就忽略了这一步Codec上电了但DAC不工作查了半天才发现是Codec的寄存器默认值不对芯片还在等自己的内部时钟。2.4 AXI4-Stream接口与数据组织方式IP核的AXI4-Stream接口是连接数据源和数据目的地的标准通道。发送方向作为Master的AXI接口需要你提供音频数据接收方向作为Slave的AXI接口会输出接收到的音频数据。数据组织方式上IP核手册的时序图一定要仔细看。我这次配置的是24bit数据、双通道每通道数据在AXI总线上占据32bit的字长24bit数据放在高24位还是低24位在不同版本的IP核里可能有差异。我踩过这个坑数据比对不一致左右声道反了、位错位了折腾了半天最后翻手册才发现是数据对齐方式理解错了。建议在正式测试之前先给发送端灌一个已知的24bit数据比如0xAAAAAA代表左声道、0x555555代表右声道然后在接收端用ILA抓总线上实际出现的数据对照IP核手册里的时序图确认对齐方式、通道排列都理解正确再开始用真实音频数据。3. 验证工程搭建与核心环节实现3.1 开发环境与硬件平台硬件平台我用了Xilinx Artix-7系列的开发板板载音频Codec是ADI的SSM2603支持I2S接口采样率范围覆盖8kHz到96kHz。FPGA和Codec之间的I2S引脚在开发板上已经连好省去了自己飞线的麻烦。软件环境是Vivado 2021.2新建一个RTL工程在IP Catalog里添加I2S Transmitter和I2S Receiver两个IP再添加一个MMCM/PLL用于产生I2S需要的音频时钟。时钟方案是这样的开发板上有100MHz的系统时钟送入MMCM产生12.288MHz的MCLK然后通过一个简单的计数器分频产生BCLK和LRCLK。12.288MHz对应48kHz采样率的256倍频这个频率下BCLK等于48kHz乘以48等于2.304MHz分频系数是5.333不是整数所以直接用计数器分频做不到精确分频。实际做法是让IP核或外部再单独处理BCLK和LRCLK的产生逻辑。这里有个更简单的方案SSM2603这颗Codec支持通过寄存器配置内部PLL从MCLK生成BCLK和LRCLK或者接收外部时钟。我最终的做法是用MMCM精确产生12.288MHz MCLK然后让Codec工作在主模式下由Codec自己产生BCLK和LRCLK时钟信号FPGA作为I2S的Slave。这样绕开了FPGA内部整数分频的尴尬又让时钟源保持精确。这个方案也侧面说明了一个问题I2S的时钟设计是整个音频验证里最容易被低估的环节。100MHz系统时钟要产生48kHz音频时钟不是简单的分频能搞定的需要提前想清楚时钟怎么来或者直接采用“FPGA产生MCLK、Codec作为Master生成BCLK/LRCLK”这种分工方式。3.2 内部回环测试快速验证收发通路内部回环是整个验证项目里最关键的快速检查手段。它的原理非常简单把I2S Transmitter IP核输出的串行数据信号在FPGA内部直接连接到I2S Receiver IP核的串行数据输入引脚。BCLK和LRCLK同样由同一时钟源驱动。这样就不需要外接任何设备纯数字逻辑层面先把收发通路验证清楚。回环模式具体操作是在顶层模块里写一条assign sdata_in sdata_out然后发送端灌入已知测试数据接收端把接到的数据和发送端比对。我设计了两种测试数据源第一种是计数器产生的线性递增数据方便观察数据和地址位的关系第二种是正弦波查找表数据有规律但又不是线性关系比对起来更容易发现左右声道错位或者位偏移之类的问题。测试结果显示在回路稳定之后接收端AXI4-Stream输出的数据和发送端送入的数据完全一致左右声道没有交叉位对齐正确。这一步通过后整个IP核的基本配置和内部数据通路就算验证完成了。3.3 真实音频数据导入与回放验证回环测试通过后接下来用真实音频数据做验证。我选取了一段44.1kHz采样率、16bit位深的WAV文件用Python脚本读出PCM数据再转换成24bit左对齐格式存成COE文件以Block ROM的形式放在FPGA里。回放时通过一个简单的状态机把ROM里的音频数据依次读出经AXI4-Stream接口送入I2S Transmitter IP核再由串行数据输出到外部Codec。这里有个细节WAV文件转换时要注意字节序和位序。标准WAV文件是小端存储而I2S要求MSB先行所以每个采样点内的字节顺序需要翻转。我在Python脚本里做了16bit到24bit的符号扩展再把高低字节按I2S要求的顺序重新排列。这个转换过程如果做错了播放出来的声音会变成噪声而且极难定位因为你在逻辑分析仪上看到的波形似乎和协议格式完全吻合但声音就是不对。回放验证的结果很顺利。接上耳机后播放出的音频清晰无杂音音量正常左右声道分离正确。和原始音频对比音质没有可感知的劣化。这一步标志着整条I2S发送通路从FPGA内部到外部Codec的完整链路全部打通。3.4 使用ILA/VIO观察关键信号ILAIntegrated Logic Analyzer是调试FPGA内部信号的利器。我在这套设计里把ILA挂在了I2S串行接口和数据总线两个位置一个采样BCLK、LRCLK、DATA三根串行信号线用于验证协议时序另一个采样AXI4-Stream接口的TVALID、TREADY、TDATA用于验证总线的握手和数据传输。ILA的触发条件设置也很有讲究。观察I2S时序时我把触发条件设为LRCLK的上升沿这样抓到的波形正好是一个完整帧的起始位置左声道的第一个bit在波形上清晰可见。观察AXI总线时触发条件设为TVALID和TREADY同时有效即一次有效数据传输发生的时刻。这样抓到的数据是数据总线传输频率和有效数据比例的直观反映。通过ILA抓到的波形我可以明确看到BCLK的每个下降沿对应DATA线稳定输出LRCLK为低电平时传输左声道数据高电平时传输右声道数据数据MSB先行比LRCLK边沿延迟一个BCLK周期。这些特征和I2S协议定义完全吻合。VIOVirtual I/O则用来在线复位IP核、切换音频源、看状态寄存器省去了反复修改代码重新综合的麻烦。4. 验证结果分析与时序细节4.1 ILA抓到的关键波形怎么读ILA抓到的波形不是随便看一眼就完事的要能从中读出有效信息才算真正掌握了调试方法。我以48kHz采样率、24bit双声道为例把波形上的关键特征整理一下。LRCLK是方波频率48kHz占空比50%高电平期间对应右声道低电平期间对应左声道。BCLK是LRCLK的48倍频即2.304MHz。DATA线上每个BCLK周期对应一个bit的数据从MSB开始依次排列一共24bit。标准I2S格式下第一bit数据在LRCLK翻转后的第一个BCLK下降沿输出接收端在第二个BCLK上升沿采样。我验证时实际看到的情况是左声道24bit数据全部发完后LRCLK跳变为高电平紧接着是右声道的24bit数据。一个完整帧结束后LRCLK回到低电平开始下一帧。整个过程中没有出现数据bit缺失或者多余bit插入的情况DATA线的电平和BCLK的边沿对应关系稳定。这些波形特征就是I2S协议正确运行的直接证据。4.2 FIFO深度与AXI流控对稳定性的影响FIFO深度和AXI流控是保证数据连续性的关键。I2S发送端按固定的BCLK节奏消耗数据而AXI4-Stream总线是突发式的两者的速度天然不匹配FIFO就是中间的缓冲。以48kHz采样率、24bit双声道为例一秒钟需要传输的数据量是48k乘以2声道乘以24bit等于2.304Mbps。AXI总线的时钟是100MHz数据位宽32bit理论带宽是3.2Gbps远大于实际需求。所以这里的瓶颈完全不在于总线带宽而在于数据源能不能连续供上数据、以及FIFO深度能不能扛住突发间隙。我实际测试时用了512深度的FIFO。在最坏情况下即使AXI总线连续几个周期没有新的数据写入FIFO中的数据也足够维持数十毫秒的I2S输出。实际播放没有出现任何欠载或者爆音。如果FIFO深度太小可能出现的现象是声音断断续续、周期性卡顿尤其是采样率高、位深大的时候更容易暴露。这个问题排查起来也简单ILA里观察FIFO的empty信号如果empty频繁拉高就说明FIFO深度不足或者数据源供给不及时。4.3 MCLK和时钟域的一堆坑I2S时钟域可以说是整个项目里最容易踩坑的地方。MCLK、BCLK、LRCLK三者的频率关系必须精确匹配任何一个对不上音频输出就会出现明显的变调或者噪声。对比几个最常见的采样率配置差异点一目了然采样率MCLK (256fs)BCLK (48bit/帧)LRCLK44.1kHz11.2896MHz2.1168MHz44.1kHz48kHz12.288MHz2.304MHz48kHz96kHz24.576MHz4.608MHz96kHz从100MHz系统时钟生成11.2896MHz或者12.288MHz这类非整数倍关系的频率直接分频是做不到的必须借助MMCM/PLL。但MMCM也不是万能的它需要输入频率乘以M分频系数再除以D分频系数得到VCO频率这个VCO频率必须落在器件的允许范围内。我试过用100MHz输入产生12.288MHz按公式100乘以M除以(D乘以O)等于12.288M就需要M除以(D乘以O)等于0.12288很难找到一组整数解精确满足这个关系。我最终采用的方案是让音频Codec做Master生成BCLK和LRCLKFPGA只负责产生MCLK。SSM2603这颗Codec内部自带PLL可以精确生成BCLK和LRCLK完全绕开了FPGA分频的尴尬。但需要注意的是这套方案在I2S配置上IP核要选用Slave模式不能默认配置成Master否则时钟会冲突。如果开发板上有现成的音频专用晶振直接用专用晶振是最干净的做法。做音频验证还有一个容易忽略的点时序约束。BCLK和LRCLK这种相对低频的时钟Vivado默认的时序分析可能没法正确约束。我给这几个时钟创建了独立的时钟域约束对于数据信号和时钟的建立保持时间关系合理使用了set_false_path或者set_max_delay之类的约束指令告诉工具忽略或者限制检查避免时序收敛报错和实际硬件行为不一致。5. 常见问题与排查技巧实录5.1 问题1配好了IP核但ILA里抓不到LRCLK翻转这是我调试初期遇到的一个典型问题。IP核配置正确、时钟也产生了但ILA里看到LRCLK信号完全拉平没有任何边沿。排查过程逐步深入最终定位到两个原因。第一个原因是IP核的复位没有释放。I2S Transmitter IP核的复位信号默认是高有效如果复位引脚一直拉高IP核内部的所有逻辑都处于复位状态自然不会有任何输出。解决办法是检查复位信号的极性用VIO或者逻辑代码确保复位释放。第二个原因是IP核的AXI4-Lite接口配置寄存器没有被正确初始化。这个IP核的使能位在寄存器里需要通过AXI4-Lite接口写入才能让IP核真正开始工作。我用了一个简单的AXI4-Lite主设备逻辑在系统启动时写入使能寄存器问题随即解决。5.2 问题2回环模式下数据比对不一致内部回环测试是比对收发数据的一致性结果发现接收端的数据和发送端对不上有时候是左右声道互换了有时候是数据的位序不对。这个问题几乎是所有I2S调试者的必经之路。定位方法是给发送端灌入有明确左右特征的数据比如左声道送0xAAAAAA右声道送0x555555。然后在接收端用ILA抓数据看IP核手册里的通道映射表和数据位对齐图。我当时的问题出在数据的位对齐上24bit数据在32bit的AXI总线上我误以为放在低24位实际手册要求左对齐也就是放在高24位低8位填充0。修正数据写入的方式后比对立刻通过。这里想强调的是不要凭感觉猜一定要对着IP核手册的寄存器说明和时序图逐项核对。手册里这些信息都有就是容易被忽略。5.3 问题3Codec没有输出或声音异常回环测试通过后把I2S接口接到外部Codec结果耳机里完全没有声音或者只有轻微的电流声没有任何正常的音频输出。Codec不出声的排查按照这个顺序走了不少弯路先量MCLK、BCLK、LRCLK三根时钟线确认Codec确实收到了时钟信号。然后用示波器看I2S的DATA信号线确认FPGA确实在输出数据。如果这两步都正常那么问题大概率在Codec的寄存器配置上。SSM2603这类Codec芯片有I2C配置接口芯片上电后需要初始化一系列寄存器包括采样率设置、接口格式设置、DAC使能、耳机驱动使能等。我当时遇到的情况是DAC输出未使能寄存器默认值全为0导致模拟输出通路完全关闭。通过I2C写入正确的寄存器配置后声音正常出现。排查这个问题的过程中我还发现了一个容易被忽视的电源问题。Codec的模拟电源和数字电源如果不在上电时序上有先后要求芯片可能进入异常状态。开发板的电源设计已经处理好这个时序但如果用分立元件搭电路做音频接口这个问题就一定要重视。5.4 问题4Windows下JTAG下载器驱动异常这个坑可能和I2S本身没关系但是在调试过程中确实卡了我不少时间。用的是一根第三方JTAG下载线连接开发板Windows系统一直弹出提示无法加载设备驱动程序。这类问题通常是驱动信息没有正确安装导致的。在设备管理器里可以看到一个带有黄色感叹号的未知设备。解决办法是下载对应厂商的驱动安装包手动指定驱动路径强制安装。如果还是不认可以换USB接口或者检查JTAG线缆的焊接。遇到这种和功能本身无关的环境问题最快的解决方式是先换一根线试试省得浪费时间排查。5.5 常用的分层排查套路几次调试下来我自己总结出一个简单实用的分层排查方法把音频链路从逻辑到物理拆成协议层、数据层、电学层三层按层逐个排查。协议层用ILA去抓到BCLK、LRCLK、DATA三根信号的实际波形和标准I2S时序图对比确认频率关系、相位关系、数据位序都正确。数据层关注发送端和接收端的PCM数据是否一致左右声道是否交叉、位宽是否匹配、字节序是否正确。电学层用示波器量信号线电平、确认电压幅值是否符合器件要求、排除线序接反、虚焊和电平不匹配的问题。这个排查逻辑的核心是每次都只有一个变量不确定其他变量保持已知状态快速定位到问题归属层。用这个思路处理实际问题效率比自己瞎猜要高得多。6. 一点补充IP核之外的扩展思路6.1 自己封装一个简化版I2S接口看完整个验证流程可能有朋友觉得官方IP核虽然好用但终究是个黑盒子。如果项目有特殊需求比如需要极低延迟、或者需要自定义TDM时隙分配手写I2S接口反而是更好的选择。这里给一个简化版的I2S发送端核心框架作为参考module i2s_tx ( input wire bclk, input wire lrclk, input wire rst_n, input wire [23:0] sample_left, input wire [23:0] sample_right, output reg sdata_out ); reg [4:0] bit_cnt; reg [23:0] shift_reg; reg cur_ch; always (posedge bclk or negedge rst_n) begin if (!rst_n) begin bit_cnt 5d0; cur_ch 1b0; sdata_out 1b0; end else begin if (bit_cnt 5d0) begin shift_reg (lrclk 1b0) ? sample_left : sample_right; cur_ch lrclk; end else begin shift_reg {shift_reg[22:0], 1b0}; end sdata_out shift_reg[23]; bit_cnt (bit_cnt 5d23) ? 5d0 : bit_cnt 1b1; end end endmodule这个模块的核心逻辑是在每帧开始时根据LRCLK的电平选择左声道或右声道数据装入移位寄存器然后在每个BCLK周期移出一位实现MSB先行的串行输出。相比官方IP核少了FIFO、AXI接口、寄存器配置等一大堆功能但协议本质是一样的。理解了这段代码再看IP核的配置项会通透很多。6.2 从I2S到音频链路后续可以做哪些扩展I2S收发通路验证通过后后续能做的事情很多。一个非常自然的扩展方向是接FFT做频谱分析。把I2S Receiver收到的PCM数据送入FFT IP核计算出频域数据后在屏幕上显示频谱效果。我自己做过这个扩展唯一的提醒是FFT IP核的输入时钟最好和音频采样时钟域保持一致否则跨时钟域处理会凭空增加不少麻烦。另一个方向是把音频数据和DDR或者DMA结合起来。用AXI DMA将I2S Receiver收到的音频数据搬运到DDR内存实现长时间音频录制或者从DDR读出音频数据送到I2S Transmitter播放实现完整的音频采集回放系统。这套组合在Zynq平台上尤其常见PS侧用Linux的ALSA驱动PL侧是I2S IP核加DMA整体性能和灵活性都非常好。还有一个我在验证过程中顺手做过的小功能用VIO和GPIO实现对音频音量的软件调节。在AXI4-Stream数据通路里加一个乘法器将音频样本乘上音量系数系数由外部GPIO按键控制。这个功能虽然简单但涉及了音频信号处理的乘加运算对于理解音频数据的幅值范围和定点数运算是很好的练习。收个尾分享一点个人体会这个I2S验证项目做下来最大的体会是I2S协议本身简单但音频链路里需要打通的环节远比想象中多。很多时候问题不是出在I2S接口本身而是出在它周边的时钟生成、寄存器配置、数据位序、FIFO策略这些看起来不起眼的细节上。我个人在实际调试过程中的经验是先把时钟树完整画出来MCLK从哪里来、BCLK和LRCLK由谁产生、多少倍频关系每一个数值都要提前算清楚。然后做内部回环先证明纯数字通路没问题再碰物理接口。每次只用单一变量测试不要一次性把所有功能全打开。另外仔细阅读IP核手册和数据手册是绕不过去的基本功。Xilinx的I2S IP核文档里有时序图、寄存器表、接口描述把这些资料耐心看一遍配置IP和排查问题时能省下无数时间。我这次就是靠着一份PDF手册搞定了之前想都不敢想的音频验证任务。希望这篇记录也能给正在做类似事情的你提供一些实际的帮助。
返回列表