FPGA数字跑表程序

  • 格式:doc
  • 大小:28.00 KB
  • 文档页数:6

下载文档原格式

  / 18
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(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)

begin

if(clr) //异步复位

begin

{msh,msl}<=8'h00; //从00开始计数

cn1<=0;

end

else

if(!pause) //PAUSE为0时正常计数,为1时暂时计数

begin

if (msl==9)

begin

msl<=0; //低位百分秒计数到10是归零

if (msh==9)

begin

msh<=0; //高位百分秒计数到10是归零

cn1<=1; //CN1触发进位

end

else //低位计数到10,高位未计数到10时,高位计数

msh<=msh+1;

end

else

begin //低位计数未到10时,继续计数

msl<=msl+1;

cn1<=0; //低位未计数到10时,CN1不产生进位

end

end

end

//秒计数模块,每计数满60,CN2产生一个进位always @(posedge cn1 or posedge clr)

begin

if (clr)

begin //异步复位

{sh,sl}<=8'h00;

cn2<=0;

end

else

if(sl==9)

begin

sl<=0; //低位秒计数到10,低位归零

if (sh==5)

begin

sh<=0; //低位计数到10,高位计数到6时,高位秒归零

cn2<=1; //cn2触发进位

end

else

sh<=sh+1; //低位计数到10,高位未到6时,低位计数end

else

begin

sl<=sl+1; //低位未计数到10,低位计数

cn2<=0; //低位未计数到10时,CN2不产生进位

end

end

//分钟计数模块,每计满60,系统自动清0

always@ (posedge cn2 or posedge clr)

begin

if(clr)

begin //异步复位

{mh,ml}<=8'h00;

end

else

if(ml==9)

begin

ml<=0; //低位分计数到10时,低位归零

if (mh==5)

mh<=0; //低位计数到10,高位计数到6时,高位归零

else

mh<=mh+1; //低位计数到10,高位未计数到6时,高位计数end

else

ml<=ml+1; //低位计数未到10时,低位计数

end

//led显示模块

always@(msl[3:0])

begin

case(msl[3:0]) //利用case语句控制显示低位百分秒的0~9

0: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;

endcase

end

always@(msh[3:0])

begin

case(msh[3:0]) //利用case语句控制显示高位百分秒的0~9

0:led2='b1000000;

1:led2='b1111001;

2:led2='b0100100;

3:led2='b0110000;

4:led2='b0011001;