Xilinx FPGA 设计中的跨时钟域问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈XLINX FPGA设计中跨时钟域的同步设计问题
摘要
本文介绍了FPGA设计中的同步设计原则并对FPG A设计中的触发器亚稳态问题进行了阐述本文通过具体的设计实例论证了跨时钟域同步处理的必要性并介绍了一种实现跨时
钟域同步处理的方法和其具体电路
关键字
同步设计异步设计触发器亚稳态时序稳定
一同步设计的原则
尽量使用同步电路避免使用异步电路这句话是电路设计的几个原则之一同异步设计相比同步设计设计出来的电路更稳定可靠在XILINX FPGA设计中时常
有设计人员遇到如下类似的问题
设计的电路升级困难可移植性差也就是说一些原本工作正常的电路移植到高端的FPGA中就根本工作不起来了
设计的电路一致性差同一电路设计每次布线后工作的结果不同
设计的电路时序仿真正常但实际电路上却工作不起来
设计的电路极易受毛刺的干扰
通常这些类似的问题都于电路的异步设计有关
二亚稳态
图1 触发器的亚稳态示意图
对于触发器当时钟沿到来时其输入要求是稳定的这时其输出也是稳定的但假如时钟沿到来时其输入也正在变化即翻转这时触发器会瞬时进入亚稳态通
常触发器对输入信号都有一个建立时间的要求也即setup时间当这一建立时间得
不到满足时触发器也会进入瞬时亚稳态如图1
通常触发器即使进入亚稳态也会很快进入稳态但其输出值是不定的这有可能对使我们设计的FPGA模块尤其是哪些有复杂状态机的模块产生错误的逻辑对于亚稳态问题我们还应明白亚稳态问题并非指输出结果数据的不确定性而是指输出变化的时序不确定性
遵循同步设计的原则有助于解决亚稳态问题使我们设计出稳定可靠的电路模块对于单时钟系统我们可以很方便地设计出稳定易于设计及仿真的同步单一时钟系统但在电信和数据通讯领域中我们设计的系统中往往具有多个时钟往往需要将数据或时序由一个时钟域传到另一个时钟域这类设计的难点在于实现不同时钟域之间数据和时序变化的稳定可靠地传递采用经验证的设计技术可以实现跨时钟域的同步设计进而设计出可靠工作的电路
三跨时钟域的异步设计案例
本人曾经设计过如下几个模块这些模块中的几个子模块分别工作在各自的时钟域
中但在他们之间有着数据和时序的传递在设计这些模块的初始时并没有考虑到跨时钟域时序和数据传递的特殊性使得在系统上使用这些模块时出现过一些较为棘手的问题现把它们列举出来供大家研究
模块一名称:
芯片配置模块模块功能
从平行口接收从PC 机下传的命令和参数产生相应的控制时序完成单板上芯片的配置
模块结构框图
图2 同步处理前芯片配置模块结构框图
各子模块简介
模块A 实现同PC 的平行接口PC 机控制程序通过操作并行口各个引脚把各个参数信息如数据地址信息传递到参数控制总线上并且发出相应的命令如start, write 等命令启动下层模块
模块B 是一个状态机clk 是状态机的主时钟模块B 根据模块A 传来的命令启动相应的状态机完成从参数传递总线上获取参数信息或产生相应的配置时序完成芯片的正确配置
在上图中模块A 中各寄存器都受控于并行口各引脚的状态它们在并行口引脚中stroble 引脚的上跳沿发生状态的迁移可以说stroble 引脚是模块A 的主时钟信号
由上分析得模块A 和模块B 分属于两不同的时钟域时钟域A 和时钟域B
中时钟域A 的主时钟为stroble, 时钟域B 的主时钟为clk 两时钟域的主时钟stroble 和clk 是不相关的它们之间的信号就为跨时钟域A 和时钟域B 之间的信号线其中write 信号线,start 信号线及回馈握手信号线用于实现控制时序的传递而参数传递总线用于实现数据的传递
在如上的设计中没有对跨时钟域的时序控制线进行同步处理在系统使用此模块时出现如下的问题
Parrel port with PC
PC机上芯片配置命令并不能总是成功的启动模块B 中相应的状态机也即PC机上芯片配置命令并不能总是成功地实现芯片的正确配置
芯片配置时序的不稳定性
故障的偶然性故障的不可重复性
模块二
名称:
突发调制器模块
模块功能
完成数据的突发调制
模块结构框图
图3 同步处理前突发调制器模块框图
各子模块简介
模块A 为突发调制器主控模块它的主时钟为CLKA它利用CLKA定时产生周期的Send_data信号去启动模块B中的状态机模块B为突发调制器时序控制模块它的主时钟是从专用调制器芯片送来的TXBITCLK时钟信号模块B根据模块A的触发信号启动相应的状态机产生相应的调制器控制时序专用调制芯片中的DPLL(数字锁相环)根据相应的设置参数以CLKB为参考时钟产生TXBITCLK时钟信号上图中R1R2为跳接电阻通过R1R2不同的焊剂方式可以改变CLKB时钟信号的时钟源在如上的设计中没有对跨时钟域的时序控制进行同步处理在系统使用此模块时出现如下的问题
在R1短接R2断开情况下CLKA时钟信号和CLKB时钟信号共用一个时钟源晶体
A,上述模块工作正常稳定
在R1断开R2短接情况下CLKA 时钟信号的时钟源为晶体A CLKB 时钟信号的时钟源为晶体B 晶体A 和B 是两个独立不相关的晶体这时模块A 和模块B 工作于不同的时钟域(时钟域A 和时钟域B) 它们之间的信号就为跨时钟域A 和时钟域B 之间的信号线Send_data 信号和回馈握手信号线用于实现两时钟域之间控制时序的传递
此时上述模块工作很不稳定模块B 中的状态机经常进入一种未知状态不能产生正确的调制器控制时序
四 跨时钟域的同步设计的方法
经对上述案例仔细地仿真和深入分析后笔者发现作成上述两模块工作不稳定的主要原因是没有按照同步设计的原则对跨时钟域的时序控制信号进行同步处理可以有好几种电路用于实现跨时钟域的时序控制信号的同步处理下面的电路模块Asy_syc 可以用于跨时钟域时序控制信号的同步处理
Asy_in
Syc_clk
Syc_out
Time periphery
图4 Asy_syc 电路原理图
上述电路的时序仿真图如下:
图5 Asy_syc 时序仿真图
由时序仿真图可以看出主时钟Syc_clk 的异步输入信号Asy_in 经该电路后输出同步于主时钟Syc_clk 的Syc_out 信号, 从而实现了异步信号的同步处理
按照同步设计原则利用Asy_syc 模块对上述模块二(突发调制器模块)中跨时钟域的信号线Send_data 进行同步处理同步处理模块示意图如图6经实际电路验证得: 同步处理后突发调制器模块运行可靠稳定
同样按同样的处理方式对上述模块一(芯片配置模块) 中跨时钟域的信号线进行同步处理经实际电路验证得: 同步处理后,
芯片配置模块模块运行可靠稳定
图6 同步处理后突发调制器模块框图
五总结
同步处理模块Asy_syc是一个很好的模块笔者用它和其它的简单模块实现了如下的功能:
1. 上沿同步
2. 脉冲同步
3. 异步系统同步
解决了好多Xilinx FPGA设计中棘手的问题
参考资料
XILINX FUNDATION3.1 TRAINING
跨越异步时钟边界传输数据的解决方案 Peter Alfke。