目录

​前言​

​原理​

​Verilog HDL程序设计​

​测试代码​

​仿真波形图​

​ISE综合后​

​RTL Schematic​

​Technology Schematic​


前言

本博文用Verilog HDL语言描述模24的8421BCD码计数器,之后用Modelsim进行功能仿真,然后用ISE进行综合,看看综合出来的RTL级电路以及Technology Schematic是什么样子的,对于RTL Schematic 以及 Technology Schematic可能比较复杂,暂时可能看不懂,但混个眼熟吧。重点是设计思路以及波形图是否正确,后面例如设计一个时钟计数器,这个模24的计数器就可以当成一个模块来直接使用。本博文的目的实际上也是为了时钟计数器做准备,后面的博文会用到这个模块。

原理

计数原理很简单,rst_n为异步复位信号,当时钟上升沿或复位下降沿到来时,如果rst_n有效,则计数器清零(0000 0000)。计数器的计数过程为,当输出信号的低4位从0(0000)计数到9(1001)后,高4位计数加1,当计数到23(0010 0011)时,计数器重新清零,然后重新开始计数。

Verilog HDL程序设计

//8421BCD码计数器,模24
module bcd_counter(clk, rst_n, en, dout);

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

always@(posedge clk or negedge rst_n) //异步复位
begin
if(!rst_n) //复位信号有效时,输出清零
dout <= 8'b00000000;
else if(en == 1'b0) //计数使能无效时,输出不变
dout <= dout;
else if( (dout[7:4] == 4'b0010)&&(dout[3:0] == 4'b0011) ) //计数达到23时,输出清零
dout <= 8'b00000000;
else if(dout[3:0] == 4'b1001) //低位达到9时,低位清零,高位加1
begin
dout[3:0] <= 4'b0000;
dout[7:4] <= dout[7:4] + 1'b1;
end
else //上述情况都没有发生,则高位不变,低位加1
begin
dout[7:4] <= dout[7:4];
dout[3:0] <= dout[3:0] + 1'b1;
end

end


endmodule

测试代码

//模24,8421BCD码计数器的测试文件
`timescale 1ns/1ps
module bcd_counter_tb;

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

//时钟信号,周期为20ns
always
begin
#10 clk = ~clk;
end

//初始化
initial
begin
clk = 1'b0;
rst_n = 1'b0;
en = 1'b0;
#30 rst_n = 1'b1; en = 1'b1;
end

bcd_counter u1(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout));
endmodule

仿真波形图

模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)_上升沿

模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)_异步复位_02

可见,计数到23后计数器就自动清零了,满足设计要求。

ISE综合后

RTL Schematic

模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)_异步复位_03

展开后

模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)_上升沿_04

没办法,再放大就看不全了,需要看仔细的,自己用ISE综合一下就好了。

Technology Schematic

模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)_设计思路_05

用了一些LUT资源和D触发器资源以及各种BUF资源。

最后附上同一系列的博文:

模6计数器以及模10计数器(Verilog HDL语言设计)(Modelsim仿真与ISE综合)

级联模60计数器