当前位置:   article > 正文

Verilog设计_握手信号_握手verilog

握手verilog

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

目录

一、握手机制概述

二、代码实现


一、握手机制概述

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

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

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

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

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

二、代码实现

上代码:

  1. module shake_hand(
  2. input clk,rst_n,
  3. input [7:0] data_i,
  4. input valid_i,
  5. output ready_o,
  6. output [7:0] data_o,
  7. output valid_o,
  8. input ready_i
  9. );
  10. reg [7:0] data_o_r;
  11. reg valid_o_r;
  12. assign ready_o = ready_i; // slave对master返回的ready信号
  13. always@(posedge clk or negedge rst_n)begin
  14. if(!rst_n)begin
  15. data_o_r <= 8'b0;
  16. end
  17. else if(ready_i && valid_i)begin
  18. data_o_r <= data_i * 2;
  19. end
  20. else begin
  21. data_o_r <= data_o_r;
  22. end
  23. end
  24. always@(posedge clk or negedge rst_n)begin
  25. if(!rst_n)begin
  26. valid_o_r <= 0;
  27. end
  28. else if(ready_i)begin
  29. valid_o_r <= valid_i;
  30. end
  31. else begin
  32. valid_o_r <= valid_o_r;
  33. end
  34. end
  35. assign data_o = data_o_r;
  36. assign valid_o = valid_o_r;
  37. endmodule

测试波形:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/206873
推荐阅读
相关标签
  

闽ICP备14008679号