(1)跑表的计时范围为0.01s~59min59.99s,计时精度为10ms;(2)具有异步复位清零、启动、计时和暂停功能;(3)输入时钟频率为100Hz;(4) 要求数字跑表的输出能够直接驱动共阴极7段数码管显示/*信号定义CLK:时钟信号;CLR:异步复位信号;PAUSE:暂停/启动信号;MSH,MSL:百分秒的高位和低位;SH,SL:秒信号的高位和低位;MH,ML:分钟信号的高位和低位。
*/module h (clk,clr,pause,msh,msl,sh,sl,mh,ml,led1,led2,led3,led4,led5,led6);input clk,clr;input pause;output [6:0]led1;output [6:0]led2;output [6:0]led3;output [6:0]led4;output [6:0]led5;output [6:0]led6;output [3:0] msh,msl,sh,sl,mh,ml;reg [6:0]led1;reg [6:0]led2;reg [6:0]led3;reg [6:0]led4;reg [6:0]led5;reg [6:0]led6;reg[3:0] msh,msl,sh,sl,mh,ml;reg cn1,cn2; //cn1为百分秒向秒的进位,cn2为秒向分的进位//百分秒计数进程,每计满100,cn1产生一个进位1 always @(posedge clk or posedge clr)beginif(clr) //异步复位begin{msh,msl}<=8'h00; //从00开始计数cn1<=0;endelseif(!pause) //PAUSE为0时正常计数,为1时暂时计数beginif (msl==9)beginmsl<=0; //低位百分秒计数到10是归零if (msh==9)beginmsh<=0; //高位百分秒计数到10是归零cn1<=1; //CN1触发进位endelse //低位计数到10,高位未计数到10时,高位计数msh<=msh+1;endelsebegin //低位计数未到10时,继续计数msl<=msl+1;cn1<=0; //低位未计数到10时,CN1不产生进位endendend//秒计数模块,每计数满60,CN2产生一个进位always @(posedge cn1 or posedge clr)beginif (clr)begin //异步复位{sh,sl}<=8'h00;cn2<=0;endelseif(sl==9)beginsl<=0; //低位秒计数到10,低位归零if (sh==5)beginsh<=0; //低位计数到10,高位计数到6时,高位秒归零cn2<=1; //cn2触发进位endelsesh<=sh+1; //低位计数到10,高位未到6时,低位计数endelsebeginsl<=sl+1; //低位未计数到10,低位计数cn2<=0; //低位未计数到10时,CN2不产生进位endend//分钟计数模块,每计满60,系统自动清0always@ (posedge cn2 or posedge clr)beginif(clr)begin //异步复位{mh,ml}<=8'h00;endelseif(ml==9)beginml<=0; //低位分计数到10时,低位归零if (mh==5)mh<=0; //低位计数到10,高位计数到6时,高位归零elsemh<=mh+1; //低位计数到10,高位未计数到6时,高位计数endelseml<=ml+1; //低位计数未到10时,低位计数end//led显示模块always@(msl[3:0])begincase(msl[3:0]) //利用case语句控制显示低位百分秒的0~90:led1='b1000000;1:led1='b1111001;2:led1='b0100100;3:led1='b0110000;4:led1='b0011001;5:led1='b0010010;6:led1='b0000010;7:led1='b1111000;8:led1='b0000000;9:led1='b0010000;endcaseendalways@(msh[3:0])begincase(msh[3:0]) //利用case语句控制显示高位百分秒的0~90:led2='b1000000;1:led2='b1111001;2:led2='b0100100;3:led2='b0110000;4:led2='b0011001;6:led2='b0000010;7:led2='b1111000;8:led2='b0000000;9:led2='b0010000;endcaseendalways@(sl[3:0])begincase(sl[3:0]) //利用case语句控制显示低位秒的0~9 0:led3='b1000000;1:led3='b1111001;2:led3='b0100100;3:led3='b0110000;4:led3='b0011001;5:led3='b0010010;6:led3='b0000010;7:led3='b1111000;8:led3='b0000000;9:led3='b0010000;endcaseendalways@(sh[3:0])begincase(sh[3:0]) //利用case语句控制显示高位秒的0~5 0:led4='b1000000;1:led4='b1111001;2:led4='b0100100;3:led4='b0110000;4:led4='b0011001;5:led4='b0010010;endcaseendalways@(ml[3:0])begincase(ml[3:0]) //利用case语句控制显示低位分的0~9 0:led5='b1000000;1:led5='b1111001;2:led5='b0100100;3:led5='b0110000;4:led5='b0011001;5:led5='b0010010;6:led5='b0000010;7:led5='b1111000;9:led5='b0010000;endcaseendalways@(mh[3:0])begincase(mh[3:0]) //利用case语句控制显示高位分的0~5 0:led6='b1000000;1:led6='b1111001;2:led6='b0100100;3:led6='b0110000;4:led6='b0011001;5:led6='b0010010;endcaseendendmodulemodule led (ledin,ledout);//七段译码模块input[3:0] ledin;output[6:0] ledout;reg[6:0] ledout;always@(ledin) //case语句进行译码begin case(ledin) //分别对应数码管的a--g4'd0:ledout=7'b11000000;4'd1:ledout=7'b11111001;4'd2:ledout=7'b10100100;4'd3:ledout=7'b10110000;4'd4:ledout=7'b10011001;4'd5:ledout=7'b10010010;4'd6:ledout=7'b10000010;4'd7:ledout=7'b11111000;4'd8:ledout=7'b10000000;4'd9:ledout=7'b10010000;default:ledout=7'bx;endcaseendendmodule分频模块module clk(f50m,f100);input f50m;output f100;reg f100;reg [31:0]h;always@(posedge f50m)beginif(h==250000) //对计数器进行判断,确定f100信号是否反转beginh<=0; //不计数f100<=~f100;endelse //未计数到250000时,继续计数h<=h+1;endendmodule。