目录
前言
模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内部有的资源。