当前位置: 首页 > news >正文

FPGA项目开发之同步信号和亚稳态

FPGA项目开发之同步信号和亚稳态

让我们从触发器开始,所有触发器都有一个围绕活动时钟沿的建立(setup time)和保持窗口(hold time),在此期间数据不得更改。如果该窗口中的数据实际发生了变化,则触发器的输出将进入不确定状态,这既不是逻辑 0 也不是逻辑 1。在定义的恢复时间(recovery time)后,触发器输出将恢复为逻辑 0 或逻辑 1。

2046c7bf03df74f5f385528c96f6ad4d.png

每个系列器件的建立和保持时间以及恢复时间都是独一无二的,这些信息通常在数据表或应用说明中定义。一般来说,当我们设计 FPGA 满足时序约束时,我们不必过于担心它们,因为 Vivado 会尽量满足约束中定义的性能。

然而,当我们有异步信号进入到 FPGA 或多个彼此异步的时钟域时,我们就需要仔细考虑设计,以确保我们不会违反建立和保持时间并导致亚稳态。当然,无论哪种情况,我们都无法阻止亚稳态事件的发生,但我们可以确保我们的设计不会因为亚稳态事件的发生而出现不正确的数据。

当然,很明显的一个情况就是输入信号与内部时钟是异步的,在同一个时钟域中的构成还不是很清楚。我们可以使用一些简单的规则;如果时钟是公共时钟的整数除法,我们就在同一个时钟域中。如果时钟是非整数除法,它们不在同一个时钟域中,或者来自不同的源(即使它们具有相同的时钟频率)

在将信号同步到 FPGA 或不同的时钟域时,有多种设计可供选择。在xilinx fpga中,最好的方法是使用xilinx参数化宏,创建这些宏的目的是解决 CDC / Synchronization问题。XPM 提供了一个范围宏,包括

  • 单静态同步器(Single Static Synchroniser)——经典的单比特触发器同步器

  • 脉冲数据同步器(Pulse Data Synchroniser)——将脉冲从一个域传输到下一个域

  • 数据总线(Data Bus)——多路复用器、FIFO、握手和基于格雷码的传输

在 Vivado 中,我们现在很容易地在 IP Integrator 中实现 XPM 结构,以使 CDC crossing可见。

7e0626a3834753fb38c56106f3aa2c68.png

需要仔细考虑使用哪种结构,例如,不要尝试使用单个位同步器同步多个数据位,因为不能保证传输的数据对齐,从而导致数据损坏。还需要注意recombination,这是两个或多个静态信号跨越时钟域并在逻辑功能中重组的地方。由于亚稳态恢复,同步器中的延迟会导致下游逻辑受到影响。

尽管我们在设计中尽最大努力减轻 CDC,但我们是人类,我们也会犯错,因此我们可以使用内置的 Vivado 选项来报告设计中出现的 CDC。

综合完成后,我们可以运行 CDC 报告,无需等待 place 和 root 完成。

在 TCL 控制台中运行命令report_cdc – 有很多选项可用于写出文件、分析特定路径或创建豁免。

dc3ff5c8471eea74aa746c41c468d70e.png

这将显示设计中的所有时钟域交叉以及是否存在任何不安全或未知的交叉。在上面的示例中,可以看到有 6 个不安全和几个未知。如果我们使用选项 -details 运行命令,我们将看到报告的所有路径。单击不安全或未知的路径将打开关注的路径以供我们检查。

8dbd081bf1275bf43f8d39ff9c347e6f.png

选择路径后,我们可以打开我们关注路径的示意图查看器。在这种情况下的问题是复位是由不同的时钟生成的。

329c8b03c26c3020cbca1953f01f3c75.png

知道这一点后,我们可以通过更新设计,例如:纠正错误、插入必要的同步结构或纠正约束以更新路径来纠正问题。

12450eb5bb942751cc797a327223be5f.jpeg

FPGA项目开发之 7 系列 FPGA 高级 SelectIO 逻辑资源

610a7e911b1738e46a52a913181c1c65.jpeg

FPGA项目开发之时钟规划


相关文章:

  • 【机器学习】Linear Regression Experiment 线性回归实验 + Python代码实现
  • 【数据结构 C语言版】第四篇 栈、堆栈、Stack(超级详细版)
  • Django(3):数据模型定义
  • Linux系统编程·进程概念引入
  • 对抗生成网络GAN系列——CycleGAN简介及图片春冬变换案例
  • 第二课 ceph基础学习-OSD扩容换盘和集群运维
  • 帮助命令---学习Linux命令的第一步
  • C++ - 文件读写(fstream)
  • JavaScript:二维码生成与解析
  • SpringBoot 2 配置文件 2.4 多环境配置
  • JavaWeb编年史(远古时期)
  • 【Spring】面向切面编程详解(AOP)
  • 第四课 ceph基础学习-RGW高可用集群和集群测试
  • 幼儿园小程序实战开发教程
  • JavaScript基础总结---重点
  • axios 和 cookie 的那些事
  • Bootstrap JS插件Alert源码分析
  • echarts花样作死的坑
  • Gradle 5.0 正式版发布
  • HashMap剖析之内部结构
  • HTTP那些事
  • Javascript弹出层-初探
  • javascript数组去重/查找/插入/删除
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • pdf文件如何在线转换为jpg图片
  • Rancher-k8s加速安装文档
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SOFAMosn配置模型
  • Vue实战(四)登录/注册页的实现
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于 Cirru Editor 存储格式
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 坑!为什么View.startAnimation不起作用?
  • 你不可错过的前端面试题(一)
  • 网页视频流m3u8/ts视频下载
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 从如何停掉 Promise 链说起
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (6)STL算法之转换
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (算法)Travel Information Center
  • (转)linux下的时间函数使用
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net 4.0发布后不能正常显示图片问题
  • .net 7 上传文件踩坑
  • .NET BackgroundWorker
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET面试题(二)