时序逻辑基础之D触发器&分频器

文章目录

  • 一.D触发器
    • 1.原理
    • 2.代码
  • 二.N分频器
    • 1.原理
    • 2.实验任务
    • 3.设计思路
    • 4.时序图
    • 5.代码
    • 6.仿真文件
    • 7.仿真效果

一.D触发器

1.原理

  • D触发器原理如下
    时序逻辑基础之D触发器&分频器_第1张图片

  • D触发器模拟波形图如下
    时序逻辑基础之D触发器&分频器_第2张图片

由图可知Q值不仅与D有关,同时需要考虑到clk上升沿到来后有效

2.代码

module DFF(
    input clk,
    input rst_n,
    input d,
    output q
);

reg q_r;

always @(posedge clk or negedge rst_n) begin
    q_r <= d;
end

assign q = q_r;

endmodule

二.N分频器

1.原理

  • 输入一个时钟信号,将输出的信号的时钟周期变为输入信号的时钟周期的N倍,我们将这种器件叫做N分频器。

2.实验任务

  • 我们的目的是生成一个N分频器,可以实现任意比例分频。需要时仅需改变N的值即可实现不同的分频器。

3.设计思路

  • 将clk上升沿下降沿都设为敏感信号,clk变化时计数。实现N分频器,计数器从0数到N-1,输出信号反转一次。注意:由于是从0开始计数,共计N个数,只需要计到N-1即可。

4.时序图

时序逻辑基础之D触发器&分频器_第3张图片

  • 这里以5分频和8分频为例,分别探讨了奇数和偶数分频的情况。时序图是我们自己设想的效果,需要与我们的仿真效果比较。

5.代码

module N_divider #(parameter N = 5)(//N可以取我们需要的值,作为全局变量,它可以被更改
    input               clk,
    input               rst_n,

    output      reg     clk_out
);

    
//计数,计N个数一清零
    reg     [N-1:0]   cnt;
    wire            add_cnt;
    wire            end_cnt;

    always @(clk) begin
        if (!rst_n) begin
            cnt <= 'd0;
        end
        else if (add_cnt) begin
            if (end_cnt) begin
                cnt <= 'd0;
            end
            else begin
                cnt <= cnt + 'd1;
            end
        end
    end

    assign add_cnt = 1'b1;
    assign end_cnt = add_cnt && cnt == N - 1'd1;

//计满N个数clk_out反转一次
    always @(clk) begin
        if (!rst_n) begin
            clk_out <= 'b1;
        end
        else if (cnt == N - 1'd1) begin//计满N个数反转
            clk_out <= ~clk_out; 
        end
        else begin//其余情况保持不变
            clk_out <= clk_out;
        end
    end

endmodule

6.仿真文件

`timescale 1ns/1ns
module tb_N_divider #(parameter N = 5)();
    
    reg tb_clk;
    reg tb_rst_n;
    wire tb_clk_out;

parameter CYCLE = 20;//周期

N_divider #(.N(N)) u_N_divider(
.clk    (tb_clk),
.rst_n  (tb_rst_n),
.clk_out(tb_clk_out)
);

initial tb_clk = 1'b1;
always #(CYCLE/2) tb_clk = ~tb_clk;//半个周期反转clk

initial begin
    tb_clk = 1'b0;
    tb_rst_n = 1'b0;
    #20;
    tb_rst_n = 1'b1;
    #2000;
    $stop;
end
endmodule

7.仿真效果

  • 仍然以5分频和8分频为例,探究奇数和偶数的仿真效果

  • 5分频波形图
    时序逻辑基础之D触发器&分频器_第4张图片

  • 8分频波形图
    时序逻辑基础之D触发器&分频器_第5张图片

你可能感兴趣的:(FPGA学习,fpga)