数字钟实验报告Word格式.docx
《数字钟实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《数字钟实验报告Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
![数字钟实验报告Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/23/329bae16-9c97-40da-9ce1-e889adcb6d29/329bae16-9c97-40da-9ce1-e889adcb6d291.gif)
input_50mhzin;
inputadjminkey,adjhrkey;
inputh12;
inputncr;
output[6:
0]led0,led1,led2,led3;
wire[7:
0]led_a,led_b;
wire_1hz,_1khz,_5hz;
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:
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;
0]hour,minute,second;
//时、分、秒每个用八位二进制表示两位BCD码
//高电平,是使能一直打开
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?
({minute,second}==16'
h5959);
//进位或校时使能控制
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;
0]led_a,led_b,led_sec;
//数码管显示缓存
//12,24小时制切换
reg[7:
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,
h14,
h15,
h16,
h17,
h18,
h19,
h22,
h23,
h24:
led_a=hour-8'
h12;
h20:
led_a=8'
h08;
h21:
h09;
default:
led_a=hour;
endcase
end//12/24小时切换,24到12,相应BCD码减
end
5.数码管操作模块
moduleSEG7_LUT(iDIG,oSEG);
input[3:
0]iDIG;
output[6:
0]oSEG;
reg[6:
always@(iDIG)
begin
case(iDIG)
4'
h1:
oSEG=7'
b1111001;
//---t----
h2:
b0100100;
//||
h3:
b0110000;
//ltrt
h4:
b0011001;
h5:
b0010010;
//---m----
h6:
b0000010;
h7:
b1111000;
//lbrb
h8:
b0000000;
h9:
b0010000;
//---b----
ha:
b0001000;
hb:
b0000011;
hc:
b1000110;
hd:
b0100001;
he:
b0000110;
hf:
b0001110;
h0:
b1000000;
endcase
end
六、功能仿真
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);
wire[3:
0]hour_num1,hour_num0,min_num1,min_num0,second_num1,second_num0;
Endmodule
//topclock.v
output[3:
0]hour_num1,hour_num0,min_num1,min_num0,second_num1,second_num0;
//divfreq50M_5hzut0(_5hz,ncr,_50mhzin);
assignhour_num1[3:
0]=hour[7:
4];
assignhour_num0=hour[3:
0];
assignmin_num1=minute[7:
assignmin_num1=minute[3:
assignsecond_num1=second[7:
assignsecond_num0=second[3:
//display.v
//SEG7_LUT.v
//---t----
//divided_frequency.v
moduledivfreq50M_1Khz(_1khzout,ncr,_50mhzin);
output_1khzout;
reg_1khzout;
reg[15:
0]cnt;
always@(posedge_50mhzin)
if(~ncr)
_1khzout<
=1'
b0;
else
if(cnt==16'
d24999)
begin
_1khzout=~_1khzout;
cnt<
=16'
end//50000分频
else
=cnt+1'
b1;
moduledivfreq50M_5hz(_5hzout,ncr,_50mhzin);
input_50mhzin,ncr;
output_5hzout;
reg_5hzout;
reg[24:
if(~ncr)
_5hzout<
if(cnt==25'
d4999999)
_5hzout=~_5hzout;
=25'
end//一千万分频
//counter10.v
modulecounter10(q,ncr,en,cp);
//模十
inputcp,ncr,en;
reg[3:
always@(posedgecpornegedgencr)
if(~ncr)q<
=4'
b0000;
elseif(~en)q<
=q;
elseif(q==4'
b1001)q<
elseq<
=q+1'
modulecounter6(q,ncr,en,cp);
//模6
b0101)q<
modulecounter60(cnt,ncr,en,cp);
//模60
wireenp;
counter10uc0(cnt[3:
0],ncr,en,cp);
counter6uc1(cnt[7:
4],ncr,enp,cp