[FPGA] 跨时钟异步处理(从快到慢)的Verilog代码

[复制链接]
416|32
gaochy1126 发表于 2025-9-28 17:31 | 显示全部楼层 |阅读模式
  1. 以下是从快速时钟到慢速时钟的单比特信号跨时钟代码,带握手反馈。大家想参考的话拿去。本来想搞成代码块的,但是没200字不能发,代码块不算字数,所以就没用代码块,直接贴了,见谅。

  2. reg                a_latch;

  3. reg                b_latch;

  4. reg                b_latch_2r;

  5. wire               b;

  6. reg                b_feedback_latch;

  7. reg                c_latch;

  8. reg                c_latch_r;

  9. wire               busy;



  10. //------------------------------------------------

  11. always @(posege clk1 or negedge rst1_n)

  12. begin

  13. if (!rst1_n)

  14.     a_latch <= 1’b0;

  15. else if (a)

  16.     a_latch <= 1’b1;   //先在clk1域把a变成电平

  17. else if (c_latch_r)   //当目的时钟域反馈称脉冲b已产生,本电平会归0

  18.     a_latch <= 1’b0;

  19. end



  20. always @(posedge clk2 or negedge rst2_n)

  21. begin

  22. if (!rst2_n)

  23. begin

  24.     b_latch     <= 1’b0;

  25.     b_latch_r   <= 1’b0;

  26.     b_latch_2r <= 1’b0;

  27. end

  28. else

  29. begin

  30.     b_latch     <= a_latch;    //跨时钟第一拍,容易产生亚稳态

  31.     b_latch_r  <= b_latch;    //跨时钟第二拍,几乎没有亚稳态

  32.     b_latch_2r <= b_latch_r; //为了转换为脉冲而打拍

  33. end

  34. end



  35. assign b = b_latch_r & (~b_latch_2r);  //抓取b_latch_r的上升脉冲



  36. always @(posedge clk2 or negedge rst2_n)

  37. begin

  38. if (!rst2_n)

  39.     b_feedback_latch <= 1’b0;

  40. else if (b)

  41.     b_feedback_latch <= 1’b1; //反馈信号,当b起来以后它也Latch住

  42. else if (~b_latch_r)  //“~”和“!”对于单比特是可以混用的

  43.     b_feedback_latch <= 1’b0;  //当源时钟的电平已归0后,反馈电平也归0

  44. end



  45. always @(posege clk1 or negedge rst1_n)

  46. begin

  47. if (!rst1_n)

  48. begin

  49.     c_latch   <= 1’b0;

  50.     c_latch_r <= 1’b0;

  51. end

  52. else

  53. begin

  54.     c_latch   <= b_feedback_latch; //跨时钟第一拍,容易产生亚稳态

  55.     c_latch_r <= c_latch;           //跨时钟第二拍,几乎没有亚稳态

  56. end

  57. end



  58. assign busy = a_latch | c_latch_r; //产生忙信号阻止新的握手请求


robertesth 发表于 2025-9-28 19:08 来自手机 | 显示全部楼层
相当全的资料,很适合初学者                                 

评论

赞一个  发表于 2025-9-28 19:46
houjiakai 发表于 2025-9-28 19:09 来自手机 | 显示全部楼层
相当全的资料,很适合初学者                                 

评论

赞一个  发表于 2025-9-28 19:46
lzbf 发表于 2025-9-28 19:09 来自手机 | 显示全部楼层
相当全的资料,很适合初学者                                 

评论

赞一个  发表于 2025-9-28 19:46
bestwell 发表于 2025-9-28 19:10 来自手机 | 显示全部楼层
  应用还是很广泛的                                 

评论

赞一个  发表于 2025-9-28 19:46
gygp 发表于 2025-9-28 19:10 来自手机 | 显示全部楼层
具有一定的参考价值,需要的朋友可以参考一下。

评论

赞一个  发表于 2025-9-28 19:46
mollylawrence 发表于 2025-9-28 19:11 来自手机 | 显示全部楼层
资料还是相当全面的                                 

评论

赞一个  发表于 2025-9-28 19:46
vivilyly 发表于 2025-9-28 19:11 来自手机 | 显示全部楼层
资料的确是很全面                                 

评论

赞一个  发表于 2025-9-28 19:46
zerorobert 发表于 2025-9-28 19:12 来自手机 | 显示全部楼层
资料够全的,多谢分享                                 

评论

赞一个  发表于 2025-9-28 19:47
abotomson 发表于 2025-9-28 19:12 来自手机 | 显示全部楼层
资料的确是很全面                                 

评论

赞一个  发表于 2025-9-28 19:47
51xlf 发表于 2025-9-28 19:13 来自手机 | 显示全部楼层
这些资料太全了!!!                 

评论

赞一个  发表于 2025-9-28 19:47
1988020566 发表于 2025-9-28 19:13 来自手机 | 显示全部楼层
楼主太好了,非常感谢            

评论

赞一个  发表于 2025-9-28 19:47
 楼主| gaochy1126 发表于 2025-9-28 19:40 | 显示全部楼层
当快时钟域信号脉冲宽度小于慢时钟周期时,直接采样可能导致信号丢失或亚稳态。

评论

赞一个  发表于 2025-9-28 19:47
 楼主| gaochy1126 发表于 2025-9-28 19:40 | 显示全部楼层
快时钟域检测到有效信号后保持高电平,慢时钟域确认采样后反馈释放信号‌

评论

赞一个  发表于 2025-9-28 19:47
 楼主| gaochy1126 发表于 2025-9-28 19:40 | 显示全部楼层
对跨时钟域信号至少使用两级触发器同步,降低亚稳态风险‌

评论

赞一个  发表于 2025-9-28 19:47
 楼主| gaochy1126 发表于 2025-9-28 19:40 | 显示全部楼层
在异步FIFO等场景中,使用格雷码转换地址指针可避免多位同时变化导致的亚稳态‌

评论

赞一个  发表于 2025-9-28 19:47
 楼主| gaochy1126 发表于 2025-9-28 19:40 | 显示全部楼层
需确保慢时钟采样时满足触发器的时序要求‌                  

评论

赞一个  发表于 2025-9-28 19:48
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1205

主题

11937

帖子

26

粉丝
快速回复 在线客服 返回列表 返回顶部