I2S接口以及Verilog实现数据接收
2018-02-02 15:13
1201 查看
I2S(Inter—IC Sound)总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门用于音频设备之间的音频数据传输。I2S总线有三条数据信号线:
(1)BCLK:串行时钟,也叫位时钟,对应数字音频的每一位数据。
(2)WS:字段(声道)选择,用于选择左右声道。为“0”表示正在传输的是左声道的数据, 为“1”表示正在传输的是右声道的数据。
(3)SD:串行数据,用二进制补码来表示音频数据(数据传输从高位到低位)。
常见的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次,相当于把第一个上升沿采样的无效数据删掉。
(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
相关文章推荐
- 二、基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
- ios客户端向服务器端发送数据以及接收数据要如何实现?
- javaWed项目中用过滤器实现转码功能,敏感词汇过滤更能,处理Get和Post接收数据中的中文乱码问题以及敏感词汇的处理
- 使用Struts2写的接口实现接收json格式的数据
- Callable接口以及CyclicBarrier实现list数据求和
- 【厉害了FPGA】Verilog实现接收帧数据的一种方法(帧数据同步搜索检测)
- 基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
- verilog串口接收多个数据进行处理的实现方法
- 基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
- 基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
- 用springmvc实现类似restful风格接口(接收和返回为xml格式数据)
- Vue.js 实现表单数据参数传递,以及不同独立按钮之间的参数传递
- 使用scipy实现最小二乘法,以及通过曲线对数据进行拟合(Python)
- JSP调用数据库实现数据接收——create_2.jsp
- 【iOS开发-59】LOL案例:单组tabView、alertView样式、实现监听,以及用reloadData数据刷新
- Android开发:使用序列化接口Parcelable、Serializable实现Activity间传递复杂数据类型参数
- 网卡驱动4-做一个与外界交互的虚拟网卡3(调用真实网卡接收数据以及napi使用)
- 原生js如何实现柱状图以及原生js柱状图结合ajax循环动态数据_JavaScript_柱状图(原生JavaScript做的柱状图)(03)_ajax获取数据
- java socket连接以及发送和接收数据
- php 接口与前端数据交互实现