当前位置:   article > 正文

跨时钟域相关的知识点

跨时钟域

模块之间有数据交互,但是用的不是一个时钟进行驱动,存在相位与频率的不同,由于电路本身的特性(中间态存在时间长),在同一时刻不同元器件对同一信号的判断出现不一致现象,称为亚稳态。这就需要同步器进行同步,减小亚稳态传播下去的概率。

跨时钟域:模块之间有数据交互,但是用的不是同一个时钟进行驱动。

在跨时钟处理单bit信号时,慢时钟域到快时钟域下的处理方式比较简单,将在慢时钟域下的信号在快时钟域下打三拍处理,取二拍与三拍信号进行处理,将慢时钟域的信号分解为在快时钟域下的上升沿脉冲信号与下降沿脉冲信号。

  1. //将慢时钟域下的信号能在快时钟域下采集
  2. //clka为快时钟、clkb为慢时钟
  3. module slow2quick (
  4. // input
  5. input rst_n , // system reset
  6. input clka , // clockA
  7. input clkb , // clockB
  8. input level_a_in , // pulsee input from clka
  9. // output
  10. output pulse_b_neg , // pulsee output in clkb
  11. output pulse_b_pos , // pulsee output in clkb
  12. output level_b_out // level output in clkb
  13. );
  14. parameter DLY = 1 ; //
  15. reg level_b_d1, level_b_d2, level_b_d3;
  16. //
  17. always @ (posedge clka or negedge rst_n)
  18. begin
  19. if (!rst_n) begin
  20. level_b_d1 <= #DLY 1'b0;
  21. level_b_d2 <= #DLY 1'b0;
  22. level_b_d3 <= #DLY 1'b0;
  23. end
  24. else begin
  25. level_b_d1 <= #DLY level_a_in;
  26. level_b_d2 <= #DLY level_b_d1;
  27. level_b_d3 <= #DLY level_b_d2;
  28. end
  29. end
  30. assign pulse_b_pos = level_b_d2 & (~level_b_d3);
  31. assign pulse_b_neg = level_b_d3 & (~level_b_d2);
  32. assign level_b_out = level_b_d2;
  33. endmodule

在跨时钟域处理单bit信号时,快时钟域的信号由于频率较快,信号的脉宽如果不足,就不会被慢时钟采样到,因此需要将快时钟产生的信号进行展宽,然后在进行打两拍来处理亚稳态。具体处理方式如下:

快到慢时钟域

  1. //目的:使在clka下的脉冲信号pluse_a_in也能在clkb下采集到
  2. module quick2slow (
  3. // input
  4. input rst_n , // system reset
  5. input clka , // clockA
  6. input clkb , // clockB
  7. input pulse_a_in , // pulsee input from clka
  8. // output
  9. output pulse_b_out , // pulsee output in clkb
  10. output level_b_out // level output in clkb
  11. );
  12. parameter DLY = 1 ; //模拟真实电路加入DLY
  13. reg signal_a;
  14. reg signal_b;
  15. reg signal_b_b1;
  16. reg signal_b_b2;
  17. reg signal_b1_a1;
  18. reg signal_b1_a2;
  19. //对脉冲信号进行展宽处理
  20. //引入signsl_a作为展宽信号,脉冲信号为1时拉高signal_a,signal_b1_a21时拉低signal_a,
  21. //signal_b1_a2在后边进行定义
  22. always @ (posedge clka or negedge rst_n)
  23. begin
  24. if (rst_n == 1'b0)
  25. signal_a <= # DLY 1'b0 ;
  26. else if (pulse_a_in)
  27. signal_a <= # DLY 1'b1 ;
  28. else if (signal_b1_a2)
  29. signal_a <= # DLY 1'b0 ;
  30. else ;
  31. end
  32. //将展宽后的信号signal_a引入到clkb下,定义为signal_b
  33. always @ (posedge clkb or negedge rst_n)
  34. begin
  35. if (rst_n == 1'b0)
  36. signal_b <= # DLY 1'b0 ;
  37. else
  38. signal_b <= # DLY signal_a ;
  39. end
  40. //在clkb下对signal_b打一拍得到signal_b_b1
  41. //在clkb下对signal_b打二拍得到signal_b_b2
  42. always @ (posedge clkb or negedge rst_n)
  43. begin
  44. if (rst_n == 1'b0) begin
  45. signal_b_b1 <= # DLY 1'b0 ;
  46. signal_b_b2 <= # DLY 1'b0 ;
  47. end
  48. else begin
  49. signal_b_b1 <= # DLY signal_b ;
  50. signal_b_b2 <= # DLY signal_b_b1 ;
  51. end
  52. end
  53. //确定signal_a的信号下降沿
  54. //选取 signal_b_b1作为signal_a的下降沿,但是他是在clkb下的信号,而signal_a是clka下的信号,可能存在踩不到的现象,因此对signal_b_b1在clka下同步打两拍得到signal_b1_a2
  55. always @ (posedge clka or negedge rst_n)
  56. begin
  57. if (rst_n == 1'b0) begin
  58. signal_b1_a1 <= # DLY 1'b0 ;
  59. signal_b1_a2 <= # DLY 1'b0 ;
  60. end
  61. else begin
  62. signal_b1_a1 <= # DLY signal_b_b1 ;
  63. signal_b1_a2 <= # DLY signal_b1_a1 ;
  64. end
  65. end
  66. assign pulse_b_out = signal_b_b1 & (~signal_b_b2) ;
  67. assign level_b_out = signal_b_b1 ;
  68. endmodule

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

闽ICP备14008679号