verilog仿真——篮球24秒计时显示器

任务

最终的工程需要调用之前设计的元件实现篮球24秒计时显示器

计时部分

思路

24进制,则利用任意模数计数器,分别实现如下

  • 当个位为9时,十位的计数使能端有效
  • 当十位为2与个位为4时,进行清零

程序设计

//filename:timer.v
module timer(
	input CR_n,EN,CP,
	output [7:0]second
);
/*功能描述
24s计时器
*/
/*端口描述
CR_n:异步清零输入端
EN:使能端
CP:时钟信号
S1,S0:控制信号
D:预置输入数据
Q:输出数据
*/
supply1 Vdd;
//秒计数高位使能端
wire SecH_EN,SecL_EN;
//记录到达24s的信号
wire CR_n_24;
//24进制秒计数器:调用10进制和2进制底层模块构成
//个位10进制:0-9
counterX U1(
.CR_n(CR_n_24),
.EN(SecL_EN),
.CP(CP),
.X(4'h9),
.Q(second[3:0])
);
//十位2进制:0-2
counterX U2(
.CR_n(CR_n_24),
.EN(SecH_EN),
.CP(CP),
.X(4'h2),
.Q(second[7:4])
);
//一直计数
assign SecL_EN=EN;
//当个位为9时,十位的计数使能
assign SecH_EN=second[3:0]==4'h9;
//只在上升沿检测是否到达,若到达,则归零
assign CR_n_24=~(second==8'h25)&CR_n;
endmodule

仿真

//filename:tb_timer.v
`timescale 1ns/1ns
module tb_timer;
reg CR_n,EN,CP;
wire [7:0]second;
//实例化24s计时器
timer timer_inst(
.CR_n(CR_n),
.EN(EN),
.CP(CP),
.second(second)
);
//产生时钟脉冲
initial
	CP=0;
always
	#1 CP=~CP;
initial begin
	//清零
	CR_n=0;EN=1;
	#2
	//计数
	CR_n=1;EN=1;
	#1
	//计数
	CR_n=1;EN=1;
	#1
	//计数
	CR_n=1;EN=1;
	#70
	$stop;
end
endmodule
24s时归零重新开始计时

显示部分

思路

这个比较简单,只需将当前时间送至7段译码管74HC4511即可,现在可以整合为一个较完整的项目。

程序设计

//filename:display.v
module display(
	input LT_n,BL_n,LE, //译码器:灯测试输入,灭灯输入,锁存使能输入
	input CR_n,EN,CP, //计时器:清零,使能,时钟信号
	output [6:0]Y1,Y2
);
/*功能描述
篮球24s计时显示器
*/
/*端口描述
//LT_n:灯测试输入,低电平有效,所有输出置1,检查好坏
//BL_n:当灭灯输入;当LT_n无效时,低电平有效,所有输出置0,清晰显示
//LE:译码器锁存使能输入;当LT_n与BL_n皆无效时,高电平有效,则译码器显示不变化
CR_n:清零信号,低电平有效,异步直接清零
EN:使能端,当清零信号与预置信号无效时,电路处于计数状态
CP:时钟信号
//Y1,Y2:译码器输出编码
*/
//传递计时器的数值至译码器
wire[7:0] value;
//实例化计时器
timer T(CR_n,EN,CP,value);
//显示个位
decoder74HC4511 U1(LT_n,BL_n,LE,value[3:0],Y1);
//显示十位
decoder74HC4511 U2(LT_n,BL_n,LE,value[7:4],Y2);
endmodule

仿真

//filename:tb_display.v
` timescale 1ns/1ns
module tb_display;
reg LT_n,BL_n,LE; //译码器:灯测试输入,灭灯输入,锁存使能输入
wire [6:0]Y1,Y2;//译码输出
reg CR_n,EN,CP;//计时器:清零,使能,时钟信号
//实例化显示器
display display_inst(
.LT_n(LT_n),
.BL_n(BL_n),
.LE(LE),
.Y1(Y1),
.Y2(Y2),
.CR_n(CR_n),
.EN(EN),
.CP(CP)
);
//时钟信号
initial
	CP=0;
always
	#1 CP=~CP;
initial begin
	//测试显示,全部为1
	LT_n=0;BL_n=0;LE=0;CR_n=1;EN=0;
	#2
	//灭灯
	LT_n=1;BL_n=0;LE=0;CR_n=1;EN=0;
	#2
	//显示
	LT_n=1;BL_n=1;LE=0;CR_n=1;EN=0;
	#2
	//清零
	LT_n=1;BL_n=1;LE=0;CR_n=0;EN=1;
	#2
	//开始计时
	LT_n=1;BL_n=1;LE=0;CR_n=1;EN=1;
	#50
	//清零
	LT_n=1;BL_n=1;LE=0;CR_n=0;EN=1;
	#12
	LT_n=1;BL_n=1;LE=0;CR_n=1;EN=1;
	//恢复计时
	#20
	LT_n=1;BL_n=1;LE=1;CR_n=1;EN=1;
	//锁存
	#8
	$stop;
end
endmodule

Leave a comment

Your email address will not be published. Required fields are marked *