gaochy1126 发表于 2025-9-28 17:31

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

以下是从快速时钟到慢速时钟的单比特信号跨时钟代码,带握手反馈。大家想参考的话拿去。本来想搞成代码块的,但是没200字不能发,代码块不算字数,所以就没用代码块,直接贴了,见谅。

reg                a_latch;

reg                b_latch;

reg                b_latch_2r;

wire               b;

reg                b_feedback_latch;

reg                c_latch;

reg                c_latch_r;

wire               busy;



//------------------------------------------------

always @(posege clk1 or negedge rst1_n)

begin

if (!rst1_n)

    a_latch <= 1’b0;

else if (a)

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

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

    a_latch <= 1’b0;

end



always @(posedge clk2 or negedge rst2_n)

begin

if (!rst2_n)

begin

    b_latch   <= 1’b0;

    b_latch_r   <= 1’b0;

    b_latch_2r <= 1’b0;

end

else

begin

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

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

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

end

end



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



always @(posedge clk2 or negedge rst2_n)

begin

if (!rst2_n)

    b_feedback_latch <= 1’b0;

else if (b)

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

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

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

end



always @(posege clk1 or negedge rst1_n)

begin

if (!rst1_n)

begin

    c_latch   <= 1’b0;

    c_latch_r <= 1’b0;

end

else

begin

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

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

end

end



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

robertesth 发表于 2025-9-28 19:08

相当全的资料,很适合初学者                                 

houjiakai 发表于 2025-9-28 19:09

相当全的资料,很适合初学者                                 

lzbf 发表于 2025-9-28 19:09

相当全的资料,很适合初学者                                 

bestwell 发表于 2025-9-28 19:10

应用还是很广泛的                                 

gygp 发表于 2025-9-28 19:10

具有一定的参考价值,需要的朋友可以参考一下。

mollylawrence 发表于 2025-9-28 19:11

资料还是相当全面的                                 

vivilyly 发表于 2025-9-28 19:11

资料的确是很全面                                 

zerorobert 发表于 2025-9-28 19:12

资料够全的,多谢分享                                 

abotomson 发表于 2025-9-28 19:12

资料的确是很全面                                 

51xlf 发表于 2025-9-28 19:13

这些资料太全了!!!               

1988020566 发表于 2025-9-28 19:13

楼主太好了,非常感谢            

gaochy1126 发表于 2025-9-28 19:40

当快时钟域信号脉冲宽度小于慢时钟周期时,直接采样可能导致信号丢失或亚稳态。

gaochy1126 发表于 2025-9-28 19:40

快时钟域检测到有效信号后保持高电平,慢时钟域确认采样后反馈释放信号‌

gaochy1126 发表于 2025-9-28 19:40

对跨时钟域信号至少使用两级触发器同步,降低亚稳态风险‌

gaochy1126 发表于 2025-9-28 19:40

在异步FIFO等场景中,使用格雷码转换地址指针可避免多位同时变化导致的亚稳态‌

gaochy1126 发表于 2025-9-28 19:40

需确保慢时钟采样时满足触发器的时序要求‌                  
页: [1]
查看完整版本: 跨时钟异步处理(从快到慢)的Verilog代码