HDLBits刷题Day12,3.2.1.17 Edge capture register - 3.2.1.18 Dual-edge triggered flip-flop

3.2.1.17 Edge capture register

问题描述

        对于32bits向量中的每一位,当输入信号由1变为0时进行检测(即下降沿检测)

  其中检测表示在复位信号(同步)到达前,输出将保持1。 每一个输出位就像一个RS触发器,即当对应位出现1 to 0的变化时,输出位将置1

  而当reset信号为高电平,输出位将在下一个时钟的上升沿被复位。如果信号的下降沿和reset事件在同一时刻发生,将优先执行复位操作

  在下图示例波形的最后4个时钟周期中,reset事件比set事件早一个周期出现,因此这里没有前述冲突。 为清楚起见,in[1]和out[1]在波形中分别单独显示

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

分析:我们将这道题和3.2.1.15 Detect an edge比较一下

①本题多了一个reset的高电平有效的同步复位信号

②本题是下降沿检测

③3.2.1.15题pedge的高电平只维持一个时钟周期,而本题在复位信号到达之前out会保持高电平(红色画圈处,类似于SR触发器,体现了题目'capture'捕获一词)

代码:

module top_module (
    input clk,
    input reset,
    input [31:0] in,
    output [31:0] out
);
    reg [31:0] pre_in;
    always @(posedge clk) begin
        pre_in<=in;
        if(reset) //reset的优先级高,我们先判断它
            out<=0;
        else
            out<=pre_in&~in | out; //这个|out体现了捕获的操作
    end
endmodule

3.2.1.18 Dual-edge triggered flip-flop

问题描述

您熟悉在时钟上升沿或时钟下降沿触发的触发器。在时钟的两个边沿触发双边触发触发器。但是,FPGA 没有双边触发触发器,并且始终不接受 @(posedge clk 或 negedge clk)作为合法的敏感度列表。这一点可以参考  【 Verilog 】always@()的敏感源中为什么不能双边沿触发?为什么不能双时钟触发?

构建一个功能类似于双边触发触发器的电路:

(注意:它不一定完全等效:触发器的输出没有毛刺,但模拟这种行为的更大组合电路可能会。但我们将在这里忽略这个细节。)

提示:

您无法在 FPGA 上创建双边触发触发器。但是您可以同时创建正沿触发和负沿触发触发器。
这个问题是一个中等难度的电路设计问题,但只需要基本的 Verilog 语言特性。(这是电路设计问题,而不是编码问题,这就有可综合的要求。)在尝试编码之前先用手画出电路图可能会有所帮助。

分析:双边沿触发器了解到的只有mux型和xor型

①mux型:

优点:逻辑简单

缺点:触发器有延时,可能q1、q2还未更新就已经执行了assign q = clk? q1:q2,使输出波形产生毛刺

代码:

// mux型双边沿触发器
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

 ②xor型:

优点:无毛刺产生

缺点:需要使用三个异或门,电路复杂

代码:

module top_module(
    input clk,
    input d,
    output q);

    reg p, n;

    // clk的上升沿
    always @(posedge clk)
        p <= d ^ n;

    // clk的下降沿
    always @(negedge clk)
        n <= d ^ p;

    //在上升沿时候,p=d^n, 则q=d^n^n=d;
    //在下降沿时候,n=d^p, 则q=p^d^p=d;
    //加载一个新值时会取消旧值。
    assign q = p ^ n;


    // 这样写是无法综合的
    /*always @(posedge clk, negedge clk) begin
        q <= d;
    end*/


endmodule

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值