赞
踩
最近闲来无聊玩了一阵子FPGA,其中遇到一个经典的问题,就是用verilog实现8分频器。发现自己并不是很熟练,所以就以blog的形式记录一下,同时也分享给大家。
所需要的前提条件:由verilog语言基础,知道D触发器的逻辑
要知道,几乎所有的编程语言都由模块化的思想包含在内,硬件描述语言也不例外。想要构建一个8分频器,首先需要了解它是怎么实现的。
8分频器的实现原理: 它是由三个由D触发器简单改造的二分频器级联构成的,即每经过一级输入的时钟频率变为原来的二分之一
将一个D触发器的Q非门与D连接就形成了一个二分频电路
将三个二分频器级联即可得到8分频器
在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_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
根据模块化思想,我们只需要在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
已知8分频器的功能是将输入的clk信号频率变为原来的八分之一,所以我们看到的理想波形如下
`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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。