【 FPGA 】玩玩带有异步复位,同步使能的D触发器的两种实现方式

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网、数据手册、帮助文档、书本以及论文等上的内容,仅供学习交流使用,如有侵权,请联系,我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/85682438

第一种,正儿八经:

带异步复位,同步使能的D触发器:

module dff_reset_en_1seg(
    input clk,
    input reset,
    input en,
    input d,
    output reg q
    );
    always @(posedge clk, posedge reset)
    begin
        if(reset)
            q <= 1'b0;
        else if(en)
            q <= d;
    end
endmodule

行为测试:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2019/01/03 10:39:16
// Design Name: 
// Module Name: dff_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module dff_tb;
    reg reset;
    reg en;
    reg CLK;
    reg d;
    wire q;
    
    
   // Note: CLK must be defined as a reg when using this method
    
    parameter PERIOD = 10;
 
    always begin
       CLK = 1'b0;
       #(PERIOD/2) CLK = 1'b1;
       #(PERIOD/2);
    end
    
       initial begin
       reset = 1'b1;
       en = 1'b1;
       d = 1'b0;
       
       #60
       reset = 1'b0;
       en = 1'b0;
       d = 1'b1;
       
       #100;
       en = 1'b1;
       d = 1'b1;
    end
    
    dff_reset_en_1seg uu1(.clk(CLK), .reset(reset), .en(en),
        .d(d), .q(q) );  




endmodule

可见,分三个阶段,复位,保持,跟随!

第二种:两段式含异步复位和同步使能的D触发器。

这个触发器没有问题,下面用常规的触发器来实现一个带有异步复位和同步使能的D触发器(练习代码,有点无聊):

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2019/01/03 10:34:30
// Design Name: 
// Module Name: dff_reset_en_1seg
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module dff_reset_en_1seg(
    input clk,
    input reset,
    input en,
    input d,
    output reg q
    );
    reg r_reg,r_next;
    
    always @(posedge clk, posedge reset)
    begin
        if(reset)
            r_reg <= 1'b0;
        else
            r_reg <= r_next;
    end
    //next-state logic
    always @*
    begin
        if(en)
            r_next = d;
        else 
            r_next = r_reg;
    end
    
    //output logic
    always @*
    q = r_reg;
    
    
endmodule

这段代码用于实现同样的功能。

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/85682438
今日推荐