HDMI20协议解析_Audio_Sample

news2024/11/15 13:47:43

HDMI20协议解析_Audio_Sample


1.版本说明

日期作者版本说明
202409XX风释雪初始版本

2.概述

当通过HDMI传输音频信号时,Audio_Sample是必须要传输的数据包之一;
通过前端硬件或软件收到PCM原始音频数据后,需要通过Audio_Sample packet发送给sink端,
sink端收到后,结合协议解析出原始PCM音频数据,用来播放声音;
同时(重点),该协议还会按照IEC-60958打包传输通道状态信息,该信息包含音频采样位宽,
音频采样率,通道数量等信息,非常重要!!


3.目标

FPGA 实现 HDMI2.0 TX/RX功能,生成或解析对应的Audio Sample数据包,用于传输双通道立体声


4.协议解析

  • 协议分类

  • 在这里插入图片描述

  • 协议格式

  • 在这里插入图片描述


5.参数分析

  • layout

  • 在这里插入图片描述

  • 通常 HDMI只传输2个通道,因此 layout = 0;

  • sample_present.sp[3:0] : 有效通道使能bit,当传输2个通道时,4’b0001

  • sample_flat.sp[3:0] : 固定 4’b0000

  • 在这里插入图片描述

  • B[3:0] : 音频帧起始状态,根据IEC-60958, 每一帧包含192个subframe,计数器0-191, 当等于0时,B[x] = 1

B.X [4 fields, 1 bit each] B.X =1 if Subpacket X contains the first frame in a 192
frame IEC 60958 Channel Status block; B.X = 0 otherwise
备注:需要先理解 IEC-60958
  • L/R 左右声道数据
  • P/C/U/V
    P : 校验
    U : 用户数据,固定 0
    V : 固定 0
    C : 状态信息bit,参考IEC-60958,该信息包含音频采样位宽,音频采样率,通道数量等信息,非常重要!!

6.IEC-60958

  • 参考 https://blog.csdn.net/luckywang1103/article/details/88886810 (感谢分享)

  • 参考 https://www.cnblogs.com/fellow1988/p/6445489.html (感谢分享)

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 总结 :

    一个block,共 192 Frames, 一个Frames等于2个(左+右)subframe,每个subframe代表一个声道的音频数据+V/U/C/P+其他数据(不关心)
    因此, 一个block,可以传输 192个左右声道数据,加192bit左右通道信息数据

7.C 通道信息

  • 每个声道的通道信息共 192 bit, 每个audio sample packet 只传输1个bit,共需要192次才能传输完;
  • C 通道信息包含 消费级 和 专业级, 日常使用为消费级;
  • 在这里插入图片描述
status[0] : PRO = 1'b0 消费级
status[1] : AUDIO = 1'b0
status[2] : Copy = 1'b0
status[5:3] : Emphasis = 3'b000
status[7:6] : Mode = 2'b00
status[15:8] : Category Code = 8'b10000000
status[19:16] : Source Num = 4'b0000
status[23:20] : Channel Num = 4'b0001 (Left) 4'b0010 (Right)
status[27:24] : FS = 4'b0000(44.1K) 4'b1000(88.2K) 4'b1100(176.4K) 4'b0010 (48K) 4'b1010 (96K) 4'b1110 (192K)
status[29:28] : Clock Acc = 2'b00
status[32] : Word Max = 1'b0  Max word length is 20 bits , Word Max = 1'b1  Max word length is 24 bits,
status[35:33] :  Word Length = IF(Word Max == 1'b0) : 3'b001(16bits), 3'b010(18bits) 3'b100(19bits) 3'b101(20bits) 3'b110(17bits)
-----------------Word Length = IF(Word Max == 1'b1) : 3'b001(20bits), 3'b010(22bits) 3'b100(23bits) 3'b101(24bits) 3'b110(21bits)

8.P 校验

    P = ^ {C, U, V, DATA[23:0]}

9.软件实现

// ch1
wire           [24                      -1 : 0] ch1_data                    ;
wire                                            ch1_c                       ; // 0 not use 1 use
wire                                            ch1_u                       ; // 0 not use 1 use
wire                                            ch1_v                       ; // 0 valid 1 no valid
wire                                            ch1_p                       ;
// ch2
wire           [24                      -1 : 0] ch2_data                    ;
wire                                            ch2_c                       ; // 0 not use 1 use
wire                                            ch2_u                       ; // 0 not use 1 use
wire                                            ch2_v                       ; // 0 valid 1 no valid
wire                                            ch2_p                       ;

reg            [192                    - 1 : 0] status_l                    = 0;
reg            [192                    - 1 : 0] status_r                    = 0;

reg            [8                      - 1 : 0] cnt                         = 0;

always @(posedge clk) begin
    status_l[0]      <= 1'b0;
    status_l[1]      <= 1'b0;
    status_l[2]      <= 1'b0;
    status_l[5:3]    <= 3'b000;
    status_l[7:6]    <= 2'b00;
    status_l[15:8]   <= 8'b10000000;
    status_l[19:16]  <= 4'b0000;
    status_l[23:20]  <= 4'b0001;
    status_l[27:24]  <= (aud_fs == `ARG_AUD_44_1KFS) ? 4'b0000 : (aud_fs == `ARG_AUD_48KFS) ? 4'b0010 : 4'b0010 /* (48K) */;
    status_l[29:28]  <= 2'b00;
    status_l[31:30]  <= 2'b00;
    status_l[32]     <= 1'd1;
    status_l[35:33]  <= (aud_bit == `ARG_AUD_16BIT) ? 3'b001 : (aud_bit == `ARG_AUD_24BIT) ? 3'b101 : 3'b101 /* (24bits) */;
    status_l[191:36] <= 156'd0;

    status_r[0]      <= 1'b0;
    status_r[1]      <= 1'b0;
    status_r[2]      <= 1'b0;
    status_r[5:3]    <= 3'b000;
    status_r[7:6]    <= 2'b00;
    status_r[15:8]   <= 8'b10000000;
    status_r[19:16]  <= 4'b0000;
    status_r[23:20]  <= 4'b0010;
    status_r[27:24]  <= (aud_fs == `ARG_AUD_44_1KFS) ? 4'b0000 : (aud_fs == `ARG_AUD_48KFS) ? 4'b0010 : 4'b0010 /* (48K) */;
    status_r[29:28]  <= 2'b00;
    status_r[31:30]  <= 2'b00;
    status_r[32]     <= 1'd1;
    status_r[35:33]  <= (aud_bit == `ARG_AUD_16BIT) ? 3'b001 : (aud_bit == `ARG_AUD_24BIT) ? 3'b101 : 3'b101 /* (24bits) */;
    status_r[191:36] <= 156'd0;
end

assign {ch2_data, ch1_data} = aud_data;

assign ch1_c = status_l[cnt];
assign ch1_u = 1'd0;
assign ch1_v = 1'd0;
assign ch1_p = (^ch1_data[23:0]) ^ ch1_c ^ ch1_u ^ ch1_v;

assign ch2_c = status_r[cnt];
assign ch2_u = 1'd0;
assign ch2_v = 1'd0;
assign ch2_p = (^ch2_data[23:0]) ^ ch2_c ^ ch2_u ^ ch2_v;


5.参考文档

  • EIA-CEA-861-D
  • HDMI 1.4(1.4b/2.0)
  • IEC-60958-1
  • IEC-60958-3-2003

在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟着B战学习JAVA面试八股文

学习链接&#xff1a;https://www.bilibili.com/video/BV1gm411S7EX/?spm_id_from333.337.search-card.all.click&vd_sourceefbaa07876b231ae3225ba8999116807 创建线程的几种方式&#xff1f; 继承Thread类实现Runnable接口实现Callable接口通过线程池来创建线程 为什么…

fiddler抓包09_过滤站点请求

课程大纲 1、 界面 Fiddler列表默认显示所有请求&#xff0c;可以设置过滤&#xff0c;按照规则只显示指定的请求。 界面介绍&#xff1a; “Use Filters”&#xff1a;过滤功能开关。勾选&#xff0c;开启过滤&#xff1b;反之不开启。 “Hosts”&#xff1a;根据站点&#xf…

免费ppt模板哪里找?职场必备这些利器

一眨眼&#xff0c;9月份的尾声渐近&#xff0c;无论是学生还是职场人士&#xff0c;都开始准备着新一轮的演讲和报告。在这个忙碌的时期&#xff0c;一份精美的PPT模板能够大幅提升你的工作效率&#xff0c;让你的演示更加引人入胜。 不用担心高昂的版权费用&#xff0c;市场…

LPDDR4芯片学习(一)——基础知识与引脚定义

一、基础知识 01 dram基本存储单元 当需要将一位数据存储到DRAM中时&#xff0c;晶体管会充电或放电电容。充电的电容表示逻辑高&#xff08;1&#xff09;&#xff0c;放电的电容表示逻辑低&#xff08;0&#xff09;。由于电容会随着时间泄漏电荷&#xff0c;因此需要定期刷…

接口测试Postman关联,断言,前置,参数化用法

一、Postman下载 我们直接搜索Postman官网下载即可 Postman API Platformhttps://www.postman.com/ 二、使用 下载安装完成后我们需要登录注册&#xff0c;按照Postman的指示进行注册登录&#xff0c;不登陆可能有些功能无法使用 登陆完成我们就可以开始对接口进行测试了 …

用于体积医学图像分割的跨视角差异依赖网络|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Cross-view discrepancy-dependency network for volumetric medical image segmentation 用于体积医学图像分割的跨视角差异依赖网络 01 文献速递介绍 医学图像分割的目标是通过为每个像素分配语义类别&#xff0c;从原始图像中描绘出受试者的解剖结构&#x…

Python项目的质量保证

首先来打个不恰当比喻&#xff0c;你在市场上购买苹果时&#xff0c;挑选最好的苹果相当简单。你可以通过触摸它们来挑选&#xff0c;选择最好的颜色、成熟度和没有可见的伤疤。这个过程称为质量控制——你只选择满足你要求的优质产品。当分拣站里有大量苹果时&#xff0c;事情…

利用F.interpolate()函数进行插值操作

函数简介 功能&#xff1a; 利用插值方法&#xff0c;对输入的张量数组进行上\下采样操作&#xff0c;换句话说就是科学合理地改变数组的尺寸大小&#xff0c;尽量保持数据完整。 torch.nn.functional.interpolate(input, sizeNone, scale_factorNone, modenearest, align_c…

Node.JS有什么用?给谁用?怎么学?通俗易懂,超级详细!

现在&#xff0c;nodejs主要是前端的小伙伴来用的。前端小伙伴也不用说去怎么学node&#xff0c;而是把node当做是一个环境。我们利用这个环境去搭建上层的一些应用&#xff0c;去使用一些工具。就像学习Windows一样&#xff0c;我们没有必要深入了解Windows的每一个细节&#…

【解密!】终端安全管理软件究竟是什么?一文给您揭晓答案!

在数字化时代&#xff0c;随着企业信息化程度的不断提升&#xff0c;网络安全问题日益凸显。 终端作为网络连接的最后一环&#xff0c;其安全性直接关系到整个网络体系的安全与稳定。 那么&#xff0c;终端安全管理软件究竟是什么呢&#xff1f;本文将为您深入解析这一重要话…

Image matting入门

概念 matting就是扣图&#xff0c;本质是预测前景与背景&#xff0c;将前景扣出来。主要应用于影视行业&#xff0c;如拍电影绿幕扣图。和图像分割的区别在于多一个模糊地带&#xff0c;非01分类&#xff0c;变成了预测alpha通道。前景F&#xff0c;背景B&#xff0c;图像I可以…

数据结构与算法——Java实现 11.习题——有序链表去重

目录 82. 删除排序链表中的重复元素 II 方法1 方法2 要知道&#xff0c;每一颗钻石在被发现前&#xff0c;都要经受埋藏尘埃的寂寞时光 —— 24.9.23 82. 删除排序链表中的重复元素 II 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0…

ActiveMQ 的传输协议机制

ActiveMQ 通过网络连接器这种连接机制来实现客户端与服务端之间的通信&#xff0c;ActiveMQ支持的传输协议在activeMQ 安装目录的 conf/activemq.xml中的<transportConnectors>标签之内。 ActiveMQ 支持的 client 端和 broker 端的通讯协议有&#xff1a;TCP、NIO、UDP、…

SpringBoot框架下的客户管理策略

1 绪论 1.1研究背景 随着网络不断的普及发展&#xff0c;企业客户管理系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从员工的实际需求出发&#xff0c;通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、行业类型管理、项目信息管理、…

Vue(16)——Vue3.3新特性

defineOptions 在 Vue 3.3 之前&#xff0c;如果需要在 <script setup> 中设置组件名&#xff0c;通常需要在额外的 <script> 标签中使用 Options API 进行配置。defineOptions 是 Vue 3.3 版本中引入的一个宏&#xff08;macro&#xff09;&#xff0c;它主要用于…

Oracle数据库中设置账户密码、创建新用户以及授权操作详解

目录 背景: 1.使用命令行方式进入控制台&#xff1a; 2. 连接Oracle数据库 3.修改Oracle数据库管理员的密码 4. 测试密码修改是否成功 5.创建Oracle数据库中的新用户、设置密码并授权 背景: 最近我安装了Oracle数据库&#xff0c;记录一下使用SQL命令来完成迹象关键操作…

Rust格式化输出宏

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 我们编写程序的目的就是对输入进行处理&#xff0c;然后将处理结果反馈给用户&#…

react组件入门

react应用程序就是由一个个组件搭建而成。组件有类组件和函数组件两种。 我们之前使用create-react-app创建了app&#xff0c;src下放的就是我们应用的源代码&#xff0c;我们基于这些已生成的文件&#xff0c;来学习和验证组件。 类组件 这里我们创建PostList.js更改这个ap…

C++ bitset(位图)的介绍和使用

文章目录 一、bitset的介绍1. 位图的引入2. 位图的概念3. 位图的应用场景 二、bitset的使用1. 定义方式2. 成员函数3. 运算符重载 一、bitset的介绍 1. 位图的引入 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是…

关于TrustedInstaller权限

前言 我们在在删除某些文件时会发现权限不够的情况&#xff0c;那是因为自从 Windows Vista 以来&#xff0c;为了提升安全性&#xff0c;微软对于权限的把控越来越紧。为了对抗恶意软件随意修改系统文件&#xff0c;Trustedinstaller 应运而生。 各权限之间的关系 普通人:Us…