级联模60计数器(Verilog HDL语言描述)(仿真与综合)

目录

前言

模60计数器

Verilog HDL语言描述

测试文件

仿真波形

RTL Schematic

Technology Schematic


前言

看这篇文章前,推荐先看看模10计数器和模6计数器,因为模60计数器是由这两个计数器级联得到的。相关博文下面有说。

级联模60计数器由模6计数器和模10计数器组成,模10计数器计数到9,产生一个进位,这时模6计数器在使能信号有效的情况下开始计数一次,模10计数器继续计数,然后计数到9产生进位,模6计数器又计数一次,如此下去,直到模6计数器到5,模6计数器在使能信号有效的情况下,进位一次。

这就是级联模60计数器的原理。

模60计数器

Verilog HDL语言描述

模60计数器分为3个模块,一个模10计数器模块,一个模6计数器模块,二者级联得到一个模60计数器,模块counter60调用counter10和counter6,模6计数器和模10计数器在另外一篇博文中有专门介绍:模6计数器以及模10计数器(Verilog HDL语言设计)(Modelsim仿真与ISE综合)

//模60计数器的Verilog HDL设计
module counter60(clk, rst_n, en, dout, co);

input clk, rst_n, en;
output[7:0] dout;
output co;
wire co10_1, co10, co6;
wire[3:0] dout10, dout6;

counter10 u1(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout10), .co(co10_1)); //模10计数器的进位为co10_1
and u3(co10,en,co10_1); //co10_1与en的与为co10
counter6 u2(.clk(clk), .rst_n(rst_n), .en(co10), .dout(dout6), .co(co6)); //co10_1与en的与为co10,作为模6计数器的使能信号
and u4(co, co10, co6); //模6计数器的进位和模6的使能信号co10的与作为模60计数器的进位

assign dout = {dout6,dout10}; //模60计数器的输出,高位为模6计数器的输出,低位为模10计数器的输出,读法是8421BCD码读法

endmodule

//模6计数器模块
module counter6(clk, rst_n, en, dout, co);

input clk, rst_n, en;
output[3:0] dout;
reg [3:0] dout;
output co;

always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		dout <= 4'b0000;        //系统复位,计数器清零
	else if(en)
		if(dout == 4'b0101)     //计数值达到5时,计数器清零
			dout <= 4'b0000;
		else
			dout <= dout + 1'b1; //否则,计数器加1
	else
		dout <= dout;

end

assign co = dout[0]&dout[2];  //当计数达到5(4'b1001)时,进位为1,计数值为其他,都没有进位

endmodule


//模10计数器模块
module counter10(clk, rst_n, en, dout, co);

input clk, rst_n, en;
output[3:0] dout;
reg [3:0] dout;
output co;

always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		dout <= 4'b0000;        //系统复位,计数器清零
	else if(en)
		if(dout == 4'b1001)     //计数值达到5时,计数器清零
			dout <= 4'b0000;
		else
			dout <= dout + 1'b1; //否则,计数器加1
	else
		dout <= dout;

end

assign co = dout[0]&dout[3];  //当计数达到5(4'b1001)时,进位为1,计数值为其他,都没有进位

endmodule


测试文件

//模10计数器的测试文件
`timescale 1ns/1ps
module counter60_tb;

reg clk, rst_n, en;
wire[7:0] dout;
wire co;

//时钟设计周期为2ns
always
begin
	#1 clk = ~clk;
end

//初始化
initial
begin
	clk = 1'b0;
	rst_n = 1'b1;
	en = 1'b0;
	#2 rst_n = 1'b0;
	#2 rst_n = 1'b1; en = 1'b1;    //计数使能信号有效,且不复位
	

end

counter60 u5(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout), .co(co));

endmodule



仿真波形

先来一张整个的仿真波形图,看不清楚:

然后放大分解开来看:(开头部分)

这是一个计数周期结尾部分

可见,计数到0101 1001也就是59后,下一个时钟上升沿到来时,计数器清零。

从0开始计数到59,恰好60,设计正确。

RTL Schematic

在ISE中综合后的RTL Schematic

展开后

可见模10计数器的进位co和使能信号en与运算之后作为模6计数器的使能信号,模6计数器的进位信号与自身的使能信号相与作为模60计数器的进位信号。

继续展开

这张图的意思是把组成模块counter10和counter6都展开了,已经看不清楚了,但没关系,这两个模型仅供参观而已。这两个模块的具体RTL原理图见博文:模6计数器以及模10计数器(Verilog HDL语言设计)(Modelsim仿真与ISE综合)

Technology Schematic

下面看看Technology Schematic,也就是在FPGA内部的电路是什么样的:

太大了,看不清楚,但没关系,可以看出FPGA内部,是由很多的LUT和缓冲器以及D触发器构成的,这都是FPGA内部有的资源。

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/81348812