cpu与fpga跨时钟域数据交换的实现问题_第1页
cpu与fpga跨时钟域数据交换的实现问题_第2页
cpu与fpga跨时钟域数据交换的实现问题_第3页
cpu与fpga跨时钟域数据交换的实现问题_第4页
cpu与fpga跨时钟域数据交换的实现问题_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 芯片之 间的电路很复杂 该电路需要考虑外部信号的毛刺问题 一种可行的处理方法可以参考这篇文章 riple 13 恶劣的情况下需要考虑毛刺问题 riple 14 在读取数据接口中可以看到 数据由 FPGA 驱动 驱动的时刻取决于 FPGA 内部的逻辑处理时间 数据的出 现可以晚于 EX RD N 的下降沿 数据的撤销必须晚于 EX RD N 的上升沿 所以 只要提取 EX RD N 下降沿对应的同步脉冲就可以触发同步时钟域的寄存器或 FIFO 读取操作 数据被 读出 同步和边沿提取的逻辑和写入操作采用的方法一样 写操作提取的是上升沿脉冲 读操作需要提取下降沿脉冲 这些操作会引入一定的延时 2 3 个同步时钟周期 需要你和软件开发人员密切配合 调整 T3 的时长 riple 15 此外 还要考虑双向总线的三态问题 可以参考 从读取数据接口时序图中可以看到 在 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 的获奖文章给出了全面而准确的解答 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 的时候 就会牵涉到信号同步的问题 这种设计需要单时钟宽度脉冲以及用于读 写选通的脉 冲同步器 因为当一个电平信号从一个时钟域跨越到 另一个更快的时钟域时 在较快时钟域中它能在更多的时钟周期中保持有效 由于只要读或写信号是有效的 每个计数器就会发生变化 因此较快的时钟域就检测到更多的读 写 超出较慢时钟域实际发生的数量 脉冲同 步器可以将一个时钟域的时钟宽度脉冲转换为新时钟域的时钟宽度脉冲 每

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论