FPGA设计标准I2S协议音频编解码器

  • --I2S基本介绍
  • --I2S采样和处理过程
  • --I2S协议规范
  • --FPGA设计标准I2S音频编解码器

–I2S基本介绍

I2S(Inter-IC Sound)是飞利浦公司针对数字音频设备(如CD播放器、数码音效处理器、数字电视音响系统)之间的音频数据传输而制定的一种总线标准。它采用了独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。

–I2S采样和处理过程

模拟信号–>音频codec芯片–>I2S数字信号(音频ADC转换过程)
I2S数字信号–>音频codec芯片–>模拟信号(音频DAC转换过程)
备注:音频codec芯片需要进行相关寄存器配置才能工作。相关配置资料可以查看芯片手册。

–I2S协议规范

I2S有3个主要信号

  • 1.串行时钟SCLK,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲。SCLK的频率=2×采样频率×采样位数。
  • 2.帧时钟LRCK,(也称WS),用于切换左右声道的数据。LRCK为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。LRCK的频率等于采样频率。
  • 3.串行数据SDATA,由于音频数据有正负之分,故而用二进制补码表示的音频数据。

有时为了使系统间能够更好地同步,还需要另外传输一个信号MCLK,称为主时钟,也叫系统时钟(Sys Clock),是采样频率的256倍或384倍。

随着技术的发展,在统一的 I2S接口下,出现了多种不同的数据格式。根据SDATA数据相对于LRCK和SCLK的位置不同,分为左对齐(较少使用)、I2S格式(即飞利浦规定的格式)和右对齐(也叫日本格式、普通格式)。

–FPGA设计标准I2S音频编解码器

代码已经在Cyclone ® IV EP4CE6 Device硬件平台测试OK.
音频解码器代码如下,欢迎各位学友共同探讨

在这里插入代码片module i2s_decoder_slave#(
parameter DATA_WIDTH = 32
)
(
input sys_clk_i,
input audio_clk_i,
input rstn_i,
//
output reg [DATA_WIDTH-1:0] audio_data_o, //hi:left lw:right
output reg audio_den_o,
//
input i2s_din_i,
output reg i2s_mclk_o,
input i2s_lrclk_i,
input i2s_bclk_i
);//ʱ��ʱ 49.152M������ʱ��Ϊ fs=48khz��mclk=256fs=12.288M,bclk=mclk/4,ʱ��Ϊ mclk �� 4�����ʴ˴�Ϊ 16
localparam BCLK_PER_NUM = 16;
localparam LRCLK_BCLK_RATE = 64;
localparam I2S_EMPTY_WIDTH = LRCLK_BCLK_RATE/2 - DATA_WIDTH/2;
reg [1:0] mclk_cntr;
reg [3:0] i2s_din_dly;
reg [3:0] i2s_bclk_dly;
reg [4:0] bit_cntr;
reg [LRCLK_BCLK_RATE/2-1:0] rsr;
reg [7:0] i2s_lrclk_dly;
reg sample_en;
reg [DATA_WIDTH/2-1:0] audio_left_data;//left data
reg [DATA_WIDTH/2-1:0] audio_right_data;//right dataalways@(posedge audio_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
mclk_cntr <= 'b0;
else
mclk_cntr <= mclk_cntr + 2'b1;
end
always@(posedge audio_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
i2s_mclk_o <= 'b0;
else if (mclk_cntr[0])
i2s_mclk_o <= ~i2s_mclk_o;
end
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
i2s_bclk_dly <= 4'b0;
else
i2s_bclk_dly <= {i2s_bclk_dly[2:0],i2s_bclk_i};
end
wire i2s_bclk_rise = (i2s_bclk_dly[3:2]==2'b01);
wire i2s_bclk_fall = (i2s_bclk_dly[3:2]==2'b10);
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
bit_cntr <= 5'b0;
else if (^i2s_lrclk_dly[3:2])
bit_cntr <= 5'b0;
else if(i2s_bclk_fall)
bit_cntr <= bit_cntr + 1'b1;
end
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
i2s_lrclk_dly <= 8'b0;
else
i2s_lrclk_dly <= {i2s_lrclk_dly[6:0],i2s_lrclk_i};
end
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
sample_en <= 1'b0;
else if (^i2s_lrclk_dly[3:2])
sample_en <= 1'b0;
else if (i2s_bclk_fall)
sample_en <= 1'b1;
end
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
i2s_din_dly <= 4'b0;
else
i2s_din_dly <= {i2s_din_dly[2:0],i2s_din_i};
end
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
rsr <= 32'h0;
else if(sample_en && i2s_bclk_rise)
rsr <= { rsr[30:0],i2s_din_dly[3] };
end
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
begin
audio_left_data <= 'h0;
audio_right_data <= 'h0;
end
else if(^i2s_lrclk_dly[3:2])
begin
if(~i2s_lrclk_dly[3])
audio_left_data <= rsr[LRCLK_BCLK_RATE/2-2:I2S_EMPTY_WIDTH-1];
if(i2s_lrclk_dly[3])
audio_right_data <= rsr[LRCLK_BCLK_RATE/2-2:I2S_EMPTY_WIDTH-1];
end
end
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
audio_den_o <= 1'b0;
else if(i2s_lrclk_dly[5:4]==2'b10 )
audio_den_o <= 1'b1;
else
audio_den_o <= 1'b0;
end
always@(posedge sys_clk_i or negedge rstn_i)
begin
if(rstn_i == 1'b0)
audio_data_o <= 0;
else if(i2s_lrclk_dly[5:4]==2'b10)
audio_data_o <= {audio_left_data,audio_right_data};
end
//

FPGA设计标准I2S协议音频编解码器相关推荐

  1. FPGA操作WM8731音频编解码器从机模式,little white的自我进阶

    FPGA操作WM8731音频编解码器从机模式,little white的自我进阶 之前写过一篇WM8731从机模式的文章,但当时对芯片手册和I2S的理解不到位,虽然采集到了音频,但并不符合项目需求,在 ...

  2. FPGA操作WM8731音频编解码器从机模式,小白的自我批判

    FPGA操作WM8731音频编解码器从机模式,小白的自我批判 之前写过一片关于WM8731的文章,当时对这块芯片的理解还不够深,所以有些表述是错误的,当时用的是WM8731作为从机,FPGA作为主机, ...

  3. 音频(二)——I2S 协议

    I2S 协议详解 信号线定义 各个信号线的功能及描述见下表 信号线 描述 MCLK 主时钟,也叫系统时钟(Sys Clock),为了使系统间能够更好的同步,MCLK的频率=256fs 或384fs(f ...

  4. 新的Google Lyra音频编解码器对实时视频流意味着什么?

    正文字数:2602  阅读时长:4分钟 通过语言编码中的码率缩减趋势,Lyra与Opus中的区别比较,Lyra的作用,XDN平台上的高效语音编码技术几个方面探讨新的Google Lyra音频编解码器对 ...

  5. E1视音频编解码器应用方案详细说明

    E1音频编解码器,是采用数字处理芯片及大规模FPGA.数字编解码转换和时钟恢复技术方法设计的.适用于广播节目源传输的设备.音频编码器是将输入的立体声音频信号,经A/D数字编解码变换或数据格式转换后,重 ...

  6. ES8311 低功耗单声道音频编解码器(中文)

    版本11.0 低功耗单声道音频编解码器 特征 系统 • 高性能.低功耗多位音频ADC和DAC • I2S/PCM 主串行或从串行数据端口 • 256/384Fs, USB 12/24 MHz 和其他非 ...

  7. E1立体声卡侬头(XLR) 音频编解码器产品介绍

    FCA系列音频编解码器是一种采用数字处理芯片及大规模FPGA.数字编解码转换和时钟恢复技术方法设计的基于E1(2M)通道传输立体声广播信号的广播传送设备系统,它可以借助目前成熟可靠的E1传输系统网,建 ...

  8. 音频编解码器以50%的功耗提供两倍的音频质量

    音频编解码器以50%的功耗提供两倍的音频质量 Audio codecs deliver twice the audio quality at 50% less power Dialog的DA740x音 ...

  9. SoundStream VS Lyra: 谷歌今年新推出的两款AI音频编解码器有何不同?

    点击上方"LiveVideoStack"关注我们 作者 | Teresa.王晶 技术审校 | 王晶.王立众 SoundStream 影音探索 #001# 近日,谷歌又推出了一款基于 ...

  10. 从Satin到Lyra 为何微软、谷歌都盯向音频编解码器?

    回顾今年的2月份,可以说是音频编解码器最为热闹的一个月.先是微软宣布推出最新款由AI支持的音频编解码器--Satin.仅一周后,谷歌推出了用于语音压缩的新型超低比特率音频编解码器--Lyra,并且An ...

最新文章

  1. 编写python程序的步骤_编写python程序和运行.py文件的方法步骤
  2. C语言程序设计之编程求鸡和兔的只数,用穷举法解决
  3. GraphPad Prism软件无响应问题解决办法
  4. [转]进程,线程和多线程
  5. 数据库mysql中贴换函数_关于一个自定义MYSQL函数,实现点击链接后,在数据库里改变数据的问题。...
  6. mybatis SqlMapConfig.xml typeAliases
  7. 统计有几个连通分量的另一种方法--hdu 1325
  8. flutter笔记:使用flutter webvie
  9. UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)
  10. xpath 解析离线网页解析本地网页解析本体html文件
  11. android camera hal3 新增vendor tag
  12. WinRAR破解注册方法
  13. thread.java 619_java jstack thread 映射 linux 线程(LWP) | 学步园
  14. c 语言除法运算,C 语言简单加减乘除运算
  15. 日消息量突破 50 亿,谈小米的高可用推送系统设计
  16. python科学计算之numpy+pandas+matplotlib+mysql
  17. android开发之发送短信SMS
  18. 算法和刷题——二分法
  19. smarty引入html,php用Smarty模板生成html文件
  20. The Rust Programming Language - 第19章 高级特征 - 19.5 宏

热门文章

  1. 最详细的Mysql操作手册(一)
  2. java fttp连接服务器操作
  3. 元器件型号: ATMEGA328P-AU
  4. [C++] intptr_t
  5. 易语言 内存调用html文件夹,将文件移到指定文件夹 易语言移动文件到指定文件夹内...
  6. Python实现的NN神经网络算法完整示例
  7. 传值中处理jsp中文乱码问题
  8. Java中this关键字详解
  9. 什么是软件测试的缺陷指标,软件测试缺陷度量分析
  10. mongodb java 教程_MongoDB Java | 菜鸟教程