I2S(Inter—IC Sound)总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门用于音频设备之间的音频数据传输。I2S总线有三条数据信号线:
(1)BCLK:串行时钟,也叫位时钟,对应数字音频的每一位数据。
(2)WS:字段(声道)选择,用于选择左右声道。为“0”表示正在传输的是左声道的数据, 为“1”表示正在传输的是右声道的数据。
(3)SD:串行数据,用二进制补码来表示音频数据(数据传输从高位到低位)。
BLK=2*采样频率*采样位数
采样频率即WS的频率,采样位数即在WS的左右声道内采样的数据位数。
常见的I2S音频传输有48K,44.1Khz和32Khz三种采样率。传输的音频数据位宽常见的有16,20和24三种。I2S传输的数据是声音的模拟信号经过AD采样数字化后的数据,所以数据位宽越宽,数据的采样精度就越高。下图是I2S传输的波形图,I2S在BCLK的下降沿发送数据(发送),在上升沿进行数据采样(接收)。每次是先发送最高位,最后发送最低位。MSB在WS变化的下一个时钟周期有效。因此,最高位拥有固定的位置,而最低位的位置则是依赖于数据的有效位数。也就使得接收端与发送端的有效位数可以不同。如果接收端能处理的有效位数少于发送端,可以放弃数据帧中多余的低位数据;如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位(常补足为零)。
I2S发送数据:发送是在每个时钟周期的下降沿发送数据,这样在WS沿变化开始后的第二个下降沿发送数据的最高位。接着在每个下降沿依次发送数据,直到发送完最低位。
I2S接收数据:在每个时钟周期的上升沿接收数据,在WS沿变化开始后的第二个上升沿接收数据的最高位。接着在每个位时钟上升沿依次接收数据,直到接收完最低位。
verilog实现I2S数据接收,下面是一个16位宽的I2S音频数据接收模块。主要通过移位的方式实现,由于接收时,数据是在第二个时钟上升沿采样MSB,所以L_count和R_count 都是从0计数到16计数了17次,相当于把第一个上升沿采样的无效数据删掉。
reg [4:0] L_count; //左声道接收数据计数
reg [4:0] R_count;//右声道接收数据计数
reg [15:0] L_data; //接收到的16位左声道数据
reg [15:0] R_data;//接收到的16位右声道数据
reg finish_flag; //完成一次左右声道数据接收标志
//Bclk 为I2S的位时钟,sdata为I2S 位数据,LRclk为字段选择信号
always @(posedge Bclk ,posedge RESET)begin
if(RESET==1'b1)begin
L_count <= 5'd0;
R_count <= 5'd0;
L_data <= 16'd0;
R_data <= 16'd0;
finish_flag <= 1'b0;
end else begin
finish_flag <= 1'b0;
if(LRclk==1'b0)begin
R_count <= 5'd0;
if(L_count< 5'd17)begin
L_count <= L_count+1'b1;
L_data <= {L_data[14:0],sdata};
end
end else begin
L_count <= 5'd0;
if(R_count< 5'd17)begin
R_count <= R_count+1'b1;
R_data <= {R_data[14:0],sdata};
end
if(R_count==5'd16)begin
finish_flag <= 1'b1;
end
end
end
end