首页资源分类FPGA/CPLD > cpu与fpga跨时钟域数据交换的实现问题

cpu与fpga跨时钟域数据交换的实现问题

已有 451617个资源

相关资源

    下载专区

    文档信息举报收藏

    标    签:cpu与fpga跨时钟域数据

    分    享:

    文档简介

    cpu与fpga跨时钟域数据交换的实现问题

    文档预览

    munitis#1 楼主:cpu 与 fpga 跨时钟域数据交换的实现问题 [精华] ARM 与 fpga(cyclone)之间进行数据传输,这应该属于跨时钟域的范畴,CPU 与 fpga 之间采用三总线的方式 进行连接,而 CPU 连接 fpga 的数据线、地址线、控制线进入 fpga 内部就属于异步信号了,该如何考虑呢? 我看过一些关于跨时钟域的文献,上面说对于数据交换,实现方法有握手和 fifo 两种,我想,双口 RAM 是不是 也算一种?另外,我看跨时钟域数据交换,都涉及到两侧的时钟信号,而对于 CPU 的三总线,并没有输出什么时 钟信号,时钟输出是不是必须的呢? 问题比较多,不知道说明白没有,请指教一二,谢谢了! riple #2 这个问题,基本上很难。 开个玩笑,原理上简单,实现起来有许多要注意的地方,但是不难。 一个提示:从你使用的 ARM 芯片数据手册的接口时序图入手。FPGA 中的处理方法是可以改的,而接口时序 是一定要遵守的。 泛泛而谈很难,把你的芯片接口时序图贴上来吧,主要是寄存器读、写时序,如果用到 DMA 的话,应该还有 DMA 读写的时序图。 munitis #3 上面是 ARM 读写外设的时序图,时钟是 CPU 的,和 fpga 的内部时钟是两个时钟域,既需要有 ARM 写入给 fpga 内部的寄存器,又需要有 ARM 读出 fpga 内部的值,该如何解决跨时钟域的问题呢? munitis #4 ARM 与 fpga 的接口是标准的总线型接口,包括 DATA,CS,ADDR,RD,WR,这些信号由 CPU 的时钟控制, 对于 FPGA 来说是异步信号,在进入 FPGA 内部是不是需要先进行同步,我看过一些文献,这种总线型的跨时钟域, 是不能用多个同步器进行同步的,采用的方法有握手信号和 FIFO,是不是这样的呢? riple #5 我们一步一步来,先实现基本功能,然后优化性能。 第一、我觉得处理这样的接口,采用异步方式比较好。因为同步接口对 FPGA 外部电路和内部配置的要求都比 较高。异步接口只要给出充分的时间,外部电路不存在信号完整性问题就很好解决。 第二、这个接口比较好处理,原因是它的时序可以调整,通过软件配置 cpu 的外设寄存器就可以调整各个电平 的时长。但是需要你和软件开发人员密切配合,提出你的要求。可以先宽泛一些,保证你的功能实现,然后再压缩 可以压缩的时序,提高性能。 riple #6 明确一件事,信号进入 FPGA 的最初时刻是否是“异步”的呢? 不是,只有信号进入受某个时钟控制的逻辑时,该信号才被看作与该时钟域异步。 那么,我们能否利用“信号进入 FPGA 之后”和“信号进入某个时钟域之前”的这段空间实现一些组合和时序逻辑 呢。 可以,我们在 FPGA 内部创建和利用这样一个空间来实现接口的数据发送和捕获功能,把接口上的原始信号转 换为适用于同步时钟处理的信号,跨时钟域的问题也就解决了。 munitis #7 你说得对,CPU 对外设的读写时序是可以通过配置寄存器调整的。但我有点不明白,采用异步方式,对于 fpga 内部的电路来说,CPU 的信号是异步信号,不能直接让 FPGA 时钟域的电路来做处理吧,它们之间的接口该如何考 虑呢? munitis #8 你说的是不是信号进入 FPGA 之后,用 FPGA 内部的时钟对它进行采样同步,变为与内部时钟同步的信号呢? riple #9 差不多,原理上就是这样。今晚我回家给你画个例子吧。 munitis #10 多谢指教,呵呵 riple #11 先给出写同步接口。EX_WR_N 上升沿的位置很适合作为采样触发信号,数据的建立和保持时间都很充裕,这 是由接口时序保证的。把 EX_WR_N 进行标准的同步处理后就可以进行提取边沿脉冲的处理,得到的脉冲信号就可 以作为同步时钟域的采样使能信号,此时先前被采样的数据的建立时间也得到了充分的保证。 也可以把 EX_WR_N 信号同步处理后提取边沿脉冲得到的信号作为同步时钟域的采样使能脉冲。这样处理,采 样的时刻取决于同步时钟的周期。如果接口处数据的保持时间不是很充分,采样时就不一定能得到稳定的数据,需 要调整接口时序保证足够长的保持时间。 riple #12 上图中右侧的 dff_16 可以用同步 FIFO 代替,采用 lpm_fifo 或 scfifo 就可以。如果 CPU 芯片与 FPGA 芯片之间 的电路很复杂,该电路需要考虑外部信号的毛刺问题。一种可行的处理方法可以参考这篇文章: http://www.ednchina.com/blog/riple/41367/message.aspx riple #13 恶劣的情况下需要考虑毛刺问题 http://www.ednchina.com/blog/riple/41367/message.aspx riple #14 在读取数据接口中可以看到,数据由 FPGA 驱动,驱动的时刻取决于 FPGA 内部的逻辑处理时间。数据的出现 可以晚于 EX_RD_N 的下降沿,数据的撤销必须晚于 EX_RD_N 的上升沿。 所以,只要提取 EX_RD_N 下降沿对应的同步脉冲就可以触发同步时钟域的寄存器或 FIFO 读取操作,数据被 读出。 同步和边沿提取的逻辑和写入操作采用的方法一样,写操作提取的是上升沿脉冲,读操作需要提取下降沿脉冲。 这些操作会引入一定的延时——2~3 个同步时钟周期,需要你和软件开发人员密切配合,调整 T3 的时长。 riple #15 此外,还要考虑双向总线的三态问题,可以参考 http://www.ednchina.com/blog/riple/20577/message.aspx 从读取数据接口时序图中可以看到,在 EX_RD_N 下降沿之后,数据出现,在 EX_RD_N 上升沿之后,数据还 要保持一定的时间。所以高阻控制信号要比 EX_RD_N 的低电平部分晚一些,以保证数据保持时间。可以采用同步 逻辑带来的延迟实现之。 riple #16 如果有什么进展和经验,要及时跟贴呦,让大家都有收获。 munitis #17 谢谢,我根据你的电路图做一次仿真试试,然后再说 munitis #18 riple,你的图上应该是 EX_WR_N 的下降沿作为采样触发信号吧 riple #19 不知道你图中 1cycle 是多长时间,如果很短的话,还是用上升沿最好,数据的建立时间会很充裕。 munitis #20 一个 cycle 是 30ns munitis #21 riple #22 上面这个图比例上是不是有些问题?32MHz 对应的时钟周期是 31ns,和 1cycle 差不多。从 CS 下降沿到 WR 下 降沿的周期是不是多了些?时序图上只给出了 1-4cycle。 可能是激励或者时钟周期设置错了。 WR 的上升沿或下降沿采样都行,时间上都有保证。这就是 CPU 接口设计得好啊,让人用起来也舒服。 munitis #23 上图是我用 modelsim 仿真加入延时文件后的波形,外部异步信号的时钟频率是 8.33M,内部采样时钟是 32M。 当数据发生变化时,会有很小的波动,波动时间小于 1ns,这个应该是没有影响吧? munitis #24 哦,我的 T 都取了 4 个 cycle,120ns munitis #25 riple,我看你的图上,控制输入是 CS 与 WR 的与结果,是不是地址线可以等同步电路输出数据后再译码到不 同的寄存器上去。 riple #26 思考一个问题:从接口信号的物理属性看来,地址总线与数据总线有没有区别? 如果答案是否,那么对于数据总线的跨时钟域处理方法同样适用于地址总线。而且如果处理不当的话,都会出 现问题。 所以,建议你对地址总线进行同样的处理,然后再用作地址译码。这样做虽然占用了一些逻辑资源,但是确保 了处理方法的鲁棒性,可以应对接口时序的不规则变化。 munitis #27 那是不是要用 EX_CS_N 作为地址线的第一级暂存触发时钟呢 riple #28 从时序图上看可以,采用 WR 的边沿也是可靠的。 munitis #29 riple,谢谢你的指教,跟你讨论挺有收获的,我正在编码仿真,后面有什么问题和心得还会发上来的 cationebox #30 有什么进展没有的 呵呵 munitis #31 下面的图是采用 WR 上跳沿来暂存数据的原理图和仿真图 munitis #32 上面两个图是利用 ex_wr_n 的上跳沿进行数据的暂存,电路图和仿真图,从波形可以看出,这种“先写入,后暂 存”的方式是没有问题的,这种方法可以从什么地方查到吗? riple #33 对于跨时钟域的问题,我也查找了很多文章和书籍,大体上有三种方法:相位控制、两级同步、异步 FIFO。还 有很多书基本不提 CDC 的问题。可是上述方法中哪一种适合我们在这里遇到的问题呢? 单个信号采用两级同步,多位信号采用异步 FIFO,有没有多位信号不采用异步 FIFO 的办法呢?上面那些书里 都没有提到,只有一篇 EDNChina 的获奖文章给出了全面而准确的解答: http://article.ednchina.com/2004-8/AtcShow2005127160310.htm。这篇文章里提到了“一种解决总线同步问题的方法是 使用一个保持寄存器和握手信号。”,这就是我在前面提到的“先暂存,后写入”方法,也就是“先异步暂存,后同步 写入”的方法。 建议大家下功夫读一下这篇文章,内容不是一般的好。我在博客里推荐过,怕是没有谁详细地读过吧。 再补充一点,对于异步 FIFO,如果 FIFO 的深度减小到只能存储一次传输的大小,本质上是不是“使用一个保持 寄存器和握手信号”呢?差别不大吧? riple #34 再补充一点,在许多文章中描述跨时钟域问题时都给出了异步的两个时钟,一个是驱动电路的时钟,一个是接 收电路的时钟,这样做纯粹是出于分析和表达的需要。 在 FPGA 与外部芯片接口的电路设计过程中,往往只能控制接收电路的时钟,驱动电路的时钟是不可控的。即 FPGA 是跨时钟域问题的受害者,只能在 FPGA 能够控制的时钟域里采取一定的手段弥补这一问题。 所以,跨时钟域电路的分析和描述不同于跨时钟域电路的设计,但是离开分析和描述,设计又是盲目的。理解 跨时钟域电路要从两个时钟域入手,设计跨时钟域电路只能从本地时钟域入手。 如果在特殊情况下,FPGA 可以控制驱动电路的时钟频率和相位,跨时钟域问题就可以采用相位控制的方法解 决了。 twzh #35 看了你们的讨论,觉得同步确实很重要。我现在正在做一个项目,51 单片机和 FPGA 之间有数据交换。在前面 的设计中,没有注意同步的问题。可能需要对设计做些修改。看了《跨越鸿沟:同步世界中的异步信号》这篇文章, 很多概念还是云里雾里的,呵呵。其中有个概念对我挺有用的,就是“为了使同步工作能正常进行,从某个时钟域 传来的信号应先通过原时钟域上的一个触发器,然后不经过两个时钟域间的任何组合逻辑,直接进入同步器的第一 个触发器中。” 如果我要将 51 单片机到 FPGA 之间的信号线(有 P0[7..0],P2[7..0],ALE,RD,WR)在 FPGA 内进行同步,原时钟域 的信号该如何选择呢? 注:原先我是在 FPGA 中做了一些假 RAM,用这种方式实现了两者的数据交换,但是大部分是对单地址的读/ 写。在使用 FIFO 的时候,就会牵涉到信号同步的问题,“这种设计需要单时钟宽度脉冲以及用于读、写选通的脉冲 同步器,因为当一个电平信号从一个时钟域跨越到 另一个更快的时钟域时,在较快时钟域中它能在更多的时钟周期中保持有效。由于只要读或写信号是有效的, 每个计数器就会发生变化,因此较快的时钟域就检测到更多的读、写,超出较慢时钟域实际发生的数量。脉冲同 步器可以将一个时钟域的时钟宽度脉冲转换为新时钟域的时钟宽度脉冲,每个脉冲都表示一次 FIFO 的读或写。” 以上只是我的一点想法,红色部分是文章里觉得挺有用的部分,里面的一些估计要多看几遍再加上实践才能体 会了。 mactian #36 学习了。。。。。 riple #37 How to interface FPGAs to microcontrollers riple #38 AN 473: Using DCFIFO for Data Transfer between Asynchronous Clock Domains AN473_Design_Example (60 KB)

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。