实用的嵌入式编码技巧:第三部分

每个触发器都有两个我们在风险方面违反的关键规格。“建立时间”是时钟到来之前输入数据必须稳定的最小纳秒数。“保持时间”告诉我们在时钟转换后保持数据存在多长时间。

这些规格因逻辑设备而异。有些可能需要数十纳秒的设置和/或保持时间;其他人则需要少一个数量级。

图9.1:建立和保持时间

如果我们倾向于编织,我们将尊重这些参数,并且触发器将始终是完全可预测的。但是,当区域同步时(例如,腕部以其自己的速度旋转,并且只要需要数据,该软件便会读取数据),这很可能会违反设置或保持时间。

假设触发器需要3纳秒的设置时间。我们的数据在该窗口内发生变化,可能在时钟转换之前翻转状态一纳秒。该设备将进入稳态,其输出确实变得非常奇怪。

通过违反规范,设备实际上不知道我们表示的是零还是一。它的输出不是逻辑状态,而是半电平(在数字规范之间),或者会振荡,在状态之间疯狂地切换。触发器是亚稳态的。

图9.2:亚稳态

这种疯狂不会持续很长时间。通常在几秒到50纳秒后,振荡衰减或半态消失,使输出保持有效的1或0。但是是哪一个?这是一个数字系统,我们期望一个为1,并将零为零。

输出是随机的。 那个,那个 您无法预测它将采用的级别。这肯定使设计可预测的数字系统变得困难!

硬件人员认为随机输出不是问题。由于输入几乎在时钟选通的同一时间发生变化,因此零或一是合理的。无论如何,如果我们只是在先发制人或落后,我们将获得不同的价值。从哲学上讲,谁知道我们测量的状态?这真的很重要吗?也许不影响EE,但这将在很大程度上影响我们的软件,我们将很快看到。

仅当时钟和数据几乎同时到达时才发生亚稳态。随着时钟频率的飙升,赔率增加。同样重要的因素是所使用的逻辑组件的类型:较慢的逻辑(如74HCxx)比较快的器件(例如74FCTxx)具有更宽的亚稳态窗口。

显然,以适当的速率,两个异步信号及时到位足以引起亚稳态的可能性很低,可测量,是的,很重要。在使用10 MHz时钟和10KHz数据速率的情况下,使用典型但并非十分快速的逻辑,亚稳态错误大约每分钟发生一次。尽管很少见,但没有可靠的系统可以承受该故障率。

经典的亚稳态修正使用串联的两个触发器。它的输出馈入第二个的数据输入。两者都使用相同的时钟输入。两个时钟后,第二个触发器的输出将是“正确的”,因为两个背对背发生的亚稳态事件的几率几乎为零。使用两个触发器,合理的数据速率误差相隔数百万甚至数十亿年,对于大多数系统来说已经足够了。

但是,“正确”意味着第二阶段的输出将无可挑剔:它没有振荡,也没有处于非法电压电平。该值处于两种法律状态的机会仍然相等。

固件,而不是硬件

据我所知,没有关于亚稳性如何影响软件的文献,但它对构建可靠的系统却构成了真正的威胁。

嵌入式开发工程师使用所述的两阶段触发器自鸣得意地解决了他们的亚稳性问题。它们的域是单个位的域,其输入几乎在时钟转换的同一时间改变。用这么狭义的思想思考,接受触发器产生的固有随机输出确实是合理的。

但是,我们的嵌入式开发工程师正在读取并行的I / O端口,每个端口可能都是8位宽。这意味着输入捕捉寄存器中有8个触发器,它们均由相同的时钟脉冲驱动。

让我们看看会发生什么。编码器从0xff变为0x100。这种小的差异可能只是角度的微小变化。我们要求在数据改变的几乎同一时间读取数据,我们的输入操作会选通捕捉寄存器的时钟,从而会破坏建立时间或保持时间。

每个输入位都会变化,寄存器中的每个触发器都将变为亚稳态。短时间后,振荡消失,但寄存器中的每个位都是随机的。尽管硬件人员可能耸耸肩并抱怨没有人知道正确的值,但是由于时钟的到来,一切都发生了变化,实际上数据大约是0xf表示0x100。例如,0x12的随机结果是荒谬的,是完全不可接受的,并且可能导致疯狂的系统行为。

数据从0xff变为0x100的情况是病理性的,因为每个位都立即更改。每当许多位更改时,系统都会面临相同的风险。0x0f至0x10。0x1f至0x20。不变的高位数据始终会正确锁存,但每个变化位都有风险。

为什么不使用多重触发器解决方案?串联连接两个输入捕捉寄存器,它们均由同一时钟驱动。尽管这将消除非法的逻辑状态和振荡,但第二级的输出也将是随机的。

一种选择是忽略亚稳态,并希望获得最好的结果。或使用建立时间/保持时间窗口非常窄的快速逻辑来减少故障几率。如果代码很少在输入中进行采样,则有可能将亚稳定性降低到几百万甚至数十亿的机会。建立安全关键系统?感觉很幸运?

可以构建一个同步器电路,该电路接收从处理器读取的请求,并将其与I / O设备的可用数据位组合在一起,并以数据OK信号响应返回到CPU,这是不平凡的,并且容易出错。

一种替代方法是对I / O设备使用不同的编码方案。例如,购买带有格雷码输出的编码器(如果可以找到的话)。格雷码是一种计数方案,其中数字之间只有一个位更改,如下所示:

0 000

1 001

2 011

3 010

4 110

5 111

6 101

7 100

只有当您的代码读取设备的速度比可能更改的速度快,并且更改以相当可预测的方式发生(例如递增计数)时,格雷码才有意义。那么,如果输入变为亚稳态,那么只有一位是错误的,那么读取之间的变化就不会超过一个位。结果仍然是合理的。

另一种解决方案是在捕获寄存器之前计算输入数据的奇偶校验或校验和。也将其锁存到寄存器中。如果有错误,请执行代码计算奇偶校验并将其与该读取进行比较,然后再进行一次读取。

尽管我已经讨论过添加输入捕获寄存器,但是请不要以为这是问题的根本原因。没有那个寄存器-如果您仅将异步输入直接输入到CPU中-很有可能会违反处理器的固有设置/保持时间。

没有免费的午餐,所有逻辑都有我们必须遵守的身体限制。有些设计永远不会出现亚稳性问题。它总是防止违反设置或保持时间,而这又源于不良的设计或异步输入。

当时钟和数据在时间上不相关时,到目前为止,所有讨论都围绕异步输入展开。警惕任何不属于处理器时钟的东西。中断是问题的根源。

如果是由某人按下按钮引起的,请确保中断本身以及矢量生成逻辑不会违反处理器的建立和保持时间。

但是,在计算机系统中,大多数事情确实是同步发生的。如果您正在读取一个以CPU时钟为基础的计时器,则它与代码本身是同步的。从亚稳定性的角度来看,这是完全安全的。

但是,不良的设计会困扰任何电子系统。每个逻辑组件都需要花费时间来传播数据。当信号经过许多设备时,延迟可能会显着增加。如果数据随后进行分配,则延迟很可能导致输入与时钟同时转换。即时亚稳。

但是,嵌入式开发工程师非常小心,避免出现这些情况。请注意FPGA和其他组件的延迟,延迟取决于软件如何路由设备。此外,当锁存数据或为计数器计时时,通过使用错误的时钟沿不难引起亚稳性问题。拾取使设备有时间在读取之前稳定的边缘。

那模拟输入呢?将一个12位A / D转换器连接到两个8位端口,我们似乎会遇到类似的问题:模拟数据会遍历整个状态,在读取两个端口的过程中会发生变化。

但是,不需要输入捕获寄存器,因为转换器本身通常包括一个“采样和保持”模块,该模块在A / D数字化时存储模拟信号。然后,大多数A / D都会存储数字值,直到我们开始下一次转换为止。

我们所有使用的其他输入都会遇到这个问题。假设机器人使用10位编码器监视腕关节的角度位置,当腕部旋转时,编码器会发回10位宽的二进制代码,以表示关节的当前位置。一个8位处理器需要两个不同的I / O指令(两个字节宽的读取)才能获取数据。无论计算机速度有多快,读取之间的时间间隔都是有限的,在此期间编码器数据可能会更改。

手腕在旋转。“ get_position”例程从位置数据的下部读取0xff。然后,在下一条指令之前,编码器将翻转到0x100。“ get_position”读取数据的大部分(现在为0x1)并返回0x1ff的位置,显然是错误的,甚至可能是不可能的。

这是一个常见的问题,需要处理两轴控制器的输入,如果在读取过程中硬件继续移动,则X和Ydata会略有不相关,可能无法得到结果。

一位朋友追踪了一种罕见的自动驾驶仪故障,该故障是代码读取磁通门罗盘的方式,该罗盘的输出是一对相关的正交信号。在船只继续移动的同时,在不同的时间读取它们,无法获得航向数据。嵌入式开发工程师

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纽禄美卡Neuromeka亮相美国FABTECH,展示用于焊接的3D视觉协作机器人

原创 | 文 BFT机器人 纽禄美卡Neuromeka公司在由美国精密成型协会、美国焊接协会、化工涂料协会等5大协会举办的美国金属加工及焊接展览会FABTECH上精彩亮相。这家总部位于韩国首尔的公司成立于2013年,是机器人解决方案领域的领先供应商,致力于提高各种…

Spark 【分区与并行度】

RDD 并行度和分区 SparkConf setMaster("local[*]") 我们在创建 SparkContext 对象时通常会指定 SparkConf 参数,它包含了我们运行时的配置信息。如果我们的 setMaster 中的参数是 "local[*]" 时,通常代表使用的CPU核数为当前环境…

setState是同步还是异步的?

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ 以下内容针对React v18以下版本。 前言 setState到底是同步还是异步?很多人可能面试都被问到过,就好比这道代码输出题&#xff1…

零售超市如何应对消费者需求?非常全面!

随着科技的飞速发展和消费者期望的不断演变,零售行业正经历着一场深刻的革命。传统零售模式逐渐被新零售模式所取代,而其中一个备受关注的元素是自动售货机。 自动售货机不仅在商场、车站和办公楼等高流量地点迅速扩张,还在重新定义我们如何购…

基于SSM的北京集联软件科技有限公司信息管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Meta | 对比解码:进一步提升LLM推理能力

深度学习自然语言处理 原创作者:wkk 为了改进LLM的推理能力,University of California联合Meta AI实验室提出将Contrastive Decoding应用于多种任务的LLM方法。实验表明,所提方法能有效改进LLM的推理能力。让我们走进论文一探究竟吧&#xff…

“百华多功能休闲鞋”走进CCTV移动传媒真购好物

激动的心, 颤抖的手。 百华多功能休闲鞋福利来袭! 坚守匠心之道, 安全是我们的使命。 百华入选产品将在CCTV移动传媒 《真购好物》直播。 9月21日晚10点30分,经过层层选拔,山东百华鞋业有限公司的“百华多功能休…

网络协议学习地图分享

最近在回顾网络知识点的时候,发现华为数通有关报文格式及网络协议地图神仙网站,这里涵盖了各个协议层及每个协议层对应的协议内容,最人性的化的一点是点击每个单独的协议可以跳转到该协议详细报文格式页面,有对应的说明和解释&…

linux下链接

linux下链接用法 ln链接格式与介绍 linux下链接用法一、链接的使用格式二、链接的介绍 一、链接的使用格式 链接: 格式: ln 源文件 链接文件 硬链接 ln -s 源文件 链接文件 软连接 硬链接文件占磁盘空间 但是删除源文件不会影响硬链接文件 软链接文件不…

Android 应用上线注意事项

将 Android 应用上线到 Google Play 商店需要仔细注意一系列问题,以确保应用的质量、安全性和用户体验。以下是一些在 Android 应用上线过程中需要注意的关键问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司&…

介绍Spring Security框架,以及如何使用它实现应用程序的安全性

文章目录 什么是 Spring Security?Spring Security 的工作原理如何使用 Spring Security 构建安全的应用程序步骤 1:添加 Spring Security 依赖步骤 2:配置 Spring Security步骤 3:配置安全性规则步骤 4:创建用户和角色…

【Linux系统编程】通过系统调用获取进程标识符 及 创建子进程(fork)

文章目录 1. 通过系统调用获取进程标示符(PID)1.1 进程id(PID)1.2 父进程id(PPID) 2. bash也是一个进程3. 通过系统调用创建进程-fork初识3.1 批量化注释3.2 取消注释3.3 fork创建子进程3.4 fork的返回值3.…

目标检测算法改进系列之Neck添加渐近特征金字塔网络(AFPN模块)

渐近特征金字塔网络(AFPN模块) 在目标检测任务中,多尺度特征对具有尺度差异的目标进行编码具有重要意义。多尺度特征提取的常用策略是采用经典的自顶向下和自底向上的特征金字塔网络。 然而,这些方法存在特征信息丢失或退化的问…

十四、流式编程(2)

本章概要 中间操作 跟踪和调试流元素排序移除元素应用函数到元素在 map() 中组合流 中间操作 中间操作用于从一个流中获取对象,并将对象作为另一个流从后端输出,以连接到其他操作。 跟踪和调试 peek() 操作的目的是帮助调试。它允许你无修改地查看…

Maven3.6.1下载和详细配置

1.下载maven 说明:以下载maven3.6.1为例 1.1网址 Maven – Welcome to Apache Maven 1.2点击下载 1.3点击Maven 3 archives 1.4 点击相应的版本 1.5 点击binaries下载 说明:binaries是二进制的意思 1.6点击zip格式 1.7 蓝奏云获取 说明&#xff1a…

gateway之断言的使用详解

文章目录 gateway产生的背景,为什么要是用gateway什么是网关gateway 带来的好处功能特征gateway在项目中使用的依赖 什么是断言断言分类内置自定义示例 断言和过滤器的不同 gateway产生的背景,为什么要是用gateway 一个系统会被拆分为多个微服务&#x…

软考 -- 计算机学习(2)

文章目录 一、安全性知识1.1 信息安全和信息系统安全1.2 信息安全技术1.3 网络安全技术 二、多媒体技术三、软件工程基础知识3.1 信息系统生命周期3.2 软件过程模型3.3 信息系统开发方法3.4 系统分析和设计概述3.5 结构化开发方法3.6 系统运行与维护 四、项目管理4.1 进度管理4…

说说hashCode() 和 equals() 之间的关系?

每天一道面试题,陪你突击金九银十! 上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于“hashCode() 和 equals() 之间的关系?”的面试题,本篇来解析一下这道基础面试题。 先祭一…

ESP-IDF学习——1.环境安装与hello-world

ESP-IDF学习——1.环境安装与hello-world 0.前言一、环境搭建1.官方IDE工具2.vscode图形化配置 二、示例工程三、自定义工程四、点灯五、总结 0.前言 最近在学习freertos,但由于买的书还没到,所以先捣鼓捣鼓ESP-IDF,因为这个比Arduino更接近底…

『贪吃蛇』AI 算法简易实现(中秋特别版)

前言 一年一度的中秋节就快到了,平台也有各种各样的中秋发文活动,正在翻阅时偶然间我看到了这篇文章:《兔饼大作战》:吃月饼、见月亮,还能咬自己?| 欢庆中秋特制版 - 掘金 (juejin.cn) 大家肯定比较熟悉了…