多功能数字钟实验报告_第1页
多功能数字钟实验报告_第2页
多功能数字钟实验报告_第3页
多功能数字钟实验报告_第4页
多功能数字钟实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.一、实验名称多功能数字钟电路设计二、实验任务及要求基本功能:四个数码管显示十进制时—分,六个LED二极管以二进制显示秒,时、分均可调。扩展功能:清零、暂停、整点报时、设定闹钟,整点报时和闹钟通过LED以10Hz频率的闪烁来实现。三、实验条件软件:Quartus29.1硬件:DE0开发板,其中四个数码管——显示时、分八个LED——前六个显示二进制秒,后两个分别为用于整点报时、闹钟八个按键——清零、暂停、标准时间闹钟时间和显示切换调时、调分、闹钟调时、闹钟调分、结束闹钟四、设计思路nCR,EN两按键分别用于清零和暂停。首先将DE0内的50MHz振荡源分别分频到10Hz和1Hz,分频模块1Hz输出作为秒的时钟信号,即每来一个时钟信号,秒增加1秒,10Hz输出用于触发整点报时和闹铃的LED显示。秒和分的*围为0~59,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的*围为0~23时。校时校分分别用AdjMinkey、AdjHrkey按键实现,拨动按键后,对应数码管示数每秒增加一。当时间处于59分55~59秒时对应整点报时的ALARM_RadioLED会以10Hz的频率闪烁。拨下Mode按键后数码管显示将从标准时间切换到闹钟时间,调节闹钟时间同标准时间校时一样——拨动SetMinkey,SetHrkey按键后对应数码管每秒增一。当闹钟时间和标准时间相同时ALARM_ClockLED开始以10Hz的频率闪烁。拨下CtrlBell按键后ALARM_ClockLED停止闪烁。verilog程序及注释*******************plete_Clock.v*********************//程序主干,调用其他文件主模块:Moduleplete_Clock(LED_hr,LED_min,LED_sec,ALARM_Radio,ALARM_Clock,_50MHzIN,AdjMinkey,AdjHrkey,SetMinkey,SetHrkey,CtrlBell,Mode,nCR,EN);input_50MHzIN;//50MHz时钟源inputnCR,EN;//清零、暂停output[13:0]LED_hr,LED_min;//标准时间显示——时、分output[5:0]LED_sec;//标准时间显示——秒wire_1Hz,_10Hz;//分频输出1Hz和10HzinputAdjMinkey,AdjHrkey;//标准时间调时按键wire[7:0]Hour,Minute,Second;//时、分、秒计时inputSetMinkey,SetHrkey;//设定闹钟按键wire[7:0]Set_hr,Set_min;//闹钟时间显示——时、分outputALARM_Radio,ALARM_Clock;//整点报时、闹钟信号显示inputCtrlBell;//控制闹钟是否继续inputMode;//标准时间闹钟时间切换Div_fpU0(_1Hz,_10Hz,_50MHzIN,nCR,EN);//分频Top_clockU1(Hour,Minute,Second,AdjMinkey,AdjHrkey,_1Hz,nCR);//标准时间RadioU2(ALARM_Radio,Minute,Second,_10Hz);//整点报时BellU3(ALARM_Clock,Set_hr,Set_min,Hour,Minute,SetHrkey,SetMinkey,_1Hz,_10Hz,CtrlBell);//闹钟DisplayL1(LED_hr[13:7],Hour[7:4],Set_hr[7:4],Mode);//数码管显示DisplayL2(LED_hr[6:0],Hour[3:0],Set_hr[3:0],Mode);DisplayL3(LED_min[13:7],Minute[7:4],Set_min[7:4],Mode);DisplayL4(LED_min[6:0],Minute[3:0],Set_min[3:0],Mode);assignLED_sec=Second[5:0];//LED显示秒endmodule***********************Div_fp.v************************//将时钟源50MHz频率分频到1Hz(时钟脉冲)和10Hz(闹钟及整点报时)分频模块:moduleDiv_fp(_1Hz,_10Hz,_50MHzIN,nCR,EN);input_50MHzIN,nCR,EN;output_1Hz,_10Hz;reg_1Hz,_10Hz;reg[24:0]count1,count2;//中间变量决定_1Hz和_10Hz是否翻转always(posedge_50MHzIN)begin if(nCR)//清零 begin _1Hz<=~_1Hz; end elseif(EN)count1<=count1;//暂停 else begin if(count1==24999999)//分至1Hz begin count1<=0; _1Hz<=~_1Hz; end else count1<=count1+1; if(count2==2499999)//分至10Hz begin count2<=0; _10Hz<=~_10Hz; end else count2<=count2+1; endendendmodule************************Top_clock.v**************************//完成计时、校时、暂停、清零基本功能顶层时钟模块:moduleTop_clock(Hour,Minute,Second,AdjMinkey,AdjHrkey,_1Hz,nCR,EN);input_1Hz,nCR,EN;inputAdjMinkey,AdjHrkey;output[7:0]Hour,Minute,Second;wireMin_Ctrl,Hr_Ctrl;Sec_countS(Second,nCR,EN,_1Hz);//秒counter60M(Minute,nCR,EN,~Min_Ctrl);//分counter24H(Hour,nCR,EN,~Hr_Ctrl);//时assignMin_Ctrl=AdjMinkey"_1Hz:(Second==8'b00111011);//当AdjMinkey按下或秒为59时下一个脉冲分加1assignHr_Ctrl=AdjHrkey"_1Hz:((Second==8'b00111011)&&(Minute==8'b01011001));//当AdjHrkey按下或秒为59时下一个脉冲时加1endmodule秒显示模块:moduleSec_count(Sec,nCR,EN,CP);inputCP,nCR,EN;output[7:0]Sec;reg[7:0]Sec,M,H;regtemp;always(posedgeCP)begin temp<=0; if(nCR)Sec<=8'b0;//清零 elseif(EN)Sec<=Sec;//暂停 elseif(Sec==8'b00111011)Sec<=8'b0;//显示*围0~59elseSec<=Sec+6'b000001;//每次触发加1 endendmodule模十计数模块:modulecounter10(Q,nCR,EN,CP);//用于显示两位数中的个位inputCP,EN,nCR;output[3:0]Q;reg[3:0]Q;always(posedgeCPorposedgenCRorposedgeEN)beginif(nCR)Q<=4'b0;//清零elseif(EN)Q<=Q;//暂停elseif(Q==4'b1001)Q<=4'b0;//个位*围0~9elseQ<=Q+4'b0001;endendmodule模六计数模块:modulecounter6(Q,nCR,EN,CP);//用于显示两位数中的十位inputCP,nCR,EN;output[3:0]Q;reg[3:0]Q;always(posedgeCPorposedgenCRorposedgeEN)beginif(nCR)Q<=4'b0;//清零elseif(EN)Q<=Q;//暂停elseif(Q==4'b0101)Q<=4'b0;//十位*围0~5elseQ<=Q+4'b0001;endendmodule模六十计数模块:modulecounter60(t,nCR,EN,CP);inputCP,nCR,EN;output[7:0]t;wireENP;counter10C0(t[3:0],nCR,EN,CP);//个位十位分开表示,便于数码管显示counter6C1(t[7:4],nCR,ENP,CP);//低四位表示个位,高四位代表十位assignENP=!(t[3:0]==4'b1001);//产生向十位进位信号endmodule模二十四计数模块:modulecounter24(Q,nCR,EN,CP);//显示时,十位个位分开表示便于数码管显示 inputCP,nCR,EN; output[7:0]Q; reg[7:0]Q; always(posedgeCPorposedgenCRorposedgeEN) begin if(nCR)Q<=4'b0000000;//清零 elseif(EN)Q<=Q;//暂停 elseif((Q[3:0]<4'b1001)&&Q[7:4]<4'b0010)Q<=Q+4'b0001; elseif((Q[3:0]==4'b1001)&&Q[7:4]<4'b0010)beginQ[7:4]<=Q[7:4]+4'b0001;Q[3:0]<=4'b0000;end//个位向十位进位 elseif((Q[3:0]<4'b0011)&&Q[7:4]==4'b0010)Q<=Q+4'b0001; elseQ<=8'b0; endendmodule**************************Radio.v******************************//当时间是*时59分55秒时信号灯闪烁整点报时模块:moduleRadio(ALARM_Radio,Minute,Second,_10Hz);input_10Hz;input[7:0]Minute,Second;outputALARM_Radio;regALARM_Radio;always(posedge_10Hz)beginif(Minute==8'b01011001&&Second>=8'b00110111)//时间大于等于59分55秒ALARM_Radio=~ALARM_Radio;//开始闪烁elseALARM_Radio=1'b0;endendmodule****************************Bell.v*********************************//闹铃设定及闹铃开关闹铃模块:moduleBell(ALARM_Clock,Set_hr,Set_min,Hour,Minute,SetHrkey,SetMinkey,_1Hz,_10Hz,CtrlBell);input_1Hz,_10Hz;inputSetHrkey,SetMinkey;//闹铃时间设定inputCtrlBell;//闹铃控制input[7:0]Hour,Minute;outputALARM_Clock;output[7:0]Set_hr,Set_min;wireCheck,Min_Ctrl,Hr_Ctrl;regALARM_Clock;counter60SM(Set_min,0,0,~Min_Ctrl);//闹铃时间设定同标准时间设定counter24SH(Set_hr,0,0,~Hr_Ctrl);assignMin_Ctrl=SetMinkey"_1Hz:0;assignHr_Ctrl=SetHrkey"_1Hz:0;assignCheck=((Set_hr[7:4]==Hour[7:4])&&(Set_hr[3:0]==Hour[3:0])&&(Set_min[7:4]==Minute[7:4])&&(Set_min[3:0]==Minute[3:0]));//判断闹铃时间是否与标准时间相同always(posedge_10Hz)beginif(Check==1&&CtrlBell==0)//如果闹铃时间与标准时间相同ALARM_Clock=~ALARM_Clock//并且CtrlBell没有被拨动,闹铃信号有效elseALARM_Clock=1'b0;endendmodule***********************************Display.v************************************//将正常时间及闹钟时间通过BCD码翻译到数码管上moduleDisplay(out,in1,in2,sel);input[7:0]in1,in2;inputsel;//输入选择显示标准时间还是闹铃时间output[6:0]out;wire*ianshi;//中间变量,选择要显示的内容reg[6:0]out;assign*ianshi=(~sel)"in1:in2;//选择显示的内容always(*ianshi) begin case(in1)//将BCD码翻译到数码管上 4'b0000:out=7'b0000001; 4'b0001:out=7'b1001111; 4'b0010:out=7'b0010010; 4'b0011:out=7'b0000110; 4'b0100:out=7'b1001100; 4'b0101:out=7'b0100100; 4'b0110:out=7'b0100000; 4'b0111:out=7'b0001111; 4'b1000:out=7'b0000000; 4'b1001:out=7'b0000100; default:out=7'b1111111; endcaseendendmodule六、仿真结果验证仿真说明:由语EndTime及GridSize设置太长会因内存不足而导致仿真失败,故仿真时将开发板50MHz振荡源当作1Hz及10Hz作为触发脉冲。即:程序中所有_Hz及_10Hz都换为_50MHzIN。1、秒向分进位由图可知当Second从59变到0时Minute也从0增至1,仿真结果正确。2、分向时进位由图可知当Minute从89变为0的同时Hour也从0变为1,仿真结果正确。说明:Minute十位和个位分别用BCD码表示,时间为59分时Minute=01011001,转化为十进制正好为图中的893、从23:59:59到00:00:00由图可知当Second从59变为0的时候Minute从89变为0,同时Hour也从35变为0,方正结果正确。说明:与Minute同理,当时间是23点时Hour=00100011,转化为十进制正好为图中的354、校时(AdjHrkey和AdjMinkey均置1)由图可知调时调分按键拨动后,每来一个脉冲Hour和Minute的地址就会增1,Second不受控制故脉冲来的同时,地址也会增1。Hour和Minute

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论