以下是从快速时钟到慢速时钟的单比特信号跨时钟代码,带握手反馈。大家想参考的话拿去。本来想搞成代码块的,但是没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; //产生忙信号阻止新的握手请求
收藏0 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
人才类勋章
时间类勋章
1205
11937
26
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号