FPGA数字电子钟

公众号:FPGA技术小开发
1.实验内容
(1 )整体功能
数字电子钟应能以秒为最小单位计时,同时用数字直观的显示当前时、分、秒。
(2)系统结构
数字电子钟的系统结构框图如图7-1-1所示。图中秒信号产生电路产生1Hz的标准计时信号,计时电路记录当前的时、分、秒,数字显示以数字的方式显示当前时间,报时电路用于整点报时,时分调整电路用于校正当前时或分,系统复位键用于系统整体清零。
(3)电气指标
① 最小计时单位为1秒。
② 秒和分计时范围为00~59,小时计时范围为0~23或1~12。
③ 可以手动校准时、分。

(1)定义输入输出信号和中间变量

module digital_clock(
input clk,                        //时钟信号,借2kHz脉冲
input clr,                         //清零信号,高电平有效
input set_m,
input set_h,                    //调分、调时信号,高电平有效
output reg [5:0] wei,       //位选信号,低电平时选中该位
output reg [3:0] data      //数据信号
);

reg [26:0] counter=0;     //M=2000的计数器
reg [2:0] count_6=0;      //M=6的计数器
reg [7:0] second=0;
reg [7:0] minute=0;
reg [7:0] hour=0;           //存放时、分、秒的数值
reg [3:0] secondL;
reg [3:0] secondH;
reg [3:0] minuteL;
reg [3:0] minuteH;
reg [3:0] hourL;
reg [3:0] hourH;             //分离时、分、秒数值的十位和个位

(2)实现强制清零和自动清零

always@(posedge clk or posedge clr)
begin
if(clr==1)    //清零键按下时将所有数据置零
begin
counter<=0;
second<=0;
minute<=0;
hour<=0;
end
else if(counter==2000)    //经过2000个2kHz时钟脉冲上升沿,即经过1s后计数器自动归零
begin
counter<=0;

(3)分钟调整

if(set_m==1)
begin
second<=second+1;  //秒正常计数
if(minute==59)
begin
minute<=0;
if(hour==23)
begin
hour<=0;                 //23:59进位变为00:00
end
else
begin
hour<=hour+1;        //59分进位为1小时
end
end
else
begin
minute<=minute+1; //分钟数值每秒增加1
end
end

(4)小时调整

if(set_h==1)
begin
second<=second+1;  //秒正常计数
if(hour==23)
begin
hour<=0;                 //24点进位变为0点
end
else
begin
hour<=hour+1;        //小时数值每秒增加1
end
end

(5)正常计时

if(second==59)        //秒针进位
begin
second<=0;
if(minute==59)        //分针进位
begin
minute<=0;
if(hour==23)           //时针进位
begin
hour<=0;
end
else                        //hour<23,小时+1
begin
hour<=hour+1;
end
end
else                        //minute<59,分钟+1
begin
minute<=minute+1;
end
end
else                        //在调时、调分键都没有按下的情况下,数字钟正常计时
begin
second<=second+1;
end

(6)分离时、分、秒数值的十位和个位

begin                               //两位数整数除10即得到十位数,取余10即得到个位数
secondH<=second/10;
secondL<=second%10;
minuteH<=minute/10;
minuteL<=minute%10;
hourH<=hour/10;
hourL<=hour%10;
end
end
else
begin
counter<=counter+1;       //时钟信号未计到1s时,计数器继续计数
end
end

(7)动态显示地址计数器

always@(posedge clk)    //将每个时钟周期选中的数码管地址存放在count_6中,以2kHz的频率刷新
if(count_6==3'b101)
count_6<=3'b000;
else
count_6<=count_6+1;

(8)输出动态显示

always@(count_6)  //每个时钟周期用位选信号选中当前编号的数码管,并显示该位当前数值
case(count_6)
3'b000:begin wei=6'b011111;data=hourH;end
3'b001:begin wei=6'b101111;data=hourL;end
3'b010:begin wei=6'b110111;data=minuteH;end
3'b011:begin wei=6'b111011;data=minuteL;end
3'b100:begin wei=6'b111101;data=secondH;end
3'b101:begin wei=6'b111110;data=secondL;end
default:begin wei=6'b011111;data=4'b0000;end
endcase
endmodule

测试激励文件:

module digital_clock_test(
);
reg clk;
reg clr;
reg set_m;
reg set_h;
wire [5:0] wei;
wire [3:0] data;
digital_clock u1(
.clk(clk),
.clr(clr),
.set_m(set_m),
.set_h(set_h),
.wei(wei),
.data(data)
);
initial
begin
clk=0;
clr=1;
set_m=0;
set_h=0;
#100
clr=0;
#6000000
set_m=1;
#6000000
set_m=0;
set_h=1;
end
always #10 clk=~clk;
endmodule

仿真结果如下:(公众号里面有,想看自己搜索FPGA技术小开发)
1、正常计时
(1)秒针计到60s进位1min
(2)分针计到60min进位1h
(3)23:59:59进位为0:0:0
2、调分
minute和second以相同频率变化。
3、调时
hour和second以相同频率变化。
故实验结果符合预期。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值