Verilog设计_握手信号

508 阅读1分钟

一个简单的握手机制的设计。

一、握手机制概述

握手机制是很常见的一种机制,尤其是在各种各样的总线协议中会经常使用。对于面向连接的场景,无论哪一方向另一方发送数据之前,都必须先建立双方的连接,而握手机制的意义就是提供稳定可靠的连接。

考虑一种上游master和下游slave通信的场景,可能有三种情况:

(1)上游master的数据已经准备好,拉高valid信号,但是下游slave没有准备好则一直等待,直到slave返回ready信号,完成握手,数据传输出去。

image.png

(2)下游slave已经准备好,ready拉高,上游master没有准备好,则一直等待,直到master准备好之后拉高valid,完成握手,数据传输出去。

image.png

(3)上游master和下游slave同时准备好,同时拉高valid和ready,完成握手,数据传输出去。

image.png

二、代码实现

上代码:

module shake_hand(
    input clk,rst_n,
    input [7:0] data_i,
    input valid_i,
    output ready_o,   
    output [7:0] data_o,
    output valid_o,
    input ready_i
);
 
    reg [7:0] data_o_r;
    reg valid_o_r;
    assign ready_o = ready_i;   // slave对master返回的ready信号
 
 
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            data_o_r <= 8'b0;
        end
        else if(ready_i && valid_i)begin
	        data_o_r <= data_i * 2;
        end
        else begin
            data_o_r <= data_o_r;
        end
    end
 
 
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
	        valid_o_r <= 0;
        end
        else if(ready_i)begin
	        valid_o_r <= valid_i;
        end
        else begin
            valid_o_r <= valid_o_r;
        end
    end
 
    assign data_o  = data_o_r;
    assign valid_o = valid_o_r;
 
endmodule

测试波形:

image.png

我这个测试比较简单,只测试了其中一种情况,感兴趣的朋友可以自行去测试其他几种情况。