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

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

3天内不再提示

SpinalHDL里用于跨时钟域处理的一些手段方法

FPGA之家 来源:Spinal FPGA 作者:玉骐 2022-07-11 10:51 次阅读
开篇立论

每一个做数字逻辑的都绕不开跨时钟域处理,谈一谈SpinalHDL里用于跨时钟域处理的一些手段方法。

打拍处理

跨时钟域信号的打拍处理往往用于单比特信号或类似于格林码这种信号的跨时钟域处理。其逻辑电路很简单。SpinalHDL提供了BufferCC用于实现这种跨时钟域打拍处理方式:
BufferCC(input: T, init: T = null, bufferDepth: Int = 2)
bufferDepth可用于指定打拍级数。input信号的时钟域为源时钟域,BUfferCC调用的地方的时钟域为目的时钟域。

在日常的电路设计里,计数器是常见的DFX信号,有些情况下需要将一个时钟域的DFX信号转换到另一个时钟域进行HPI读取,这种情况也可以通过打拍进行处理,不过前提是需转换成格林码,如此在源时钟域和目的时钟域需分别做一次转换与反转换。但如果计数器采用格林码进行计数则可以少进行一次转换。SpinalHDL有提供一个GrayCounter方法用于生成格林码计数器:
GrayCounter(width: Int, enable: Bool) 
提供一个小demo,GtayCounter+BufferCC:

ddc3355a-00c1-11ed-ba43-dac502259ad0.png

这里GrayCounter在时钟域clkA中实现,通过BufferCC将其跨时钟域至clkB,bufferDepth为3.Tips:BufferCC的第二个参数init数据类型是T,而T<:Data,即意味着init数据类型为“硬件”数据类型,因而上面init赋值需为U(0,8 bits)而不能直接写0 》》脉冲信号处理脉冲信号的跨时钟域处理,SpinalHDL提供了PulseCCByToggle方法:
PulseCCByToggle(input:Bool,clockIn:ClockDomain,clockOut:ClockDomain):Bool
握手处理

对于吞吐要求不是特别高的场合,跨时钟域信号采用握手形式进行处理也是一种不错的选择。SpinalHDL有两个抽象类型个人一直很喜欢:Stream,Flow。这两种形式基本囊括了所有的信号交互行为,其也可以说是SpinalHDL lib库的基石。针对跨时钟域的握手处理,SpinalHDL有一个StreamCCByToggle可以使用:

StreamCCByToggle(input: Stream[T], inputClock: ClockDomain, outputClock: ClockDomain): Stream[T]

其输入参数包含源时钟域信号,源时钟域,目的时钟域,其返回一个目的时钟域的Stream信号:

ddd37c80-00c1-11ed-ba43-dac502259ad0.png

这里srcIn隶属于时钟域clkA,destOut隶属于时钟域clkB。


除了StreamCCByToggle,SpinalHDL里还有一个FlowCCByToggle。由于Flow类型没有反压,因而从低时钟域向高时钟域进行传输则没什么问题,但从高时钟域向低时钟域进行转换则存在丢失数据的风险。


FIFO跨时钟域缓存

对于高吞吐的多比特信号跨时钟域处理,则往往采用FIFO的形式进行处理。在SpinalHDL里则有StreamFifoCC供使用:
val myFifo = StreamFifoCC(  dataType  = Bits(8 bits),  depth     = 128,  pushClock = clockA,  popClock  = clockB)myFifo.io.push << streamAmyFifo.io.pop>>streamB

审核编辑:汤梓红


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

    关注

    48

    文章

    1041

    浏览量

    103387
  • 时钟
    +关注

    关注

    11

    文章

    1746

    浏览量

    131763
  • 数字逻辑
    +关注

    关注

    0

    文章

    74

    浏览量

    16695

原文标题:跨时钟域那点事儿

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于时钟信号的处理方法

    我在知乎看到了多bit信号时钟的问题,于是整理了下自己对于时钟信号的
    的头像 发表于 10-09 10:44 6381次阅读

    三种时钟处理方法

    的三种方法时钟处理方法如下:  1. 打两拍;  2. 异步双口RAM;  3. 格雷码转换
    发表于 01-08 16:55

    如何处理好FPGA设计中时钟间的数据

    时钟处理是FPGA设计中经常遇到的问题,而如何处理
    发表于 07-29 06:19

    看看Stream信号是如何做时钟握手的

    一些,适用于追求高吞吐的场景。写在最后逻辑处理很多总线都是基于Stream这种信号来实现的(如AXI4家族),通过上面的方法,可以很容易根
    发表于 07-07 17:25

    FPGA界最常用也最实用的3种时钟处理方法

    时钟处理是FPGA设计中经常遇到的问题,而如何处理
    发表于 11-15 20:08 1.4w次阅读

    cdc路径方案帮您解决时钟难题

    章介绍下CDC也就是时钟可能存在的一些问题以及基本的
    的头像 发表于 11-30 06:29 7259次阅读
    cdc路径方案帮您解决<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>难题

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

    时钟处理是 FPGA 设计中经常遇到的问题,而如何处理
    的头像 发表于 12-05 16:41 1698次阅读

    SpinalHDL时钟域中的定制与命名

    聊在SpinalHDL时钟域中时钟的定制与命名。 相较于Verilog,在SpinalHDL
    的头像 发表于 03-22 10:14 2170次阅读

    总线半握手时钟处理

    总线半握手时钟处理 简要概述: 在上篇讲了单bit脉冲同步器
    的头像 发表于 04-04 12:32 2932次阅读
    总线半握手<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b><b class='flag-5'>处理</b>

    关于时钟的详细解答

    个做数字逻辑的都绕不开时钟处理,谈SpinalH
    的头像 发表于 04-27 10:52 4320次阅读
    关于<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>的详细解答

    介绍3种方法时钟处理方法

    时钟处理是FPGA设计中经常遇到的问题,而如何处理
    的头像 发表于 09-18 11:33 2.2w次阅读
    介绍3种<b class='flag-5'>方法</b><b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b><b class='flag-5'>处理</b><b class='flag-5'>方法</b>

    基于FPGA的时钟信号处理——MCU

    问题,不过请注意,今后的这些关于异步信号处理的文 章将会重点从工程实践的角度出发,以一些特权同学遇到过的典型案例的设计为依托,从代码的角度来剖析一些特权同学认为经典的
    发表于 11-01 16:24 11次下载
    基于FPGA的<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b>信号<b class='flag-5'>处理</b>——MCU

    三种时钟处理方法

    时钟处理是FPGA设计中经常遇到的问题,而如何处理
    的头像 发表于 10-18 09:12 7989次阅读

    FPGA时钟处理方法()

    时钟是FPGA设计中最容易出错的设计模块,而且时钟
    的头像 发表于 05-25 15:06 2075次阅读
    FPGA<b class='flag-5'>跨</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b><b class='flag-5'>处理</b><b class='flag-5'>方法</b>(<b class='flag-5'>一</b>)

    FPGA时钟处理方法(二)

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