转自:http://bbs.ednchina.com/BLOG_ARTICLE_253787.HTM

在逻辑设计领域,只涉及单个时钟域的设计并不多。尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信。异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同频不同相。

图1是一个跨时钟域的异步通信实例,发送域和接收域的时钟分别是clk_a和clk_b。这两个时钟频率不同,并且存在一定的相位差。对于接收时钟域而言,来自发送时钟域的信号data_a2b有可能在任何时刻变化。

图1 跨时钟域通信

对于上述的异步时钟域通信,设计者需要做特殊的处理以确保数据可靠的传输。由于两个异步时钟域的频率关系不确定,触发器之间的建立时间和保持时间要求也无法得到保证。如果出现建立时间或者保持时间违规,接收域将会采样到处于亚稳态数据,那么后果可想而知。

如何有效的进行跨时钟域的信号传输呢?最基本的思想是同步,在这个基础上设计者可以利用各种协议约定进行通信。单向控制信号检测方式(前面提到过的脉冲信号检测方法,这里为了和握手方式相区别,所以如此称呼)、握手协议的方式或者借助存储器的方式都是比较常用的处理手段。

本文将重点介绍握手方式进行异步时钟域的通信。

图2是一个基本的握手通信方式。所谓握手,意即通信双方使用了专用控制信号进行状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式。

图2 握手通信原理

 使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req和ack)分别使用脉冲检测方法进行同步。在具体实现中,假设req、ack、data总线在初始化时都处于无效状态,发送域先把数据放入总线,随后发送有效的req信号给接收域。接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应答。发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤销后也相应撤销ack信号,此时完成一次正常握手通信。此后,发送域可以继续开始下一次握手通信,如此循环。以上所述的通信流程如图3所示。该方式能够使接收到的数据稳定可靠,有效的避免了亚稳态的出现,但控制信号握手检测会消耗通信双方较多的时间。

图3 握手通信流程

下面通过一个简单的工程代码及其仿真测试进一步加深大家对基本握手协议的认识。

module handshack(

clk,rst_n,

req,datain,ack,dataout

);

input clk;      //50MHz系统时钟

input rst_n;    //低电平复位信号

input req;      //请求信号,高电平有效

input[7:0] datain;  //输入数据

output ack;     //应答信号,高电平有效

output[7:0] dataout;//输出数据,主要用于观察是否和输入一致

//--------------------------------------

//req上升沿检测

reg reqr1,reqr2,reqr3;

always @(posedge clk or negedge rst_n)

if(!rst_n) begin

reqr1 <= 1'b1;

reqr2 <= 1'b1;

reqr3 <= 1'b1;

end

else begin

reqr1 <= req;

reqr2 <= reqr1;

reqr3 <= reqr2;

end

//pos_req2比pos_req1延后一个时钟周期,确保数据被稳定锁存

wire pos_req1 = reqr1 & ~reqr2; //req上升沿标志位,高有效一个时钟周期

wire pos_req2 = reqr2 & ~reqr3; //req上升沿标志位,高有效一个时钟周期

//--------------------------------------

//数据锁存

reg[7:0] dataoutr;

always @(posedge clk or negedge rst_n)

if(!rst_n) dataoutr <= 8'h00;

else if(pos_req1) dataoutr <= datain;   //检测到req有效后锁存输入数据

assign dataout = dataoutr;

//--------------------------------------

//产生应答信号ack

reg ackr;

always @(posedge clk or negedge rst_n)

if(!rst_n) ackr <= 1'b0;

else if(pos_req2) ackr <= 1'b1;

else if(!req) ackr <= 1'b0;

assign ack = ackr;

endmodule

该实例的verilog代码模拟了握手通信的接收域,其仿真波形如图4所示。在发送域请求信号(req)有效的若干个时钟周期后,先是数据(datain)被有效锁存了(dataout),然后接收域的应答信号(ack)也处于有效状态,此后发送域撤销请求信号,接收域也跟着撤销了应答信号,由此完成一次通信。

图4 握手通信仿真波形

基于FPGA的跨时钟域信号处理——专用握手信号相关推荐

  1. 跨时钟域信号处理——专用握手信号

    下图是一个基本的握手通信方式.所谓握手,意即通信双方使用了专用控制信号进行状态指示.这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式 使用握手协议方式处理跨时钟 ...

  2. FPGA跨时钟域信号处理之亚稳态问题

    FPGA跨时钟域信号处理之亚稳态问题学习笔记 跨时钟域会导致"亚稳态"的问题,信号的上升沿和下降沿并不是瞬间被拉高或拉低的,而是有一个倾斜变化的过程,如图中的tx信号的上升沿和下降 ...

  3. (79)FPGA如何处理跨时钟域问题-面试必问(三)(第16天)

    (79)FPGA如何处理跨时钟域问题-面试必问(三)(第16天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA如何处理跨时钟域问题-面试必问(三)(第1 ...

  4. FPGA CDC跨时钟域设计学习(一)亚稳态

    FPGA CDC跨时钟域设计学习(一) 亚稳态 MTBF - mean time before failure 同步器 理论 设计原则 学习资源主要来源于CummingsSNUG2008Boston_ ...

  5. 跨时钟域信号处理(二)——异步fifo的Verilog实现(附同步fifo的实现)

    需要回答几个问题: 1.什么是异步FIFO,异步FIFO有什么功能? 跨时钟域的数据交换,防止亚稳态. 2.在产生写满与读空信号时需要进行跨时钟域如何做的,且如何能正确指示空满状态? 寄存器打两拍+格 ...

  6. 【 FPGA 】跨时钟域处理以及边沿检测

    本文转载自:跨时钟域处理 题目:多时钟域设计中,如何处理跨时钟域 单bit:两级触发器同步(适用于慢到快) 多bit:采用异步FIFO,异步双口RAM 加握手信号 格雷码转换 题目:编写Verilog ...

  7. 跨时钟域信号处理---脉冲同步器详解

    在学习了原子哥的脉冲同步处理模块后,发现了诸多问题. 本文脉络:先对我哥的脉冲同步模块的代码进行一次测试,测试后发现问题,在对问题进行分析并提出解决方案. 这是一个典型的脉冲展宽同步器,实现的的功能是 ...

  8. 跨时钟域电路设计——多bit信号FIFO

    多个bit信号的跨时钟域仅仅通过简单的同步器同步时不安全的. 如下图: 虽然信号都同步到目的时钟域,可完成的功能却与设计的初衷不相符. 解决方案之一为对信号进行格雷码编码,但此方案只适用于连续变化的信 ...

  9. 跨时钟域电路设计——单bit信号

    前面提到了简单的双电平锁存器,下面是一些单bit同步电路. 一.慢时钟域向快时钟域 边沿检测同步器 将慢时钟域的脉冲搬移并缩小为快时钟域的脉冲. 既可以检测上升沿,也可以检测下降沿. 如上图,慢时钟下 ...

最新文章

  1. 什么是目标检测中的旋转敏感度错误?
  2. Jumping Jack
  3. 【C语言入门教程】2.2 常量 与 变量
  4. 【数据库系统】SQL查询的注意事项
  5. 2.14_AVL_tree_AVL树
  6. 安卓中资源ID的问题
  7. python百分号字符串_python--003--百分号字符串拼接、format
  8. Android学习笔记(十一)——从意图返回结果
  9. windows网络编程-几种模式
  10. mw150um 驱动程序win10_mercury无线网卡驱动
  11. logistic回归模型
  12. 想成为一名数据科学家?你得先读读这篇文章
  13. sqldevelop 连接数据库,数据库直接写ip
  14. 我的世界服务器ess汉化文件,《我的世界》ess插件指令大全
  15. 小心肝队-冲刺日志(第八天)
  16. 众筹时代 - Web众筹平台
  17. Python数据类型—数值型
  18. rn+android+sdk,RN与Android原生交互
  19. 华为服务器忘记系统登录密码,服务器主机登陆密码忘记了
  20. 2022年 Q1书单:17本书《可口可乐传》《随机漫步的傻瓜》等 | δ星 丨读书笔记与书单 notes...

热门文章

  1. 一天一种设计模式之二-----备忘录模式
  2. 【 Logistic Regression 】林轩田机器学习基石
  3. c语言中有关逗号表达式
  4. Linux文档内容查询命令
  5. 问题九:C++中::是干嘛用的(域解析操作符)
  6. 大数据分析如何应用在驾驶世界
  7. 大数据可视化技术的挑战及应对
  8. javaweb课堂练习继承与重写怎么做_深入学习Java Web(一):深入了解Servlet
  9. linux qt程序崩溃_Lubuntu 20.04 点评:轻量、简约、文雅 | Linux 中国
  10. linux时间调整为dst,禁用Linux中的夏令时(DST)更改