级联BCD计数器

项目名称

级联BCD计数器

具体要求

设计三级bcd计数器,可以计数到999

设计说明

BCD码是用四位二进制数表示十进制中的0-9这10个数字,最常见的是8421码,各个位的权值分别为8、4、2、1,同样还有5421码等,例如将321转化为BCD码为0011_0010_0001。详细请参考百度。

                 3               2                1
001100100001

 

BCD码的主要应用之一就是数码管,假设在数码管上要显示256,一般是将个十百位进行拆分,然后查出对应数码管显示的段码再送给IO口,这个过程是比较消耗时间的,但是如果先将其转换为BCA码,可以大幅度减少运算时间。

 

设计架构

                             

代码设计

注意如果只是一个BCD计数器,cin可以是没有的,笔者在网上看到有的说是不能少,但是如果单个BCD计数器与普通计数器相差不大,在时钟上升沿进行计数,没有多大影响。

顶层模块设计

module bcd_top(
	input			clk,
	input			rst_n,
	input			cin,
	output		cout,
	output [11:0]q
);
wire [3:0] q0,q1,q2;
assign q={q2,q1,q0};


wire cin2;
wire cin3;
bcd_counter  bcd_counter1(
	.clk(clk),
	.rst_n(rst_n),
	.cin(cin),
	.cout(cin2),
	.q(q0)
);
bcd_counter  bcd_counter2(
	.clk(clk),
	.rst_n(rst_n),
	.cin(cin2),
	.cout(cin3),
	.q(q1)
);
bcd_counter  bcd_counter3(
	.clk(clk),
	.rst_n(rst_n),
	.cin(cin3),
	.cout(cout),
	.q(q2)
);
endmodule

计数模块

module bcd_counter(
	input			clk,
	input			rst_n,
	input			cin,
	output		cout,
	output	[3:0]q
);
reg [3:0] cnt;
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		cnt<=0;
	else if(cin)begin
		if(cnt==4'd9)
			cnt<=0;
		else
			cnt<=cnt+1;
	end
	else
		cnt<=cnt;

		
assign cout=(cnt==4'd9 && cin==1)?1:0;
assign q=cnt;

endmodule

仿真代码

`timescale 1ns/1ns
module bcd_counter_tb;
	reg			clk;
	reg			rst_n;
	reg			cin;
	wire			cout;
	wire	[11:0]	q;

bcd_top  bcd_top(
	.clk(clk),
	.rst_n(rst_n),
	.cin(cin),
	.cout(cout),
	.q(q)
);

initial clk=0;
always #10 clk=~clk;

initial begin
	rst_n=0;
	cin=0;
	#210;
	rst_n=1;
	#100;
	cin=1;
	
end

endmodule

仿真结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值