您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 可编程逻辑器件数字钟
1可编程逻辑器件及其应用一设计要求用VerilogHDL设计一个多功能数字钟基本功能描述:1.时钟功能:包括时、分、秒的显示;2.定时与闹钟功能:能在设定的时间发出闹铃音;3.校时功能:能非常方便地对小时、分钟和秒进行手动调整以校准时间;4.整点报时功能:每逢整点,产生“嘀嘀嘀嘀--嘟”,四短一长的报时音。二仿真环境用Modelsim进行编译和仿真,工程文件在clocknew1文件夹中。三结果说明此次设计实现了数字钟的基本功能,能够进行时分秒的计时,校准,能够整点报时,在设定的时间实现响铃功能。此次设计对各种功能进行了分模块设计,记数模块中,对秒位,分位进行60位记数,小时模块进行24位记数;同时在记数模块中进行校准操作;报时模块里,每逢整点前的59分56秒、59分57秒、59分58秒、59分59秒,和整点时刻,发出“嘀嘀嘀嘀--嘟”的报时声;闹钟模块里,手动对数字钟进行定时,当数字钟的时刻与定时时刻相同时,ring=1发出响铃声。在以上各个功能的模块基础上,设置top顶层模块,将以上功能综合起来实现。为了验证数字钟的功能,编写测试testench模块,输入时钟#5clk=~clk,观察各个信号输出。四仿真结果2图1仿真整体效果图图2当reset键为0时,开始计数3图3秒位计数图4分钟计数4图5小时位计数图6整点报时功能5图7定时响铃功能图8校时功能,校时使能键为1,停止计数,校时6图9校时使能键为0,按校好的时间继续计数五设计代码//顶层模块moduletop(//inputclk,reset012,dssl,dssh,dsml,dsmh,dshl,dshh,dingshi,ksec,kmin,khour,cntsec,cntmin,cnthour,//outputsl,sh,ml,mh,hl,hh,di,do,ring);inputclk;inputreset012;input[3:0]dssl,dssh,dsml,dsmh,dshl,dshh;inputksec,kmin,khour;input[7:0]cntsec,cntmin,cnthour;inputdingshi;output[3:0]sl,sh,ml,mh,hl,hh;wire[3:0]sl,sh,ml,mh,hl,hh;outputdi,do,ring;7wiredi,do,ring;wire[3:0]c,d,e,f,g,j;wirea,b;//对模块立化secondmy_second(.clk(clk),.reset(reset012),.sh(d),.sl(c),.co(a),.ksec(ksec),.cntsec(cntsec));minutemy_minute(.reset1(reset012),.mh(f),.ml(e),.clk1(a),.co1(b),.kmin(kmin),.cntmin(cntmin));hourmy_hour(.reset2(reset012),.hh(j),.hl(g),.clk2(b),.khour(khour),.cnthour(cnthour));baoshimy_baoshi(.bssl(c),.bssh(d),.bsml(e),.bsmh(f),.bshl(g),.bshh(j),.di(di),.do(do));naozhongmy_naozhong(.dssl(dssl),.dssh(dssh),.dsml(dsml),.dsmh(dsmh),.dshl(dshl),.dshh(dshh),.clksl(c),.clksh(d),.clkml(e),.clkmh(f),.clkhl(g),.clkhh(j),.dingshi(dingshi),.ring(ring));assignsl=c;assignsh=d;assignml=e;assignmh=f;assignhl=g;assignhh=j;endmodule//秒位计数模块modulesecond(clk,reset,sh,sl,co,ksec,cntsec);inputclk;inputreset;output[3:0]sh,sl;//秒位输出的十位和个位reg[3:0]sh,sl;outputco;//进位regco;inputksec;input[7:0]cntsec;reg[7:0]cnt;//计数器//遇到时钟上升沿或置位下降沿触发always@(posedgeclkornegedgereset)beginif(ksec==1)begin//校准8cnt=cntsec;endelseif(reset==0)begin//复位sl=4'd0;sh=4'd0;cnt=0;endelsebegin//计数到60,进位if(cnt==8'd60)beginsl=4'd0;sh=4'd0;cnt=8'd0;co=1'd1;endelsebegin//小于60,继续计数cnt=cnt+1;co=1'd0;sh=cnt/10;//十位sl=cnt%10;//个位endendendendmodule//分钟计数模块moduleminute(reset1,mh,ml,clk1,co1,kmin,cntmin);inputreset1;//复位inputclk1;//时钟output[3:0]mh,ml;//分钟十位和个位reg[3:0]mh,ml;outputco1;//进位regco1;inputkmin;input[7:0]cntmin;reg[7:0]cnt1;//计数器//遇到时钟和复位触发always@(negedgeclk1ornegedgereset1)beginif(kmin==1)begin//校准cnt1=cntmin;9endelsebeginif(reset1==0)begin//复位ml=0;mh=0;cnt1=0;endelseif(cnt1==8'd60)begin//计数到60,进位。重新计数ml=4'd0;mh=4'd0;cnt1=8'd0;co1=1'd1;endelsebegin//计数不到60继续cnt1=cnt1+1;co1=1'd0;mh=cnt1/10;//十位ml=cnt1%10;//个位endendendendmodule//小时计数模块modulehour(reset2,hh,hl,clk2,khour,cnthour);inputclk2;//时钟inputreset2;//复位output[3:0]hh,hl;//???????????reg[3:0]hh,hl;reg[7:0]cnt2;//计数器inputkhour;input[7:0]cnthour;//遇到时钟和复位触发always@(negedgeclk2ornegedgereset2)beginif(khour==1)begin//校准cnt2=cnthour;endelse10if(reset2==0)begin//复位hl=0;hh=0;cnt2=0;endelsebegin//计数到24重新计数if(cnt2==8'd24)beginhl=4'd0;hh=4'd0;cnt2=8'd0;endelsebegin//计数不到24继续cnt2=cnt2+1;hh=cnt2/10;//十位hl=cnt2%10;//个位endendendendmodule//闹钟模块,在设定的时间响铃modulenaozhong(dssl,dssh,dsml,dsmh,dshl,dshh,//inputclksl,clksh,clkml,clkmh,clkhl,clkhh,//inputdingshi,ring);//手动定时input[3:0]dssl,dssh,dsml,dsmh,dshl,dshh;input[3:0]clksl,clksh,clkml,clkmh,clkhl,clkhh;reg[3:0]naosl,naosh,naoml,naomh,naohl,naohh;inputdingshi;//定时使能键outputring;//响铃键regring;//定时变化触发always@(dsslordsshordsmlordsmhordshlordshh)beginif(dingshi==1)11beginnaosl=dssl;naosh=dssh;naoml=dsml;naomh=dsmh;naohl=dshl;naohh=dshh;endelsebeginnaosl=naosl;naosh=naosh;naoml=naoml;naomh=naomh;naohl=naohl;naohh=naohh;endend//时钟变化触发,当数字钟时钟与定时时钟相同时响铃;always@(clkslorclkshorclkmlorclkmhorclkhlorclkhhornaoslornaoshornaomlornaomhornaohlornaohh)beginif((naosl==clksl)&&(naosh==clksh)&&(naoml==clkml)&&(naomh==clkmh)&&(naohl==clkhl)&&(naohh==clkhh))ring=1'd1;elsering=1'd0;endendmodule//整点报时模块modulebaoshi(bssl,bssh,bsml,bsmh,bshl,bshh,di,do);input[3:0]bssl,bssh,bsml,bsmh,bshl,bshh;outputdi,do;regdi,do;//在59分56秒59分57秒59分58秒59分59秒发出嘀嘀嘀嘀的声音always@(bsslorbsshorbsmlorbsmhorbshlorbshh)beginif((bsmh==4'd5)&&(bsml==4'd9)&&(bssh==4'd5)&&(bssl==4'd6))di=1'd1;12elseif((bsmh==4'd5)&&(bsml==4'd9)&&(bssh==4'd5)&&(bssl==4'd7))di=1'd1;elseif((bsmh==4'd5)&&(bsml==4'd9)&&(bssh==4'd5)&&(bssl==4'd8))di=1'd1;elseif((bsmh==4'd5)&&(bsml==4'd9)&&(bssh==4'd5)&&(bssl==4'd8))di=1'd1;elsedi=1'd0;end//整点发出嘟的声音always@(bsslorbsshorbsmlorbsmhorbshlorbshh)beginif((bsmh==4'd0)&&(bsml==4'd0)&&(bssh==4'd0)&&(bssl==4'd0))do=1'd1;elsedo=1'd0;endendmodule//测试模块`timescale1ns/100psmoduletestbench;regclk;regreset012;regdingshi;reg[3:0]dssl,dssh,dsml,dsmh,dshl,dshh;reg[7:0]cntsec,cntmin,cnthour;regksec,kmin,khour;wire[3:0]sl,sh,ml,mh,hl,hh;wiredi,do,ring;initial//setsimulatetimebeginclk=0;reset012=1;dingshi=0;#100dingshi=1;#100dingshi=0;13#1000reset012=0;#1000reset012=1;#3000000$stop;endinitialbegin//whendingshi==1,youcansetdingshi;dingshi=1'd1;endinitialbegincntsec=8'd55;ksec=0;#1
本文标题:可编程逻辑器件数字钟
链接地址:https://www.777doc.com/doc-5419351 .html