跨时钟域信号处理——专用握手信号

转:https://blog.csdn.net/bleauchat/article/details/96857247

下图是一个基本的握手通信方式。所谓握手,意即通信双方使用了专用控制信号进行状态指示。这个控制信号既有发送域给接收域的,也有接收域给发送域的,有别于前面的单向控制信号检测方式

使用握手协议方式处理跨时钟域数据传输,只需要对双方的握手信号(req和ack)分别使用脉冲检测方法进行同步。在具体实现中,假设req、ack、data总线在初始化时都处于无效状态,发送域先把数据放入总线,随后发送有效的req信号给接收域接收域在检测到有效的req信号后锁存数据总线,然后回送一个有效的ack信号表示读取完成应答发送域在检测到有效ack信号后撤销当前的req信号,接收域在检测到req撤销(需要进行边沿检测)后也相应撤销ack信号,此时完成一次正常握手通信。此后,发送域可以继续开始下一次握手通信,如此循环。该方式能够使接收到的数据稳定可靠,有效的避免了亚稳态的出现,但控制信号握手检测会消耗通信双方较多的时间。以上所述的通信流程如下图所示:


 
 
  1. module handshake(
  2. input clk, //50MHZ时钟
  3. input rst_n, //复位信号
  4. input req, //数据发送请求信号
  5. input [ 15: 0]data_in, //数据输入
  6. output reg ack, //应答信号
  7. output [ 15: 0]data_out
  8. );
  9. reg req1,req2,req3; //req输入同步信号
  10. reg [ 15: 0]data_in_r; //输入数据寄存器
  11. wire pos_req1,pos_req2;
  12. //---------通过三级寄存器同步异步输入信号req--------
  13. always@(posedge clk or negedge rst_n) begin
  14. if(!rst_n) begin
  15. req1 <= 1 'b0;
  16. req2 <= 1'b0;
  17. req3 <= 1 'b0;
  18. end
  19. else begin
  20. req1 <= req;
  21. req2 <= req1;
  22. req3 <= req2;
  23. end
  24. end
  25. //--------------检测req1、req2的上升沿---------------
  26. assign pos_req1 = req1 && ~req2;
  27. assign pos_req2 = req2 && ~req3;
  28. //----------在检测到pos_req1上升沿时,锁存数据-------
  29. always@(posedge clk or negedge rst_n)begin
  30. if(!rst_n)begin
  31. data_in_r <= 16'd0;
  32. end
  33. else begin
  34. if(pos_req1) begin
  35. data_in_r <= data_in;
  36. end
  37. end
  38. end
  39. assign data_out = data_in_r;
  40. //----------在检测到pos_req2上升沿时,发出ack应答信号,表示数据已经锁存-------
  41. //----------检测req信号,如果req信号取消,则ack也取消-----------------------
  42. always@(posedge clk or negedge rst_n) begin
  43. if(!rst_n) begin
  44. ack <= 1 'b0;
  45. end
  46. else begin
  47. if(pos_req2)begin
  48. ack <= 1'b1;
  49. end
  50. else if(!req) begin
  51. ack <= 1 'b0;
  52. end
  53. end
  54. end
  55. endmodule

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值