位置:51电子网 » 技术资料 » EDA/PLD

基于FPGA和AD1836的I2S接口设计

发布时间:2008/8/18 0:00:00 访问次数:948

i2s总线协议简介

  i2s(inter ic sound bus)是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,它既规定了硬件接口规范,也规定了数字音频数据的格式。i2s有三个主要的信号:

  (1)串行时钟bclk,也叫位时钟,即对应于数字音频的每一位数据,bclk都有一个脉冲。bclk的频率=2×采样率×采样位数。

  (2)帧时钟lrclk,用于切换左右声道的数据。lrclk为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。lrclk的频率等于采样频率。

  (3)串行数据sdata,就是用二进制补码表示的音频数据。

  有时为了使系统能够更好的同步,还需要另外传输一个信号mclk,称为主时钟,也叫系统时钟,是采样频率的256倍或384倍。典型的i2s接口时序如图1所示,对于系统而言,产生bclk和lrclk信号的信号端是主设备。i2s的数据线用于串行数据,当lrclk变化(也就是左右通道的数据切换),在第二个blck处数据开始,按照高位在先低位在后的顺序进行传输。数据在bclk的下降沿改变,在bclk的上升沿进行数据的采样。因此,在bclk的上升沿处数据必须是稳定的,接收端和发送端处理的有效数据的位数可以不同:如果接收端可处理的有效数据的位数多于发送端,将不足的数据位用0补足;反之,则将多余的数据位舍弃。

i2s接口硬件设计

  本设计采用altera公司的stratix系列的fpga,ep1s10672i7来实现ad1836中d/a的i2s接口设计。该芯片内核电压为1.5v,i/o电压为3.3v,符合ad1836数字接口输入输出电平要求,其中d/a部分的i2s接口硬件设计原理图如图1所示。

  本设计中,将ad1836采样时钟设置为48khz,采样位数为24位。从ad1836数据手册可知,其系统时钟(mclk)为12.288mhz,左右通道数据切换时钟(lrclk)等于采样时钟(48khz),数据位时钟(dbclk)为64×左右通道数据切换时钟(3.072mhz)。所以串行数据线上传输的是24位的有效数据,其余数据位时钟周期对应的数据线上的数据为0,串行数据线dsdata1、dsdata2、dsdata3分别对应于三路的立体d/a,所有的时钟线和数据线均经过下拉电阻后与fpga的i/o相连。

基于fpga的实现

逻辑模块设计

  fpga内部逻辑模块主要包括分频模块和d_a接口模块,如图2所示。其中分频模块将ad1836的系统时钟12.288mhz分频为3.072mhz(即位时钟bclk);start信号为模块使能信号,为高时,d_a接口模块将从datin引脚输入的24位并行数据转换为串行数据,从datout引脚输出;当左右通道时钟切换时,输入的24位并行数据也相应改变,同时从lrclk引脚输出48khz的左右通道数据切换时钟,从bclk引脚输出3.072mhz的位时钟信号。lrclk和bclk都是在ad1836的系统时钟(mclk)的基础上分频得到的,从而保证了整个系统的同步性。

软件设计

  所有软件的设计是在quartusⅱ 6.0中采用verilog hdl语言输入完成的,系统采用10mhz的有源晶振,通过fpga内部的锁相环进行二级倍频从而得到12.288mhz的时钟信号,然后通过clkin_12_288m引脚送入分频模块。主要的程序如下:

分频模块

module freq3_027m(clkin12_288m, clkout3_027m);

input clkin12_288m; //时钟输入引脚

output clkout3_027m; //时钟输出引脚

reg clkout3_027m; //分频计数器

integer cunt;

always@( posedge clkin12_288m) begin

cunt=cunt+1;

if (cunt<=1)

begin clkout3_027m=1'b0;end

else if((cunt<=3)&&(cunt>=2))

begin clkout3_027m=1'b1;end

else

begin cunt=0;clkout3_027m=1'b0;end

end

endmodule

d_a接口模块

(1)左右通道切换时钟和数据位时钟

assign lrclkout = lr_f; //左右通道切换时钟

assign bclkout =(bclk_f)?bclkin:1'b1; //数据位时钟

(2)时钟输出和数据的并串转换

always@( negedge bclkin) begin

if(start) begin //使能信号为高

cunt=cunt+1;

case (cunt)

1: begin lr_f=~lr_f; //左右通道时钟

bclk_f=1'b1;end //送出位数据时钟

2: datout=ddsdatin[23];//送出最高位

3: datout=ddsdatin[22]; //送出次高位

4: datout=ddsdatin[21];

5: datout=dds

i2s总线协议简介

  i2s(inter ic sound bus)是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,它既规定了硬件接口规范,也规定了数字音频数据的格式。i2s有三个主要的信号:

  (1)串行时钟bclk,也叫位时钟,即对应于数字音频的每一位数据,bclk都有一个脉冲。bclk的频率=2×采样率×采样位数。

  (2)帧时钟lrclk,用于切换左右声道的数据。lrclk为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。lrclk的频率等于采样频率。

  (3)串行数据sdata,就是用二进制补码表示的音频数据。

  有时为了使系统能够更好的同步,还需要另外传输一个信号mclk,称为主时钟,也叫系统时钟,是采样频率的256倍或384倍。典型的i2s接口时序如图1所示,对于系统而言,产生bclk和lrclk信号的信号端是主设备。i2s的数据线用于串行数据,当lrclk变化(也就是左右通道的数据切换),在第二个blck处数据开始,按照高位在先低位在后的顺序进行传输。数据在bclk的下降沿改变,在bclk的上升沿进行数据的采样。因此,在bclk的上升沿处数据必须是稳定的,接收端和发送端处理的有效数据的位数可以不同:如果接收端可处理的有效数据的位数多于发送端,将不足的数据位用0补足;反之,则将多余的数据位舍弃。

i2s接口硬件设计

  本设计采用altera公司的stratix系列的fpga,ep1s10672i7来实现ad1836中d/a的i2s接口设计。该芯片内核电压为1.5v,i/o电压为3.3v,符合ad1836数字接口输入输出电平要求,其中d/a部分的i2s接口硬件设计原理图如图1所示。

  本设计中,将ad1836采样时钟设置为48khz,采样位数为24位。从ad1836数据手册可知,其系统时钟(mclk)为12.288mhz,左右通道数据切换时钟(lrclk)等于采样时钟(48khz),数据位时钟(dbclk)为64×左右通道数据切换时钟(3.072mhz)。所以串行数据线上传输的是24位的有效数据,其余数据位时钟周期对应的数据线上的数据为0,串行数据线dsdata1、dsdata2、dsdata3分别对应于三路的立体d/a,所有的时钟线和数据线均经过下拉电阻后与fpga的i/o相连。

基于fpga的实现

逻辑模块设计

  fpga内部逻辑模块主要包括分频模块和d_a接口模块,如图2所示。其中分频模块将ad1836的系统时钟12.288mhz分频为3.072mhz(即位时钟bclk);start信号为模块使能信号,为高时,d_a接口模块将从datin引脚输入的24位并行数据转换为串行数据,从datout引脚输出;当左右通道时钟切换时,输入的24位并行数据也相应改变,同时从lrclk引脚输出48khz的左右通道数据切换时钟,从bclk引脚输出3.072mhz的位时钟信号。lrclk和bclk都是在ad1836的系统时钟(mclk)的基础上分频得到的,从而保证了整个系统的同步性。

软件设计

  所有软件的设计是在quartusⅱ 6.0中采用verilog hdl语言输入完成的,系统采用10mhz的有源晶振,通过fpga内部的锁相环进行二级倍频从而得到12.288mhz的时钟信号,然后通过clkin_12_288m引脚送入分频模块。主要的程序如下:

分频模块

module freq3_027m(clkin12_288m, clkout3_027m);

input clkin12_288m; //时钟输入引脚

output clkout3_027m; //时钟输出引脚

reg clkout3_027m; //分频计数器

integer cunt;

always@( posedge clkin12_288m) begin

cunt=cunt+1;

if (cunt<=1)

begin clkout3_027m=1'b0;end

else if((cunt<=3)&&(cunt>=2))

begin clkout3_027m=1'b1;end

else

begin cunt=0;clkout3_027m=1'b0;end

end

endmodule

d_a接口模块

(1)左右通道切换时钟和数据位时钟

assign lrclkout = lr_f; //左右通道切换时钟

assign bclkout =(bclk_f)?bclkin:1'b1; //数据位时钟

(2)时钟输出和数据的并串转换

always@( negedge bclkin) begin

if(start) begin //使能信号为高

cunt=cunt+1;

case (cunt)

1: begin lr_f=~lr_f; //左右通道时钟

bclk_f=1'b1;end //送出位数据时钟

2: datout=ddsdatin[23];//送出最高位

3: datout=ddsdatin[22]; //送出次高位

4: datout=ddsdatin[21];

5: datout=dds

相关IC型号

热门点击

 

推荐技术资料

声道前级设计特点
    与通常的Hi-Fi前级不同,EP9307-CRZ这台分... [详细]
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!