当前位置:   article > 正文

使用D触发器实现8分频_d触发器实现分频的原理

d触发器实现分频的原理

使用D触发器实现8分频(verilog)

前言

最近闲来无聊玩了一阵子FPGA,其中遇到一个经典的问题,就是用verilog实现8分频器。发现自己并不是很熟练,所以就以blog的形式记录一下,同时也分享给大家。

所需要的前提条件:由verilog语言基础,知道D触发器的逻辑

第一步:visio画出8分频器的电路

要知道,几乎所有的编程语言都由模块化的思想包含在内,硬件描述语言也不例外。想要构建一个8分频器,首先需要了解它是怎么实现的。

8分频器的实现原理: 它是由三个由D触发器简单改造的二分频器级联构成的,即每经过一级输入的时钟频率变为原来的二分之一

二分频器

将一个D触发器的Q非门与D连接就形成了一个二分频电路

在这里插入图片描述

三个二分频器级联

将三个二分频器级联即可得到8分频器

在这里插入图片描述

第二步 按图施工,用verilog语言描述搭建好的电路

二分频器搭建

在DIV_2 图中我们发现,它的内部是一个D_FF(D触发器)。DIV_2将D和Q_NOTE_GATE连接到了一起。那条线就变成了一个模块内部的线,所以在verilog文件中我们要声明一个中间变量,在这里我取名为QD。

module DIV_2(	
	input wire clk,
	input wire rst_n,
	
	output wire Q
);
wire QD;  //声明的中间变量
//例化
D_FF D_FF(
	. clk(clk),
	. rst_n(rst_n),
	. D(QD),

	. Q(Q),
	. Q_NOT_GATE(QD)
);
endmodule

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
D触发器(D_FF)

因为实例化了D_FF,而且D_FF较为简单,我直接把D_FF的verilog描述源码贴在这里。

module D_FF(

	input wire clk,
	input wire rst_n,
	input wire D,

	output reg Q,
	output wire Q_NOT_GATE

	);

always @(posedge clk or negedge rst_n) begin
	if (~rst_n) //如果rst_n 是低电平,则Q置零
		Q <= 1'b0;
	else 
		Q <= D;
end
assign Q_NOT_GATE = ~Q;

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

8分频器的实现

根据模块化思想,我们只需要在DIV_8.v中(调用)实例化三次2分频器即可。

	module DIV_8(
		input wire clk,
		input wire rst_n,

		output wire rs
		);
    //声明中间变量
	wire Q1;
	wire Q2;
	//实例化三次
	DIV_2 DIV_2_1(
		. clk(clk),
		. rst_n(rst_n),
		
		. Q(Q1)
		);
	DIV_2 DIV_2_2(
		. clk(Q1),
		. rst_n(rst_n),
		
		. Q(Q2)
		);
	DIV_2 DIV_2_3(
		. clk(Q2),
		. rst_n(rst_n),
		
		. Q(rs)
		);

	endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

第三步 搭建tb文件测试程序是否正确

已知8分频器的功能是将输入的clk信号频率变为原来的八分之一,所以我们看到的理想波形如下

在这里插入图片描述

搭建tb文件



`timescale 1ns/1ps
module DIV_8_tb();
    
	reg clk;
	reg rst_n;
	wire rs;
	
	initial begin
		clk = 1'b0;
		rst_n = 1'b0;
		#100.3
		rst_n = 1'b1;
	end
	
	always #10 clk = ~clk ;
	
	DIV_8 DIV_8(
		.clk(clk),
		.rst_n(rst_n),
		
		.rs(rs)
	);
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

验证仿真波形

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/166139
推荐阅读
相关标签
  

闽ICP备14008679号