数字钟实验报告.docx

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

数字钟实验报告.docx

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

数字钟实验报告.docx

数字钟实验报告

 

华中科技大学

《电子线路设计、测试与实验》实验报告

 

实验名称:

多功能数字钟设计

院(系):

自动化学院

专业班级:

实验成绩:

指导教师:

汪小燕

 

2014年6月11日

 

一、实验目的

1.掌握可编程逻辑器件的应用开发技术,设计输入、编译、仿真和器件编程;

2.熟悉EDA软件使用;

3.掌握VerilogHDL设计方法;

4.分模块、分层次数字系统设计

二、实验器材

QUARTUSII软件PCDEO实验板

三、实验要求

1.能显示小时、分钟、秒钟(小时以24进制,时、分用显示器,秒用LED)

2.能调整小时、分钟的时间

3.复位

四、实验原理

五、程序设计过程

数字钟由2个60进制计数器和1个24进制计数器和4个译码器共7个模块构成,3个计数器公用一个时钟信号CP。

2个选择器分别用于选择分计数器和时计数器的使能控制信号,对时间进行校正时,在控制器的作用下,使能信号接高电平,此时每来一个时钟信号,计数器加一计数,从而实现对小时和分钟的校正.正常计时时,使能信号来自低位计数器的输出,即秒计数器达到59秒时,产生输出信号使分计数器加1,分秒计数器同时计到最大值时即59分59秒时,产生输出信号使小时计数器加一。

1.顶层模块:

moduleclock(led0,led1,led2,led3,led_sec,_50mhzin,adjminkey,adjhrkey,ncr,h12,hour12);

input_50mhzin;

inputadjminkey,adjhrkey;

inputh12;

inputncr;

output[6:

0]led0,led1,led2,led3;

wire[7:

0]led_a,led_b;

wire_1hz,_1khz,_5hz;

wire[7:

0]hour,minute,second,set_hr,set_min;

outputhour12;

wireh12;

output[7:

0]led_sec;

assignhour12=h12;

divided_frequencyu0(_1hz,ncr,_50mhzin);

top_clocku1(hour,minute,second,_1hz,ncr,adjminkey,adjhrkey,_50mhzin);

displayu2(_50mhzin,_5hz,ncr,led_a,led_b,led_sec,hour,minute,second,h12);

SEG7_LUTu3(led_a[7:

4],led3);

SEG7_LUTu4(led_a[3:

0],led2);

SEG7_LUTu5(led_b[7:

4],led1);

SEG7_LUTu6(led_b[3:

0],led0);

endmodule

2.分频模块:

moduledivided_frequency(_1hzout,ncr,_50mhzin);

input_50mhzin,ncr;

output_1hzout;

supply1vdd;

wire[11:

0]q;

wire_1khzin;

wireen1,en2;

divfreq50M_1Khzdu00(_1khzin,ncr,_50mhzin);//先调用1khz分频

counter10du0(q[3:

0],ncr,vdd,_1khzin);

counter10du1(q[7:

4],ncr,en1,_1khzin);

counter10du2(q[11:

8],ncr,en2,_1khzin);//再调用三个10计数器,将1khz分为1hz

assignen1=(q[3:

0]==4'h9);

assignen2=(q[7:

4]==4'h9)&&(q[3:

0]==4'h9);

assign_1hzout=q[11];

assign_500hzout=q[0];

endmodule

3.时钟运行模块

moduletop_clock(hour,minute,second,_1hz,ncr,adjminkey,adjhrkey,_50mhzin);

input_1hz,_50mhzin,ncr,adjminkey,adjhrkey;

output[7:

0]hour,minute,second;

wire[7:

0]hour,minute,second;//时、分、秒每个用八位二进制表示两位BCD码

supply1vdd;//高电平,是使能一直打开

wiremincp,hrcp,_5hz;//_5hz用于快速校时

divfreq50M_5hzut0(_5hz,ncr,_50mhzin);

counter60ut1(second,ncr,vdd,_1hz);

counter60ut2(minute,ncr,vdd,~mincp);//秒和分使用60进制

counter24ut3(hour[7:

4],hour[3:

0],ncr,vdd,~hrcp);//时钟为24进制(默认)

assignmincp=adjminkey?

_5hz:

(second==8'h59);

assignhrcp=adjhrkey?

_5hz:

({minute,second}==16'h5959);//进位或校时使能控制

endmodule

4.显示模块:

moduledisplay(_50mhz,_5hz,cr,led_a,led_b,led_sec,hour,minute,second,h12);

input[7:

0]hour,minute,second;//时分秒

input_50mhz,cr,_5hz;

output[7:

0]led_a,led_b,led_sec;//数码管显示缓存

inputh12;//12,24小时制切换

reg[7:

0]led_a,led_b,led_sec;

reg[2:

0]mod;//模式变量

always@(posedge_50mhz)

begin

led_b=minute;

led_sec=second;//模式0,显示时分秒

if(~h12)

begin

led_a=hour;

led_b=minute;

led_sec=second;

end

else

begin

case(hour)

8'h13,

8'h14,

8'h15,

8'h16,

8'h17,

8'h18,

8'h19,

8'h22,

8'h23,

8'h24:

led_a=hour-8'h12;

8'h20:

led_a=8'h08;

8'h21:

led_a=8'h09;

default:

led_a=hour;

endcase

end//12/24小时切换,24到12,相应BCD码减

end

endmodule

5.数码管操作模块

moduleSEG7_LUT(iDIG,oSEG);

input[3:

0]iDIG;

output[6:

0]oSEG;

reg[6:

0]oSEG;

always@(iDIG)

begin

case(iDIG)

4'h1:

oSEG=7'b1111001;//---t----

4'h2:

oSEG=7'b0100100;//||

4'h3:

oSEG=7'b0110000;//ltrt

4'h4:

oSEG=7'b0011001;//||

4'h5:

oSEG=7'b0010010;//---m----

4'h6:

oSEG=7'b0000010;//||

4'h7:

oSEG=7'b1111000;//lbrb

4'h8:

oSEG=7'b0000000;//||

4'h9:

oSEG=7'b0010000;//---b----

4'ha:

oSEG=7'b0001000;

4'hb:

oSEG=7'b0000011;

4'hc:

oSEG=7'b1000110;

4'hd:

oSEG=7'b0100001;

4'he:

oSEG=7'b0000110;

4'hf:

oSEG=7'b0001110;

4'h0:

oSEG=7'b1000000;

endcase

end

endmodule

六、功能仿真

1.六进制

2.十进制

3.六十进制(分了几张图截图)

4.24进制

5.异步清零仿真

6.正常计时仿真

●秒计时

●分计时

●小时计时

●23:

59:

59秒返0

7手动校小时和分钟仿真

ADJHrKey与AdjMinKey均为高电平有效,

七、思考题

1.什么是分层次的电路设计方法?

叙述分层次设计电路的基本过程.

答:

在电路设计中,可以将两个或者多个模块组合起来描述电路逻辑功能,通常称为分层次的电路设计.自顶而下和自底而上是两种常用的设计方法.在自顶而下的设计中,先定义顶层模块,然后再定义顶层模块中用到的子模块.而在自底而上的设计中,底层的各个子模块首先被确定下来,然后将这些子模块组合起来构成顶层模块.

2.在用MAX+PLUSII软件设计数字钟电路时,简述对60进制计数器进行仿真分析的大致过程.若仿真时栅格的大小(GRIDSIZE)为0.5ms,设置CP信号时倍率(MultipliedBy)为软件默认值1,那么仿真文件的时间至少需要多长才能完整反映计数过程?

答:

至少要0.5ms*60=30ms

八、试验中遇到的问题与解决办法

这次实验主要是Verilog代码的编写和仿真,在波形的仿真过程中,有许多操作并不清楚,尤其是部分功能的波形仿真输出和如何手动调整时钟的波形仿真,虽然最后有同学帮忙,但是最后还是操作得很不熟练。

九、实验小结

本次实验让我们巩固了Verilog代码编写与波形仿真,掌握了更多了相关波形的仿真操作,但是在部分功能的操作上,以及网格的重新建立等方面显得仍然不够熟练,还需要更多的锻炼。

十、附录(附源代码)

//clock.v

moduleclock(led0,led1,led2,led3,led_sec,_50mhzin,adjminkey,adjhrkey,ncr,h12,hour12);

input_50mhzin;

inputadjminkey,adjhrkey;

inputh12;

inputncr;

output[6:

0]led0,led1,led2,led3;

wire[7:

0]led_a,led_b;

wire_1hz,_1khz,_5hz;

wire[7:

0]hour,minute,second,set_hr,set_min;

outputhour12;

wireh12;

output[7:

0]led_sec;

wire[3:

0]hour_num1,hour_num0,min_num1,min_num0,second_num1,second_num0;

assignhour12=h12;

divided_frequencyu0(_1hz,ncr,_50mhzin);

top_clocku1(hour,minute,second,_1hz,ncr,adjminkey,adjhrkey,_50mhzin);

displayu2(_50mhzin,_5hz,ncr,led_a,led_b,led_sec,hour,minute,second,h12);

SEG7_LUTu3(led_a[7:

4],led3);

SEG7_LUTu4(led_a[3:

0],led2);

SEG7_LUTu5(led_b[7:

4],led1);

SEG7_LUTu6(led_b[3:

0],led0);

Endmodule

//topclock.v

moduletop_clock(hour,minute,second,_1hz,ncr,adjminkey,adjhrkey,_50mhzin);

input_1hz,_50mhzin,ncr,adjminkey,adjhrkey;

output[7:

0]hour,minute,second;

output[3:

0]hour_num1,hour_num0,min_num1,min_num0,second_num1,second_num0;

wire[7:

0]hour,minute,second;//时、分、秒每个用八位二进制表示两位BCD码

supply1vdd;//高电平,是使能一直打开

wiremincp,hrcp,_5hz;//_5hz用于快速校时

wire[3:

0]hour_num1,hour_num0,min_num1,min_num0,second_num1,second_num0;

//divfreq50M_5hzut0(_5hz,ncr,_50mhzin);

counter60ut1(second,ncr,vdd,_1hz);

counter60ut2(minute,ncr,vdd,~mincp);//秒和分使用60进制

counter24ut3(hour[7:

4],hour[3:

0],ncr,vdd,~hrcp);//时钟为24进制(默认)

assignmincp=adjminkey?

_5hz:

(second==8'h59);

assignhrcp=adjhrkey?

_5hz:

({minute,second}==16'h5959);//进位或校时使能控制

assignhour_num1[3:

0]=hour[7:

4];

assignhour_num0=hour[3:

0];

assignmin_num1=minute[7:

4];

assignmin_num1=minute[3:

0];

assignsecond_num1=second[7:

4];

assignsecond_num0=second[3:

0];

endmodule

 

//display.v

moduledisplay(_50mhz,_5hz,cr,led_a,led_b,led_sec,hour,minute,second,h12);

input[7:

0]hour,minute,second;//时分秒

input_50mhz,cr,_5hz;

output[7:

0]led_a,led_b,led_sec;//数码管显示缓存

inputh12;//12,24小时制切换

reg[7:

0]led_a,led_b,led_sec;

reg[2:

0]mod;//模式变量

always@(posedge_50mhz)

begin

led_b=minute;

led_sec=second;//模式0,显示时分秒

if(~h12)

begin

led_a=hour;

led_b=minute;

led_sec=second;

end

else

begin

case(hour)

8'h13,

8'h14,

8'h15,

8'h16,

8'h17,

8'h18,

8'h19,

8'h22,

8'h23,

8'h24:

led_a=hour-8'h12;

8'h20:

led_a=8'h08;

8'h21:

led_a=8'h09;

default:

led_a=hour;

endcase

end//12/24小时切换,24到12,相应BCD码减

end

endmodule

 

//SEG7_LUT.v

moduleSEG7_LUT(iDIG,oSEG);

input[3:

0]iDIG;

output[6:

0]oSEG;

reg[6:

0]oSEG;

always@(iDIG)

begin

case(iDIG)

4'h1:

oSEG=7'b1111001;//---t----

4'h2:

oSEG=7'b0100100;//||

4'h3:

oSEG=7'b0110000;//ltrt

4'h4:

oSEG=7'b0011001;//||

4'h5:

oSEG=7'b0010010;//---m----

4'h6:

oSEG=7'b0000010;//||

4'h7:

oSEG=7'b1111000;//lbrb

4'h8:

oSEG=7'b0000000;//||

4'h9:

oSEG=7'b0010000;//---b----

4'ha:

oSEG=7'b0001000;

4'hb:

oSEG=7'b0000011;

4'hc:

oSEG=7'b1000110;

4'hd:

oSEG=7'b0100001;

4'he:

oSEG=7'b0000110;

4'hf:

oSEG=7'b0001110;

4'h0:

oSEG=7'b1000000;

endcase

end

endmodule

 

//divided_frequency.v

moduledivided_frequency(_1hzout,ncr,_50mhzin);

input_50mhzin,ncr;

output_1hzout;

supply1vdd;

wire[11:

0]q;

wire_1khzin;

wireen1,en2;

divfreq50M_1Khzdu00(_1khzin,ncr,_50mhzin);//先调用1khz分频

counter10du0(q[3:

0],ncr,vdd,_1khzin);

counter10du1(q[7:

4],ncr,en1,_1khzin);

counter10du2(q[11:

8],ncr,en2,_1khzin);//再调用三个10计数器,将1khz分为1hz

assignen1=(q[3:

0]==4'h9);

assignen2=(q[7:

4]==4'h9)&&(q[3:

0]==4'h9);

assign_1hzout=q[11];

assign_500hzout=q[0];

endmodule

moduledivfreq50M_1Khz(_1khzout,ncr,_50mhzin);

input_50mhzin,ncr;

output_1khzout;

reg_1khzout;

reg[15:

0]cnt;

always@(posedge_50mhzin)

begin

if(~ncr)

_1khzout<=1'b0;

else

begin

if(cnt==16'd24999)

begin

_1khzout=~_1khzout;

cnt<=16'b0;

end//50000分频

else

cnt<=cnt+1'b1;

end

end

endmodule

 

moduledivfreq50M_5hz(_5hzout,ncr,_50mhzin);

input_50mhzin,ncr;

output_5hzout;

reg_5hzout;

reg[24:

0]cnt;

always@(posedge_50mhzin)

begin

if(~ncr)

_5hzout<=1'b0;

else

begin

if(cnt==25'd4999999)

begin

_5hzout=~_5hzout;

cnt<=25'b0;

end//一千万分频

else

cnt<=cnt+1'b1;

end

end

endmodule

 

//counter10.v

modulecounter10(q,ncr,en,cp);//模十

inputcp,ncr,en;

output[3:

0]q;

reg[3:

0]q;

always@(posedgecpornegedgencr)

begin

if(~ncr)q<=4'b0000;

elseif(~en)q<=q;

elseif(q==4'b1001)q<=4'b0000;

elseq<=q+1'b1;

end

endmodule

modulecounter6(q,ncr,en,cp);//模6

inputcp,ncr,en;

output[3:

0]q;

reg[3:

0]q;

always@(posedgecpornegedgencr)

begin

if(~ncr)q<=4'b0000;

elseif(~en)q<=q;

elseif(q==4'b0101)q<=4'b0000;

elseq<=q+1'b1;

end

endmodule

modulecounter60(cnt,ncr,en,cp);//模60

inputcp,ncr,en;

output[7:

0]cnt;

wire[7:

0]cnt;

wireenp;

counter10uc0(cnt[3:

0],ncr,en,cp);

counter6uc1(cnt[7:

4],ncr,enp,cp

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

当前位置:首页 > 表格模板 > 合同协议

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

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