当今的数字系统往往是围绕CPLD/ FPGA 进行设计的, 首选的方案是采用同步时序电路设计 , 也称作单时钟系统, 电路中所有触发器的时钟输入端共享同一个时钟, 每个触发器的状态变化都是在时钟的上升沿( 或下降沿) 完成的, 与时钟脉冲信号同步。
但在实际的工程应用中, 纯粹单时钟系统设计不能完成数据在不同时钟域间的传递, 跨时钟域的异步时序设计不可避免。异步时序电路中有多个独立的时钟源, 不同时钟源存在频率和相位的差异, 当数据信号通过两个时钟域的交界处时, 将会分别由这两个时钟来控制信号的值。此时如果两时钟信号的敏感沿非常接近并超过了允许的额度, 则将出现数据信号的不稳定, 即电路陷入亚稳态, 也称为同步失败。
异步电路设计的关键就是把数据或控制信号正确地进行跨时钟域传输, 同时防止亚稳态的出现。如果对跨时钟域带来的亚稳态、采样丢失等问题处理不当, 将导致系统无法正常运行。
随着信息技术的飞速发展, 航天航空、军事应用领域对数据异步传输的可靠性提出了更高的要求, 如果不彻底消除亚稳态隐患, 将可能导致灾难性的后果。
1 亚稳态的产生
1. 1 单触发器的亚稳态
触发器是数字电路设计中最常用的基本器件, 内部包含两个双稳态元件, 其特性曲线如图1 所示。除了两个稳定状态0 和1 外, 还有一个状态也满足双稳态元件的方程,即当两个反相器都处于中间值的第3 种半稳定态----- 亚稳态, 反相器在非逻辑值范围的反馈系数是相当大的, 一旦因干扰或噪音离开了这个中心点, 就会很快地进入逻辑值范围( 稳态) 。
图1:亚稳态问题
触发器工作过程中要满足数据建立( setup ) / 保持( hold) 的时间要求, 输入信号在时钟的上升沿前后是不允许发生变化的。对于使用上升沿触发的触发器来说,建立时间就是在时钟上升沿到来之前, 触发器输入端数据必须保持稳定不变的最小时间; 而保持时间是时钟上升沿到来之后, 触发器输入端数据还应该继续保持稳定不变的最小时间。建立( setup) / 保持( hold) 时间与时钟跳变沿的关系如图2 所示。
图2 setup-hold 时间
因为触发器内部数据的形成需要一定的时间, 如果不满足建立和保持时间, 触发器将进入亚稳态, 其输出在经过一段时间的不确定状态后才能随机地稳定到0 或1。在稳定期间, 触发器输出一些中间级电平, 或者可能处于振荡状态, 并且这种无用的输出电平可以沿信号通道上的各个触发器级联传播下去, 导致其他数字部件的逻辑混乱。
1. 2 异步时钟造成的亚稳态
信号在跨时钟域时应特别注意亚稳态问题。一个信号在过渡到另一个时钟域时, 如果仅仅用一个触发器将其锁存, 那么采样的结果将可能是亚稳态。图3 所示为异步时钟和亚稳态, 图中a_ck 和b_ck 为异步时钟。
图3 触发器产生亚稳态
信号dat 经过一个锁存器的输出数据为a_dat。用时钟b_ck 进行采样的时候, 如果a_dat 正好在b_ck 的set up??hold 时间内发生变化, 此时b_dat 就既不是逻辑1, 也不是逻辑0, 而是处于中间状态。输出信号处于中间状态到恢复为逻辑1 或0 的这段时间, 称为亚稳态时间。当触发器的亚稳态时间超过一个时钟周期时, 这种不确定状态将会影响下一级的触发器, 最终导致连锁反应使整个系统功能失常。
1. 3 降低亚稳态的现有方法
常用于降低异步电路中亚稳态发生概率的方法有:
1) 两级触发器法
两级触发器法就是在一个信号进入另一个时钟域之前, 将该信号用两个触发器连续锁存两次, 也称为双锁存器法。这样做可以防止由于异步输入信号对于本级时钟可能不满足建立保持时间而使本级触发器产生的亚稳态传播到后面逻辑中。理论研究表明这种设计可以将出现亚稳态的几率降低到一个很小的程度, 但这种方法同时带来了对输入信号的一级延时。
两级触发器法在2 个异步时钟周期相差不大的情况下比较适合。在信号从快时钟域向慢时钟域过渡的时候,如果信号变化太快, 慢时钟将可能无法对该信号进行正确的采样, 导致采样失败。使用两级触发器法时, 应使原始信号保持足够长的时间, 以便另一个时钟域的触发器可以正确地对其采样。
2) 结绳法
针对双锁存器法在快时钟域向慢时钟域过渡中可能存在采样失效的问题, 一般采用"结绳法" 进行设计, 通过分频方式将慢时钟信号的周期增长, 经双锁存采样后再使其恢复原来的时钟周期。即用"结绳" 将信号延长, 用"同步"实现双锁存采样, 用"解绳"还原为原来的时钟, 保证另一个时钟域也可以正确采样, 而接收方用相反的流程送回响应信号。
"结绳法"是一种安全的跨时钟域的方法, 可以解决快时钟域向慢时钟域过渡的问题, 适用的范围也很广。但是"结绳法"实现较为复杂, 特别是其频率不高, 所以在对设计性能要求较高的场合,应该慎用。
3) 异步FIFO
在有大量的数据需要进行跨时钟域传输且对数据传输速度要求比较高的场合, 一般采用异步FIFO, 异步FIFO 即用一种时钟写入数据, 而用另外一种时钟读出数据, 其中这两个读写时钟是异步的。
4) 格雷编码法
由实践可知, 同步多个输入信号出现亚稳态的概率远大于同步1 个异步信号的概率。由于格雷码每次只变化1位, 因此异步FIFO 的读写地址使用格雷码计数器可以有效地减少亚稳态的产生, 特别是在地址位比较多的情况下能更好地解决亚稳态的问题。
2 外部逻辑控制方法消除亚稳态
传统的观点认为: 只要系统中有异步元件, 亚稳态就是无法避免的。
在多时钟域的异步电路系统中, 数据的建立和保持时间很难得到保证, 这时最好的方法是将所有非同源时钟同步化[5] , 具体措施是使用带复位端的D 触发器, 并引入一个高频时钟( 频率高于系统中的所有源时钟) , 达到使系统中所有源时钟同步的效果。基于这种思想, 本文提出一种
新的方法-----半拍错位同步法!, 选择适当参数的逻辑器件, 便能彻底消除异步电路中的亚稳态。
2. 1 半拍错位同步法原理
半拍错位同步法的思想是: 从外部引入一高频时钟h_ck 到异步电路中, 通过一定的逻辑和时序处理, 将异步时钟a_ck 同步到高频时钟的上升沿, 同时将异步时钟b_ck同步到高频时钟h_ ck 的下降沿, 这样两个完全独立的异步时钟经过高频时钟h_ck 同步处理后, 时间上至少错开时钟h_ck 的半周期, 只要半周期满足原电路中触发器的建立时间要求, 便可彻底避免亚稳态的发生。
半拍错位同步法的电路和时序波形图如图4 所示, 电路包括两个带异步复位端的D 触发器、两个信号延迟环节、两个2 输入端或门、两个3 输入端与门、1 个反相器。异步时钟a_ck 与其延迟信号a_ck_d 的或输出接触发器D_A 的数据端D 和异步复位端CLR, a_ck 和a_ck_d 的与用于选通高频时钟h_ck 进入触发器D_A 的时钟端CP( 要求延迟时间大于触发器D_A 的建立时间) 。
图4 半拍错位同步法的电路和时序波形图
时序如下:
1) a_ck= 0 时, 触发器复位端CLR 有效, a_ck_o= 0;
2) 上升沿过后, a_ck= 1 稳定作用在数据端D, 经延迟环节a_d 的适当延时后, a_ck 和a_ck_d 同时为1, 高频时钟h_ck 进入触发器D_A 的时钟端CP;
3) 高频时钟h_ ck 的上升沿将数据端D 的数据1 锁存, 使输出端a_ck_o= 1, a_ck_o 与h_ck 的上升沿同步;
4) a_ck 下降沿后a_ck= 0, 与门a_and 输出0, 即触发器D_A 的时钟端CP 保持0, a_ck_o= 1;
5) a_ck 延时信号a_ck_d 下降沿后, 或门a_or 输出0,触发器复位使a_ck_o= 0。
异步时钟b_ck 的时序情况与a_ck 类似, 唯一不同的是h_ck 的反相信号经b_ck 和b_ck_d 的与选通后进入D_B 的时钟端, b_ck_o 与h_ck 的下降沿同步。
由图4 可见, 设信号a_ck 和b_ck 分别在极为接近的时刻1 和2 向上跳变, 其相应输出a_ck_o 和b _ck_o 的上升沿分别处于时刻3 和4, 时间上错开了高频时钟的半周期, 同样在时刻5 几乎同时升上跳的信号a_ck 和b_ck, 输出a_ck_o 和b_ck_o 的上升沿分别处于时刻7 和6, 也在时间上错开了高频时钟的半周期。因此, 经过上部电路的处理后, 原来时间上完全独立的信号a_ ck 和b_ck 变成了时间上有一最小固定间隔的信号a_ck_o 和b_ck_o。
为了叙述方便, 规定电路中参数的符号表示为: 延迟环节的延迟时间为T d, 高频时钟h_ck 的周期为T hck, 同步电路中D 触发器的建立时间为信号T set, 保持时间为信号T hold , a_ck 和b_ck 的高电平宽度为T H , 基于上述表示, 根据半拍错位同步法的时序要求, 对电路的相关参数选择原则总结如下:
1) T hck> T of f, T of f表示后面电路中对异步时钟信号的时间分离或数据建立时间要求, 高频时钟应在满足此条件基础上取较高的频率;
2) T d> T s , 确保D 触发器的数据建立时间满足要求;
3) T H+ T d> T set + T hold ;
4) T H> T d+ 2 # T hck。
2. 2 半拍错位同步法的应用
2. 2. 1 在异步触发电路中的应用
以图3( a) 电路为例说明半拍错位同步法在异步触发电路中的应用, 将半拍错位同步电路串行接入图3 的异步触发电路, 给同步电路引入一高频时钟h _ck, 图3( a) 电路中的a_ck 和b_ck 接同步电路的相应触发器, dat 连接关系不变, 同步电路输出a_ck_ o 和b _ck_ o 分别代替a_ck 和
b_ck接入原电路相应位置, 由2. 1 小节的分析知, 给原电路串入半拍错位同步电路后, 由于a_ck_o 和b_ck_o 在时间上错开半个h_ck 周期, 其后的触发电路中不会再发生亚稳态。
2. 2. 2 在异步FIFO 中的应用
异步FIFO( First In First Out ) 为多时钟域系统异步时钟间接口设计提供了一种简便、快捷的解决方案, 在网络接口、图像处理等方面, 得到了广泛的应用。
异步FIFO 是跨时钟域设计方法的集中体现, 体现了很多的方法。其中最重要的有两点, 一个是亚稳态, 另一个就是和亚稳态类似但不相同的------多个控制/ 状态信号的跨时钟传递。对于异步FIFO, 采用格雷码进行读写地址计数, 每次只变化1 个位, 大大减小了亚稳态发生的概率。由于异步FIFO 的读写信号属于不同的时间域, 因此set up/ hold 冲突和亚稳态的发生是必然的, 数据的丢失概率不为零。
异步FIFO 产生亚稳态的原因是读写信号属于不同的时间域, 没有确定的时间关系, 因此只要通过适当的外部逻辑将读写信号在时间上产生间隔, 就能消除亚稳态, 解决异步FIFO 丢失数据问题。将半拍错位同步法用于异步FIFO 的读写信号控制的电路如图5 所示, 图中虚线框内是半拍错位同步电路。给同步电路引入高频时钟h_ck, 外部独立的读R# 和写W# 信号接在虚线框内的同步器上,
同步电路的输出R_O 和W_O 接FIFO 的读写管脚, 由2. 1小节的分析知, 给原电路串入半拍错位同步电路后, 由于R_O和W_O 在时间上至少错开半个h_ck 周期, 因此其后的异步FIFO 中不会发生亚稳态造成数据丢失。
图5 半拍错位同步法在异步FIFO 中应用
图5 所示的电路是对异步FIFO 外加控制逻辑消除亚稳态。半拍错位同步法也可用于由异步FIFO 的FPGA 设计中。
3 结论
亚稳态是异步电路和异步FIFO 设计中的常见问题,将异步信号同步化的几种常用方法虽能大大将降低亚稳态发生的概率, 但无法 根除! 亚稳态的发生。本文提出的半拍错位同步法!, 通过附加的带异步复位端的D 触发器和高频时钟, 将异步时钟分别同步到高频时钟的上升沿和下降沿, 使得过于接近的异步时钟在时间上拉开一定的间隔, 只要选择适当的延迟时间和高频时钟, 便能彻底消除亚稳态的发生, 在航天航空、军事等对要求高可靠数据传递的应用领域具有广阔的应用前景。