当前位置:   article > 正文

跨时钟域单bit信号处理--握手信号_电路里什么时候用握手信号

电路里什么时候用握手信号

 

 

用途:一般用在AB两个时钟关系不确定的时候,可能是快到慢,也可能是慢到快;

基本原理:双方电路在声明或终止各自的握手信号信号前都要等待对方的相应。完整的同步过程(A→B)可有以下4个步骤:

请求信号的产生:当同步器处于空闲状态时,在输入脉冲到来时,A声明它的请求信号sync_reg;
请求信号的跨越与应答信号的产生:sync_reg信号需要跨时钟域同步到B,与此同时,B产生同步脉冲,并产生应答信号sync_ack,此时,已经给出了要输出的脉冲
应答信号的跨越与请求信号的清除:sync_ack信号跨时钟域同步到A,与此同时,A清除之前产生的sync_reg;
应答信号的清除:在sync_reg信号清除之后,B清除sync_ack信号。此时,一次信号的跨时钟域完成,等待同步下一个脉冲。

缺点:延时大

握手代码

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2021/01/11 16:35:34
  7. // Design Name:
  8. // Module Name: top
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module top(
  22. input wire din,
  23. input wire clk_A,
  24. input wire rst_n_A,
  25. input wire clk_B,
  26. input wire rst_n_B,
  27. output wire sync_idle, //给出同步器是否空闲的信号
  28. output reg sync_fail, //同步失败:位于原时钟域
  29. output wire dout
  30. );
  31. reg src_sync_req; //原时钟产生同步请求
  32. reg req_state_dly1;
  33. reg req_state_dly2; //同步器的输出
  34. reg req_state_dly3; //目的时钟延后信号,以保证脉冲输出
  35. reg dst_sync_ack; //目的时钟产生应答
  36. reg ack_state_dly1;
  37. reg ack_state_dly2; //同步器的输出
  38. wire src_sync_ack; //原时钟接收应答
  39. //同步器空闲状态的判断:原时钟下:请求和应答信号同时无效
  40. assign sync_idle = ~(src_sync_req | src_sync_ack );
  41. //同步失败的判断
  42. always @(posedge clk_A or negedge rst_n_A)
  43. begin
  44. if(rst_n_A == 1'b0)
  45. sync_fail <= 1'b0;
  46. else if(din & (~sync_idle)) //源时钟脉冲到来,此时同步器不空闲,给出同步失败
  47. sync_fail <= 1'b1;
  48. else
  49. sync_fail <= 1'b0;
  50. end
  51. //原时钟产生请求信号,请求信号的产生相当于将脉冲转化为了电平
  52. always @(posedge clk_A or negedge rst_n_A)
  53. begin
  54. if(rst_n_A == 1'b0)
  55. src_sync_req <= 1'b0;
  56. else if(din & sync_idle) //源时钟脉冲到来,且源时钟空闲,传递请求。同时完成了脉冲转电平
  57. src_sync_req <= 1'b1;
  58. else if(src_sync_ack) //检测到应答以后,清除请求
  59. src_sync_req <= 1'b0;
  60. end
  61. //同步原时钟请求信号到目的时钟,利用请求信号跨时钟域
  62. always @(posedge clk_B or negedge rst_n_B)
  63. begin
  64. if(rst_n_B == 1'b0)
  65. begin
  66. req_state_dly1 <= 1'b0;
  67. req_state_dly2 <= 1'b0;
  68. req_state_dly3 <= 1'b0;
  69. end
  70. else
  71. begin
  72. req_state_dly1 <= src_sync_req;
  73. req_state_dly2 <= req_state_dly1; //打两拍结束
  74. req_state_dly3 <= req_state_dly2; //再外接一个寄存器,以保证脉冲输出
  75. end
  76. end
  77. //上升沿检测,产生输出脉冲
  78. assign dout = (~req_state_dly3) & req_state_dly2; //完成输出脉冲
  79. //目的时钟产生应答信号
  80. always @(posedge clk_B or negedge rst_n_B)
  81. begin
  82. if(rst_n_B == 1'b0)
  83. dst_sync_ack <= 1'b0;
  84. else if (req_state_dly2) //同步高电平已到达
  85. dst_sync_ack <= 1'b1;
  86. else begin
  87. dst_sync_ack <= 1'b0;
  88. end
  89. end
  90. //同步目的时钟产生的应答信号到原时钟
  91. always @(posedge clk_A or negedge rst_n_A)
  92. begin
  93. if(rst_n_A == 1'b0)
  94. begin
  95. ack_state_dly1 <= 1'b0;
  96. ack_state_dly2 <= 1'b0;
  97. end
  98. else
  99. begin
  100. ack_state_dly1 <= dst_sync_ack;
  101. ack_state_dly2 <= ack_state_dly1;
  102. end
  103. end
  104. assign src_sync_ack = ack_state_dly2;
  105. endmodule

测试代码:

  1. `timescale 1ns/1ns
  2. module top_tb;
  3. reg clk_A;
  4. reg clk_B;
  5. reg rst_n;
  6. wire clk_write;
  7. reg din;
  8. initial begin
  9. clk_A=1;
  10. clk_B=1;
  11. end
  12. always #20 clk_A=~clk_A; //50
  13. always #40 clk_B=~clk_B; //25
  14. initial begin
  15. rst_n=0;
  16. #10
  17. rst_n=1;
  18. end
  19. assign clk_write = clk_A&rst_n; //复位期间不应写入数据
  20. reg [31:0] cnt;
  21. always@(posedge clk_write or negedge rst_n) begin
  22. if(rst_n==1'b0) begin
  23. cnt <= 32'd0;
  24. end
  25. else begin
  26. cnt <=cnt + 1;
  27. end
  28. end
  29. always@(posedge clk_write or negedge rst_n) begin
  30. if(rst_n==1'b0) begin
  31. din <= 32'd0;
  32. end
  33. else if(cnt==10) begin
  34. din <=1;
  35. end
  36. else begin
  37. din <=0;
  38. end
  39. end
  40. top top_inst(
  41. .din (din),
  42. .clk_A (clk_A),
  43. .rst_n_A (rst_n),
  44. .clk_B (clk_B),
  45. .rst_n_B (rst_n)
  46. );
  47. endmodule

 

原文链接:https://blog.csdn.net/u013668469/article/details/99643154

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/206885
推荐阅读
相关标签
  

闽ICP备14008679号