您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > Verilog数字钟设计实验报告
基于FPGA实现多功能数字钟——电子系071180094王丛屹摘要本文利用VerilogHDL语言自顶向下的设计方法设计多功能数字钟,并通过ISE完成综合、仿真。此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中,实现了基本的计时显示和设置,调整时间,闹钟设置的功能。[关键词]FPGA;VerilogHDL;数字钟一、多功能数字钟的设计设计一个多功能数字时钟,具有时分、秒计数显示、闹钟功能。能够利用按键实现对闹钟时间的设定并在当前显示时间到时后能够进行闹钟提示。能够利用按键实现“较时”、“较分”功能,随时对数码管的显示进行校正和校对。数字中系统主要由系统时钟,三个功能按键(mode,turn,change),FPGA,数码管和蜂鸣器部分组成。图:多功能数字钟总体设计模块以下就各个模块说明其功能1.分频模块分频模块计时模块闹钟模块显示模块控制模块蜂鸣器数码管Clk由于FPGA内部提供的时钟信号频率大约为50MHz,在这需要将它转化成1Hz的标准时钟信号供数字钟的计时显示;在此我采用了级联分频法。RTL图如下:代码如下://fenpinmodulefenpin(clk,clk_1Hz,clk_100Hz,clk_1k);outputclk_1Hz,clk_100Hz,clk_1k;inputclk;regclk_1Hz=0,clk_3=0,clk_1=0,clk_2=0,clk_1k=0;reg[6:0]cnt1=0,cnt2=0,cnt3=0,cnt4=0,cnt5=0;wireclk_100Hz;always@(posedgeclk)beginif(cnt1156/2-1)/////////////////////////////////////////////156分频,生成1MHz信号begincnt1=cnt1+1;endelsebegincnt1=0;clk_1=~clk_1;endendalways@(posedgeclk_1)if(cnt2156/2-1)/////////////////////////////////////100分频,生成10000Hz信号begincnt2=cnt2+1;endelsebegincnt2=0;clk_2=~clk_2;endalways@(posedgeclk_2)if(cnt510/2-1)/////////////////////////////////////////10分频,生成1kHz标准信号begincnt5=cnt5+1;endelsebegincnt5=0;clk_1k=~clk_1k;endalways@(posedgeclk_2)if(cnt3100/2-1)//////////////////////////////////////////100分频,生成100Hz信号begincnt3=cnt3+1;endelsebegincnt3=0;clk_3=~clk_3;endassignclk_100Hz=clk_3;always@(posedgeclk_3)if(cnt4100/2-1)/////////////////////////////////////////100分频,生成1Hz标准信号begincnt4=cnt4+1;endelsebegincnt4=0;clk_1Hz=~clk_1Hz;endendmodule最终输出的是1Hz,100Hz,1kHz的标准时钟信号clk_1Hz,clk_100Hz,clk_1k。2、计时模块原理:m是模式按键,当m=0时,进入计时模式,在计时模式下可以进行时间调整。num3,num4产生加速调整时间,当其值为1时,可以快速调整时间,该调整时间的频率由clk提供。counta,count1是手动调节时间。Turn接按键,可以改变当前调节的是小时还是分钟,长按turn键还可以使秒钟信号清零。sec1,min1,hour1输出的是计时的秒,分,时。RTL图如下:代码如下://jishimodulejishi(clk,clk_1Hz,turn,////turn:接按键,在手动校时功能时,选择是调整小时,还是分钟;若长时间按住该键,还可使秒信号清零,用于精确调时mode,count1,counta,sec1,min1,hour1,num3,num4);inputclk,clk_1Hz,turn,num3,num4;inputmode;inputcount1,counta;output[7:0]sec1,min1;output[7:0]hour1;wireclk_1Hz,ct1,cta,turn,num3,num4;reg[7:0]sec1=0,min1=0;reg[7:0]hour1=0;reg[1:0]m;wirecount1,counta;regminclk,hclk;always@(posedgemode)//mode信号控制系统在三种功能间转换beginif(m==4)m=0;elsem=m+1;end/////秒钟计时模块//////always@(posedgeclk_1Hz)if((sec1==8'h59)|turn&(!m))///////若长时间按住该键,还可使秒信号清零,用于精确调时。beginsec1=0;//按住“turn”按键一段时间,秒信号可清零,该功能用于手动精确调时if(!(turn&(!m)))minclk=1;///产生进位endelsebeginif(sec1[3:0]==4'b1001)beginsec1[3:0]=4'b0000;sec1[7:4]=sec1[7:4]+1;endelsesec1[3:0]=sec1[3:0]+1;minclk=0;end////////分钟计时模?///assignm_clk=minclk||count1;/////m_clk产生进位或校正改变assignct1=(num3&clk)|(!num3&m_clk);//ct1用于计时、校时中的分钟计数always@(posedgect1)beginif(min1==8'h59)beginmin1=0;hclk=1;endelsebeginif(min1[3:0]==9)beginmin1[3:0]=0;min1[7:4]=min1[7:4]+1;endelsemin1[3:0]=min1[3:0]+1;hclk=0;endend////////小时计时模块///assignh_clk=hclk||counta;//////h_clk产生进位或校正改变assigncta=(num4&clk)|(!num4&h_clk);//cta用于计时、校时中的小时计数always@(posedgecta)if(hour1==8'h23)hour1=0;elseif(hour1[3:0]==9)beginhour1[7:4]=hour1[7:4]+1;hour1[3:0]=0;endelsehour1[3:0]=hour1[3:0]+1;endmodule3、闹钟模块原理:num1,num2产生加速调整时间,当其值为1时,可以快速调整时间,该调整时间的频率由clk提供。countb,count2是手动调节闹钟时间。amin,ahour是输出的闹钟的分钟和小时,LD_alert指示当前是否开启闹钟。RTL图如下:代码如下://AlarmmoduleAlarm(clk,amin,ahour,num1,num2,count2,countb,LD_alert);inputclk,num1,num2,count2,countb;output[7:0]amin;output[7:0]ahour;outputLD_alert;wireLD_alert;reg[7:0]amin=0;reg[7:0]ahour=0;assignct2=(num1&clk)|(!num1&count2);//ct2用于定时状态下调整分钟信号assignLD_alert=(ahour|amin)?1:0;//指示是否进行了闹铃定时always@(posedgect2)if(amin==8'h59)amin=0;elseif(amin[3:0]==9)beginamin[3:0]=0;amin[7:4]=amin[7:4]+1;endelseamin[3:0]=amin[3:0]+1;assignctb=(num2&clk)|(!num2&countb);////ctb用于定时状态调节小时信号always@(posedgectb)if(ahour==8'h23)ahour=0;elseif(ahour[3:0]==9)beginahour[3:0]=0;ahour[7:4]=ahour[7:4]+1;endelseahour[3:0]=ahour[3:0]+1;endmodule4、控制模块(1)原理:m是模式按键,当m=0时,指当前输出的是计时功能;当m=1时,指当前调整的是闹钟时间;当m=2时,指当前调整的是计时时间;当m=3时,此时turn按键可用于跑表的暂停与开始。change接按键,手动调整时,每按一次,计数器加1;如果长按,则连续快速加1,用于快速调时和定时;turn接按键,在手动校时功能时,选择是调整小时,还是分钟;若长时间按住该键,还可使秒信号清零,用于精确调时。count1,count2,counta,countb分别是用来调节计时时间和闹钟时间。LD_min,LD_hour,指示当前调节的是分钟还是小时。RTL图代码如下://ctrolmodulectrol(change,turn,count1,count2,counta,countb,pause,LD_min,LD_hour,mode);inputchange,mode,turn;outputcount1,count2,counta,countb,pause,LD_min,LD_hour;reg[1:0]m;regfm=0,count1=0,count2=0,counta=0,countb=0,pause=0,LD_min=0,LD_hour=0;wiremode,turn,change;always@(posedgemode)//mode信号控制系统在三种功能间转换beginif(m==4)m=0;elsem=m+1;endalways@(posedgeturn)//////////接按键,在手动校时功能时,选择是调整小时,还是分钟;beginfm=~fm;endalways@(morfmorchange)begincase(m)3:begin////////3:跑表功能;if(fm)pause=1;elsepause=0;end2:begin////////2:调节时间功能;if(fm)begincount1=change;{LD_min,LD_hour}=2;end//////指示当前调整的是分钟elsebegincounta=change;{LD_min,LD_hour}=1;end/////指示当前调整的是小时{count2,countb}=0;end1:begin//////1:调节闹钟功能if(fm)begincount2=change;{LD_min,LD_hour}=2;end/////指示当前调整的是分elsebegincountb=change;{LD_min,LD_hour}=1;end/////指示当前调整的是小时{count1,counta}=0;end0:begin{count1,count2,counta,countb,LD_min,LD_hour}=0;end////0:计时功能endcaseendendmodule5、控制模块(2)原理:此模块是加速调节时间模块,count1,count2,count
本文标题:Verilog数字钟设计实验报告
链接地址:https://www.777doc.com/doc-2216201 .html