FPGA设计中跨时钟域问题的处理

这篇具有很好参考价值的文章主要介绍了FPGA设计中跨时钟域问题的处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


由于FPGA跨时钟域传输信号会出现亚稳态等问题,所以要用到异步设计用以处理跨时钟域数据传输的问题,尽量使得系统对亚稳态错误不敏感。

第一种:打两拍(慢时钟到快时钟)

(快时钟到慢时钟则先延长信号再打两拍)

FPGA在处理跨时钟域的数据有单bit和多bit之分,而打两拍的方式常见于处理单bit数据的跨时钟域问题。
打两拍的方式,其实说白了,就是定义两级寄存器,对输入的数据进行延拍,如下图所示:
FPGA设计中跨时钟域问题的处理
应该很多人都会问,为什么是打两拍呢,打一拍、打三拍行不行呢?
先简单说下两级寄存器的原理:两级寄存是一级寄存的平方,两级并不能完全消除亚稳态的影响,但是提高了可靠性减少其发生概率。总的来讲,就是一级概率很大,三级改善不大。
这样说可能还是有很多人不够完全理解,那么请看下面的时序示意图:
FPGA设计中跨时钟域问题的处理
data是Clk1 Domain的数据,需要传到Clk2 Domain进行处理(即上图的clk时钟),寄存器1和寄存器2使用的时钟都为clk。假设在clk的上升沿正好采到data的跳变沿(从0变1的上升沿,实际上的数据跳变不可能是瞬时的,所以有短暂的跳变时间),那这时作为寄存器1的输入(D1)到底应该是0还是1呢?这是一个不确定的问题,此时有可能会出现亚稳态问题。虽然Q1的值也不能确定,但至少可以保证,在clk的下一个上升沿,Q1基本可以满足第二级寄存器的保持时间和建立时间要求,作为寄存器2的输入(D2)出现亚稳态的概率得到了很大的改善。
如果再加上第三级寄存器,由于第二级寄存器对于亚稳态的处理已经起到了很大的改善作用,第三级寄存器在很大程度上可以说只是对于第二级寄存器的延拍,所以意义是不大的。

第二种:格雷码转换

对于单bit数据信号的跨时钟域处理办法我们知道可以用打两拍,然而这对多bit数据并不管用。首先,我们知道,使用DFF打两拍可以基本消除亚稳态的问题,但是无法保证采样得到的数据是正确的,因此,如果现在要采样的是一个多bit的跨时钟域信号,比如4bit信号,那么由于建立时间和保持时间的违例,虽然在打两拍之后可以得到一个稳定的数据,但该数据的每一个bit都不一定是正确的,所以其可能的值有2^4=16种,这显然是无法接受的,因此,对于多比特信号的跨时钟域处理,不能照搬。
一种可以解决多bit跨时钟域信号传输的方法就是格雷码。
格雷码(又称循环码),它具有以下两个特点:
1、相邻的两个编码之间只有一位是不一样的。
2、当第N位从0变到1时,之后的数的N-1位会关于前半段对称,而比N位高的是相同的。
二进制与格雷码转换真值表如下图所示:
FPGA设计中跨时钟域问题的处理
二进制与格雷码转换verilog语言描述如下:

assign gray = (binary>>1) ^ binary;  //binary to gray
assign bunary = {gray[2],gray[2]^gray[1],gray[2^gray[1]^gray[0]]};//gray to binary

由于格雷码相邻数据只有一个bit不同,因此,在进行跨时钟域传输时,只有发生变化的那个bit有可能处于亚稳态,而其余bit由于保持不变,因此是稳定的,故多比特格雷码的跨时钟域传输相当于单比特信号的跨时钟域传输,我们采用打两拍的方法即可处理。

第三种:异步fifo/异步双端口RAM

单bit信号我们可以打两拍,少数bit信号我们可以格雷码转换,多bit信号跨时钟域的最常用方法还是异步FIFO或者异步双端口RAM。简单来说,异步FIFO是双口RAM的一个封装而已,其存储容器本质上还是一个RAM,只不过对其添加了某些控制,使其能够实现先进先出的功能且不向双端口RAM那样读写需要地址线,由于这个功能十分的实用,因此得以广泛应用。 真双口RAM可以实现在一端存储,另一端读取的功能,两端的时钟可以不同,将数据存入一个容器,再取出来,这个过程在双口RAM的两端完全不存在亚稳态的问题。由于异步FIFO的实现中也存在数据的存取问题,和双口RAM类似,再加上空满信号的控制,存在跨时钟域的问题,因此只要处理好,空满信号的判断中的跨时钟域问题,就可以使用FIFO解决多比特信号的跨时钟域问题。封装的异步fifo如下图所示:
FPGA设计中跨时钟域问题的处理
由于是异步FIFO的设计,读写时钟不一样,在产生读空信号和写满信号时,会涉及到跨时钟域的问题,如何解决?
跨时钟域的问题:由于读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的,要是将读时钟域的读指针与写时钟域的写指针不做任何处理直接比较肯定是错误的,因此我们需要进行同步处理以后再进行比较
 
解决方法:加两级寄存器同步 + 格雷码(目的都是消除亚稳态)
  
1.使用异步信号进行使用的时候,好的设计都会对异步信号进行同步处理,同步一般采用多级D触发器级联处理。这种模型大部分资料都说的是第一级寄存器产生亚稳态后,第二级寄存器稳定输出概率为90%,第三极寄存器稳定输出的概率为99%,如果亚稳态跟随电路一直传递下去,那就会令自我修护能力较弱的系统直接崩溃。

2.将一个二进制的计数值从一个时钟域同步到另一个时钟域的时候很容易出现问题,因为采用二进制计数器时所有位都可能同时变化,在同一个时钟沿同步多个信号的变化会产生亚稳态问题。而使用格雷码只有一位变化,因此在两个时钟域间同步多个位不会产生问题。所以需要一个二进制到gray码的转换电路,将地址值转换为相应的gray码,然后将该gray码同步到另一个时钟域进行对比,作为空满状态的检测。

异步fifo的RTL设计与TestBench可参考如下资源内部文件:
基于UVM的异步fifo验证平台设计文章来源地址https://www.toymoban.com/news/detail-477085.html

到了这里,关于FPGA设计中跨时钟域问题的处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA项目设计:数字时钟

    项目要求: 设计一个数字时钟,数码管前两位显示小时,数码管中间两位显示分钟,数码管后面两位显示秒。 项目设计: 系统框架图: 计数模块时序图: 代码实现: 计数模块: 数码管显示模块: 顶层文件:

    2024年02月14日
    浏览(44)
  • 【差分时钟转单端时钟】FPGA原语设计详解

    【差分时钟转单端时钟】FPGA原语设计详解 在现代电子系统中,为了提高数据传输的速率和抗干扰能力使用差分信号传输时钟信号已成为一种常见的做法。而FPGA作为可编程逻辑器件,其灵活性和可重构性得到越来越广泛的应用。本文将介绍利用FPGA实现差分时钟转单端时钟的原

    2024年02月04日
    浏览(53)
  • 基于vivado(语言Verilog)的FPGA学习(5)——跨时钟处理

    慢时钟到快时钟一般都不需要处理,关键需要解决从快时钟到慢时钟的问题,因为可能会漏信号或者失真,比如: 第一种办法是开环解决方案,也就是人为设置目标信号脉宽大于1.5倍的周期。但是容易和设计要求冲突 所以第二个大方法是闭环解决方案,也就是从改善同步方

    2024年02月03日
    浏览(44)
  • 基于FPGA的数字时钟系统设计

    在FPGA的学习中,数字时钟是一个比较基础的实验案例,通过该实验可以更好的锻炼初学者的框架设计能力以及逻辑思维能力,从而打好坚实的基本功,接下来就开始我们的学习吧! 1.数码管介绍 数码管通俗理解就是将8个LED(包含dp部分)灯拼接到一起组成的,分别标号为a~g。前

    2024年02月06日
    浏览(45)
  • 基于FPGA的CDR时钟恢复设计

    [参考文献] [1] https://blog.csdn.net/yijingjijng/article/details/48024059   CDR全称为Clock and Data Recovery,即时钟数据恢复。顾名思义,CDR就是接收端根据接收到的数据信号恢复出时钟,以便于接收端对数据信号进行恢复和处理。 那为什么需要CDR呢?CDR一般应用于串行数据的恢复,那为什

    2024年02月04日
    浏览(35)
  • FPGA(Verilog)时钟无缝切换设计与验证

    时钟切换基本模型,本文围绕“ 基本组合电路切换、解决前毛刺切换、解决后毛刺切换 ”三方面完成时钟无缝切换。 组合逻辑切换,本质就是二选一多路器 如下图,CLK_SEL 0与1分别控制时钟CLK_A CLK_B输出。 组合逻辑输出只跟当前输入状态有关,CLK_SEL异步不可控导致输出毛刺

    2023年04月10日
    浏览(45)
  • 基于FPGA的数字时钟设计与实现(含源码)

    随着数字电子技术的不断发展,基于FPGA(现场可编程门阵列)的数字时钟设计方案逐渐成为了一种流行的选择。本篇博客将详细介绍如何利用FPGA实现一个简单的数字时钟,涉及到分频器、数码管驱动、时分秒计数、三八译码器和扫描数码管等模块。 1. 系统设计概述 在本设计

    2024年02月05日
    浏览(48)
  • 基于FPGA的多功能数字时钟设计报告

    作品基于intel Cyclone IV E EP4CE10F17C8 FPGA板卡,主要开发环境为Quartus Ⅱ,编程并实现了多功能温湿度电子钟。本作品在实现显示实时时间的基础上,设计并完成了设置闹钟、改变闹钟铃声、显示实时温度和实时湿度、基于以太网通信协议的实时视频传输等功能。在未设置闹钟时

    2024年02月05日
    浏览(47)
  • FPGA时钟资源与设计方法——Xilinx(Vivado)

    1.时钟资源包括:时钟布线、时钟缓冲器(BUFGBUFRBUFIO)、时钟管理器(MMCM/PLL)。 2.时钟类型有三种:全局时钟,可以驱动整个内核上的同步逻辑;局部时钟,可以驱动特定和相邻区域的逻辑;IO时钟,可以驱动某个IO的特定逻辑。 3.混合模式时钟管理器(MMCM)和数字时钟管理

    2024年02月22日
    浏览(53)
  • 基于FPGA的电子时钟设计与实现 (在EDA开发板上实现电子时钟功能)

    开发板: 此款开发板使用的是 ALTERA 公司的 Cyclone IV 系列 FPGA,型号为 EP4CE6F17C8, 256 个引脚的 FBGA 封装。  题目:在EDA开发板上实现电子时钟功能 要求:实现电子时钟程序编写,实现在7段数码管显示时、分、秒,使用4x4矩阵按键模拟调节时钟指令输入按键,并实现整点报时

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包