多功能数字钟设计实验报告XilinxEDABasys2华中科技大学HUST

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

多功能数字钟设计实验报告院系:电子与通信工程学院姓名:郭世康班级:1301学号:U201313639指导教师:唐祖平一、实验目标掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程熟悉EDA软件使用掌握VerilogHDL设计方法分模块、分层次数字系统设计二、实验内容要求基本功能能显示小时、分钟、秒钟(时、分用显示器,秒用LED)能调整小时、分钟的时间提高要求任意闹钟;(1分)小时为12/24进制可切换(1分)报正点数(几点钟LED闪烁几下)(1分)三、实验条件Xilinx工程环境,win7操作系统,BASYS2实验板。四、实验设计1.设计分析数字钟大体上由2个60进制计数器,1个24进制计数器构成,中间有数据选择器进行连接。为实现提高功能,还需12进制计数和整点判断模块。下图为数字钟层次结构图。2.实验原理振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,再经分频器输出标准秒脉冲。秒计数器计满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按24或12进制规律计数。计数器的输送译码显示电路,即可显示出数码(即时间)。计时出现误差时可以用校时电路进行校时和校分。小时显示(12\24)切换电路、仿电台报时、定时闹钟为扩展电路,只有在计时主体电路正常运行的情况下才能进行功能扩展。本实验采用VerilogHDL进行描述,然后用FPGA/CPLD实现,使用内部50MHz晶振作为时钟电路。3.逻辑设计实现上述功能的VerilogHDL程序如下。实现基本功能的程序分为两层次四个模块,底层有3个模块构成,即6进制计数器模块,10进制计数器模块和24进制计数器模块,顶层有一个模块,他调用底层的3个模块完成数字中的计时功能。moduletimeclock(Hour,Minute,Second,CP,nCR,EN,Adj_Min,Adj_Hour,number,Light,clk,temp,change,AMTM,dingdong);output[7:0]Hour,Minute,Second;output[3:0]Light,temp;output[6:0]number;outputclk,AMTM,dingdong;//clk为分频之后的时钟信号,频率为1Hz,AMTM为24进制转换12进制时表明上下午的变量,dingdong为整点报时时的闪烁信号。inputCP;//输入的时钟信号,需分频后才能正常使用。inputnCR;//清零inputEN,change;//EN为使能信号,change为12/24进制转换开关。inputAdj_Min;//校分控制inputAdj_Hour;//校时控制wire[7:0]Hour,Minute,Second;regclk;reg[29:0]count,count1;//分频需要的计数器reg[1:0]scan;//扫描时需要的计数器reg[3:0]Light,temp;//4Bit变量Light代表四个数码管,temp表示数码管需要显示的数字reg[6:0]number;//number代表7个发光二极管regclk1;//为分频后的扫描频率supply1Vdd;wireMinL_EN,MinH_EN,Hour_EN;//中间变量//Hour,Minute,Secondcounter////60进制秒计数器counter10U1(Second[3:0],nCR,EN,clk);//个位counter6U2(Second[7:4],nCR,(Second[3:0]==4'h9),clk);//十位//产生分钟计数器使能信号。Adj_Min=1,校正分钟;Adj_Min=0,分钟正常计时assignMinL_EN=Adj_Min?Vdd:(Second==8'h59);assignMinH_EN=(Adj_Min&&(Minute[3:0]==4'h9))||((Minute[3:0]==4'h9)&&(Second==8'h59));//60进制分钟计数器counter10U3(Minute[3:0],nCR,MinL_EN,clk);counter6U4(Minute[7:4],nCR,MinH_EN,clk);//产生小时计数器使能信号。Adj_Hour=1,校正小时;Adj_Hour=0,小时正常计时assignHour_EN=Adj_Hour?Vdd:((Minute==8'h59)&&(Second==8'h59));//24进制和12进制可切换的小时计数器counter24U5(Hour[7:4],Hour[3:0],nCR,Hour_EN,clk,change,AMTM);//整点报时模块dingdongU6(clk,nCR,Minute[7:4],Minute[3:0],Hour[7:4],Hour[3:0],dingdong);//分频always@(posedgeCP)beginif(~nCR)count=30'd00;elseif(count==30'd25000000)begincount=30'd00;clk=~clk;endelsecount=count+1'b1;end//产生1Hz的频率always@(posedgeCP)beginif(~nCR)count1=30'd00;elseif(count1==30'd100000)begincount1=30'd00;clk1=~clk1;endelsecount1=count1+1'b1;end//产生扫描用的频率//扫描计数器always@(posedgeclk1)beginif(~nCR)scan=2'b00;elseif(scan==2'b11)scan=2'b00;elsescan=scan+1'b1;end//扫描always@(scan[1:0])begincase(scan[1:0])2'b00:Light=4'b0111;2'b01:Light=4'b1011;2'b10:Light=4'b1101;2'b11:Light=4'b1110;endcaseend//显示数字always@(scan[1:0])begincase(scan[1:0])2'b00:temp=Hour[7:4];2'b01:temp=Hour[3:0];2'b10:temp=Minute[7:4];2'b11:temp=Minute[3:0];endcaseendalways@(temp)begincase(temp)4'd0:number=7'b0000001;//04'd1:number=7'b1001111;//14'd2:number=7'b0010010;//24'd3:number=7'b0000110;//34'd4:number=7'b1001100;//44'd5:number=7'b0100100;//54'd6:number=7'b0100000;//64'd7:number=7'b0001111;//74'd8:number=7'b0000000;//84'd9:number=7'b0000100;//9default:number=7'b0000001;endcaseendendmodulemoduledingdong(clk,ncr,minuteh,minutel,hourh,hourl,dingdong);inputncr;inputclk;input[3:0]minuteh,minutel;input[3:0]hourh,hourl;outputregdingdong;integeri=0;regen;always@(posedgeclkornegedgencr)beginif(~ncr)begindingdong=0;endelseif((minuteh==4'd5)&&(minutel==4'd9))begini=0;en=1;endelseif((i(hourh*20+hourl*2))&&(en))begindingdong=~dingdong;i=i+1;endelseif(i==(hourh*20+hourl*2))en=0;elsedingdong=0;endendmodulemodulecounter10(Q,nCR,EN,CP);output[3:0]Q;inputCP;inputnCR;inputEN;reg[3:0]Q;always@(posedgeCPornegedgenCR)beginif(~nCR)Q=4'b0000;//nCR=0,计数器被异步清零elseif(~EN)Q=Q;//EN=0,暂停计数elseif(Q==4'b1001)Q=4'b0000;elseQ=Q+1'b1;//计数器增加1endendmodulemodulecounter6(Q,nCR,EN,CP);output[3:0]Q;inputCP;inputnCR;inputEN;reg[3:0]Q;always@(posedgeCPornegedgenCR)beginif(~nCR)Q=4'b0000;elseif(~EN)Q=Q;elseif(Q==4'b0101)Q=4'b0000;elseQ=Q+1'b1;endendmodulemodulecounter24(CntH,CntL,nCR,EN,CP,change,AMTM);output[3:0]CntH;output[3:0]CntL;outputAMTM;inputnCR;inputEN;inputCP,change;reg[3:0]CntH,CntL;regAMTM;always@(posedgeCPornegedgenCR)beginif(~nCR){CntH,CntL}=8'h00;//清零elseif(change==0)//判断12或者24小时进制。change=0时为24进制,change=1时为12进制beginAMTM=0;//上下午显示关闭if(~EN){CntH,CntL}={CntH,CntL};//暂停计数elsebeginif((CntH4'b0010)||(CntL4'b1001)||((CntH==4'b0010)&&(CntL=4'b0011))){CntH,CntL}=8'h00;elseif((CntH==4'b0010)&&(CntL4'b0011))beginCntH=CntH;CntL=CntL+1'b1;endelseif(CntL==4'b1001)beginCntH=CntH+1'b1;CntL=4'b0000;endelsebeginCntH=CntH;CntL=CntL+1'b1;endendend//24进制小时计数模块完成elseif(change==1)//进入12小时计数模块beginif(CntH=4'b0001&&CntL4'b0010)beginCntH=CntH-1'b1;CntL=CntL-2'b10;AMTM=1;end//AMTM=1.,表示为下午elseif(~EN){CntH,CntL}={CntH,CntL};elsebeginif((CntH4'b0001)||(CntL4'b1001)||((CntH==4'b0001)&&(CntL=4'b0010)))begin{CntH,CntL}=8'h01;AMTM=~AMTM;end//完成一次12小时计数,AMTM翻转一次,表示上下午的转换elseif((CntH==4'b0001)&&(CntL4'b0001))beginCntH=CntH;CntL=CntL+1'b1;endelseif(CntL==4'b1001)beginCntH=CntH+1'b1;CntL=4'b0000;endelsebe

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功