数字钟verilog.docx

上传人:b****3 文档编号:2282012 上传时间:2022-10-28 格式:DOCX 页数:23 大小:192.18KB
下载 相关 举报
数字钟verilog.docx_第1页
第1页 / 共23页
数字钟verilog.docx_第2页
第2页 / 共23页
数字钟verilog.docx_第3页
第3页 / 共23页
数字钟verilog.docx_第4页
第4页 / 共23页
数字钟verilog.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

数字钟verilog.docx

《数字钟verilog.docx》由会员分享,可在线阅读,更多相关《数字钟verilog.docx(23页珍藏版)》请在冰豆网上搜索。

数字钟verilog.docx

数字钟verilog

数字钟verilog

 

2进制计数器。

编程用always语句实现,并且用clk上升沿触发实现计数。

EN为使能端,高电平有效。

zox为显示早上、下午的标志位,其中小于12点之前为早上,zox为0,否则zox输出为1表示下午。

其QuartusⅡ仿真波形如下图3所示,由于verilogHDL程序显示不便,均附在附件上,下面各模块相同。

图3小时计数器仿真

从仿真图中可以看出,当使能信号信号为高电平且始终上升沿到来时计数器开始计时,hour_data0计数为0—1—2—3—0···的计数规律,即4进制计数器,同理hour_data1为2进制计数器,zox信号由图中看出当小于12小时的时候输出为0,大于12小时时输出为1,与预计效果相同。

3.1.2分、秒计数器

由于分、秒计数器均为60进制计数器,所以以分计数器作为示例说明其编程思想。

其中分计数器模块在程序中为minute_counter程序段,由上面分析得分计数器由一个十进制计数器与一个六进制计数器组成,程序中有minute_data0表示分计数器低位即10进制计数器,minute_data1表示分计数器的高位为一个六进制计数器(秒计数器的低位、高位分别由second_data0、second_data1表示,其余均与分计数器相同)。

其它信号定义与小时计数器相同,clk为时钟信号,时钟周期为1HZ,即1s,与小时计数器不同的是,EO为进位信号,即到60s后自动进位。

Minute_data0、minute_data1、second_data0、second_data1位宽均为4位reg型变量。

仿真示意图如下图4所示。

图4分计数器仿真结果

由图中可以看出,当使能端信号端EN变为1的时候,计数器开始计时,minute_data0计数规律为0—1—2—3—4—5—6—7—8—9—0—1···当计数到9的时候,minute_data1加1,minute_data1计数规则为0—1—2—3—4—5—0—1···当高位minute_data1计数到5的时候,进位信号EO变为1。

秒计数器second_counter模块与分计数器完全一样,这里不再赘述。

3.2分频部分

分频器的功能主要有三个:

一是产生计时用的标准秒脉冲1HZ信号;二是提供仿电台用的1kHZ高音频信号和500HZ低音频信号;三是闹钟设置时用的200HZ闪烁信号和闹钟响铃用的500HZ音频信号。

所用输入信号为1kHZ的高频信号。

根据分析可知,1kHZ方波信号经过2分频可以得到500HZ方波,经过5分频得到200HZ信号,最后将分频得到的200HZ信号作为分频1HZ的时钟,经过200分频得到1HZ的信号。

设计框图如下图5所示。

 

图5分频信号框图

在程序设计的过程中,在复位信号rst为高电平时分频器工作,输入信号为1kHZ的高频信号,分别经过2分频、5分频、200分频得到f500HZ的500HZ信号、f200HZ的200HZ信号和f1HZ的1HZ信号。

仿真结果如下图6所示。

图6分频信号结果仿真图

从仿真图中可以看到,在rst为高电平时分频过程开始,f500HZ、f200HZ和f1HZ也与预期的输出结果一样。

3.3秒表模块

秒表模块实现秒表功能,在实现的过程中,通过改变自动工作模式下的时钟频率来实现秒表的功能。

即按动start键闹钟开始工作,再次按动start键,闹钟便停止工作。

由于秒表模块比较简单,流程图在此省略。

根据分析,在verilogHDL实现过程中,clk作为时钟正常工作时候的频率,f500hz为秒表工作时候的频率,仿真结果如下图7所示。

图7秒表仿真模块

由图中可以看出,根据start高低电平的变化,时钟在正常工作与秒表之间相互转换。

3.4闹钟模块

闹钟模块实现的是闹钟的设置及闹钟所设定的时间到之后的响铃提示。

闹钟模块的设置主要思想是由控制键来设置数字钟的闹钟响的时间,经过与当前数字钟实时时间的比较,来决定闹钟提醒的时间。

设计框图如下图8所示。

 

图8闹钟模块设计框图

在verilogHDL实现的过程中,由SW1、SW2两个调整键来实现,其中SW1为移位控制键,即按SW1一次,将移位一次,闪烁显示当前设置为数字,SW2为当前位的闹钟数字设置,每按SW2一次,当前数字设置位数字增加1,每一位上数字变化范围由当前位循环上限决定,不会超出范围。

EN为设置使能端,为1有效。

Hour1、hour0、minute1和minute0分别为当前时间每个位上显示的数字,hour_set1、hour_set0、minute_set1和minute_set0为与当前时间所对应的每一位上设置的时间显示,f200hz为闹钟设置过程中显示闪烁的频率。

Con_alarm为闹钟响铃的控制键,其值为1时,表示闹钟已设置,并且在闹钟响的时候,如果设置其值为0,则闹钟关闭。

Alarm为闹钟响铃提示输出,即设定时间到时alarm值为1,否则为0。

Alarmclock_disp_select为闹钟设置中位选信号,为4位reg型变量,其值采用独热编码,为1000、0100、0010和0001分别表示设置过程中hour1、hour0、minute1和minute0四个位。

其仿真结果如下图9所示。

图9闹钟模块仿真示意图

由于设置波形输入的时候如果调整过多,将不容易看出仿真结果的正确与否,所以图中输入比较简单,以便可以更好地分析仿真结果。

由图中可以看出,经过SW1的两次调整,位选信号alarmclock_disp_select的值为0010,表示此时的设置位为hour_set0位,SW2键将其值设置为0001,其他位均为0000,然后在与当前时钟时间相等的情况下,并且在con_alarm值为1的时候闹钟响,即alarm值输出为1,在当前时间与闹钟时间仍然相等的情况下,将闹钟控制键con_alarm值设置为0,闹钟停止,即alarm值为0。

很好的完成了闹钟的功能。

3.5时间设置模块

时间设置模块实现的功能为通过按键调节可以对当前时间进行手动控制。

其主要是在时间设置使能端有效地情况下通过SW1和SW2两个按键对数字钟的小时和分钟数进行调节。

Disp_drive为设置中的显示控制,即通过SW1对位的调整,Disp_drive随之变化。

SW2为对每一位上的数字在其范围内进行加1调节,其调节过程与闹钟模块相同。

Disp_drive取值000、001、010和011分别对应hour1、hour0、minute1和minute0的设置。

Quartus下仿真结果如图10所示。

图10时间设置模块仿真效果

图中,hour_set0、hour_set1、minute_set0和minute_set1为设置后的时间。

可以看到,当前给的hour0为0010,hour1的值0001,在SW1经过一次高电平之后,disp_drive的值变为001,对hour0进行设置,加1之后hour_set0变为0001,SW1再按一下,变为0010,在SW2两次高电平之后,SW1的值变为1,此时对分的高位进行加1设置,依此类推。

3.6报时模块

整点报时模块的主要功能为仿中央人民广播电台整点报时信号,即从59分50秒起每隔2秒发出一次低音“嘟”信号,将其定义为500HZ的低频信号,到达整点(00分00秒时),发一次高音“哒”信号,其响声为高频1kHZ信号。

由于整点报时程序比较简单,所以框图省略。

为了程序简化又与其他模块有较好的兼容性,用minute、second分别表示minute1、minute0和second1,second0经过位拼接之后的分和秒的当前显示时间。

F1khz为到达整点之后的高音频率,f500hz为59分50秒、52秒、54秒、56秒和58秒时的低音频率,radio则为到达时间时的报时输出。

仿真图如下图11所示。

图11整点报时模块仿真效果图

从图中可以看出,从59分50秒开始,输出的radio开始以f500hz的频率报时,当到达00分00秒时,输出信号频率为f1khz,到达00分01秒的时候之后便变为0,符合设计要求。

3.7控制显示模块

控制显示模块在整个数字钟的设计中起着非常重要的作用。

它的作用是将时间等数据用数码管显示的控制和数据传输模块,包括数据的传输以及BCD码译码等。

通过几个控制使能端将其不同功能时的时间在数码管上显示出来。

本模块中端口定义比较多,下面是其所对应的功能。

Time_EN:

时间自动模式工作使能信号;

Timeset_EN:

时间设置使能信号;

Stopwatch_EN:

秒表使能信号;

Alarmclock_EN:

闹钟设置使能信号;

Radio_EN:

整点报时使能信号;

Time_disp_select:

时间显示位选信号;

Alarmclock_disp_select:

闹钟设置的显示位选信号;

Disp_select:

显示位选信号输出;

Disp_data:

经过译码之后显示的数据。

程序设计中,各使能端信号为1表示执行该功能,以时间自动工作模式使能信号有效为例说明,当Time_EN为1时,首先将时间显示位选信号isp_select的值赋给显示位选信号disp_select输出,定义time_disp_select的状态一共有6个,分别为100000、010000、001000、000100、000010和000001,其在各状态下分别依次表示将hour0、hour1、minute0、minute1、second0和second1的值赋给data,用case语句来实现,其实现语句如下:

if((Time_EN==1'b1)

begin

disp_select<=time_disp_select;

case(time_disp_select)

6'b100000:

Data<=hour1;

6'b010000:

Data<=hour0;

6'b001000:

Data<=minute1;

6'b000100:

Data<=minute0;

6'b000010:

Data<=second1;

6'b000001:

Data<=second0;

default:

Data<=4'b0;

endcase

在quartusⅡ下仿真图12如下:

图12控制显示模块当前时间使能端有效时译码的显示

从图中可以看出,在第一个时钟周期内,时间显示位选信号time_disp_select的值为000000,此时应执行case语句的default,Data的值为0;在第二个时钟周期内,time_disp_select的值为000001,此时对应其最后一种状态,将second0的值赋给Data,即Data的值为0110,从图中看,仿真结果正确,disp_data表示的是将当前数据译码显示之后七段数码管的显示,所以在第一个周期内值为1111110,表示值为0,与Data所表示的数对应。

依次类推,可将Data的值全部表示出来。

显示译码数据段主要程序如下:

case(Data)

4'b0000:

disp_data<=7'b1111110;

4'b0001:

disp_data<=7'b0110000;

4'b0010:

disp_data<=7'b1101101;

4'b0011:

disp_data<=7'b1111001;

4'b0100:

disp_data<=7'b0110011;

4'b0101:

disp_data<=7'b1011011;

4'b0110:

disp_data<=7'b1011111;

4'b0111:

disp_data<=7'b1110000;

4'

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1