39、异步数据采集:挑战与解决方案

异步数据采集:挑战与解决方案

在数字系统中,与外部世界交互时处理异步输入是一项常见且具有挑战性的任务。由于外部事件相对于系统内部操作是随机发生的,因此同步问题成为了数字系统设计中不可忽视的一部分。

1. 异步数据采集的动机

大多数与外部世界交互的数字系统都必须处理异步输入。例如,曲轴角度传感器会产生脉冲序列,而不管处理这些脉冲的电子发动机管理单元的运行状态如何。同步问题不仅局限于机电接口,在相互独立的电子系统交互时也会出现,即使每个系统都以严格同步的方式运行。

历史上有一个例子能很好地说明处理异步输入信号的困难。在1963年,一个电子工程师团队为生物研究人员设计了一台计算机,用于从实验室设备收集数据。为了根据外部信号的二进制状态有条件地跳过一条指令,他们设计了一种机制。然而,在监测计算机运行时,他们发现外部信号被断言后,下一条指令有时会从错误的地址获取,导致计算机失去对程序执行的控制。后来,他们插入了一个同步触发器,虽然改进后的设计表现更好,但仍会偶尔出现跳转到意外内存位置的情况。这个案例暴露了数据不一致和同步器亚稳态这两种故障机制。

2. 向量采集的数据一致性

当两个或更多的电线一起形成数据、地址、控制或状态字等信息,跨越时钟边界(分隔两个时钟域的假想线)时,就涉及到向量采集。

2.1 普通位并行同步

在数据字通过w条并行线跨越时钟边界,然后在由w个触发器组成的寄存器中与接收时钟ClkQ同步的情况下,由于实际存在的各种不完善因素,如不匹配的门延迟、不同的负载、不同的布线、不等的布局寄生参数、时钟偏移、PTV变化、OCV和串扰等,当总线采用新值时,一些位会比其他位先切换。如果这种情况发生在有效时钟沿附近,寄存器必然会存储一个混乱的数据模式,将旧位和新位任意混合。

这种数据混乱对电路操作的影响因情况而异,可能从良性故障到致命灾难不等,具体如下:
- 一个周期的数据错误,然后被正确值覆盖。
- 持续几个时钟周期的间歇性干扰(例如在滤波器中)。
- 超出合法范围的值(例如,如果数据是互补对、采用单热编码或以其他冗余格式编码)。
- 有限状态机(FSM)偏转到未计划的状态。
- 有限状态机(FSM)陷入锁定状态。
- 地址计数器指向错误的内存位置。

以下是一个数字音频数据的警告示例:
| 样本 | 十进制 | 相对值 | 二进制补码 |
| ---- | ---- | ---- | ---- |
| s(t) (正确) | +47 | +0.0014 | 0000 0000 0010 1111 |
| s(t + 1) (正确) | -116 | -0.0035 | 1111 1111 1000 1100 |
| 最大混合 | +32 687 | +0.9976 | 0111 1111 1010 1111 |
| 随机结果 | +5 388 | +0.1644 | 0001 0101 0000 1100 |
| 最小混合 | -32 756 | -0.9997 | 1000 0000 0000 1100 |

由此可以得出结论:通过并行线跨越时钟边界的数据不能仅借助并行寄存器进行同步,否则数据可能会混乱并影响下游电路。

2.2 单位距离编码

如果两个数据字的汉明距离为1或更小,那么将它们混合得到的任何模式必然与这两个字中的一个匹配。因此,通过采用单位距离编码可以解决一致性问题,但前提是数据每次在任何方向上的变化不超过一步。单位距离编码包括著名的格雷码(2w)和Glixon、O’Brien、Tompkins以及反射余3码(二进制编码十进制(BCD))。

例如,一个数字音频应用的采样率转换器IC需要实时跟踪两个采样频率的比率。为了避免时钟计数混乱对最终音频信号的关键影响,他们让时钟计数数据以格雷码的形式跨越时钟边界,从而消除了数据混乱。

以下是时钟计数的二进制和格雷码编码示例:
| 时钟计数 | 十进制(二进制) | 十进制(格雷码) |
| ---- | ---- | ---- |
| c(t) | +47 (0010 1111) | +47 (0011 1000) |
| c(t + 1) | +48 (0011 0000) | +48 (0010 1000) |
| 最大混合 | +63 (0011 1111) | +48 (0010 1000) |
| 最小混合 | +32 (0010 0000) | +47 (0011 1000) |

2.3 抑制混乱的数据模式

这种方法的思路是在接收端比较后续的数据字,以检测并忽略瞬态。如果检测到任何不匹配,数据将被声明为损坏并被丢弃,同步器将输出与前一个周期相同的值。只要输入数据能在一个时钟周期内稳定下来,像图中电路那样仅比较两个字就足够了。为了避免数据丢失,任何数据项必须至少连续正确采样两次,这意味着可能需要多达三个时钟间隔,新的数据项才能在同步器输出端显示出来。另一种相关但更繁琐的方法是使用错误检测编码来确定何时应忽略新获取的数据字。

2.4 握手协议

握手协议与前面的方法不同,它可以防止混乱的数据进入接收电路。其基本思想是避免在数据向量可能变化时对其进行采样,而是通过握手协议来协调数据的更新和采样,该协议涉及数据的产生和消费子系统。

完整的握手协议本质上是对称的,需要两条控制线路,分别称为请求Req和确认Ack,它们的方向相反。握手协议有多种变体,下面介绍两种重要的协议:
- NRZ或两相握手协议 :在第一次数据传输开始前,两条控制线路都处于逻辑0。当生产者准备好一个新的数据字后,将其存储在输出寄存器中,并通过切换Req线路通知消费者数据向量已稳定到新的有效状态,并请求消费者接收该数据项。生产者必须保持这个状态,直到消费者确认数据已接收。当消费者安全地获取了该数据项并准备好接受另一个数据项时,会切换Ack线路通知生产者。每次数据传输操作涉及两条控制线路上各一个事件,因此非归零(NRZ)协议也被称为两相、两冲程和过渡协议。
- RZ或四相握手协议 :与NRZ协议不同,RZ协议在任何两次连续的传输操作之间,控制线路会恢复到初始值。这种协议基于电平信号,涉及两个额外的事件,因此也被称为四相、四冲程和电平协议。虽然在相同的时钟频率下,RZ协议的数据速率是NRZ协议的一半,但由于硬件相对简单且易于理解,因此更为常见。不过,额外的两个阶段会增加延迟。

无论是哪种信号方案,握手协议都确保数据向量只在电线保持稳定和一致状态时进行采样。同步的需求以及亚稳态的风险被限制在两个标量控制信号上,无论数据字有多宽,通常使用两级同步器。完整的握手协议独立于所涉及子系统的相对运行速度,它可以防止数据丢失,将同步限制在两条控制线路上,并使通信子系统的设计在很大程度上相互独立。

下面是一个简化的握手协议流程说明:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(生产者准备数据):::process --> B(切换Req线路):::process
    B --> C(消费者接收数据请求):::process
    C --> D(消费者处理数据):::process
    D --> E(切换Ack线路):::process
    E --> F(生产者释放数据):::process

然而,完整的握手协议要求所涉及的两个子系统都具有可暂停性,即它们必须能够在必要时无限期地暂停数据生产和消费活动,但这并不总是可行的。

2.5 部分握手协议

当数字数据源以固定采样率运行时,例如A/D转换器作为音频样本的生产者,这种数据源自发工作,不需要也不关心协议,输入终端Ack变得毫无意义,因此电路和协议变得不对称。固定速率的生产者不可暂停,这意味着它不会等待,从而迫使对方必须在新数据项可用之前及时完成数据处理,否则数据项可能会丢失。部分握手协议依赖于对参与方响应时间的假设,当这些假设发生变化时,协议就容易出现故障。

例如,在特定的例子中,Sec+必须在Val+之前发生,这对生产者和消费者的时钟速率和延迟的相互关系施加了限制。如果将现有设计移植到新技术、在不同上下文中重用部分设计或应用动态电压和/或频率缩放,都可能挑战这些假设。而完整的握手协议则不受频率和运行速度的影响,因为它不做任何假设。

2.6 FIFO同步器

FIFO同步器的思路是在两个时钟域之间插入一个先进先出(FIFO)队列,写入操作在一个域中进行,读取操作在另一个域中进行。需要注意的是,跟踪FIFO的填充级别比同步FIFO(读写指针属于同一个时钟域)更棘手,FIFO同步器属于异步电路设计。

一种经过验证的架构是使用双端口RAM作为循环缓冲区,由位于生产者和消费者域中的读指针和写指针进行操作。实际上,同步的是内存指针,而不是数据本身。

产生Full和Empty标志需要进一步解释。由于在循环缓冲区中,满和空的条件都由读写计数器指向相同的地址来标识,因此需要额外的信息来区分这两种情况。常见的方法是在地址指针前添加一个额外的数字,这个新的最高有效位(MSB)仅用于比较指针,而不是内存地址总线的一部分。

例如,如果缓冲区容量为2v×w位,那么指针包括位(v, v - 1, …, 1, 0),其中(v - 1, …, 1, 0)实际用于访问内存。使用格雷码可以确保指针向量在跨越时钟边界时不会混乱。空条件为WrPtr = RdPtr,满条件为WrPtr(i) = RdPtr(i)(i = v和i = v - 1)且WrPtr(i) ≠ RdPtr(i)(所有其他位i = v - 2, …, 1, 0)。

然而,简单地使用v + 1位指针的低v位(v - 1, …, 1, 0)来寻址内存对于格雷码是行不通的,因为截断MSB不会得到v位的格雷码,这会导致一些数据字被重复,而另一些数据字丢失。解决方案之一是从v + 1位的格雷计数器开始,使用异或操作将其MSB和第二MSB组合成v位代码的MSB。图中所示的方法是使用一个组合计数器,成对产生二进制和格雷码,前者用于访问内存,后者用于指针比较。

与握手协议相比,FIFO同步器在延迟和电路复杂度方面成本更高,但它的优势在于能够处理暂时不相等的生产和消费速率,其缓冲长度v决定了可调节的范围。不过,生产者必须遵守“满”标志,绝不能试图使队列溢出,消费者也是如此。设计师有两种选择:
- 生产者和消费者必须在耗尽缓冲区长度之前收敛到相同的数据速率,例如通过使数据生产和消费依赖于额外的“几乎满”和“几乎空”标志。
- 生产者或消费者可以确保始终比另一个运行得更快,在这种情况下,较慢的一方必须能够使较快的一方暂停。

FIFO同步器受欢迎的原因之一是它们可以作为虚拟和DesignWare组件使用。此外,即使在由同一时钟驱动的主要构建块之间,同步FIFO队列也可用于接口。

异步数据采集:挑战与解决方案(续)

3. 异步数据采集方法总结与对比

为了更清晰地了解各种异步数据采集方法的特点和适用场景,我们对前面介绍的方法进行总结和对比。

方法 优点 缺点 适用场景
普通位并行同步 实现相对简单 容易出现数据混乱,对电路操作影响大 对数据一致性要求不高的场景
单位距离编码 能有效解决数据一致性问题 适用范围受限,要求数据每次变化不超过一步 如位置和角度编码器数据采集等特定场景
抑制混乱的数据模式 可检测并丢弃损坏数据 可能需要多个时钟间隔才能显示新数据,较繁琐的方法还需使用错误检测编码 输入数据能在一个时钟周期内稳定的场景
握手协议(完整) 防止混乱数据进入接收电路,同步风险小,子系统设计独立 要求子系统可暂停,可能增加延迟 子系统相对运行速度差异大、需要严格保证数据不丢失的场景
部分握手协议 适用于固定速率数据源 依赖参与方响应时间假设,易出现故障 参与方响应时间可严格保证的特定场景
FIFO同步器 能处理暂时不相等的生产和消费速率 延迟和电路复杂度高 生产和消费速率有波动的场景
4. 实际应用中的考虑因素

在实际应用中,选择合适的异步数据采集方法需要综合考虑多个因素。

4.1 数据一致性要求

如果对数据一致性要求极高,如在医疗设备、航空航天等领域,单位距离编码或完整的握手协议可能是更好的选择。单位距离编码通过特殊的编码方式保证数据变化时的一致性,而完整的握手协议可以确保数据在稳定状态下被采样,避免数据混乱。

例如,在医疗监护设备中,采集患者的生命体征数据时,数据的准确性和一致性直接关系到患者的健康和安全。如果采用普通位并行同步方法,可能会出现数据混乱,导致错误的诊断结果。而使用单位距离编码或握手协议,可以大大提高数据的可靠性。

4.2 系统复杂度和成本

不同的异步数据采集方法对系统复杂度和成本的要求不同。FIFO同步器虽然能处理复杂的速率差异问题,但需要额外的硬件资源,如双端口RAM和复杂的指针控制逻辑,会增加系统的成本和复杂度。而部分握手协议相对简单,对硬件资源的要求较低,但适用范围有限。

在一些低成本的消费电子产品中,如智能手环,为了降低成本和简化设计,可能会选择部分握手协议或抑制混乱的数据模式等相对简单的方法。

4.3 系统运行速度和延迟

系统的运行速度和延迟也是需要考虑的重要因素。RZ握手协议虽然硬件简单,但由于额外的两个阶段,会增加延迟,不适合对延迟要求极高的场景。而NRZ握手协议在数据传输速度上相对较快,但硬件设计可能相对复杂。

在高速通信系统中,如5G通信基站,对数据传输的速度和延迟要求非常高。此时,可能需要选择NRZ握手协议或其他低延迟的异步数据采集方法。

5. 异步数据采集的未来发展趋势

随着科技的不断发展,异步数据采集技术也在不断进步。以下是一些可能的未来发展趋势。

5.1 智能化和自适应

未来的异步数据采集系统可能会具备智能化和自适应的能力。系统可以根据不同的应用场景和数据特点,自动选择最合适的异步数据采集方法。例如,当系统检测到数据的变化频率较高时,自动切换到更适合高速数据采集的方法;当数据一致性要求提高时,选择能保证数据准确性的方法。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(系统检测数据特征):::process --> B{数据变化频率高?}:::process
    B -- 是 --> C(选择高速采集方法):::process
    B -- 否 --> D{数据一致性要求高?}:::process
    D -- 是 --> E(选择保证一致性方法):::process
    D -- 否 --> F(维持当前方法):::process
5.2 集成化和小型化

随着集成电路技术的发展,异步数据采集电路将越来越集成化和小型化。将多种异步数据采集功能集成到一个芯片中,可以减少系统的体积和功耗,提高系统的可靠性和稳定性。例如,将FIFO同步器、握手协议控制器等功能集成到一个芯片中,实现一站式的异步数据采集解决方案。

5.3 与新兴技术的融合

异步数据采集技术可能会与人工智能、物联网等新兴技术深度融合。在物联网应用中,大量的传感器会产生异步数据,需要高效的异步数据采集方法来处理这些数据。人工智能技术可以用于分析和处理采集到的异步数据,挖掘其中的有价值信息。例如,通过人工智能算法对异步采集的传感器数据进行故障诊断和预测,提高系统的智能化水平。

6. 结论

异步数据采集在数字系统与外部世界交互中起着至关重要的作用。不同的异步数据采集方法各有优缺点,适用于不同的场景。在实际应用中,需要根据数据一致性要求、系统复杂度和成本、系统运行速度和延迟等因素综合选择合适的方法。同时,随着科技的发展,异步数据采集技术也将朝着智能化、集成化、小型化以及与新兴技术融合的方向发展。通过不断探索和创新,我们可以更好地应对异步数据采集带来的挑战,提高数字系统的性能和可靠性。

**项目名称:** 基于Vue.jsSpring Cloud架构的博客系统设计开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值