I2S(Inter-IC Sound,集成电路内置音频总线)是由飞利浦公司(现 NXP 半导体)于 1986 年制定的同步串行通信协议,专门用于在集成电路之间高效传输PCM(脉冲编码调制)数字音频数据 ,现已成为音频设备间的工业标准。
只传输PCM的音频数据,不进行控制传输
核心组成:三线制信号架构
| 信号线 | 英文全称 | 中文名称 | 核心功能 |
|---|---|---|---|
| SCK/BCLK | Serial Clock/Bit Clock | 串行时钟 / 位时钟 | 每一位数据对应一个时钟脉冲,频率 = 采样率 × 位深 × 声道数 |
| WS/LRCLK | Word Select/Left-Right Clock | 字选择 / 左右声道时钟 | 指示当前传输声道(左 / 右),频率等于采样率(如 44.1kHz) |
| SD/DATA | Serial Data | 串行数据 | 传输 PCM 音频数据,高位优先(MSB first)传输 |
| 部分扩展配置还会增加 MCLK(主时钟)、SDIN/SDOUT(双向数据)等引脚。 |
二、工作原理:精准同步的音频传输机制
1. 主从架构
- 主设备:提供 BCLK 和 LRCLK 时钟信号,通常为 MCU、DSP 或 CODEC
- 从设备 :被动接收时钟并同步传输 / 接收数据,如 DAC、ADC 或数字麦克风
主从设备可以是发送端也可以是接收端。当复杂系统中同时存在多个发送端和多个接收端时,则可以引入第三方主控制IC间的数据流向,如图所示

2. 数据传输时序
- LRCLK 信号上升沿 / 下降沿(依设备而定)切换声道
- 声道切换后,第一个 BCLK 脉冲 开始传输该声道数据的最高位(MSB)
- 每个 BCLK 脉冲传输 1 位数据,依次从高位到低位传输
- 一帧数据包含左声道完整数据 + 右声道完整数据
- 发射机发送的串行数据可以在时钟信号的下降沿(高到低)或者上升沿(低到高)进行同步。然而,串行数据必须在时钟的上升沿被接收机锁定接收,因此,在时钟上升沿传输的数据被同步时有一些限制
3. 数据格式特点
- 支持多种位深:16 位、24 位、32 位等标准音频格式
- 数据以高位优先方式传输,确保音频数据的完整性和时序准确性
- 标准 I2S 采用 "左对齐" 或 "飞利浦格式",数据在 LRCLK 切换后延迟一个 BCLK 传输

1. 初始状态:左声道数据传输阶段
- SCK:持续输出串行位时钟,每个周期对应一位数据的传输。
- WS:保持低电平(假设低电平代表左声道),告知接收端当前传输的是左声道数据。
- WSD:经两级 D 触发器同步后的 WS 信号,与 WS 同相位,但延迟了 2 个 SCK 周期。
- WSP :由两级触发器输出异或得到,仅在 WS 边沿后产生一个窄脉冲,触发移位寄存器并行加载。
- SD :在反相 SCK 驱动下,从移位寄存器中从 MSB 到 LSB逐位输出左声道音频数据,每一位都在 SCK 的指定边沿(通常是下降沿)稳定变化。
2. WS 边沿切换:声道切换触发
- WS:电平由低变高(切换到右声道),这个跳变是异步的,可能出现在 SCK 的任意位置。
- 第一级 D 触发器:在 SCK 的下一个上升沿,采样 WS 的新电平,输出延迟 1 个 SCK 周期的同步信号。
- 第二级 D 触发器 :在再下一个 SCK 上升沿,采样第一级的输出,得到延迟 2 个 SCK 周期的
WSD,彻底消除亚稳态。 - WSP :两级触发器输出不同,异或门输出高电平,产生一个窄脉冲,这个脉冲会触发移位寄存器的并行加载(PL)。
3. 并行加载:载入右声道数据
- PL(并行加载) :
WSP脉冲到达后,移位寄存器停止移位,将右声道的并行数据完整载入。 - DATA RIGHT 输出使能 :
WSD变为高电平,打开DATA RIGHT的输出使能(OE),右声道数据被送入移位寄存器输入端。 - SD:在当前左声道数据的最后一位(LSB)传输完成前,保持左声道数据的输出,直到并行加载完成。
4. 右声道数据传输阶段
- SCK:继续输出串行位时钟。
- WS:保持高电平,告知接收端当前传输的是右声道数据。
- SD :从下一个 SCK 周期开始,输出右声道数据的MSB,随后逐位输出到 LSB,传输顺序与左声道完全一致(MSB 优先)。
- WSP :脉冲结束,回到低电平,移位寄存器恢复串行移位模式。
对应上图I2S Transmitter FPGA 数据缓冲部分Verilog实现如下(豆包生成的,不确定能运行,但是了解Verilog思路就行了,也就那)
verilog
// I²S 发送模块 - 对应你看到的电路图
module i2s_transmitter #(
parameter DATA_WIDTH = 16 // 音频数据位宽(16/24/32)
)(
input wire clk, // 系统时钟(比如 100MHz)
input wire sck, // I²S 串行时钟(位时钟)
input wire rst_n, // 低电平复位
input wire ws_in, // 外部输入的 WS 信号(字选择)
input wire [DATA_WIDTH-1:0] left_data, // 左声道并行数据(来自左FIFO)
input wire [DATA_WIDTH-1:0] right_data, // 右声道并行数据(来自右FIFO)
output reg sd_out, // I²S 串行数据输出
output reg ws_out, // 同步后的 WS 输出(WSD)
output wire wsp_pulse // 并行加载脉冲(WSP)
);
// ----------------------
// 1. 两级 D 触发器同步 WS(消除亚稳态)
// ----------------------
reg ws_sync1, ws_sync2;
always @(posedge sck or negedge rst_n) begin
if(!rst_n) begin
ws_sync1 <= 1'b0;
ws_sync2 <= 1'b0;
end else begin
ws_sync1 <= ws_in; // 第一级同步
ws_sync2 <= ws_sync1; // 第二级同步
end
end
assign ws_out = ws_sync2; // 同步后的 WSD 信号
// ----------------------
// 2. 生成 WSP 并行加载脉冲(异或两级同步输出)
// ----------------------
assign wsp_pulse = ws_sync1 ^ ws_sync2;
// ----------------------
// 3. 并行寄存器 + 多路选择器(选择左右声道)
// ----------------------
reg [DATA_WIDTH-1:0] parallel_reg; // 并行寄存器(存当前帧数据)
always @(posedge sck or negedge rst_n) begin
if(!rst_n) begin
parallel_reg <= {DATA_WIDTH{1'b0}};
end else if(wsp_pulse) begin // WSP 脉冲触发并行加载
// 根据同步后的 WS 选择左/右声道数据
parallel_reg <= ws_out ? right_data : left_data;
end
end
// ----------------------
// 4. 移位寄存器(并转串,MSB 优先)
// ----------------------
reg [DATA_WIDTH-1:0] shift_reg; // 移位寄存器
always @(negedge sck or negedge rst_n) begin // 反相 SCK 驱动移位
if(!rst_n) begin
shift_reg <= {DATA_WIDTH{1'b0}};
sd_out <= 1'b0;
end else if(wsp_pulse) begin // 并行加载时,把数据载入移位寄存器
shift_reg <= parallel_reg;
sd_out <= parallel_reg[DATA_WIDTH-1]; // 先输出最高位 MSB
end else begin // 正常移位,一位一位输出
shift_reg <= {shift_reg[DATA_WIDTH-2:0], 1'b0};
sd_out <= shift_reg[DATA_WIDTH-1];
end
end
endmodule
同时,对应的I2S Transmitter FPGA 数据缓冲部分逻辑图如下
