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

在逻辑设计领域,只涉及单个时钟域的设计并不多。尤其对于一些复杂的应用,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 握手通信仿真波形

时间: 2024-07-29 19:42:00

跨时钟域信号处理——专用握手信号的相关文章

基于FPGA的跨时钟域信号处理——亚稳态(V3-FPGA学院)

(V3-FPGA学院教你学习FPGA) 基于FPGA的跨时钟域信号处理--亚稳态 基于FPGA的跨时钟域信号处理--亚稳态 什么是亚稳态? 所有数字器件(例如FPGA)的信号传输都会有一定的时序要求,从而保证每 个寄存器将捕获的输入信号正确输出.为了确保可靠的操作,输入寄存器的信号必须在时钟沿的某段时间(寄存器的建立时间Tsu)之前保持稳定,并且持续到时钟沿之后的某段时间(寄存器的保持时间Th)之后才能改变.而该寄存器的输入反映到输出则需要经过一定的延时(时钟到输出的时间Tco).如果数据信号的

跨时钟域信号处理

1.什么是跨时钟域? 如图所示: 缺点:数据传输不可靠 2.如何实现信号传输稳定? 设计最基本的思想就是同步. 看两篇文章:<(多图) 跨越鸿沟:同步世界中的异步信号>.<cpu与fpga跨时钟域数据交换的实现问题>

FPGA中信号的跨时钟域处理模板(一)

在做项目的时,我们经常会使用到多个时钟.每一个时钟在FPGA内部都会形成一个时钟域,如果一个时钟域中要用到另外一个时钟域的信号,也就形成了跨时钟域的操作,这时候要格外小心. 一.实际使用背景       假设在项目中需要在clk_b时钟域中用到用到来自clk_a中的信号.那么此信号就需要从clk_a时钟域跨越到clk_b中因此我们要建立一个同步计数器,该设计器从clk_a 中获取信号,然后再clk_b中创建一个新的信号.并从作为输出.模型如下: 在此设计中.我们假设输入的信号与clk_a和clk

FPGA中信号的跨时钟域处理模板(三)

一.背景  如果clk_a时钟域中的某个任务需要在clk_b时钟域中来完成.则可以采用以下设计:通过框图可知人任务的跨时钟域的处理相当于两个买冲刺你好的跨时钟域的处理.在两个标志信号跨时钟域完成后,在此期间相关任务的跨时钟域. 这只是其中的一种方法. 二.模板 模块 TaskAck_CrossDomain( 输入 clkA, 输入 TaskStart_clkA, 输出 TaskBusy_clkA,TaskDone_clkA, 输入 clkB, 输出 TaskStart_clkB,TaskBusy

柯西恒等式 FPGA中信号的跨时钟域处理模板(四)

要将数据总线(2位或更多位宽度)从一个时钟域移到另一个时钟域,我们有几种处理方法.一下有几种方法可以采取. 1.格雷码:如果数据总线是单调计数器(即仅递增或递减),我们可以将其转换为格雷码,该格雷码具有跨时钟域的能力(在某些定时条件下)   2.数据冻结:如果数据总线是非单调的,则使用标志向其他域发出信号以捕获值(在源时钟域中冻结该值). 3.数据突发:如果数据总线具有许多需要跨越时钟域的连续值,请使用异步FIFO,在其中您从源时钟域中推送值,并从另一个域中读取值. 一.第3种方法为例    

FPGA中亚稳态相关问题及跨时钟域处理

前言 触发器输入端口的数据在时间窗口内发生变化,会导致时序违例.触发器的输出在一段时间内徘徊在一个中间电平,既不是0也不是1.这段时间称为决断时间(resolution time).经过resolution time之后Q端将稳定到0或1上,但是稳定到0或者1,是随机的,与输入没有必然的关系. 触发器由于物理工艺原因,数据并不是理想化的只要触发沿时刻不变即可.触发器有固定的建立时间,保持时间. 建立时间:在时钟有效沿到来前数据需要稳定的时间. 保持时间:在时钟有效沿之后数据还需要保持不变的时间.

cdc跨时钟域处理-结绳握手法

参考文档 https://blog.csdn.net/u011412586/article/details/10009761 前言 对于信号需要跨时钟域处理而言,最重要的就是确保数据能稳定的传送到采样时钟域. 普通的cdc处理方法需要关注时钟域速度的异同,即分慢时钟域到快时钟域.快时钟域到慢时钟域.相位关系等问题,会让人瞬间爆炸. 那么,是否有一种相对稳定,又无需关注传送时钟域和接收时钟域两者时钟速度.相位关系的数据传递方式呢? 这里仿真验证握手结绳法,自己想的,不知道跟结绳法是不是一致的...

跨时钟域设计【二】——Fast to slow clock domain

跨时钟域设计中,对快时钟域的Trigger信号同步到慢时钟域,可以采用上面的电路实现,Verilog HDL设计如下:   // Trigger signal sync, Fast clock domain to slow domainmodule Trig_CrossDomain_F2S ( input clkB, input rst_n, input TrigIn_clkA,  output  reg TrigOut_clkB );  reg Q1,Q2,nQ2;  always @(pos

跨时钟域设计【一】——Slow to fast clock domain

跨时钟域设计是FPGA设计中经常遇到的问题,特别是对Trigger信号进行同步设计,往往需要把慢时钟域的Trigger信号同步到快时钟域下,下面是我工作中用到的慢时钟域到快时钟域的Verilog HDL设计.     // Trigger Cross Domain Design, Slow to fast clock domain  module Trig_ CrossDomain _S2F (      input clkB,      input rst_n,      input Trig