跨时钟异步处理(从快到慢)的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; //产生忙信号阻止新的握手请求
相当全的资料,很适合初学者 相当全的资料,很适合初学者 相当全的资料,很适合初学者 应用还是很广泛的 具有一定的参考价值,需要的朋友可以参考一下。 资料还是相当全面的 资料的确是很全面 资料够全的,多谢分享 资料的确是很全面 这些资料太全了!!! 楼主太好了,非常感谢 当快时钟域信号脉冲宽度小于慢时钟周期时,直接采样可能导致信号丢失或亚稳态。 快时钟域检测到有效信号后保持高电平,慢时钟域确认采样后反馈释放信号
对跨时钟域信号至少使用两级触发器同步,降低亚稳态风险
在异步FIFO等场景中,使用格雷码转换地址指针可避免多位同时变化导致的亚稳态 需确保慢时钟采样时满足触发器的时序要求
页:
[1]