|
I2S(Inter IC Sound Bus)是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,它既规定了硬件接口规范,也规定了数字音频数据的格式。I2S有三个主要的信号:
(1)串行时钟BCLK,也叫位时钟,即对应于数字音频的每一位数据,BCLK都有一个脉冲。BCLK的频率=2×采样率×采样位数。
(2)帧时钟LRCLK,用于切换左右声道的数据。LRCLK为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。LRCLK的频率等于采样频率。
(3)串行数据SDATA,就是用二进制补码表示的音频数据。
有时为了使系统能够更好的同步,还需要另外传输一个信号MCLK,称为主时钟,也叫系统时钟,是采样频率的256倍或384倍。
下面是我做项目的一个小测试,用VHDl语言模拟音频的dsp通信,输入和输出波形基本一致了,但还是有些毛刺,并且有毛刺的地方输出数据出错,可能因为这点毛刺使得整个系统都不稳定,坛内同仁们有什么解决办法吗
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity dsp_mode is
PORT(CLK,DIN:IN STD_LOGIC;
DOUT:OUT STD_LOGIC;
LRCK,SCLK,MCLK:OUT STD_LOGIC
);
end;
architecture rtl of dsp_mode is
SIGNAL OUT_DATA_A1: STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL IN_DATA_A1: STD_LOGIC_VECTOR(31 DOWNTO 0);
COMPONENT dsp IS
PORT(
CLK,DIN:IN STD_LOGIC;
DOUT:OUT STD_LOGIC;
LRCK,SCLK,MCLK:OUT STD_LOGIC;
OUT_DATA:buffer STD_LOGIC_VECTOR(31 DOWNTO 0);
IN_DATA:buffer STD_LOGIC_VECTOR(31 DOWNTO 0)
);
END COMPONENT;
BEGIN
iis_JJ:dsp PORT MAP
(
CLK=>CLK,
DIN=>DIN,
DOUT=>DOUT,
LRCK=>LRCK,
SCLK=>SCLK,
MCLK=>MCLK,
OUT_DATA=>OUT_DATA_A1,
IN_DATA=>IN_DATA_A1
);
IN_DATA_A1<=OUT_DATA_A1;
END rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity dsp is
PORT(CLK,DIN:IN STD_LOGIC;
DOUT:OUT STD_LOGIC;
LRCK,SCLK,MCLK:OUT STD_LOGIC;
OUT_DATA:buffer STD_LOGIC_VECTOR(31 DOWNTO 0);
IN_DATA:buffer STD_LOGIC_VECTOR(31 DOWNTO 0)
);
end;
architecture rtl of dsp is
SIGNAL CLK_IN:STD_LOGIC;
SIGNAL LRCK_S,SCLK_S:STD_LOGIC:='0';
SIGNAL DSP_RE_DATA:STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL DSP_SE_DATA:STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL NUM_DATA:INTEGER RANGE 0 TO 31:=0;
begin
CLK_IN<=CLK;
MCLK<=CLK_IN;
LRCK<=LRCK_S;
SCLK<=SCLK_S;
DSP_SE_DATA<=IN_DATA;
--DOUT<=DIN;
OUT_DATA<=DSP_RE_DATA;
CLK_SCLK:
PROCESS(CLK)
VARIABLE NUM:INTEGER RANGE 0 TO 5;
BEGIN
IF CLK'EVENT AND CLK='0'THEN
IF NUM=5 THEN
SCLK_S<=NOT SCLK_S;
NUM:=0;
ELSE NUM:=NUM+1;
END IF;
DOUT<=DSP_SE_DATA(31-NUM_DATA);
END IF;
END PROCESS CLK_SCLK;
CLK_LRCK:
PROCESS(SCLK_S)
VARIABLE NUM:INTEGER RANGE 0 TO 31;
BEGIN
IF SCLK_S'EVENT AND SCLK_S='0'THEN
IF NUM=31 THEN
LRCK_S<='1';
NUM:=0;
ELSE NUM:=NUM+1;
LRCK_S<='0';
END IF;
END IF;
END PROCESS CLK_LRCK;
RECEIVE_DATA:
PROCESS(SCLK_S,LRCK_S)
BEGIN
IF SCLK_S'EVENT AND SCLK_S='1'THEN
IF LRCK_S='1'THEN
NUM_DATA<=0;
--OUT_DATA<=DSP_RE_DATA;
ELSE
NUM_DATA<=NUM_DATA+1;
DSP_RE_DATA(32-NUM_DATA)<=DIN;
END IF;
END IF;
END PROCESS RECEIVE_DATA;
end rtl;
下面是我用逻辑分析仪LA2532测得的波形
A0是接收的波形,A1是发送的波形,按理说应该一致,但是A0中有毛刺的地方,A1就输出错误的数据
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|