数字跑表_verilog
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字跑表
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);
input clk_1000;
input SW1,SW2,SW3;
output mode_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;
wire SW1,SW2,SW3;
wire clk_1000;
wiretime_EN;
wire mode;
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;
wire flag_st0;
wire flag_st1;
maincontrol m2(.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));
double m5(.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),