当前位置:   article > 正文

握手信号方法_跨时钟域数据信号传输

握手信号

目录

1 介绍

2 握手步骤

3 握手信号的要求

4 握手信号的缺点

5 代码实现


1 介绍

使用握信号是最古老的跨时钟域传递数据信号的方式

 将双时钟域分为两个独立系统

2 握手步骤

1 发送器发送xreq信号,表示有效数据已经发送

2 把xreq同步到接收器的时钟域yclk上

3 接收器识别到xreq的同步的信号yreq2后,锁存数据总线上的信号

4 接收器发出yack,表示接受了数据

5 发送器在识别同步的xack2后,将下一个数据放到数据总线上

时序图如图

 安全的将一个数据发送到接收器需要5个时钟周期

3 握手信号的要求

数据在发送时钟域至少稳定两个时钟上升沿

请求xreq信号的宽度应该超过两个上升沿时钟,否则从高到低时钟传递可能无法捕捉到该信号。

4 握手信号的缺点

传输单个数据的延迟比使用FIFO传输相同的数据延迟要大的多。

5 代码实现

  1. module handshack(
  2. input yclk,
  3. input yrst_n,
  4. input xreq, //请求信号,高电平有效
  5. input[7:0] datain,
  6. output yack, //应答信号,高电平有效
  7. output[7:0] dataout
  8. );
  9. //req上升沿检测
  10. reg yreq1, yreq2,yreq3;
  11. always @(posedge yclk or negedge yrst_n)
  12. if(!rst_n) begin
  13. reqr1 <= 1'b0;
  14. reqr2 <= 1'b0;
  15. reqr3 <= 1'b0;
  16. end
  17. else begin
  18. //将xreq跨时钟到yclk,并进行同步
  19. yreq1 <= xreq;
  20. yreq2 <= yreq1;
  21. yreq3 <= yreq2;
  22. end
  23. //pos_req2比pos_req1延后一个时钟周期,确保数据被稳定锁存
  24. wire pos_req1 = yreq1 & ~yreq2; //req上升沿标志位,高有效一个时钟周期
  25. wire pos_req2 = yreq2 & ~yreq3; //req上升沿标志位,高有效一个时钟周期
  26. //数据锁存
  27. reg[7:0] dataout_r;
  28. always @(posedge yclk or negedge rst_n)
  29. if(!rst_n)
  30. dataoutr <= 8'h00;
  31. else if(pos_req1) //检测到req有效后锁存输入数据
  32. dataout_r <= datain;
  33. assign dataout = dataoutr;
  34. //产生应答信号ack
  35. reg yack_r;
  36. always @(posedge yclk or negedge rst_n)
  37. if(!rst_n)
  38. yackr <= 1'b0;
  39. else if(pos_req2)//确保数据被稳定锁存后,发送yack
  40. yackr <= 1'b1;
  41. else if(!req)
  42. yack_r <= 1'b0;
  43. assign yack = yack_r;
  44. endmodule

参考《硬件架构的艺术》

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

闽ICP备14008679号