多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx
《多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx》由会员分享,可在线阅读,更多相关《多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx(12页珍藏版)》请在冰豆网上搜索。
![多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST.docx](https://file1.bdocx.com/fileroot1/2023-1/6/bd3ab3bb-9338-44a2-912a-395e2ff91301/bd3ab3bb-9338-44a2-912a-395e2ff913011.gif)
多功能数字钟设计实验报告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语句的了解,了解了数字钟的工作原理以及对拓展功能如整点报时的原理。
实验中几乎完全为软件编译代码,需要有一个非常准确的布局观念以及一个正确的流程认知,这就运用到了分层次设计的方法,这种方法对我们以后的硬件设计有着非常大的帮助。
变异过程非常容易出错,所以要有耐心、细心以及毅力才能完成整个实验,正确进行仿真,然后下载软件到板子上进行结果观察。
总而言之,通过这次试验我收获颇丰。