通过D触发器实现偶分频

        在实现偶分频之前,首先先介绍一下D触发器

        触发器(D Flip-Flop)是一种常用的时序逻辑电路,其主要功能是存储一位二进制数据,并在时钟信号的控制下实现数据的锁存和传输。以下是D触发器的基本逻辑和特性:
1. 基本功能
        D触发器的核心功能是将输入信号(D端)在时钟信号(CLK)的上升沿或下降沿锁存到输出端(Q端)。其基本逻辑可以表示为:
                                CLK                   D    Q(下一个状态)    
                                上升沿/下降沿    0    0    
                                上升沿/下降沿    1    1    
        D端:数据输入端,用于提供要存储的数据。
        Q端:数据输出端,表示当前存储的数据。
        CLK端:时钟信号输入端,用于控制数据的锁存时刻。
2. 工作原理
        D触发器的工作原理基于时钟信号的边沿触发。具体过程如下:
在时钟信号的某个边沿(通常是上升沿或下降沿)到来时,D端的值会被锁存到触发器内部的存储单元。
        锁存后的值会出现在Q端,并保持稳定,直到下一个时钟边沿到来。

3.工程实现

通过D触发器我们可以实现偶分频,以下为使用D触发器编写偶分频的工程

3.1visio图

以下Visio图是D触发器的图,以及用D触发器实现8分频的图

图一(D触发器)

图二(D触发器实现8分频)

3.2 通过Verilog编写代码实现功能

3.2.1  D触发器

//D触发器 代码实现
//在时钟脉冲上升沿或者下降沿到来的时候将输入信号送到输出端
//如果边沿未到,即使输入端的数据发生改变,输出只会保持原来的样子
module D_FF (
    input  wire D  ,//数据输入
    input  wire rst_n ,//低电平复位,Q为零
    input  wire clk ,//50Mhz,20ns周期信号
    output reg  Q ,//因为要用always书写,是存储型变量,所以用reg,数据输出
    output wire Q_n//Q_n=~Q 
);

//异步复位 always @ (posedge clk or negedge rst_n)
//同步复位 always @ (posedge clk)/always @ (negedge clk)
//时钟上升沿工作,低电平复位
always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin//if()判断必须要括号内为真,所以if (~rst_n)就等同于if (rst_n == 0)
            Q <= 1'd0 ;//时序逻辑用"<="非阻塞赋值
    end
    else begin
            Q <= D ;
    end
end
assign Q_n = ~Q ;

endmodule


 

3.2.2 用D触发器实现8分频

module D_FF_div8(
    input wire clk_50,
    input wire rst_n,
    output reg Q3   
);

reg Q1 ;
reg Q2 ;
always @(posedge clk_50 or negedge rst_n) begin
    if (~rst_n) begin 
        Q1 <= 1'd0;
    end
    else begin 
        Q1 <= ~Q1 ;
    end
end

always @(posedge Q1 or negedge rst_n) begin
    if (~rst_n) begin 
        Q2 <= 1'd0;
    end
    else begin 
        Q2 <= ~Q2 ;
    end
end

always @(posedge Q2  or negedge rst_n) begin
    if (~rst_n) begin 
        Q3 <= 1'd0;
    end
    else begin 
        Q3 <= ~Q3 ;
    end
end

endmodule
通过上面的visio图可以很明显的看出,当一个D触发器的输出Q非与输入D连在一起时,此时D触发器就变成了一个二分频器,因此若将三个D触发器像这样连接之后,再相互连起来,如图二所示,就可构成八分频,由此可通过D触发器实现偶分频。

3.3 tb文件及其仿真图

3.3.1 D触发器

`timescale 1ns/1ps
module D_FF_tb ();
//定义测试信号
        reg D       ;
        reg rst_n ;
        reg clk   ;
        wire Q    ;
        wire Q_n  ;
//初始化测试信号
initial begin 
        D     = 1'd0 ;
        rst_n = 1'd0 ;
        clk   = 1'd0 ;
        #201         ;
        rst_n = 1'd1 ;
end
//生成时钟信号,50Mhz,20ns,占空比50%
always #10 clk = ~clk ;
//随机数初始化D
always #500 D = {$random}%2;    
//调用测试模块即例化
D_FF D_FF_1 (
        .D         (D       ),
        .rst_n  (rst_n),
        .clk    (clk  ),
        . Q     ( Q   ),
        . Q_n   ( Q_n )
        
);


endmodule
 

3.3.3 用D触发器实现8分频

`timescale 1ns/1ns 
module D_FF_div8_tb();
    reg clk_50 ;
    reg rst_n  ;
    wire Q3    ;
    
//初始赋值
initial begin
    clk_50 = 1'd0 ;
    rst_n  = 1'd0 ;
    #200
    rst_n  = 1'd1 ;
end

//提供时钟信号,周期为20ns
always #20 clk_50 = ~clk_50;

//例化
D_FF_div8 D_FF_div8_1(
    .clk_50 (clk_50),
    .rst_n  (rst_n ),
    . Q3        ( Q3       )
    
);
endmodule
 

4.总结

        D触发器是一种简单而强大的时序逻辑元件,它通过时钟信号的边沿触发,将输入数据锁存到输出端。其广泛应用于寄存器、计数器、同步电路等数字电路设计中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值