赞
踩
一个简单的握手机制的设计。
目录
握手机制是很常见的一种机制,尤其是在各种各样的总线协议中会经常使用。对于面向连接的场景,无论哪一方向另一方发送数据之前,都必须先建立双方的连接,而握手机制的意义就是提供稳定可靠的连接。
考虑一种上游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
测试波形:
我这个测试比较简单,只测试了其中一种情况,感兴趣的朋友可以自行去测试其他几种情况。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。