使用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
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
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
第三步 搭建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
验证仿真波形

本文介绍了使用D触发器通过verilog实现8分频器的过程,从visio绘制电路到verilog代码描述,再到测试程序的验证,详细阐述了8分频器的构建和工作原理。



2万+

被折叠的 条评论
为什么被折叠?



