verilog实现双边沿触发器Dual-edge triggered flip-flop

此博客为个人博客,不涉及商业用途,仅提供学习参考,内容均来自个人原创以及互联网转载和摘录。
此博客上带有原创标识的文章、图片、文件等,未经本人允许,不得用于商业用途以及传统媒体。
本文首发于CSDN,版权所有,禁止转载。
如需转载,请在评论区留言或私信申请,经同意后可转载,否则属于侵权行为

原博客链接:https://blog.csdn.net/qq_38305370
原博主昵称:城外南风起
————————————————

最近在做HDLBits,做到双边沿触发器,觉得还挺有意思的,记录一下。

verilog不支持同时触发上边沿和下边沿,因为FPGA中只有单边沿触发器,没有双边沿触发器这种器件。

所以,posedge clk or negedge clk是无法综合的。

always @(posedge clk, negedge clk) begin
	q <= d;
end

我了解的双边沿触发器实现方式有两种:

第一种(我的实现方式):

module top_module (
    input clk,
    input d,
    output q
);
    reg q1,q2;
    always @(posedge clk)
        begin
            q1 <= d;
        end
    always @(negedge clk)
        begin
            q2 <= d;
        end

    assign q = clk? q1:q2;
endmodule

这种方法简单明了,但因为触发器Tc_to_q延时的存在,输出波形会产生glitch,即p、q的值还没更新,就已经执行了assign q = clk? q1:q2。

第二种(HDLBits答案的实现方式)

module top_module(
    input clk,
    input d,
    output q);
    
    reg p, n;
    
    // A positive-edge triggered flip-flop
    always @(posedge clk)
        p <= d ^ n;
        
    // A negative-edge triggered flip-flop
    always @(negedge clk)
        n <= d ^ p;
    
    // At each (positive or negative) clock edge, p and n FFs alternately
    // load a value that will cancel out the other and cause the new value of d to remain.
    assign q = p ^ n;
    
endmodule

这种方法不会产生毛刺,但使用了三个异或门,电路较为复杂。其原理为:

// Why does this work? 
// After posedge clk, p changes to d^n. Thus q = (p^n) = (d^n^n) = d.
// After negedge clk, n changes to p^n. Thus q = (p^n) = (p^d^p) = d.

References:
1.FPGA中如何实现双边沿采样?这篇博客里关于第一种方法为什么会形成glitch讲得很清楚,也结合了图片讲解,为了尊重原创,就不把图片放这里了,请移步该博客阅读。

2.【 Verilog 】always@()的敏感源中为什么不能双边沿触发?为什么不能双时钟触发?

————————————————
感谢您的阅读,如果您有收获,请给我一个三连吧!
如果您觉得这还不够,可以点击 打赏 按钮,告诉我: 你币有了!

我是城外南风起,欢迎关注我的公众号【木叶芯】。

在这里插入图片描述

木叶飞舞之处,火亦生生不息。

  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城外南风起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值