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

2019-04-13 11:58发布

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