您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 基于FPGA定时闹钟实验报告
西南科技大学电工学,电子技术学生实验报告课程名称FPGA技术课程设计实验课题定时闹钟班级电子0902指导老师龙惠民评分实验小组2012年4月25日实验课题:定时闹钟实验时间:2012年4月16日—4月30日实验小组成员:一.设计要求设计一个具有系统时间设置和带闹钟功能的24小时计时器中的应用。电子钟要求如下:(1)计时功能:4位LED数字时钟对当前时间的小时和分钟进行显示,显示的最长时间为23小时59分。(2)设置并显示新的闹钟时间:用户先按“set”键,再用数字键“0”~“9”输入时间,然后按“alarm”键确认。在正常计时显示状态下,用户直接按下“alarm”键,则已设置的闹钟时间显示在显示屏上。(3)设置新的计时器时间:用户先按“set”键,再用数字键“0”-“9”输入新的时间,然后按“time”键确认。在输入过程中;输入的数字在显示屏上从右到左依次显示。例如,用户要设置新的时间12:00,则按顺序输入“l”,“2”,“0”,“0”键,与之对应,显示屏上依次显示的信息为:“1”,“12”;“120”,“1200”。如果用户在输入任意几个数字后较长时间内,例如5秒,没有按任何键,则计时器恢复到正常的计时显示状态。(4)闹钟功能:如果当前时间与设置的闹钟时间相同,则扬声器发出蜂鸣声;二.设计流程1.顶层设计顶层设计结构2.各模块原理根据顶层设计结构,初步将定时闹钟分为分频器,计时模块,显示模块,闹钟模块。(1).计时模块包括秒计时子模块(sec),分计时子模块(min),时计时模块(hour),以及主控子模块(control)。其工作原理:为妙计时子模块送1HZ脉冲,但秒计数达60时,秒计数器清零,秒进位信号为‘1’,并作为分计数器的时钟信号。每产生一个秒进位信号,分计数器加‘1’。同样,分计数达60时,计数器清零,并产生一个分进位信号,作为时的时钟信号,每产生一个分进位信号,时计数器加1,当计数器达24时,计数器清零。如图2图2程序代码:modulesec(clk,rst,sec_h,sec_l,co);//秒计数模块;inputclk,rst;//时钟信号clk,复位信号rst。outputreg[3:0]sec_h;//计数器的十位outputreg[3:0]sec_l;//计数器的个位outputregco;//进位信号coalways@(posedgeclkorposedgerst)beginif(rst)beginsec_h=0;sec_l=0;endelseif(clk)beginif(sec_l==4'd9)beginsec_l=0;if(sec_h==4'd5)sec_h=0;elsesec_h=sec_h+4'd1;endelsesec_l=sec_l+4'd1;endendalways@(sec_horsec_l)beginif(sec_h==4'd0&&sec_l==4'd0)co=1'b1;elseco=1'b0;endendmodule功能仿真结果时序仿真结果modulemin(rst,sec_co,min_h,min_l,co);//分计时模块inputrst,sec_co;//时钟信号sec_co,复位信号rstoutputreg[3:0]min_h;//计数器十位outputreg[3:0]min_l;//计数器个位outputregco;//进位信号coalways@(posedgerstorposedgesec_co)if(rst)beginmin_h=0;min_l=0;endelseif(sec_co)beginif(min_l==4'd9)beginmin_l=4'd0;if(min_h==4'd5)min_h=4'd0;elsemin_h=min_h+4'd1;endelsemin_l=min_l+4'd1;endalways@(min_hormin_l)beginif(min_h==0&&min_l==0)co=1'b1;elseco=1'b0;endendmodule功能仿真时序仿真结果modulehour(rst,min_co,hour_h,hour_l);//时计时模块inputrst,min_co;//复位信号rst,时钟信号min_co;outputreg[3:0]hour_h;//计数器的十位outputreg[3:0]hour_l;//计数器的个位always@(posedgerstorposedgemin_co)if(rst)beginhour_h=0;hour_l=0;endelseif(min_co)beginif(hour_l==4'd3&&hour_h==4'd2)beginhour_h=4'd0;hour_l=4'd0;endelseif(hour_l==4'd9)beginhour_l=4'd0;if(hour_h==4'd2)hour_h=4'd0;elsehour_h=hour_h+4'd1;endelsehour_l=hour_l+4'd1;endendmodule功能仿真时序仿真设置一个顶层模块,将三个计时模块例化,验证计时模块的功能结果图a图b从图a和图b可以看出,3个计时子模块的功能的正确性,能够满足实验的要求。(2)分频器模块因为FPGA开发板有50MHZ和27MHZ晶振,根据实验要求,首先需要1HZ的时钟信号,其次,闹钟模块,显示模块及主控模块均需要一定的时钟信号。因此将50MHZ时钟信号分割成1KHZ,200HZ,1HZ。如图3图3程序代码:modulediv50_1k(clk,Q1);//分频器inputclk;//输入信号50MHZ时钟信号outputregQ1;reg[14:0]count;always@(posedgeclk)beginif(count==50000)count=0;elsecount=count+1'b1;endalways@(count)beginif(count==50000)Q1=1'b1;elseQ1=1'b0;endendmodulemodulediv1k_200(clk,Q2);inputclk;//输入信号1KHZ时钟信号outputregQ2;reg[14:0]count;always@(posedgeclk)beginif(count==5)count=0;elsecount=count+1'b1;endalways@(count)beginif(count==5)Q2=1'b1;elseQ2=1'b0;endendmodulemodulediv200_1(clk,Q3);inputclk;//输入信号200HZ时钟信号outputregQ3;reg[14:0]count;always@(posedgeclk)beginif(count==199)count=0;elsecount=count+1'b1;endalways@(count)beginif(count==199)Q3=1'b1;elseQ3=1'b0;endendmodule(3).显示模块用5位led数码管显示时钟,将分钟和小时分为十位与各位,通过分钟及小时两个计时模块将时间数据送数码管做动态扫描。程序代码:moduleled_show(rst,clk,min_h,min_l,hour_h,hour_l,selout,segout);//显示子模块inputrst,clk;//输入复位信号rst,时钟信号clk为1KHZinput[3:0]min_h,min_l,hour_h,hour_l;//时间的输入数据outputreg[2:0]selout;//数码管的位选信号outputreg[6:0]segout;//数码管的段选信号parameters1=3'b000,s2=3'b001,s3=3'b010,s4=2'b011;parameters5=3'b100;reg[3:0]bcdin;always@(posedgeclkorposedgerst)beginif(rst)beginbcdin=4'b0000;selout=s1;endelseif(clk)case(selout)s1:beginbcdin=min_h;selout=s2;ends2:beginbcdin=4'b1010;selout=s3;ends3:beginbcdin=hour_l;selout=s4;ends4:beginbcdin=hour_h;selout=s5;ends5:beginbcdin=min_l;selout=s1;enddefault:beginbcdin=4'b0000;selout=s1;endendcaseendalways@(bcdin)begincase(bcdin)4'b0000:segout=7'b1000000;4'b0001:segout=7'b1111001;4'b0010:segout=7'b0100100;4'b0011:segout=7'b0110000;4'b0100:segout=7'b0011001;4'b0101:segout=7'b0010010;4'b0110:segout=7'b0000010;4'b0111:segout=7'b1111000;4'b1000:segout=7'b0000000;4'b1001:segout=7'b0011000;4'b1010:segout=7'b1111110;default:segout=7'b0;endcaseendendmodule显示模块功能仿真分析:从结果可以看到,当输入时间数据为0010,0011,0001,0101时,LED数码管显示23—17。可以看出显示模块符合设计的要求。(4).校对模块对于时钟,常常需要对时钟的时间进行校对并设置新的计时时间;设计两个控制模块,用于设置时间。利用10个按键分别表示0到9这10个数字,设置使能键set,当set置1时,表示设置时间,time1作为确定键,利用米勒型状态的特点设置control模块。程序代码:modulecontrol(clk,set,time1,data_in,min_h,min_l,hour_h,hour_l);inputset,time1,clk;//输入信号set,time1,clk时钟信号(200hz)input[3:0]data_in;//4位宽的时间输入数据parametersth_h=0,sth_l=1,stm_h=2,stm_l=3;outputreg[3:0]min_h;outputreg[3:0]min_l;outputreg[3:0]hour_h;outputreg[3:0]hour_l;reg[2:0]state,nextstate;always@(posedgeclk)beginstate=nextstate;endalways@(stateortime1orsetordata_in)beginbeginhour_l=0;hour_h=0;min_h=0;min_l=0;endcase(state)sth_h:beginif(time1==0)nextstate=sth_h;elsebeginhour_h=data_out(set,data_in);nextstate=sth_l;endendsth_l:beginif(time1==0)nextstate=sth_l;elsebeginhour_l=data_out(set,data_in);nextstate=stm_h;endendstm_h:beginif(time1==0)nextstate=stm_h;elsebeginmin_h=data_out(set,data_in);nextstate=stm_l;endendstm_l:beginif(time1==0)nextstate=stm_l;e
本文标题:基于FPGA定时闹钟实验报告
链接地址:https://www.777doc.com/doc-5121366 .html