基于FPGA的I2S 转TDM8 设计

这篇具有很好参考价值的文章主要介绍了基于FPGA的I2S 转TDM8 设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

在音频应用领域,I2S和TDM的应用是最基础的应用,不管模拟转数字ADC的采样还是数字转模拟DAC的输出,都经常使用这两种协议,所以跨入音频领域,这些基础的必须先掌握;在本文章主要讲设计思想,针对I2S和TDM的时序只做简单的介绍,然后通过I2S和TDM之间编解码的仿真来熟悉这两种协议的设计思路。

二、I2S简介

I2S(Inter—IC Sound)总线, 又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。在我们本设计中采用是I2S的标准协议。(下图是ADC的时序图)

主时钟 MCLK: 它是 LRCK和SCLK的参考时钟,一个系统应该使用同一的MCLK以保证时钟同步要求。常见频率256fs或512fs。这里的fs就是采样率LRCK的频率。本设计中MCLK为24.576MHz。

采样率 LRCK(也称WS): 用于切换左右声道的数据。对于I2S标准协议来说,LRCK为1表示传输右声道数据,为0则是左声道。在设计中,LRCK的下降沿是我们一个帧的起点,对于I2S来说,左右声道可以搭载两路数据,每2路数据为1帧。本设计中LRCK为48KHz。

串行时钟SCLK: 也叫位时钟BCLK,对应数字音频的每一位数据,该时钟都有一个脉冲。本设计中SCLK为3.072MHz。这里需要注意,不管我们实际音频数据的有效位是16bit、24bit或32bit,我们的串行SCLK都是LRCK的64倍,并且LRCK的下降沿一定是要和BCK的下降沿对齐的。

输入数据DIN: 对于I2s标准协议来说,我们数据是在LRCK下降沿到来后,第二个bck的时钟上升沿开始才是采样到有效数据。正常设计中,音频数据有效位都是24bit,因为32bit没有必要,本设计中也是24bit。

基于FPGA的I2S 转TDM8 设计

三、TDM简介

TDM即时分复用,它是强化版本的I2s。由于在我们实际应用中发现1组I2s只能传输2路数据,这不能满足我们的需求,所以TDM协议可以满足我们的需求。I2s说白了其实就是TDM2。我们比较常用的是格式是TDM8和TDM16。下图是我们DAC的时序图,是TDM8格式,LRCK的上升沿是一帧的起点,一个帧是8个通道。
主时钟 MCLK: 系统主时钟这里仍然是24.576MHz。
采样率LRCK: 这里LRCK的脉宽大小各个芯片的定义是有点差异的,我们这款DAC,LRCK的脉宽最小可以是1个BCK时钟周期,最大可以是255个时钟周期。本设计TDM的LRCK同样是48KHz。
TDM8移位时钟BCK是采样率LRCK的256倍。
位时钟BCK: 同样的这里移位时钟bck的下降沿一定是要和LRCK边沿是对齐的。本设计BDCK为12.288MHz。注意TDM的一帧的通道数越多,我们BCK频率会越高,对时序的要求就越高,因为一个通道占用32个bck,采样率是固定的。
输入数据DIN: 这里数据的对齐方式采用的I2s的标准格式,也就是在LRCK上升沿后,每32bck的第二个bck的开始才是有效数据。

基于FPGA的I2S 转TDM8 设计
关于I2S和TDM协议的详细介绍可以参考:I2S/PCM协议及TDM模式详解,这里面有左对齐、右对齐等等相关。

四、设计框图

如图所示,为了能够符合边沿对齐的规则(LRCK的上下沿对齐BCK的下降沿),我们需要使用24.576MHz的时钟下降沿去做分频处理。我们一共是8路数据,4路I2S进行采样(每个AD 2路I2S)。然后进行TDM8编码,输出到DAC。
基于FPGA的I2S 转TDM8 设计

五、仿真验证

1.时钟分频

如下仿真图图所示,clk是24.576MHz,clkout0是采样时钟LRCK为48KHz,clkout1是I2S的位时钟BCK为3.072MHz,clkout2是TDM8的位时钟BCK为12.288MHz。(采样率LRCK的上下沿是和BCK的下降沿对齐的)

下面展示的是最简单分频处理方法的代码(干货)

module clk_div(
input clk,//24.576MHz
input rst,
output  clkout0,//48KHz
output  clkout1,//3.072MHz
output  clkout2//12.288MHz
    );

reg[9:0]cnt=0;


assign clkout0=cnt[8];
assign clkout1=cnt[2];
assign clkout2=cnt[0];

always@(negedge clk)
begin
if(rst)
cnt<=0;
else
cnt<=cnt+1;
end

endmodule

仿真激励代码:

module vtf_clk_div;

	// Inputs
	reg clk;
	reg rst;

	// Outputs
	wire clkout0;
	wire clkout1;
	wire clkout2;

	// Instantiate the Unit Under Test (UUT)
	clk_div uut (
		.clk(clk), 
		.rst(rst), 
		.clkout0(clkout0), 
		.clkout1(clkout1), 
		.clkout2(clkout2)
	);

	initial begin
		// Initialize Inputs
		clk = 0;
		rst = 1;

		// Wait 100 ns for global reset to finish
		#100;
       	rst = 0; 
		// Add stimulus here

	end
  always # 20.345   clk = ~clk;
endmodule

仿真时序图:
基于FPGA的I2S 转TDM8 设计

2.I2S 转TDM8功能模块

关于4路I2S转1路TDM8源代码这里就不放了,想要看的可以点击如下链接获取:I2S转TDM8代码。
在激励文件中,定义的data_vld1~data_vld8这8个通道数据对应4路I2s的8个声道,具体可以看仿真时序图。
仿真激励代码:


module vtf_i2s_to_tdm8;

	// Inputs
	reg reset;
	wire MCLK;//TDM8的BCK
	wire LRCK;
	wire SCLK;//I2S的BCK
	reg DATA1;//第一路I2s数据输入
	reg DATA2;//第二路I2s数据输入
	reg DATA3;//第三路I2s数据输入
	reg DATA4;//第四路I2s数据输入

	// Outputs
	wire flag;
	wire DATA_OUT;
/
   
    reg clk;
	reg LRCK_dly1;
	reg LRCK_dly2;
	reg [63:0] TMPA;
	reg [63:0] TMPB;
	reg [63:0] TMPC;
	reg [63:0] TMPD;
	wire clk_48k_negedge;
/定义的8个数据通过4路I2S发送出去(ch1/ch2第一路、ch3/ch4第二路、
    ch5/ch6第二路、ch7/ch8第二路)

localparam data_vld1=32'hf111_1F00;//ch1
localparam data_vld2=32'hf333_3F00;//ch2
localparam data_vld3=32'hf555_5F00;//ch3
localparam data_vld4=32'hf777_7F00;//ch4
localparam data_vld5=32'hf999_9F00;//ch5
localparam data_vld6=32'hfBBB_BF00;//ch6
localparam data_vld7=32'hfCCC_CF00;//ch7
localparam data_vld8=32'hfDDD_DF00;//ch8
	// Instantiate the Unit Under Test (UUT)
	i2s_to_tdm8 uut (
		.reset(reset), 
		.MCLK(MCLK), 
		.LRCK(LRCK), 
		.SCLK(SCLK), 
		.DATA1(DATA1), 
		.DATA2(DATA2), 
		.DATA3(DATA3), 
		.DATA4(DATA4), 
		.flag(flag), 
		.DATA_OUT(DATA_OUT)
	);
///调用上面的分频模块	
		clk_div clk_div_inst (
		.clk(clk), 
		.rst(reset), 
		.clkout0(LRCK), //48KHz
		.clkout1(SCLK), //3.072MHz
		.clkout2(MCLK)//12.288MHz
	);



	initial begin
		// Initialize Inputs
		reset = 1;
		clk = 0;
		DATA1 = 0;
		DATA2 = 0;
		DATA3 = 0;
		DATA4 = 0;
      LRCK_dly1=0;
		LRCK_dly2=0;
		TMPA=0;
		TMPB=0;
		TMPC=0;
		TMPD=0;
		// Wait 100 ns for global reset to finish
		#100;
       reset =0; 
		// Add stimulus here

	end
    always # 20.345   clk = ~clk;   
	 always @(posedge SCLK)
	 begin
	LRCK_dly1 <=LRCK;
	LRCK_dly2 <=LRCK_dly1;
	 end
	assign clk_48k_negedge =~LRCK_dly1&LRCK_dly2;
	 
	always @(negedge SCLK) 
	 begin
	 if(clk_48k_negedge)begin
	   DATA1<=data_vld1[31];
		TMPA<={data_vld1[30:0],data_vld2,1'b0};
		end
		else begin
	   TMPA<=TMPA<<1;
		DATA1<=TMPA[63];
      end		
	 end
	 
	always @(negedge SCLK) 
	 begin
	 if(clk_48k_negedge)begin
	   DATA2<=data_vld3[31];
		TMPB<={data_vld3[30:0],data_vld4,1'b0};
		end
		else begin
	   TMPB<={TMPB[62:0],1'b1};	 
		DATA2<=TMPB[63];
		end
	 end
	 
	always @(negedge SCLK) 
	 begin
	 if(clk_48k_negedge)begin
	   DATA3<=data_vld5[31];
		TMPC<={data_vld5[30:0],data_vld6,1'b0};
		end
		else begin
	   TMPC<={TMPC[62:0],1'b1};	 
		DATA3<=TMPC[63];
		end 
	 end
	 
	always @(negedge SCLK) 
	 begin
	 if(clk_48k_negedge)begin
	   DATA4<=data_vld7[31];
		TMPD<={data_vld7[30:0],data_vld8,1'b0};
		end
		else begin
	   TMPD<={TMPD[62:0],1'b1};	 
		DATA4<=TMPD[63];
		end	 
	 end	 
endmodule

时序仿真图:
对于I2S时序来说LRCK的下降沿是一帧的开始,DATA1~DATA4是4路I2S的输入数据,通道对应如图所示;对于TDM8时序来说LRCK的上升沿是一帧的开始,DATA_OUT是TDM8的输出数据,这里通道对应如图所示。
基于FPGA的I2S 转TDM8 设计
广大博友,关于I2S转1路TDM8的应用这里就介绍完了,可以拓展应用,比如:8路I2S转1路TDM16、8路I2S转2路TDM8等等,只要时序搞明白了,用起来就简单了,大家可以自己研究研究,如有问题欢迎探讨。文章来源地址https://www.toymoban.com/news/detail-417951.html

到了这里,关于基于FPGA的I2S 转TDM8 设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 音频——I2S DSP 模式(五)

    音频——I2S DSP 模式(五)

    I2S 基本概念 飞利浦(I2S)标准模式 左(MSB)对齐标准模式 右(LSB)对齐标准模式 DSP 模式 TDM 模式 DSP/PCMmode 分为 Mode-A 和 Mode-B 共 2 种模式。不同芯⽚有的称为 PCM mode 有的称为 DSP mode。PCM 只有⼀个起始信号,先传输左声道后传输右声道。 Mode-A 数据在第 1 个 BCLK 脉冲处 上升沿数据有

    2024年02月09日
    浏览(12)
  • 瑞芯微 | I2S-音频基础 -1

    最近调试音频驱动,顺便整理学习了一下i2s、alsa相关知识,整理成了几篇文章,后续会陆续更新。 喜欢嵌入式、Li怒晓得老铁可以关注一口君账号。 名称 含义 ADC(Analog to Digit Conversion) 模拟信号转换为数字信号 AEC(Acoustic Echo Cancellor) 回声消除 AGC(Automatic Gain Control) 自

    2024年03月14日
    浏览(27)
  • 音频——I2S 左对齐模式(三)

    音频——I2S 左对齐模式(三)

    I2S 基本概念 飞利浦(I2S)标准模式 左(MSB)对齐标准模式 右(LSB)对齐标准模式 DSP 模式 TDM 模式 I2S 左对齐标准 标准左对齐格式的数据的 MSB 没有相对于 BCLK 延迟一个时钟。左对齐格式的左右声道数据的 MSB 在 LRCLK 边沿变化后 BCLK 的第一个上升沿有效 LRCLK 为 1 传输左声道数据,L

    2024年02月10日
    浏览(12)
  • I2S/PCM接口及音频codec

    I2S/PCM接口及音频codec

    目录 1.I2S接口及时序 1.1 I2S接口信号 1.2 I2S接口时序 1.3 MCLK的作用 2. PCM(TDM)接口  2.1 PCM(TDM)接口信号 2.2 PCM接口时序 3.audio codec  可参考本人转载的一篇文章: 数字音频接口(I2S,PCM/TDM,PDM)_cy413026的博客-CSDN博客 数字音频接口。 https://blog.csdn.net/cy413026/article/details/132590286?csdn_shar

    2024年02月01日
    浏览(14)
  • Audio-音频传输接口(I2S、PCM、PDM)

    Audio-音频传输接口(I2S、PCM、PDM)

    I2S和PCM(TDM)接口传输的数据是PCM编码格式的音频数据。 PDM接口传输的数据是PDM编码格式的音频数据。 I2S(Inter-IC Sound)总线有时候也写作 IIS,I2S 是飞利浦公司提出的一种用于数字音频设备之间进行音频数据传输的总线。和 I2C、SPI 这些常见的通信协议一样,I2S 总线用于主控制器

    2024年02月01日
    浏览(12)
  • LuatOS-SOC接口文档(air780E)-- i2s - 数字音频

    示例 常量 类型 解释 i2s.MODE_I2S number I2S标准,比如ES7149 i2s.MODE_LSB number LSB格式 i2s.MODE_MSB number MSB格式,比如TM8211 初始化i2s 参数 传入值类型 解释 int i2s通道号,与具体设备有关 int 模式, 当前仅支持0, MASTER|TX|RX 模式, 暂不支持slave. 可选 int 采样率,默认44100. 可选 int 数据位数,默认

    2024年02月07日
    浏览(17)
  • ESP32设备驱动——使用I2S播放音频的物联网应用

    在物联网应用中,使用嵌入式设备进行音频播放是一个常见的需求。ESP32是一款功能强大的嵌入式开发板,它集成了Wi-Fi和蓝牙功能,适用于物联网应用。本文将介绍如何在ESP32上使用I2S(Inter-IC Sound)接口来播放音频。 I2S是一种串行音频接口,用于高质量音频数据的传输。

    2024年03月21日
    浏览(18)
  • 【LabVIEW FPGA入门】LabVIEW FPGA实现I2S解码器

    【LabVIEW FPGA入门】LabVIEW FPGA实现I2S解码器

            该示例演示了如何使用 LabVIEW FPGA 解码 I²S 信号。该代码可用于大多数支持高速数字输入的LabVIEW FPGA 目标(例如R 系列、CompactRIO)。I²S 用于对系统和组件内的数字音频数据进行编码。例如,MP3 播放器或 DVD 播放器内部的数字音频通常使用 I²S 协议进行通信。   

    2024年01月17日
    浏览(8)
  • STM32CubeMX+MDK通过I2S接口进行音频输入输出(全双工读写一个DMA回调)

    STM32CubeMX+MDK通过I2S接口进行音频输入输出(全双工读写一个DMA回调)

    目前有一个关于通过STM32F411CEUx的I2S总线接口控制SSS1700芯片进行音频输入输出的研究。 SSS1700 是具有片上振荡器的 3S 高度集成的USB音频控制器芯片 。 SSS1700 功能支持96 KHz 24 位采样率,带外部音频编解码器(24 位/96KHz I2S 输入和输出)并具有内置立体声16/24位ADC、立体声16/24位

    2024年04月12日
    浏览(43)
  • 物联网开发笔记(51)- 使用Micropython开发ESP32开发板之通过MAX98357 I2S音频模块播放音乐

    物联网开发笔记(51)- 使用Micropython开发ESP32开发板之通过MAX98357 I2S音频模块播放音乐

    一、目的         这一节我们学习如何使用我们的ESP32开发板来播放音乐。 二、环境         ESP32 + MAX98357 I2S音频模块 + Thonny IDE + 几根杜邦线 接线方法: 三、代码     代码1,播放wav格式文件:wav格式文件几百K,别太大ESP32存储空间有限。 音频格式转换网站: 在线转

    2024年02月16日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包