如何处理跨时钟域这些基础问题

导言
在很久之前便陆续谈过亚稳态,fifo,复位的设计。本次亦安做一个简单的总结,从宏观上给大家展示跨时钟域的解决方案。
什么是亚稳态?
对大多数工程师来讲,亚稳态是非常难以追踪的,因为它具有不确定性,在相对规范的设计下,如果仍然发生这个问题,那么可能非常难以复现异常。简单来讲,当触发器不满足建立时间和保持时间要求时,就会导致亚稳态。亚稳态出现时,触发器既不是高逻辑也不是低逻辑,后续电路则可能读取为0或者1(不确定状态),导致电路逻辑做出不符合当前事物逻辑的事情。
对于数字设计人员来讲,只要信号从一个时钟域跨越到另一个时钟域,那么就可能发生亚稳态。我们称为“跨时钟域”即“clock domain crossing”,或cdc。
所以今天主要简单了解如何处理cdc这些基础问题。
同步跨时钟域信号
对大多数初学者来讲,当我们遇到cdcs时,有经验的工程师会告诉我们“打两拍”,即让信号通过两个 flip-flops,每个flip-flop都由新时钟域的时钟驱动(如下图)。第一个触发器出现亚稳态的概率很高,但第二个触发器的输出亚稳态的概率就会低得多。当然更多的flip-flops会让亚稳态的概率进一步下降,但一般下降的概率差距不会太大,如何选择取决于设计者自己。但并非多数cdc问题都能用这种简单方法,这种设计适用于旧时钟域比新时钟域慢的多的情况。经典的可配置的代码如下。
// language: verilog-2001`resetall`timescale 1 ns / 1 ps`default_nettype none/* * synchronizes an asyncronous signal to a given clock by using a pipeline of * two registers. */module sync_signal #(    parameter width=1, // width of the input and output signals    parameter n=2 // depth of synchronizer)(    input wire clk,    input wire [width-1:0] in,    output wire [width-1:0] out);reg [width-1:0] sync_reg[n-1:0];/* * the synchronized output is the last register in the pipeline. */assign out = sync_reg[n-1];integer k;always @(posedge clk) begin    sync_reg[0] <= in;    for (k = 1; k < n; k = k + 1) begin        sync_reg[k] <= sync_reg[k-1];    endendendmodule`resetall 异步复位同步释放
cdc中一个常见的例子就是异步复位,这个问题我在“fpga复位信号设计讨论“一文中有详细的表述,这里简单讲解,对于初学者而言,不太建议用异步复位,尽管他们各有优劣,但至少对fpga设计者而言,这个建议应该是有效的,即使是xilinx官方也同样建议使用同步复位(ug949)。但有些状态下可能同步复位无效,比如在低功耗设计中,时钟可能在复位前就已经被“无效”,那么异步复位自然成为一个选择。异步复位关键点不在进入复位状态,而在于移除复位,因为移除状态可能会进入亚稳态,除了“fpga复位信号设计讨论”一文,大家同样可以参阅我翻译的经典论文“同步复位与异步复位”。经典的代码如下所示,但请注意区别此处代码和“打两拍“的区别。
// language: verilog-2001`resetall`timescale 1ns / 1ps`default_nettype none/* * synchronizes an active-high asynchronous reset signal to a given clock by * using a pipeline of n registers. */module sync_reset #(    // depth of synchronizer    parameter n = 2)(    input  wire clk,    input  wire rst,    output wire out);(* srl_style = register *)reg [n-1:0] sync_reg = {n{1'b1}};assign out = sync_reg[n-1];always @(posedge clk or posedge rst) begin    if (rst) begin        sync_reg <= {n{1'b1}};    end else begin        sync_reg <= {sync_reg[n-2:0], 1'b0};    endendendmodule`resetall 很多人争论高电平复位有效好还是低电平复位有效好,一般情况下我常见低电平复位有效,但高电平复位有效也不是没有,一般认为在fpga中区别不是太大,但在asic中,低电平似乎更加常见。
跨时钟握手
有时需要一种方法来处理cdc,例如从慢时钟到快时钟,从快时钟到慢时钟,这时需要:握手信号,在“axi4协议逻辑规范以及bug处理”一文写过握手的注意点。握手的详细技术点感兴趣的朋友可以网上找相关资料。
fifo
fifo网上的文章特别多,具体的设计细节有很多需要讨论的地方,但对于跨时钟域而言,fifo几乎是最方便的数据传输方式。这里不展开讲,之前我写过关于fifo的相关文章,不是特别详细,接下来会有详细的关于fifo的计划,在此之前,大家可以看clifford e. cummings经典论文,他的论文真的很推荐。
http://www.sunburst-design.com/papers/cummingssnug2008boston_cdc.pdf


崇达技术成功通过AEO高级认证 可最大程度满足客户的交付需求
数字电视及其测量浅谈
控制激光驱动器的方法:POT和DAC
手持式蓝光3D三维扫描仪的扫描方式
世界上最大曲面显示器下个月开售 定位高端标准与游戏玩家
如何处理跨时钟域这些基础问题
耳机插座接口规格分类及五大特点介绍
家庭配电箱接线图_家庭配电箱安装规范_高低压配电柜接线规范
翼思维浅谈物联网时代下医废收运的产业链信息化管理
2019年值得关注的十大物联网安全事件
一文看懂功放的工作原理与作用
科创板铂力特监事、监事会主席宫蒲玲介绍、履历信息
新世相 智能家居不再专属于年轻人
单相可控整流电路
Linux以inode的方式,让数据形成文件
基于LCDSI71263液晶显示模块电路设计
FF的领先技术优势获得恒大支持
台湾仍为全球PCB龙头,中国内地厂商急起直追
记脚本小子的一次渗透全过程
荣耀笔记本技术创新将给手机进行无线充电