在跨时钟域(一)中,我们介绍了打两拍的方法,尽管这个方法可以有效处理单bit跨时钟域信号的亚稳态问题,但是当发送方的时钟比接收方的时钟快时,有可能出现信号有效时间过段,接收方采样不到的情况。握手就是解决这一问题的有效方法,同时,握手还可以解决多bit跨时钟域信号的同步。本文就对该方法作一介绍。
同步握手同一时钟控制下的握手过程比较简单,这里以著名的AXI4协议为例,如下图所示 发送方要发送数据的时候,就拉高VALID信号,同时把要发送的数据放到数据总线上,接受方看到VALID信号为高,并且自己也有时间接受数据,于是拉高READY信号,表示数据已经被接收,发送方看到接受方已完成数据的接收,于是拉低VALID信号,同时接收方也拉低READY信号,一次握手完成。可以看到,在上图的情况中,数据的读取发生在VALID和READY信号同为高的时候,这就是一个典型的握手过程。
在跨时钟域的情况下,握手的过程略有不同,首先,为了防止亚稳态的出现,我们必须将VALID信号同步到接收方的时钟域中,同时,接收方拉高的READY信号也必须同步到发送方的时钟域中,才能被使用。与此同时,接收方在拉高READY信号之后,还需经过几个周期才会同步到发送方的时钟域,因此VALID信号不会马上拉低,进而接收方同步过来的VALID信号也不会马上拉低,这会导致接收方以为是下一个VALID信号的到来。因此,为了解决这个问题,我们不检测VALID的高电平信息,转而检测VALID的上升沿信息,同理READY信号同步的时候也这么做。 RTL代码如下: sender.sv
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/02/22 20:50:31
// Design Name:
// Module Name: sender
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module sender(
input logic sclk,
input logic rst,
input logic start,
input logic [31:0] data,
output logic valid,
output logic [31:0]sdata,
input logic ready //从另一个时钟域来的ready信号
);
logic ready_ff1;
logic ready_ff2;
logic ready_ff3;
logic pulse;
assign pulse=ready_ff2&&~ready_ff3; //检测read_ff3上升沿
always_ff@(posedge sclk,posedge rst)
if(rst)
begin
ready_ff1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?