0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

揭秘FPGA跨时钟域处理的三大方法

454398 来源:alpha007 作者:alpha007 2022-12-05 16:41 次阅读

时钟域处理是 FPGA 设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个 FPGA 初学者的必修课。如果是还在校生,跨时钟域处理也是面试中经常常被问到的一个问题。

这里主要介绍三种跨时钟域处理的方法,这三种方法可以说是 FPGA 界最常用也最实用的方法,这三种方法包含了单 bit 和多 bit 数据的跨时钟域处理,学会这三招之后,对于 FPGA 相关的跨时钟域数据处理便可以手到擒来。

这里介绍的三种方法跨时钟域处理方法如下:

打两拍;

异步双口 RAM

格雷码转换。

01

方法一:打两拍

大家很清楚,处理跨时钟域的数据有单 bit 和多 bit 之分,而打两拍的方式常见于处理单 bit 数据的跨时钟域问题。

打两拍的方式,其实说白了,就是定义两级寄存器,对输入的数据进行延拍。

应该很多人都会问,为什么是打两拍呢,打一拍、打三拍行不行呢?

先简单说下两级寄存器的原理:两级寄存是一级寄存的平方,两级并不能完全消除亚稳态危害,但是提高了可靠性减少其发生概率。总的来讲,就是一级概率很大,三级改善不大。

data 是时钟域 1 的数据,需要传到时钟域 2(clk)进行处理,寄存器 1 和寄存器 2 使用的时钟都为 clk。假设在 clk 的上升沿正好采到 data 的跳变沿(从 0 变 1 的上升沿,实际上的数据跳变不可能是瞬时的,所以有短暂的跳变时间),那这时作为寄存器 1 的输入到底应该是 0 还是 1 呢?这是一个不确定的问题。所以 Q1 的值也不能确定,但至少可以保证,在 clk 的下一个上升沿,Q1 基本可以满足第二级寄存器的保持时间和建立时间要求,出现亚稳态的概率得到了很大的改善。

如果再加上第三级寄存器,由于第二级寄存器对于亚稳态的处理已经起到了很大的改善作用,第三级寄存器在很大程度上可以说只是对于第二级寄存器的延拍,所以意义是不大的。

02

方法二:异步双口 RAM

处理多 bit 数据的跨时钟域,一般采用异步双口 RAM。假设我们现在有一个信号采集平台,ADC 芯片提供源同步时钟 60MHz,ADC 芯片输出的数据在 60MHz 的时钟上升沿变化,而 FPGA 内部需要使用 100MHz 的时钟来处理 ADC 采集到的数据(多 bit)。在这种类似的场景中,我们便可以使用异步双口 RAM 来做跨时钟域处理。

先利用 ADC 芯片提供的 60MHz 时钟将 ADC 输出的数据写入异步双口 RAM,然后使用 100MHz 的时钟从 RAM 中读出。对于使用异步双口 RAM 来处理多 bit 数据的跨时钟域,相信大家还是可以理解的。当然,在能使用异步双口 RAM 来处理跨时钟域的场景中,也可以使用异步 FIFO 来达到同样的目的。

03

方法三:格雷码转换

我们依然继续使用介绍第二种方法中用到的 ADC 例子,将 ADC 采样的数据写入 RAM 时,需要产生 RAM 的写地址,但我们读出 RAM 中的数据时,肯定不是一上电就直接读取,而是要等 RAM 中有 ADC 的数据之后才去读 RAM。这就需要 100MHz 的时钟对 RAM 的写地址进行判断,当写地址大于某个值之后再去读取 RAM。

在这个场景中,其实很多人都是使用直接用 100MHz 的时钟与 RAM 的写地址进行打两拍的方式,但 RAM 的写地址属于多 bit,如果单纯只是打两拍,那不一定能确保写地址数据的每一个 bit 在 100MHz 的时钟域变化都是同步的,肯定有一个先后顺序。如果在低速的环境中不一定会出错,在高速的环境下就不一定能保证了。所以更为妥当的一种处理方法就是使用格雷码转换。

对于格雷码,相邻的两个数间只有一个 bit 是不一样的(格雷码,在本文中不作详细介绍),如果先将 RAM 的写地址转为格雷码,然后再将写地址的格雷码进行打两拍,之后再在 RAM 的读时钟域将格雷码恢复成 10 进制。这种处理就相当于对单 bit 数据的跨时钟域处理了。

对于格雷码与十进制互换的代码,仅提供给大家作参考:

代码使用的是函数的形式,方便调用,op 表示编码或者译码,WADDRWIDTH 和 RADDRWIDTH 表示位宽。

审核编辑黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21326

    浏览量

    593245
  • 时钟域
    +关注

    关注

    0

    文章

    49

    浏览量

    9455
收藏 人收藏

    评论

    相关推荐

    FPGA时钟电路结构原理

    FPGA 中包含一些全局时钟资源。以AMD公司近年的主流FPGA为例,这些时钟资源由CMT(时钟管理器)产生,包括DCM、PLL和MMCM等
    发表于 04-25 12:58 56次阅读
    <b class='flag-5'>FPGA</b>的<b class='flag-5'>时钟</b>电路结构原理

    异步电路中的时钟同步处理方法

    异步电路中的时钟同步处理方法  时钟同步在异步电路中是至关重要的,它确保了电路中的各个部件在正确的时间进行操作,从而使系统能够正常工作。在本文中,我将介绍一些常见的
    的头像 发表于 01-16 14:42 328次阅读

    FPGA图像处理方法

    图像细节。 FPGA 图像处理方法 1、图像增强 两大方法:空间域方法和时间域方法(以后再详述)
    的头像 发表于 12-02 13:15 613次阅读

    Xilinx FPGA芯片内部时钟和复位信号使用方法

    如果FPGA没有外部时钟源输入,可以通过调用STARTUP原语,来使用FPGA芯片内部的时钟和复位信号,Spartan-6系列内部时钟源是5
    的头像 发表于 10-27 11:26 1092次阅读
    Xilinx <b class='flag-5'>FPGA</b>芯片内部<b class='flag-5'>时钟</b>和复位信号使用<b class='flag-5'>方法</b>

    FPGA处理的优势有哪些?如何去使用FPGA处理

    ,但习惯于使用基于处理器的系统进行设计的团队,仍会避免使用FPGA,因为他们缺乏必要的硬件技能,来将FPGA用作协处理器(图1)。不熟悉像VHDL和Verilog这样传统的硬件设计
    的头像 发表于 10-21 16:55 1556次阅读
    <b class='flag-5'>FPGA</b>协<b class='flag-5'>处理</b>的优势有哪些?如何去使用<b class='flag-5'>FPGA</b>协<b class='flag-5'>处理</b>?

    fpga时钟域通信时,慢时钟如何读取快时钟发送过来的数据?

    域时,由于时钟频率不同,所以可能会产生元件的不稳定情况,导致传输数据的错误。此时我们需要采取一些特殊的措施,来保证跨时钟域传输的正确性。 FPGA时钟域通信的基本实现
    的头像 发表于 10-18 15:23 651次阅读

    FPGA的锁相环PLL给外围芯片提供时钟

    景下的时序要求。尤其对于需要高速数据传输、信号采集处理等场景的数字信号处理系统而言,FPGA PLL的应用更是至关重要。本文将介绍FPGA锁相环PLL的基本原理、设计流程、常见问题及解
    的头像 发表于 09-02 15:12 1510次阅读

    关于FPGA设计中多时钟域和异步信号处理有关的问题

    减少很多与多时钟域有关的问题,但是由于FPGA外各种系统限制,只使用一个时钟常常又不现实。FPGA时常需要在两个不同时钟频率系统之间交换数据
    的头像 发表于 08-23 16:10 373次阅读

    #FPGA FPGA信号异步时钟处理

    fpga图像处理
    奔跑的小鑫
    发布于 :2023年07月27日 10:08:04

    FPGA设计中动态时钟的使用方法

    时钟是每个 FPGA 设计的核心。如果我们正确地设计时钟架构、没有 CDC 问题并正确进行约束设计,就可以减少与工具斗争的时间。
    发表于 07-12 11:17 852次阅读
    <b class='flag-5'>FPGA</b>设计中动态<b class='flag-5'>时钟</b>的使用<b class='flag-5'>方法</b>

    高级FPGA设计技巧!多时钟和异步信号处理解决方案

    减少很多与多时钟有关的问题,但是由于FPGA外各种系统限制,只使用一个时钟常常又不现实。FPGA时常需要在两个不同
    发表于 06-02 14:26

    FPGA时钟处理方法(三)

    所谓数据流跨时钟域即:时钟不同但是时间段内的数据量一定要相同。
    的头像 发表于 05-25 15:19 1244次阅读
    <b class='flag-5'>FPGA</b>跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>(三)

    FPGA时钟处理方法(二)

    上一篇文章已经讲过了单bit跨时钟域的处理方法,这次解说一下多bit的跨时钟方法
    的头像 发表于 05-25 15:07 633次阅读
    <b class='flag-5'>FPGA</b>跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>(二)

    FPGA时钟处理方法(一)

    时钟域是FPGA设计中最容易出错的设计模块,而且一旦跨时钟域出现问题,定位排查会非常困难,因为跨时钟域问题一般是偶现的,而且除非是构造特殊用例一般的仿真是发现不了这类问题的。
    的头像 发表于 05-25 15:06 1242次阅读
    <b class='flag-5'>FPGA</b>跨<b class='flag-5'>时钟</b>域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>(一)

    FPGA中定点数的处理方法

    FPGA中最常用的还是定点化数据处理方法,本文对定点化数据处理方法进行简要探讨,并给出必要的代码例子。
    发表于 05-24 15:10 1745次阅读
    <b class='flag-5'>FPGA</b>中定点数的<b class='flag-5'>处理</b><b class='flag-5'>方法</b>