数字时钟的设计源码解析Word文件下载.docx

上传人:b****6 文档编号:19573933 上传时间:2023-01-07 格式:DOCX 页数:24 大小:20KB
下载 相关 举报
数字时钟的设计源码解析Word文件下载.docx_第1页
第1页 / 共24页
数字时钟的设计源码解析Word文件下载.docx_第2页
第2页 / 共24页
数字时钟的设计源码解析Word文件下载.docx_第3页
第3页 / 共24页
数字时钟的设计源码解析Word文件下载.docx_第4页
第4页 / 共24页
数字时钟的设计源码解析Word文件下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数字时钟的设计源码解析Word文件下载.docx

《数字时钟的设计源码解析Word文件下载.docx》由会员分享,可在线阅读,更多相关《数字时钟的设计源码解析Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。

数字时钟的设计源码解析Word文件下载.docx

inputvoice;

inputnl_kz;

outputo_led1;

//因为要点亮LED,所以设置为输出

outputo_led2;

outputo_led3;

outputo_led4;

outputo_led5;

outputo_led6;

outputo_led7;

outputled;

output[3:

0]o_miao_1;

//数码管驱动输出:

接译码器所以用四位

0]o_miao_2;

0]o_fen_1;

0]o_fen_2;

0]o_shi_1;

0]o_shi_2;

wireclk1s;

//同下

wire[7:

0]miao;

//秒保存缓存区,因为例化模块要调用,所以定义为WIRE型变量

0]fen;

/分保存缓存区,因为例化模块要调用,所以定义为WIRE型变

0]shi;

/时保存缓存区,因为例化模块要调用,所以定义为WIRE型变量

0]fen_1;

//分输出,因为例化模块要调用,所以定义为WIRE型变量

0]shi_1;

//时输出,因为例化模块要调用,所以定义为WIRE型变量

wirenz_bz;

//蜂鸣器是否开启标志位,应为只有1或0两种情况,所以一个字节

wire[2:

0]m_mode;

//模式设置标志位,因为有三个模式,所以建立了3个字节

0]m_fen;

//闹钟分保存缓存区,因为例化模块要调用,所以定义为WIRE型变量

0]m_shi;

//闹钟时保存缓存区,因为例化模块要调用,所以定义为WIRE型变量

0]m_miao;

//闹钟秒保存缓存区,因为例化模块要调用,所以定义为WIRE型变量

0]m_m_fen;

//因为在Verilog语法中不允许一个变量多次赋值,所以特地建立了一个修改时间的缓存区(PS:

不允许多次赋值是应为Verilog是可以并行执行的,所以多次赋值会出现变量的不确定性,因此不允许多次赋值)

0]m_m_shi;

//同上

0]m_m_miao;

0]m1;

//时分秒设置标志位,因为例化模块要调用,所以定义为WIRE型变量

LHB_1HZU_LHB_1HZ(//在12M主频下1秒钟产生模块

.clk(clk),//12M输入

.clk1s(clk1s)//1秒输出

LHB_JSU_LHB_JS(//实现对时间的技术模块和时间设置模块

.clk1s(clk1s),//1秒输入

.miao(miao),//秒输出送到显示模块显示

.fen(fen),//分输出送到显示模块显示

.shi(shi),//时输出送到显示模块显示

.m_mode(m_mode),//模式标志位,判断处于什么模式

.m_shi(m_m_shi),//时间设置缓存,通过在闹钟模块中赋值,送入这里赋值给miao

.m_miao(m_m_miao),//同上

.m_fen(m_m_fen)//同上

LHB_DSU_LHB_DS(//显示模块

.i_miao(miao),//时间缓存输入

.i_fen(fen),//同上

.i_shi(shi),//同上

.o_miao_1(o_miao_1),//秒低四位数码管输出

.o_miao_2(o_miao_2),/秒高四位数码管输出

.o_fen_1(o_fen_1),/分低四位数码管输出

.o_fen_2(o_fen_2),/分高四位数码管输出

.o_shi_1(o_shi_1),/时低四位数码管输出

.o_shi_2(o_shi_2),/时低低四位数码管输出

.o_led5(o_led5),//LED输出指示模式

.o_led6(o_led6),//同上

.o_led7(o_led7),//同上

.m_fen(m_fen),//同上

.m_shi(m_shi),//同上

.m_miao(m_miao),//闹钟设置时间显示

.m_mode(m_mode),//同上

.clk1s(clk),//显示刷新频率输入

.o_led1(o_led1),/LED输出指示模式

.o_led2(o_led2),/LED输出指示模式

.o_led3(o_led3),/LED输出指示模式

.o_led4(o_led4),/LED输出指示模式

.nz_bz(nz_bz),//蜂鸣器鸣叫标志位

.led(led),//蜂鸣器

.m1(m1),//时分秒设置标志位

.nl_kz(nl_kz),//蜂鸣器开启关闭选择按键

.m_m_fen(m_m_fen),//时间缓存区

.m_m_shi(m_m_shi),//时间缓存区

.m_m_miao(m_m_miao)//时间缓存区

LHB_NZU_LHB_NZ(//闹钟设置及时间设置模块

.miao(miao),//秒时间输入,主要用于判断脑中时间是否到和整点时间

.fen(fen),//同上

.shi(shi),//同上

.set(set),//按键

.accum(accum),//按键

.mode(mode),//按键

.m_mode(m_mode),//模式按键

.clk1s(clk1s),//1秒频率输入,主要做一些判断

.nz_bz(nz_bz),//闹钟标志

.m_fen(m_fen),//时间缓存

.m_miao(m_miao),//同上

.m_m_fen(m_m_fen),//时间缓存

.m_m_shi(m_m_shi),//同上

.m_m_miao(m_m_miao)//同上

Endmodule

注:

由于顶层定义定义,已在上面的文件中解释,所以下面的文件,顶层不再解释

//1HZ分频模块

moduleLHB_1HZ(

clk,

clk1s

outputclk1s;

reg[22:

0]pll;

//计数缓存区

regclk1s;

//因为在always中赋值所以定义成reg型变量(PS在always中使用而不赋值,不需要定义成reg型)

always@(posedgeclk)//上升沿检测

begin

if(pll>

=23'

h5B8D7F)//判断是否到计数值

begin

pll<

h0;

//清零

clk1s<

=~clk1s;

//取反,输出秒跳变

end

else

=pll+1;

//未到计数值时,移植累加

end

endmodule

//时钟计数模块

moduleLHB_JS(

clk1s,

miao,

fen,

shi,

m_mode,

m_fen,

m_shi,

m_miao

inputclk1s;

output[7:

input[2:

input[7:

reg[7:

always@(posedgeclk1s)//判断一秒是否到来,来了就进行处理

if(clk1s==1)//判断秒到来没

if(m_mode==0)//判断是否在模式一,已有模式一才可以累加

begin

if(miao>

=59)//判断秒是否超过计数值,超过清零,否则进行累加

begin

miao<

=8'

h00000000;

if(fen>

=59)//判断分是否超过计数值,超过清零,否则进行累加

begin

fen<

if(shi>

=23)//判断时是否超过计数值,超过清零,否则进行累加

begin

shi<

end

else

=shi+1;

end

else

=fen+1;

end

else

=miao+1;

end

end

elseif(m_mode==2)//判断是否工作在模式三,是的话吧缓存区的值进行赋值,从而达到更改时间的目的

miao<

=m_miao;

fen<

=m_fen;

shi<

=m_shi;

else;

//有IF就有else,就算是不执行任何的代码

else;

//显示模块,所有外部显示都在这个文件中显示

moduleLHB_DS(

i_miao,

i_fen,

i_shi,

o_miao_1,

o_miao_2,

o_fen_1,

o_fen_2,

o_shi_1,

o_shi_2,

m_miao,

o_led1,

o_led2,

o_led3,

o_led4,

o_led5,

o_led6,

o_led7,

nz_bz,

led,

m1,

nl_kz,

m_m_fen,

m_m_shi,

m_m_miao

0]i_miao;

0]i_fen;

0]i_shi;

inputnz_bz;

reg[3:

rego_led1;

rego_led2;

rego_led3;

rego_led4;

rego_led5;

rego_led6;

rego_led7;

regled;

reg[2:

0]m7;

always@(posedgenl_kz)//判断闹钟开关是否被按下

if(nl_kz==1)

o_led4=~o_led4;

//一旦按下就对指示灯取反,指示闹钟是否开

always@(posedgeclk1s)//显示刷新频率是否到来,这个决定是的显示的数值显示灵敏度

if(m_mode==0)//判断是否工作在模式一

o_miao_1=i_miao%10;

//对秒进行取余运算,由于很多人问我关于这个问题,我就在这里详细解释一下(取余:

举个例子15/10=1---5取余就是15%10=5这样就把各位和百位分开了,这是在数值分离中常用的一种手段)

o_miao_2=i_miao/10;

o_fen_1=i_fen%10;

o_fen_2=i_fen/10;

o_shi_1=i_shi%10;

o_shi_2=i_shi/10;

o_led1=1;

//因为工作在模式一,所以指示灯亮,其他灭

o_led2=0;

o_led3=0;

if(nz_bz==1)//判断闹钟时间是否都到来

if(o_led4==1)//判断闹钟开关是否开启

led=1;

//开启闹钟

else;

else

led=0;

//关闭闹钟

elseif(m_mode==1)//模式二

o_miao_1=m_miao%10;

o_miao_2=m_miao/10;

o_fen_1=m_fen%10;

o_fen_2=m_fen/10;

o_shi_1=m_shi%10;

o_shi_2=m_shi/10;

o_led1=0;

//模式二灯2亮

o_led2=1;

if(m1==0)//指示时间更改,现在是更改秒

o_led5=1;

o_led6=0;

o_led7=0;

elseif(m1==1)//指示时间更改,现在是更改分

o_led5=0;

o_led6=1;

else//指示时间更改,现在是更改时

o_led7=1;

if(nz_bz==1)//同上

if(o_led4==1)

else

if(m1==0)

elseif(m1==1)//模式二,闹钟参数显示

o_miao_1=m_m_miao%10;

o_miao_2=m_m_miao/10;

o_fen_1=m_m_fen%10;

o_fen_2=m_m_fen/10;

o_shi_1=m_m_shi%10;

o_shi_2=m_m_shi/10;

o_led3=1;

//闹钟设置模块,主要对闹钟设置,和模式设置

moduleLHB_NZ(

set,

accum,

mode,

m_m_miao,

m1

outputnz_bz;

output[2:

regnz_bz;

//regaccum_bz;

0]m8;

always@(posedgeaccum)//判断累加按键是否按下

if(accum==1)//判断累加按键是否按下,其实这些再判断只是为语法服务,没多少意义

if(m_mode==1)//判断是否在模式二

if(m1==0)//判断是否累加秒

if(m_miao>

=59)//对秒进行累加

m_miao=8'

h00;

m_miao=m_miao+1;

elseif(m1==1)判断是否累加分

if(m_fen>

=59)//对分进行累加

m_fen=8'

m_fen=m_fen+1;

elseif(m1==2)//判断是否累加时

if(m_shi>

=23)//对时进行累加

m_shi=8'

m_shi=m_shi+1;

elseif(m_mode==2)//判断是否工作在模式三

if(m1==0)//同上

if(m_m_miao>

=59)//对缓存区的时间进行累加,应为一个变量只能赋值一次,在计数模块中会把这个变量的值赋值给真正的监视

m_m_miao=8'

m_m_miao=m_m_miao+1;

elseif(m1==1)//判断是否工作在模式二

if(m_m_fen>

=59)

m_m_fen=8'

m_m_fen=m_m_fen+1;

elseif(m1==2)

if(m_m_shi>

=23)

m_m_shi=8'

m_m_shi=m_m_shi+1;

end

always@(posedgeset)//判断时间设置按键是否按下

if(set==1)//判断时间设置按键是否按下,其实这些再判断只是为语法服务,没多少意义

if(m1>

=3)//对时间设置标志位进行累加,从而设置对应的时间

m1=3'

m1=m1+1;

=3)//同上

always@(posedgemode)//判断模式设置按键是否按下

if(mode==1)//判断模式设置按键是否按下,

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

当前位置:首页 > 幼儿教育

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

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