admin 管理员组文章数量: 1086019
2024年3月9日发(作者:nginx升级)
要求:设计一个能显示时、分、秒的简易数字钟。
步骤:用verilog语言在记事本编写程序,再用QuartusⅡ仿真,定义针脚,在面板上模拟。
数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的寿命,因此得到广泛的应用。
设计原理及框图
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路,具有时、分、秒计数显示功能,以24小时为计数循环。这次实验主要是要实现时钟的计时功能,时间计数由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器,,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为24进制计数器.,然后需要把8位二进制数转变为译码管需要的8421码。
设计方案:
这个实验总体分:秒、分、时三个模块,计时和较准两个模式
标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲之一。“分计数器”也采用60进制计数器,每累计60分钟,发出一个时脉冲信号,该信号作为时计数器的时钟脉冲之一,时计数器采用24进制计时器,可实现对一天24小时的计时。译码显示电路将“时”、“分”、“秒”计数器的输出状态通过译码管显示。这们时钟的计时功能就实现了,
秒模块是一个以1HZ的clock信号控制的60进制计数器,并同时产生分进位信号tun。
always @(posedge clock)
begin
if(sec==59) 当秒等于59时,如果处于计时模式时产生
begin 一个进位脉冲tun, 否则tun信号暂停
sec<=0;
if(at==0)
tun<=1;
else
tun<=tun;
end
else 若秒不等于59,同样如果处于计时模式
begin 就使tun信号清0,否则tun信号暂停
sec<=sec+1;
if(at==0)
tun<=0;
else
tun<=tun;
end
end
分模块也是一个60进制计数器,并产生小时的进位信号mod,但要受到两个控制信号的控制一个是进位信号tun,另一个是t_min的按建信号。
当at=0时,赋值 mt=tun
当at=1时,赋值 mt=(!tun&t_min)|(tun&!t_min)
always@(posedge mt)
begin
if(min==59) 当min=59时, 如果处于计时模式,
begin 则产生一进位信号mod,否则mod暂停
min<=0;
if(at==0)
mod<=1;
else
mod<=mod;
end
else 当分不等于59,同样,
begin 如果处于计时模式,则mod清0,否则mod暂停
min<=min+1;
if(at==0)
mod<=0;
else
mod<=mod;
end
end
时模块和分模块相似,是一个24进制计数器,受mod和t_hou信号控制,同理
当at=0时,nt=mod
当at=1时,nt=(!mod&t_hou)|(mod&!t_hou)
always@(posedge nt)
begin
if(hou==23)
hou<=0;
else
hou<=hou+1;
end
这样就实现了计时模式时控制信号为进位信号,至此已实现时钟的功能,而显示时间的译码管是4位二进制数,须要两个译码管分别显示十位和个位,所以要求出秒、分、时的个位和十位,用以下程序就可实现。
always@(sec)
begin
sec1<=sec%10;
sec2<=sec/10;
end
always@(min)
begin
min1<=min%10;
min2<=min/10;
end
always@(hou)
begin
hou1<=hou%10;
hou2<=hou/10;
end
实验总结:
实验总体来说还是很顺利的,但在调试模拟过程中还是遇到了一些问题,在分频过程中出现了一些问题,虽然七段码正常显示了,但是时间间隔不准确,通过与老师交流,找到了问题所在。经过重新分频,时间间隔准确,实现了时钟的计时和显示的功能。
结论与心得:
经过几天的设计与思考,最终实现了数字钟的模拟。期间遇到了许多问题,但最后都一一得到解决。现将心得体会总结如下:
1,设计初期要考虑周到,否则后期改进很困难。应该在初期就多思考几个方案,进行比较认证,选择最合适的方案动手设计。总体设计在整个设计过程中非常重要,应该花较多的时间在上面。
2,方案确定后,才开始设计。设计时,多使用已学的方法,要整体考虑,不可看一步,做一步。在整体设计都正确后,再寻求简化的方法。
3,模块之间关系清楚,既利于自己修改,也利于与别人交流,如果程序杂乱无章连自己都看不懂,那还如何改进和扩展。
4,很多难点的突破都来自于与同学的交流,交流使自己获得更多的信息,开拓了思路,因此要重视与别人的交流。
5,应该有较好的理论基础,整个实验都是在理论的指导下完成了,设计过程中使用了许多理论课上学的内容,本次设计把理论应用到了实践中、同时通过设计,也加深了自己对理论知识的理解和掌握。
程序:
module clock9(t_min,t_hou,change,sec1,sec2,min1,min2,hou1,hou2,at,clk20M);
input t_min,t_hou,change,clk20M;
output reg[3:0] sec1,sec2,min1,min2,hou1,hou2;
output at;
wire t_min,t_hou;
reg[5:0] sec,min,hou;
reg tun,mod,at;
integer num;
reg clock;
wire mt,nt;
reg[3:0]secL,secG,minL,minG,houL,houG;
initial
begin
at=0;
tun=0;
mod=0;
min=0;
hou=0;
sec=0;
sec1=0;
sec2=0;
min1=0;
min2=0;
hou1=0;
hou2=0;
end
always @(posedge clk20M)
begin
if(num>=9999999)num=0;
else num=num+1;
if(num==9999999)clock=1;
else clock=0;
end
always @(posedge clock)
begin
if(sec==59)
begin
sec<=0; //秒为60进制计数器
if(at==0)
tun<=1; //如果处于计时模式,每60秒产生
else //一个分进位信号,否则tun信号暂停
tun<=tun;
end
else
begin
sec<=sec+1;
if(at==0)
tun<=0;
else
tun<=tun;
end
end
assign mt=(at==0)?(!at&tun):(!tun&t_min)|(tun&!t_min);
always@(posedge mt)
begin
if(min==59) //分钟为60进制计数器
begin
min<=0;
if(at==0)
mod<=1; //如果处于计时模式,每60分产生一个
else //时进位信号,否则mod信号暂停
mod<=mod;
end
else
begin
min<=min+1;
if(at==0)
mod<=0;
else
mod<=mod;
end
end
assign nt=(at==0)?(!at&mod):(!mod&t_hou)|(mod&!t_hou);
always@(posedge nt)
begin
if(hou==23)
hou<=0;
else
hou<=hou+1;
end
always@(sec)
begin
secL[3:0]=sec%10;
secG[3:0]=sec/10;
end
always@(min)
begin
minL[3:0]=min%10;
minG[3:0]=min/10;
end
always@(hou)
begin
houL[3:0]=hou%10;
houG[3:0]=hou/10;
end
//小时为24进制计数器
always @(secL)
case(secL)
4'b0000:sec1=4'b0000;
4'b0001:sec1=4'b0001;
4'b0010:sec1=4'b0010;
4'b0011:sec1=4'b0011;
4'b0100:sec1=4'b0100;
4'b0101:sec1=4'b0101;
4'b0110:sec1=4'b0110;
4'b0111:sec1=4'b0111;
4'b1000:sec1=4'b1000;
4'b1001:sec1=4'b1001;
endcase
always @(secG)
case(secG)
4'b0000:sec2=4'b0000;
4'b0001:sec2=4'b0001;
4'b0010:sec2=4'b0010;
4'b0011:sec2=4'b0011;
4'b0100:sec2=4'b0100;
4'b0101:sec2=4'b0101;
endcase
always @(minL)
case(minL)
4'b0000:min1=4'b0000;
4'b0001:min1=4'b0001;
4'b0010:min1=4'b0010;
4'b0011:min1=4'b0011;
4'b0100:min1=4'b0100;
4'b0101:min1=4'b0101;
4'b0110:min1=4'b0110;
4'b0111:min1=4'b0111;
4'b1000:min1=4'b1000;
4'b1001:min1=4'b1001;
endcase
always @(minG)
case(minG)
4'b0000:min2=4'b0000;
4'b0001:min2=4'b0001;
4'b0010:min2=4'b0010;
4'b0011:min2=4'b0011;
4'b0100:min2=4'b0100;
4'b0101:min2=4'b0101;
endcase
always @(houL)
case(houL)
4'b0000:hou1=4'b0000;
4'b0001:hou1=4'b0001;
4'b0010:hou1=4'b0010;
4'b0011:hou1=4'b0011;
4'b0100:hou1=4'b0100;
4'b0101:hou1=4'b0101;
4'b0110:hou1=4'b0110;
4'b0111:hou1=4'b0111;
4'b1000:hou1=4'b1000;
4'b1001:hou1=4'b1001;
endcase
always @(houG)
case(houG)
4'b0000:hou2=4'b0000;
4'b0001:hou2=4'b0001;
4'b0010:hou2=4'b0010;
endcase
endmodule忽略此处..
版权声明:本文标题:设计一个能显示时、分、秒的简易数字钟 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1709954223a551048.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论