设计一个BCD码计数器。

BCD码计数器的定义:

对于机器语言,机器与人不同,为了让人更好的了解机器语言的数据输出,选用4位二进制数据表示十进制里的每位数据,这便是BCD码。

以下便是BCD码与十进制对应的码表

0-----------0000----------0x0

1-----------0001----------0x1

2-----------0010----------0x2

3-----------0011----------0x3

4-----------0100----------0x4

5-----------0101----------0x5

6-----------0110----------0x6

7-----------0111----------0x7

8-----------1000----------0x8

9-----------1001----------0x9

这里举个例子,十进制数52,用BCD码表示即为0101 0010,通过这个例子,就可以很好的了解到BCD码的实际应用,即更好的区分十进制中的每一位数据。

下面说下这个计数器的设计,其实操作与计数器的基本没多大区别,重点运用到的就是上一篇讲到的计数器的级联原理,这篇文章的意义是为了为后面讲解数码管的显示做准备。

新建工程

程序设计:

module BCD_counter(clk,c_in,rst_n,c_out,q);
input clk;//计数器基准时钟
input c_in;//系统进位输入
input rst_n;//系统复位
output c_out ;//计数器进位输出
output [3:0]q;//计数器输出
reg [3:0]counter,c_out;
//执行计数过程
[email protected](posedge clk or negedge rst_n)
if(rst_n==0)
counter<=4‘d0;
else if (counter==1‘b1)
begin 
if (counter==9)
counter<=4‘d0;
else 
counter<=counter+1‘b1;
end
else 
counter<=counter;
//产生进位信号
[email protected](posedge clk or negedge rst_n)
if(rst_n==0)
c_out<=1‘b0;
else if (c_in==1‘b1&&counter==4‘d9)
c_out<=1‘b1;
else 
c_out<=1‘b0;
assign q=counter;
endmodule

编写testbench

`timescale 1ns/1ns
`define clock_period 20
module BCD_counter_tb;
reg clk;
reg c_in;
reg rst_n;
wire c_out;
wire [3:0]q;
BCD_counter u0(.clk(clk),
.c_in(c_in),
.rst_n(rst_n),
.c_out(c_out),
.q(q)
);

initial clk=1‘b1;
always#(`clock_period/2) clk=~clk;
initial
begin
c_in=1‘b0; //测试即使c_in 为0时,计数器是否会有动作
rst_n=1‘b0;
#(`clock_period*200);
rst_n=1‘b1;
#(`clock_period*20);
repeat(30) //重复执行30次
begin
c_in=1‘b1;
#`clock_period;
c_in=1‘b0;
#(`clock_period*5);//保持5个时钟周期
end
#(`clock_period*20);
$stop;
end
endmodule

设置仿真路径进行仿真,可以看到每次计数满9次之后,产生一个c_out的输出信号。

下面对计数器进行级联。

module BCD_counter_top(clk,c_in,rst_n,c_out,q);

input clk;//计数器基准时钟
input c_in;//系统进位输入
input rst_n;//系统复位
output c_out ;//计数器进位输出
output [11:0]q;//计数器输出

wire c_out0,c_out1;
wire [3:0]q0,q1,q2;
BCD_counter u1(.clk(clk),
.c_in(c_in),
.rst_n(rst_n),
.c_out(c_out0),
.q(q0)
);

BCD_counter u2(.clk(clk),
.c_in(c_out0),
.rst_n(rst_n),
.c_out(c_out1),
.q(q1)
);

BCD_counter u3(.clk(clk),
.c_in(c_out1),
.rst_n(rst_n),
.c_out(c_out),
.q(q2)
);

assign q=({q2,q1,q0});//将三个信号拼接起来
endmodule

将其设置为顶层文件,编写testbench,并设置其路径。

`timescale 1ns/1ns

`define clock_period 20

module BCD_counter_top_tb;

reg clk;
reg c_in;
reg rst_n;

wire c_out;
wire [11:0]q;

BCD_counter_top BCD_counter_top0(
.clk(clk),
.c_in(c_in),
.rst_n(rst_n),
.c_out(c_out),
.q(q)
);

initial clk = 1‘b1;
always#(`clock_period/2) clk = ~clk;

initial begin
rst_n = 1‘b0;
c_in = 1‘b0;
#(`clock_period*200);
rst_n = 1‘b1;
#(`clock_period*20);
c_in = 1‘b1;
#(`clock_period*5000);
$stop;
end

endmodule

点击仿真按钮进行前仿查看波形,可以看到进位到999后产生了进位输出,这说明整个设计是正确的。

可以看到q的显示是按BCD码的码表显示的999,这说明zhegn

时间: 2024-10-11 23:12:27

设计一个BCD码计数器。的相关文章

使用mysql设计一个全局订单生产计数器

2018年8月10日08:53:50 一般生产订单号的方式 1,使用时期+随机数1+随机数2 缺点,有可能在并发的时候会出现重复,解决办法就是加唯一索引,在插入数据的做查询是否已经被使用 2,使用时间+统计当前订单数,按订单数+1,很多系统使用这种 缺点,如果有需要删除数据,当然脑残的需求,但是还是会有,再次下单就会出现订单重复,这种非常不好改动 参考1:金蝶k3,会有一个全局使用的ID,通过触发器增长 参考2:经验之谈,全局计数器解决2个根本问题,订单号不重复,使用一次请求一次,返回最近的计算

BCD码转换为十进制或者十进制转为BCD码

BCD码其实就是之前在数字电路中说的 用4位二进制数值 来表示一个0-9中的数字,例如: 0000=0 0001=1 0010=2 0011=3也就是说如果把一个数字作为一个BCD码,例如: 11 22那么他应该展开为: 00010001 00100010也就是对应为十进制: 17 34所以一个BCD吗转为十进制数据的思想就是: 将BCD码每个数字分离出来,例如上面的11将十位的1分离出来然后右移4位乘上一个10 在加上 个位的数字即可.十进制转BCD码的 思想:将这个十进制数字用二进制表示,高

用QuartusII实现半加器、全加器、2-4译码器、BCD码加法器、计数器、交通灯

6.交通灯实现代码 module light(clk,set,chan,light,out); input clk,set,chan; output reg[1:0] light; output reg[3:0] out; [email protected](posedge clk or posedge chan or posedge set) if(set==1) begin out=0; light=01; end else if(chan==1) begin if(light<2) lig

STL源码剖析——iterators与trait编程#1 尝试设计一个迭代器

STL的中心思想在于:将数据容器与算法分开,独立设计,再用一帖粘着剂将它们撮合在一起.而扮演粘着剂这个角色的就是迭代器.容器和算法泛型化,从技术角度来看并不困难,C++的模板类和模板函数可分别达成目标,但如何设计出两者之间良好的粘着剂,才是大难题. 我们可以来尝试一下自己设计一个迭代器,看途中会遇到一些什么样的难题,同时看看SGI STL是怎么解决它们的.不过在此之前,我们可以先使用一下迭代器,看看其有什么样的功能,以find()函数为例: 1 //来自SGI <stl_algo.h> 2 t

BCD码与十进制

BCD码(Binary-Coded Decimal?)亦称二进码十进数或二-十进制代码.用4位二进制数来表示1位十进制数中的0~9这10个数码.是一种二进制的数字编码形式,用二进制编码的十进制代码.BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行.这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算.相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时间.此外,对于其他

如何设计一个可用的web容器

之前在另外一个平台(http://www.jointforce.com/jfperiodical/article/1035)发表的一篇文章,现在发布到自己的博客上. 开发一个web容器涉及很多不同方面不同层面的技术,例如通信层的知识,程序语言层面的知识等等,且一个可用的web容器是一个比较庞大的系统,要说清楚需要很长的篇幅,本文旨在介绍如何设计一个web容器,只探讨实现的思路,并不涉及过多的具体实现.把它分解划分成若干模块和组件,每个组件模块负责不同的功能,下图列出一些基本的组件,并将对每个组件

BCD码、十六进制与十进制互转

在做嵌入式软件的设计中,常常会遇到十六进制.BCD码与十进制之间的转换,近期做M1卡的应用中,涉及了大量的十六进制.BCD码与十进制之间的转换.通过对BCD码.十六进制 权的理解,轻松的实现了他们之间的互换. #include <stdio.h> #include <string.h> ///////////////////////////////////////////////////// // //功能:二进制取反 // //输入:const unsigned char *sr

基于Verilog HDL的二进制转BCD码实现

在项目设计中,经常需要显示一些数值,比如温湿度,时间等等.在数字电路中数据都是用二进制的形式存储,要想显示就需要进行转换,对于一个两位的数值,对10取除可以得到其十位的数值,对10取余可以得到个位的数值.对于Verilog来说它的标准是支持除法和取余运算的,综合器也会有IP可以进行除法运算.但是这样未免会耗费太多资源,使用移位加3算法就可以实现二进制到BCD码之间的转换. BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码.用4位二进制数来表示1位十进制数中的

BCD码

BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码,是用4位二进制数来表示1位十进制数中的0~9这10个数码,用一种使用二进制编码十进制的数字编码形式.BCD码这种编码形式利用四个位元来储存一个十进制的数码,从而使二进制和十进制之间的转换得以更加快捷地进行.相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免去使计算机作浮点运算时所耗费的时间.此外,对于其他需要高精确度的计算,BCD编码亦很常用. 由于十进制数共有0.1.2.…….9十个数码,