您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 数字跑表-verilog
数字跑表1信号定义输入:clk:时钟信号,50M;clear:异步复位信号;pause:暂停信号;mode_select:模式选择。输出:mode_out:模式输出disp_ms_l_seg,disp_ms_h_seg:百分秒的高位和低位;disp_sec_l_seg,disp_sec_h_seg:秒信号的高位和低位;disp_min_l_seg,disp_min_h_seg:分钟信号的高位和低位;disp_hour_l_seg,disp_hour_h_seg:时钟信号的高位和低位。2功能实现1、显示0.01秒~1小时的秒表。2、具有启动/停止按键pause和清零按键clear。3、利用DE2开发板中提供的50MHz信号做为时钟信号。4、计数结果在DE2中提供的数码管中显示。5.计时时间在0.01秒~24小时范围内。6.增加了一个功能按键mode_select,可以在单道和双道模式之间切换。7.可以双道计时。8.在双道模式显示时,可以切换两道的计时结果。3程序思路输入为三个按键,分别为功能按键(mode_select)、启动停止按键(pause)和清零按键(clear);输出为八位数码管的时间显示,分别显示小时、分钟、秒和百分秒。两个模式:单道模式(mode0)和双道模式(mode1)。单道模式(mode0):按pause按键时,启动秒表计时,以后每按一次秒表就在启动和停止之间切换,同时数码管会显示计时器中的数值;当按下clear键时,计数器和显示都清零,并且停止计数。双道模式(mode1):在单道模式(mode0)下按一次mode_select键就切换到双道模式(mode1)。在双道模式(mode1)下,第一次按pause按键时,启动秒表计时;第二次按pause按键时,其中一道结束计时,并把此时的时间按存储起来,同时秒表还在继续计时;第三次按pause按键时,秒表停止计时,并把此时的时间存储起来,表示另一道结束;以后每按一次pause按键数码管输出显示就在两道计时结果之间切换;按下clear键时计数器清零,数码管显示清零;此时按下mode_select键可以切换到单道模式(mode0)。本程序将各个功能单元用不同的模块写出来,一共有7个模块,分别是顶层模块、分频模块、模式转换模块、按键处理模块、时间计数主模块(包括小时计时模块、分钟计时模块、秒计时模块和百分秒计时模块)、单双道时间数据选择模块、时间显示数据选择模块和模式输出显示模块。moduleDigital_stopwatch(clk_1000,SW1,SW2,SW3,disp_ms_l,disp_ms_h,disp_sec_l,disp_sec_h,disp_min_l,disp_min_h,disp_hour_l,disp_hour_h,mode_out);inputclk_1000;inputSW1,SW2,SW3;outputmode_out;output[3:0]disp_ms_l,disp_ms_h;output[3:0]disp_sec_l,disp_sec_h;output[3:0]disp_min_l,disp_min_h;output[3:0]disp_hour_l,disp_hour_h;wireSW1,SW2,SW3;wireclk_1000;wiretime_EN;wiremode;wire[3:0]ms_l,ms_h,sec_l,sec_h,min_l,min_h,hour_l,hour_h;wire[3:0]ms_l_0,ms_h_0,sec_l_0,sec_h_0,min_l_0,min_h_0,hour_l_0,hour_h_0;wire[3:0]ms_l_1,ms_h_1,sec_l_1,sec_h_1,min_l_1,min_h_1,hour_l_1,hour_h_1;wire[3:0]disp_ms_l,disp_ms_h,disp_sec_l,disp_sec_h,disp_min_l,disp_min_h,disp_hour_l,disp_hour_h;wireflag_ds;wireflag_st0;wireflag_st1;maincontrolm2(.SW1(SW1),.mode(mode));SW_ctrlm3(.mode(mode),.clr(SW3),.SW_2(SW2),.flag_st(time_EN),.flag_ds(flag_ds),.flag_st0(flag_st0),.flag_st1(flag_st1));time_counter_mainm4(.clk_1000(clk_1000),.clr(SW3),.time_EN(time_EN),.ms_l(ms_l),.ms_h(ms_h),.sec_l(sec_l),.sec_h(sec_h),.min_l(min_l),.min_h(min_h),.hour_l(hour_l),.hour_h(hour_h));doublem5(.mode(mode),.flag_st0(flag_st0),.flag_st1(flag_st1),.ms_l(ms_l),.ms_h(ms_h),.sec_l(sec_l),.sec_h(sec_h),.min_l(min_l),.min_h(min_h),.hour_l(hour_l),.hour_h(hour_h),.ms_l_0(ms_l_0),.ms_h_0(ms_h_0),.sec_l_0(sec_l_0),.sec_h_0(sec_h_0),.min_l_0(min_l_0),.min_h_0(min_h_0),.hour_l_0(hour_l_0),.hour_h_0(hour_h_0),.ms_l_1(ms_l_1),.ms_h_1(ms_h_1),.sec_l_1(sec_l_1),.sec_h_1(sec_h_1),.min_l_1(min_l_1),.min_h_1(min_h_1),.hour_l_1(hour_l_1),.hour_h_1(hour_h_1));disp_muxm6(.mode(mode),.flag_ds(flag_ds),.ms_l_0(ms_l_0),.ms_h_0(ms_h_0),.sec_l_0(sec_l_0),.sec_h_0(sec_h_0),.min_l_0(min_l_0),.min_h_0(min_h_0),.hour_l_0(hour_l_0),.hour_h_0(hour_h_0),.ms_l_1(ms_l_1),.ms_h_1(ms_h_1),.sec_l_1(sec_l_1),.sec_h_1(sec_h_1),.min_l_1(min_l_1),.min_h_1(min_h_1),.hour_l_1(hour_l_1),.hour_h_1(hour_h_1),.disp_ms_l(disp_ms_l),.disp_ms_h(disp_ms_h),.disp_sec_l(disp_sec_l),.disp_sec_h(disp_sec_h),.disp_min_l(disp_min_l),.disp_min_h(disp_min_h),.disp_hour_l(disp_hour_l),.disp_hour_h(disp_hour_h));mode_outputm7(.mode(mode),.mode_out(mode_out));endmodulemodulemaincontrol(SW1,mode);inputSW1;outputmode;regmode;always@(posedgeSW1)beginif(SW1==1'b1)mode=1'b0;elsemode=1'b1;endendmodule//********************************************************************//按键处理模块//接收按键,输出标志位//通过标志位实现双道时的开始计时、停止计时和双道计时结果的显示moduleSW_ctrl(mode,clr,SW_2,flag_st,flag_ds,flag_st0,flag_st1);inputmode;inputSW_2;inputclr;outputflag_st;outputflag_ds;outputflag_st0,flag_st1;regflag_st,flag_ds;reg[1:0]flag_one;regflag_st0,flag_st1;always@(posedgeSW_2orposedgeclr)beginif(clr)beginflag_st=1'b0;flag_st0=1'b0;flag_st1=1'b0;flag_one=2'b0;flag_ds=1'b0;endelsecase(mode)1'b0:beginflag_st=~flag_st;flag_ds=1'b0;end1'b1:begincase(flag_one)2'b00:beginflag_st=1'b1;flag_one=flag_one+2'b01;flag_ds=1'b0;end2'b01:beginflag_st1=1'b1;//1daostopflag_one=flag_one+2'b01;flag_ds=1'b0;end2'b10:beginflag_st0=1'b1;//0daostopflag_one=flag_one+2'b01;flag_ds=1'b0;end2'b11:beginflag_one=flag_one;flag_ds=~flag_ds;endendcaseif(flag_st0||flag_st1)flag_st=1'b0;enddefault:beginflag_st=1'b0;flag_ds=1'b0;endendcaseendendmodule//********************************************************************//时间计数主模块//用于计时,可以通过time_EN控制启停//底层四个计时模块为串行方式相连,百分秒、秒和分钟计时单个子模块各有一//个EO计数溢出标志,当本模块记满时会输出一个正脉冲给下一个模块使//下一个模块计数加一,其他以此类推moduletime_counter_main(clk_1000,clr,time_EN,ms_l,ms_h,sec_l,sec_h,min_l,min_h,hour_l,hour_h);inputclk_1000;inputclr;inputtime_EN;output[3:0]ms_l,ms_h;output[3:0]sec_l,sec_h;output[3:0]min_l,min_h;output[3:0]hour_l,hour_h;wirems_EO;wiresec_EO;wiremin_EO;ms_counteri1(.clk(clk_1000),.clr(clr),.EN(time_EN),.EO(ms_EO),.ms_l(ms_l),.ms_h(ms_h));sec_counteri2(.clk(ms_EO),.clr(clr),.EN(time_EN),.EO(sec_EO),.sec_l(sec_l),.sec_h(sec_h));min_counteri3(.clk(sec_EO),.clr(clr),.EN(time_EN),.EO(min_EO),.min_l(min_l),.min_h(min_h));hour_counteri4(.clk(min_EO),.clr(clr),.EN(time_EN),.hour_l(hour_l),.hour_h(hour_h));endmodule//**************************
本文标题:数字跑表-verilog
链接地址:https://www.777doc.com/doc-6392280 .html