一个简单的握手机制的设计。
一、握手机制概述
握手机制是很常见的一种机制,尤其是在各种各样的总线协议中会经常使用。对于面向连接的场景,无论哪一方向另一方发送数据之前,都必须先建立双方的连接,而握手机制的意义就是提供稳定可靠的连接。
考虑一种上游master和下游slave通信的场景,可能有三种情况:
(1)上游master的数据已经准备好,拉高valid信号,但是下游slave没有准备好则一直等待,直到slave返回ready信号,完成握手,数据传输出去。
(2)下游slave已经准备好,ready拉高,上游master没有准备好,则一直等待,直到master准备好之后拉高valid,完成握手,数据传输出去。
(3)上游master和下游slave同时准备好,同时拉高valid和ready,完成握手,数据传输出去。
二、代码实现
上代码:
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
测试波形:
我这个测试比较简单,只测试了其中一种情况,感兴趣的朋友可以自行去测试其他几种情况。