I2S/PCM board-level 约束及同步(latencyskewbitsync)
I2S/PCM是典型的低速串口,在两个方向上分别有两组信号,我们已soc为视角分为soc-adif和外设audio-codec。
那么adif输入:
sclk_i, ws_i, sdi
当然并不是三个输入信号同时有效,只有adif RX slave时,三个输入都会有效
adif输出:
sclk_o, ws_o, sdo
也只有adif TX master时,三个输出才会有效。
下面要解释两个问题
1.TX master和RX slave时说明 adif与codec怎么完成的bitsync;
2.TX slave和RX master时说明 怎么保证RX输出的ws/fs sclk到了TX端产生sdo之后,再到RX端用ws/fs sclk能够正确采样
其实第一个问题对应的时信号间的skew;第二个问题对应的时信号传输的latency。
首先我们给出一些参数的量级:
adif和codec的寄存器setup和hold时间都在 几个ns
adif和codec的工作时钟都是sclk的十几到上百倍
sclk(bitclk采样时钟)最大十几MHz,所以sclk的周期在100ns量级 【所有音频采样率及采样深度请见另一文章 TODO】
1.I2S/PCM 同步
I2S/PCM自带帧同步信号,对于I2S来说ws的下降沿就是帧起始;对于PCM来说fs的上升沿就是帧起始。
那么如何保证bit同步呢?不同于高速串行接口有复杂的bit同步电路,I2S/PCM的bit同步很简单,主要由以下几个机制来完成:
- 对信号组设置skew约束,skew都约束在5ns以下【见过约束为1ns,3ns的。这个skew阈值和工艺以及IO电压有关】约束包括soc端和codec端。-----见图1
- 用高频adifclk采样信号,并对信号进行adifclk打拍---调整相位
- sclk的上升沿改变信号,下降沿采样数据,这样有足够的采样窗口----见图4
设T(sclk) ,T(fs) 和 T(sdo)分别是TX master时 从adif TX到芯片IO的延迟时间,或者Rx slave时从芯片IO到adif RX的延迟时间。
其中对于I2S这种需要输出sclk+控制信号+data的接口,通常会有以下的延时要求
T(sclk) <= T(fs) <= T(sdo)------这种约束的前提就是setup、hold、Tco远小于sclk周期
当然如果采用sclk上升沿改变信号,下降沿采样信号的处理下,上面的约束可以不用设置。
下面就以数据从adif TX 到芯片IO这一段来分析时序:
NOTE:下图源端信号中 fs和sdo都是在上升沿改变,且与上升沿的delay很小,这个delay就是寄存器的内部延迟Tco,是符合实际情况的。
图 1
上图中看出T(sclk), T(fs)和T(sdi) 差别较大,在源端三个信号的关系是 用sclk上升沿采样fs和sdo数据,其中sdo第一个数据‘1’与fs有一拍间隔;而在IO处,用sclk采样fs和sdo时,会发现fs和sdo第一笔数据差了两拍,明显出现了错误,所以尽量约束信号在传输过程中的skew,理想情况下,三根信号skew为0,必然在收端是可以正确采样的。
图 2
图2显示了上升沿变换,上升沿采样的情况下 T(fs)< T(sclk) < T(sdo)的情况,虽然三则之间skew不大【只要T(sclk)>T(fs)+Tco】,就出现了fs和sdo第一笔数据差了2各sclk的情况。
其他不满足T(sclk) <= T(fs) <= T(sdo)的情况,也很容易出现时序错误,根因在于Tco太小,T(fs)和T(sdo)延迟小了就会被提前采样。
图 3
图3就给出了T(sclk) <= T(fs) <= T(sdo)情况下的时序图,明显看出各信号都在正确的沿被采样。
图 4
图4给出了上升沿源端改变信号,芯片IO处用下降沿采样的时序图,T(fs) > T(sdo),但任然能够正确的采样数据。而且可以看到相对于下降沿,采样窗口左右两边都大了很多。
2.I2S/PCM的板间latency
在TX slave 和Rx master的工作模式下,TX接收Rx输出的ws/fs和sclk信号并进行同步,这个同步的过程需要TX 两个adifclk时间,再加上沿检测只有变化后沿【即翻转后一个脉冲宽度的信号】又晚了一个adifclk,然后用ws/fs、sclk的变化后沿输出sdo,sdo经过板间延迟T(sdo),到达RX,而此时要用RX的ws/fs和sclk来正确采样sdo,这就要求3adifclk+T(sdo)不要超过一个sclk的周期,这个也可以画时序图来分析,这里不在赘述。
在实际的项目中由于sclk在100ns量级,adifclk在10ns~0.xns的量级,T(sdo)也在几十ns【不确定】的范围,所以是很容易达到的,有些项目就没有对latency设置约束。
如果sdo在RX master端和ws/fs间隔太远超过1个sclk,有没有设计上的手段来保证不影响音频接收?
这时RX会检测到错误,比如sdata的bit数左右声道不一致,或整帧的bit数和配置值不一样。这时上报错误,然后控制Rx端的ws/fs向后delay n个sclk,直到软件检测不到错误。
相关文章:
I2S/PCM board-level 约束及同步(latencyskewbitsync)
I2S/PCM是典型的低速串口,在两个方向上分别有两组信号,我们已soc为视角分为soc-adif和外设audio-codec。 那么adif输入: sclk_i, ws_i, sdi 当然并不是三个输入信号同时有效,只有adif RX slave时,三个输入都会有效…...
vue 富文本编辑器
安装 1、npm install wangeditor/editor --save 2、npm install wangeditor/editor-for-vue --save使用 .vue文件//展示<div style"border: 1px solid #ccc;width: 95%;"><!-- 工具栏 --><Toolbar style"border-bottom: 1px solid #ccc" …...
为什么说ChatGPT还不是搜索引擎的对手
一 前言 1950年,英国科学家图灵在一篇论文中预言,人类有可能创造出具有真正智能的机器。 著名的「图灵测试」就此诞生:如果一台机器能够与人类展开对话,而不被辨别出其机器身份,那么称这台机器具有智能。 也是从那时…...
2308C++协程流程
参考 #include <常用> #include <协程> #include "简异中.cpp" //用来中文定义的.元<类 T>构 同步{共针<T>值;同步(共针<T>p):值(p){输出<<"构建同步"<<行尾;//.8}同步(常 同步&s):值(s.值){输出<<&…...
C#实现稳定的ftp下载文件方法
当使用C#实现稳定的FTP下载文件的方法时,我们可以使用FtpWebRequest类来执行FTP操作,并根据需要添加错误处理和重试机制。下面是一个示例代码: using System; using System.IO; using System.Net;public class FTPDownloader {private const…...
八股文之计算机网络
TCP/IP 网络模型有哪几层 该模型用来解决不同设备间的进程通信,就需要网络通信,该模型就应运而生。首先是应用层,我们所接触的App都是在这一层实现的,当不同的设备需要通信时,就需要把数据发给传输层,传输…...
kotlin 比较 let apply
let 和 apply 是 Kotlin 标准库中的两个非常有用的函数,它们用于在代码中实现更简洁和可读的操作。它们通常在函数式编程和链式调用中使用,以简化代码并提高可维护性。下面是关于这两个函数的详细解释: let let 函数是一个作用域函数&#…...
springboot跨域踩坑笔记
事情是这样的,我在进行前后端联调的时候,发送了跨域拦截 马上在spring项目中创建一个CorsConfig类 package com.example.demo.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.an…...
基于STM32+FreeRTOS的四轴机械臂
目录 代码: 注释写的较少,但本文出现的代码都有注释,所以请直接在本文里看注释 项目概述: 一 准备阶段(都是些废话) 二 裸机测试功能 1.摇杆控制 接线: CubeMX配置: 代码 2…...
【C语言】三子棋游戏——超细教学
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将结合之前的知识来实现 三子棋游戏。 目录: 🌟思路框架:测试游戏 🌟…...
redux的介绍、安装、三大核心与执行流程
redux的介绍、安装、三大核心与执行流程 一、redux的基本介绍二、redux的安装三、redux核心概念3.1 action3.2 reducer3.3 store 四、Redux代码执行流程五、加减案例练习 一、redux的基本介绍 redux中文官网Redux 是 React 中最常用的状态管理工具(状态容器&#x…...
Redis 5环境搭建
一、环境搭建 如果是Centos8,yum 仓库中默认的 Redis版本就是5,直接yum install即可。如果是Centos7,yum 仓库中默认的 Redis版本是3系列,比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…...
stm32红绿灯源代码示例(附带Proteus电路图)
本代码不能直接用于红路灯,只是提供一个思路 #include "main.h" #include "gpio.h" void SystemClock_Config(void); void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENAB…...
Qt与电脑管家4
折线图: #ifndef LINE_CHART_H #define LINE_CHART_H#include <QWidget> #include <QPainter> #include "circle.h" class line_chart : public QWidget {Q_OBJECT public:explicit line_chart(QWidget *parent nullptr); protected:void pa…...
使用css美化gradio界面
基本方法 在默认的前端页面中使用检查工具确定要修改的部分的选择器名称,然后在block_css中对其修改,并在启动网页时传入参数:with gr.Blocks(cssblock_css, thememy_theme) as demo: 禁止修改下拉框文字 input.border-none.svelte-c0u3f0…...
Flink流批一体计算(13):PyFlink Tabel API之SQL DDL
1. TableEnvironment 创建 TableEnvironment from pyflink.table import Environmentsettings, TableEnvironment# create a streaming TableEnvironmentenv_settings Environmentsettings.in_streaming_mode()table_env TableEnvironment.create(env_settings)# or create…...
java笔试手写算法面试题大全含答案
1.统计一篇英文文章单词个数。 public class WordCounting { public static void main(String[] args) { try(FileReader fr new FileReader("a.txt")) { int counter 0; boolean state false; int currentChar; while((currentChar fr.read()) ! -1) { i…...
点云平面拟合和球面拟合
一、介绍 In this tutorial we learn how to use a RandomSampleConsensus with a plane model to obtain the cloud fitting to this model. 二、代码 #include <iostream> #include <thread> #include <pcl/point_types.h> #include <pcl/common/io.…...
部署问题集合(十九)linux设置Tomcat、Docker,以及使用脚本开机自启(亲测)
前言 因为不想每次启动虚拟机都要手动启动一遍这些东西,所以想要设置成开机自启的状态 设置Tomcat开机自启 创建service文件 vi /etc/systemd/system/tomcat.service添加如下内容,注意修改启动脚本和关闭脚本的地址 [Unit] DescriptionTomcat9068 A…...
视觉SLAM:一直在入门,如何能精通,CV领域的绝境长城,
目录 前言 福利:文末有chat-gpt纯分享,无魔法,无限制 1 什么是SLAM? 2 为什么用SLAM? 3 视觉SLAM怎么实现? 4 前端视觉里程计 5 后端优化 6 回环检测 7 地图构建 8 结语 前言 上周的组会上&…...
【报错】yarn --version Unrecognized option: --version Error...
文章目录 问题分析解决问题 在使用 npm install -g yarn 全局安装 yarn 后,查看yarn 的版本号,报错如下 PS D:\global-data-display> yarn --version Unrecognized option: --version Error: Could...
二叉搜索树的(查找、插入、删除)
一、二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 1、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值; 2、若它的右子树不为空,则右子树上所有节点的值都…...
电力虚拟仿真 | 高压电气试验VR教学系统
在科技进步的推动下,我们的教育方式也在发生着翻天覆地的变化。其中,虚拟现实(VR)技术的出现,为我们提供了一种全新的、富有沉浸感的学习和培训方式。特别是在电力行业领域,例如,电力系统的维护…...
innovus如何设置size only
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 给instance设置size only属性命令如下: dbset [dbGet top.inst.name aa/bb -p] .dontTouch sizeOk 给一个module设置size only需要foreach循环一下: foreach inst [dbGet top.…...
Java之继承详解二
3.7 方法重写 3.7.1 概念 方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。 3.7.2 使用场景与案例…...
国内常见的几款可视化Web组态软件
组态软件是一种用于控制和监控各种设备的软件,也是指在自动控制系统监控层一级的软件平台和开发环境。这类软件实际上也是一种通过灵活的组态方式,为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。通常用于工业控制,自动…...
通过 git上传到 gitee 仓库
介绍 Git是目前世界上最先进的分布式版本控制系统,有这么几个特点: 分布式 :是用来保存工程源代码历史状态的命令行工具。保存点 :保存点可以追溯源码中的文件,并能得到某个时间点上的整个工程项目额状态;…...
设置Windows主机的浏览器为wls2的默认浏览器
1. 准备工作 wsl是可以使用Windows主机上安装的exe程序,出于安全考虑,默认情况下改功能是无法使用。要使用的话,终端需要以管理员权限启动。 我这里以Windows Terminal为例,介绍如何默认使用管理员权限打开终端,具体…...
森林生物量(蓄积量)估算全流程
python森林生物量(蓄积量)估算全流程 一.哨兵2号获取/去云处理/提取参数1.1 影像处理与下载1.2 导入2A级产品1.3导入我们在第1步生成的云掩膜文件1.4.SNAP掩膜操作1.5采用gdal计算各类植被指数1.6 纹理特征参数提取 二.哨兵1号获取/处理/提取数据2.1 纹理…...
MySQL数据库概述
MySQL数据库概述 1 SQL SQL语句大小写不敏感。 SQL语句末尾应该使用分号结束。 1.1 SQL语句及相关操作示例 DDL:数据定义语言,负责数据库定义、数据库对象定义,由CREATE、ALTER与DROP三个语法所组成DML:数据操作语言ÿ…...
可以做哪方面的网站/搜索引擎优化seo的英文全称是
最近发现许多JMeter的使用用户在利用正则表达式提取器作为“关联”方法时,仍然对Java正则表达式的理解上有所偏差,导致很多时候属于“撞大运”式的进行不断试错来完成正确的提取器配置项设置,从而得到正确的关联结果。本文为大家重新梳理一下…...
做网站应该选择怎样的公司/百度网盘客服
我是泽国华都:已入职一家电商公司做数据分析相关的工作,日常的工作内容是:(1)梳理来自产品经理、运营、财务等部门的数据需求,就分析维度达成共识再展开工作。(2)Excel和SQL是日常工…...
小公司网站建设费用/seo搜索引擎优化报价
----拨号720错误解决记.txt---本来一直用ADSL拨号和手机GPRS拨号和电话线拨号好好的...后来,用了一断时间LAN,再用手机或ADSL/3G MODEM拨号时,都提示720错误..困扰了我半个月的时间...上网查一直没好的方法..重装了TCP/IP协议也不行. 删除KB893066、 KB911280、 KB913446 、KB9…...
哪个网站做h5好/电子商务说白了就是干什么的
基于微信小程序的食堂订餐点餐管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架管理前端使用vue,用户使用微信小程序的食堂订餐点餐小程序共分为三个角色:系统管理员、商家、用户 管理员角色包含以下功能: 首页展示、…...
正定县建设局 网站/推广资源seo
java解线性方程组 Java 解线性方程组 方法一:高斯消去法 import java.util.Scanner; public class Gauss { /*** 列主元高斯消去法*/ static double a[][]; static double b[]; static double x[]; static int n; static int n2; //记录换行的次数public static vo…...
企业网站源码java/百度竞价排名价格
MVPDagger2RxjavaRetrofit 快速实现框架 一个依赖解决所有问题 安卓 Ble 低功耗蓝牙快速开发框架 H-ble 几行代码快速进行 BLE 通信 Dagger2 入门实践 Dagger2 入门实践 急速开发系列——RxJava 实战技巧大全 这几天一直看《激荡三十年》,感觉非常不错。这篇文章本身…...