多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx

上传人:b****5 文档编号:6402201 上传时间:2023-01-06 格式:DOCX 页数:12 大小:143.59KB
下载 相关 举报
多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx_第1页
第1页 / 共12页
多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx_第2页
第2页 / 共12页
多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx_第3页
第3页 / 共12页
多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx_第4页
第4页 / 共12页
多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx

《多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx》由会员分享,可在线阅读,更多相关《多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx(12页珍藏版)》请在冰豆网上搜索。

多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx

多功能数字钟设计实验报告XilinxEDABasys2华中科技大学HUST

 

多功能数字钟设计实验报告

 

院系:

电子与通信工程学院

姓名:

***

班级:

1301

学号:

U*********

指导教师:

***

 

一、实验目标

•掌握可编程逻辑器件的应用开发技术

——设计输入、编译、仿真和器件编程

•熟悉EDA软件使用

•掌握VerilogHDL设计方法

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

二、实验内容要求

•基本功能

•能显示小时、分钟、秒钟(时、分用显示器,秒用LED)

•能调整小时、分钟的时间

•提高要求

•任意闹钟;(1分)

•小时为12/24进制可切换(1分)

•报正点数(几点钟LED闪烁几下)(1分)

三、实验条件

Xilinx工程环境,win7操作系统,BASYS2实验板。

四、实验设计

1.设计分析

数字钟大体上由2个60进制计数器,1个24进制计数器构成,中间有数据选择器进行连接。

为实现提高功能,还需12进制计数和整点判断模块。

下图为数字钟层次结构图。

2.实验原理

振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,再经分频器输出标准秒脉冲。

秒计数器计满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按24或12进制规律计数。

计数器的输送译码显示电路,即可显示出数码(即时间)。

计时出现误差时可以用校时电路进行校时和校分。

小时显示(12\24)切换电路、仿电台报时、定时闹钟为扩展电路,只有在计时主体电路正常运行的情况下才能进行功能扩展。

本实验采用VerilogHDL进行描述,然后用FPGA/CPLD实现,使用内部50MHz晶振作为时钟电路。

3.逻辑设计

实现上述功能的VerilogHDL程序如下。

实现基本功能的程序分为两层次四个模块,底层有3个模块构成,即6进制计数器模块,10进制计数器模块和24进制计数器模块,顶层有一个模块,他调用底层的3个模块完成数字中的计时功能。

moduletimeclock(Hour,Minute,Second,CP,nCR,EN,Adj_Min,Adj_Hour,number,Light,clk,temp,change,AMTM,dingdong);

output[7:

0]Hour,Minute,Second;

output[3:

0]Light,temp;

output[6:

0]number;

outputclk,AMTM,dingdong;//clk为分频之后的时钟信号,频率为1Hz,AMTM为24进制转换12进制时表明上下午的变量,dingdong为整点报时时的闪烁信号。

inputCP;//输入的时钟信号,需分频后才能正常使用。

inputnCR;//清零

inputEN,change;//EN为使能信号,change为12/24进制转换开关。

inputAdj_Min;//校分控制

inputAdj_Hour;//校时控制

wire[7:

0]Hour,Minute,Second;

regclk;

reg[29:

0]count,count1;//分频需要的计数器

reg[1:

0]scan;//扫描时需要的计数器

reg[3:

0]Light,temp;//4Bit变量Light代表四个数码管,temp表示数码管需要显示的数字

reg[6:

0]number;//number代表7个发光二极管

regclk1;//为分频后的扫描频率

supply1Vdd;

wireMinL_EN,MinH_EN,Hour_EN;//中间变量

//Hour,Minute,Secondcounter//

//60进制秒计数器

counter10U1(Second[3:

0],nCR,EN,clk);//个位

counter6U2(Second[7:

4],nCR,(Second[3:

0]==4'h9),clk);//十位

//产生分钟计数器使能信号。

Adj_Min=1,校正分钟;Adj_Min=0,分钟正常计时

assignMinL_EN=Adj_Min?

Vdd:

(Second==8'h59);

assignMinH_EN=(Adj_Min&&(Minute[3:

0]==4'h9))||((Minute[3:

0]==4'h9)&&(Second==8'h59));

//60进制分钟计数器

counter10U3(Minute[3:

0],nCR,MinL_EN,clk);

counter6U4(Minute[7:

4],nCR,MinH_EN,clk);

//产生小时计数器使能信号。

Adj_Hour=1,校正小时;Adj_Hour=0,小时正常计时

assignHour_EN=Adj_Hour?

Vdd:

((Minute==8'h59)&&(Second==8'h59));

//24进制和12进制可切换的小时计数器

counter24U5(Hour[7:

4],Hour[3:

0],nCR,Hour_EN,clk,change,AMTM);

//整点报时模块

dingdongU6(clk,nCR,Minute[7:

4],Minute[3:

0],Hour[7:

4],Hour[3:

0],dingdong);

//分频

always@(posedgeCP)

begin

if(~nCR)count<=30'd00;

elseif(count==30'd25000000)begincount<=30'd00;clk=~clk;end

elsecount<=count+1'b1;

end//产生1Hz的频率

always@(posedgeCP)

begin

if(~nCR)count1<=30'd00;

elseif(count1==30'd100000)begincount1<=30'd00;clk1=~clk1;end

elsecount1<=count1+1'b1;

end//产生扫描用的频率

//扫描计数器

always@(posedgeclk1)

begin

if(~nCR)scan<=2'b00;

elseif(scan==2'b11)scan<=2'b00;

elsescan<=scan+1'b1;

end

//扫描

always@(scan[1:

0])

begin

case(scan[1:

0])

2'b00:

Light<=4'b0111;

2'b01:

Light<=4'b1011;

2'b10:

Light<=4'b1101;

2'b11:

Light<=4'b1110;

endcase

end

//显示数字

always@(scan[1:

0])

begin

case(scan[1:

0])

2'b00:

temp<=Hour[7:

4];

2'b01:

temp<=Hour[3:

0];

2'b10:

temp<=Minute[7:

4];

2'b11:

temp<=Minute[3:

0];

endcase

end

always@(temp)

begin

case(temp)

4'd0:

number<=7'b0000001;//0

4'd1:

number<=7'b1001111;//1

4'd2:

number<=7'b0010010;//2

4'd3:

number<=7'b0000110;//3

4'd4:

number<=7'b1001100;//4

4'd5:

number<=7'b0100100;//5

4'd6:

number<=7'b0100000;//6

4'd7:

number<=7'b0001111;//7

4'd8:

number<=7'b0000000;//8

4'd9:

number<=7'b0000100;//9

default:

number<=7'b0000001;

endcase

end

endmodule

moduledingdong(clk,ncr,minuteh,minutel,hourh,hourl,dingdong);

inputncr;

inputclk;

input[3:

0]minuteh,minutel;

input[3:

0]hourh,hourl;

outputregdingdong;

integeri=0;

regen;

always@(posedgeclkornegedgencr)

begin

if(~ncr)

begin

dingdong<=0;

end

elseif((minuteh==4'd5)&&(minutel==4'd9))

begin

i=0;

en<=1;

end

elseif((i<(hourh*20+hourl*2))&&(en))

begin

dingdong<=~dingdong;

i=i+1;

end

elseif(i==(hourh*20+hourl*2))

en<=0;

else

dingdong<=0;

end

endmodule

modulecounter10(Q,nCR,EN,CP);

output[3:

0]Q;

inputCP;

inputnCR;

inputEN;

reg[3:

0]Q;

always@(posedgeCPornegedgenCR)

begin

if(~nCR)Q<=4'b0000;//nCR=0,计数器被异步清零

elseif(~EN)Q<=Q;//EN=0,暂停计数

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

elseQ<=Q+1'b1;//计数器增加1

end

endmodule

modulecounter6(Q,nCR,EN,CP);

output[3:

0]Q;

inputCP;

inputnCR;

inputEN;

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

modulecounter24(CntH,CntL,nCR,EN,CP,change,AMTM);

output[3:

0]CntH;

output[3:

0]CntL;

outputAMTM;

inputnCR;

inputEN;

inputCP,change;

reg[3:

0]CntH,CntL;

regAMTM;

always@(posedgeCPornegedgenCR)

begin

if(~nCR){CntH,CntL}<=8'h00;//清零

elseif(change==0)//判断12或者24小时进制。

change=0时为24进制,change=1时为12进制

beginAMTM<=0;//上下午显示关闭

if(~EN){CntH,CntL}<={CntH,CntL};//暂停计数

else

begin

if((CntH>4'b0010)||(CntL>4'b1001)||((CntH==4'b0010)&&(CntL>=4'b0011)))

{CntH,CntL}<=8'h00;

elseif((CntH==4'b0010)&&(CntL<4'b0011))

beginCntH<=CntH;CntL<=CntL+1'b1;end

elseif(CntL==4'b1001)

beginCntH<=CntH+1'b1;CntL<=4'b0000;end

else

beginCntH<=CntH;CntL<=CntL+1'b1;end

end

end//24进制小时计数模块完成

elseif(change==1)//进入12小时计数模块

begin

if(CntH>=4'b0001&&CntL>4'b0010)beginCntH<=CntH-1'b1;CntL<=CntL-2'b10;AMTM<=1;end//AMTM=1.,表示为下午

elseif(~EN){CntH,CntL}<={CntH,CntL};

else

begin

if((CntH>4'b0001)||(CntL>4'b1001)||((CntH==4'b0001)&&(CntL>=4'b0010)))

begin{CntH,CntL}<=8'h01;AMTM<=~AMTM;end//完成一次12小时计数,AMTM翻转一次,表示上下午的转换

elseif((CntH==4'b0001)&&(CntL<4'b0001))

beginCntH<=CntH;CntL<=CntL+1'b1;end

elseif(CntL==4'b1001)

beginCntH<=CntH+1'b1;CntL<=4'b0000;end

else

beginCntH<=CntH;CntL<=CntL+1'b1;end

end

end//12进制小时计数完成

end

endmodule

4.仿真波形

Counter10:

Counter6:

Counter24:

24进制时:

12进制时:

总体波形:

注:

number,temp等没有显示,change=0,即仿真波形为24进制。

五、调试过程

1.调试步骤

首先设置引脚接口,其代码如下:

引脚代码:

NET"Light[0]"LOC=F12;

NET"Light[1]"LOC=J12;

NET"Light[2]"LOC=M13;

NET"Light[3]"LOC=K14;

NET"number[6]"LOC=L14;

NET"number[5]"LOC=H12;

NET"number[4]"LOC=N14;

NET"number[3]"LOC=N11;

NET"number[2]"LOC=P12;

NET"number[1]"LOC=L13;

NET"number[0]"LOC=M12;

NET"Second[0]"LOC=M5;

NET"CP"LOC=B8;

NET"nCR"LOC=L3;

NET"EN"LOC=P11;

NET"Adj_Hour"LOC=B4;

NET"Adj_Min"LOC=K3;

NET"change"LOC=G3;

NET"AMTM"LOC=M11;

NET"dingdong"LOC=P7;

接着连接BASYS2实验板,将程序下载到板子上,观看结果。

2.调试过程中遇到的问题及解决办法

在调试过程中,观察到四个数码管都显示为8,通过检查确定原因为扫描频率过高,将扫描频率降低,结果正常显示。

3.实验结果

在BASYS2实验板上观察到时钟运行正常,清零功能以及暂停功能可以正确实现,可以正常校正时间以及切换12/24小时进制,整点报时功能也能正确实现。

六、实验总结

本次实验需要使用Xilinx进行软件编译,通过这次实验,加深了对verilog语句的了解,了解了数字钟的工作原理以及对拓展功能如整点报时的原理。

实验中几乎完全为软件编译代码,需要有一个非常准确的布局观念以及一个正确的流程认知,这就运用到了分层次设计的方法,这种方法对我们以后的硬件设计有着非常大的帮助。

变异过程非常容易出错,所以要有耐心、细心以及毅力才能完成整个实验,正确进行仿真,然后下载软件到板子上进行结果观察。

总而言之,通过这次试验我收获颇丰。

 

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

当前位置:首页 > 人文社科 > 军事政治

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

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