1、多功能数字钟设计实验报告 Xilinx EDA Basys2 华中科技大学 HUST 多功能数字钟设计实验报告 院系:电子与通信工程学院 姓名:* 班级:1301 学号:U* 指导教师:*一、实验目标掌握可编程逻辑器件的应用开发技术 设计输入、编译、仿真和器件编程熟悉EDA软件使用掌握Verilog HDL设计方法 分模块、分层次数字系统设计 二、实验内容要求基本功能能显示小时、分钟、秒钟(时、分用显示器,秒用LED)能调整小时、分钟的时间提高要求任意闹钟;(1分)小时为12/24进制可切换(1分)报正点数(几点钟LED闪烁几下)(1分)三、实验条件Xilinx工程环境,win7操作系统,BA
2、SYS2实验板。四、实验设计1.设计分析 数字钟大体上由2个60进制计数器,1个24进制计数器构成,中间有数据选择器进行连接。为实现提高功能,还需12进制计数和整点判断模块。下图为数字钟层次结构图。2. 实验原理 振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,再经分频器输出标准秒脉冲。秒计数器计满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按24或12进制规律计数。计数器的输送译码显示电路,即可显示出数码(即时间)。计时出现误差时可以用校时电路进行校时和校分。小时显示(1224)切换电路、仿电台报时、定时闹钟为扩展电路,只有在计时主体电路正常运行的情况下才能进行功能
3、扩展。本实验采用Verilog HDL进行描述,然后用FPGA/CPLD实现,使用内部50MHz晶振作为时钟电路。3. 逻辑设计 实现上述功能的Verilog HDL 程序如下。实现基本功能的程序分为两层次四个模块,底层有3个模块构成,即6进制计数器模块,10进制计数器模块和24进制计数器模块,顶层有一个模块,他调用底层的3个模块完成数字中的计时功能。 module timeclock(Hour,Minute,Second,CP,nCR,EN,Adj_Min,Adj_Hour,number,Light,clk,temp,change,AMTM,dingdong); output 7:0 Hou
4、r,Minute,Second; output 3:0 Light,temp; output 6:0 number; output clk,AMTM,dingdong;/clk为分频之后的时钟信号,频率为1Hz,AMTM为24进制转换12进制时表明上下午的变量,dingdong为整点报时时的闪烁信号。 input CP;/输入的时钟信号,需分频后才能正常使用。 input nCR;/清零 input EN,change;/EN为使能信号,change为12/24进制转换开关。 input Adj_Min;/校分控制 input Adj_Hour; /校时控制 wire 7:0 Hour,Min
5、ute,Second; reg clk; reg 29:0 count,count1;/分频需要的计数器 reg 1:0 scan;/扫描时需要的计数器 reg 3:0 Light,temp;/4Bit 变量Light代表四个数码管,temp表示数码管需要显示的数字 reg 6:0 number;/number代表7个发光二极管 reg clk1;/为分频后的扫描频率 supply1 Vdd; wire MinL_EN,MinH_EN,Hour_EN;/中间变量 / Hour,Minute,Second counter/ /60进制秒计数器 counter10 U1(Second3:0,nCR
6、,EN,clk);/个位 counter6 U2(Second7:4,nCR,(Second3:0=4h9),clk);/十位 /产生分钟计数器使能信号。Adj_Min=1,校正分钟;Adj_Min=0,分钟正常计时 assign MinL_EN=Adj_Min?Vdd:(Second=8h59); assign MinH_EN=(Adj_Min&(Minute3:0=4h9)|(Minute3:0=4h9)&(Second=8h59); /60进制分钟计数器 counter10 U3(Minute3:0,nCR,MinL_EN,clk); counter6 U4(Minute7:4,nCR,
7、MinH_EN,clk); /产生小时计数器使能信号。Adj_Hour=1,校正小时;Adj_Hour=0,小时正常计时 assign Hour_EN=Adj_Hour?Vdd:(Minute=8h59)&(Second=8h59);/24进制和12进制可切换的小时计数器 counter24 U5(Hour7:4,Hour3:0,nCR,Hour_EN,clk,change,AMTM);/整点报时模块 dingdong U6(clk,nCR,Minute7:4,Minute3:0,Hour7:4,Hour3:0,dingdong); /分频 always (posedge CP) begin
8、if(nCR) count=30d00; else if(count=30d25000000) begin count=30d00; clk=clk; end else count=count+1b1; end /产生1Hz的频率 always (posedge CP) begin if(nCR) count1=30d00; else if(count1=30d100000) begin count1=30d00; clk1=clk1; end else count1=count1+1b1; end /产生扫描用的频率/扫描计数器 always (posedge clk1) begin if(
9、nCR) scan=2b00; else if(scan=2b11) scan=2b00; else scan=scan+1b1; end /扫描 always (scan1:0) begin case(scan1:0) 2b00: Light=4b0111; 2b01: Light=4b1011; 2b10: Light=4b1101; 2b11: Light=4b1110; endcase end/显示数字 always (scan1:0) begin case(scan1:0) 2b00: temp=Hour7:4; 2b01: temp=Hour3:0; 2b10: temp=Minu
10、te7:4; 2b11: temp=Minute3:0; endcase end always (temp) begin case(temp) 4d0:number=7b0000001; /0 4d1:number=7b1001111; /1 4d2:number=7b0010010; /2 4d3:number=7b0000110; /3 4d4:number=7b1001100; /4 4d5:number=7b0100100; /5 4d6:number=7b0100000; /6 4d7:number=7b0001111; /7 4d8:number=7b0000000; /8 4d9
11、:number=7b0000100; /9 default:number=7b0000001; endcase end endmodulemodule dingdong(clk,ncr,minuteh,minutel,hourh,hourl,dingdong); input ncr; input clk; input 3:0 minuteh,minutel; input 3:0 hourh,hourl; output reg dingdong; integer i=0; reg en; always(posedge clk or negedge ncr) begin if(ncr) begin
12、 dingdong=0; end else if(minuteh=4d5)&(minutel=4d9) begin i=0; en=1; end else if(i(hourh*20+hourl*2)&(en) begin dingdong=dingdong; i=i+1; end else if(i=(hourh*20+hourl*2) en=0; else dingdong=0; end endmodulemodule counter10(Q,nCR,EN,CP); output 3:0 Q; input CP; input nCR; input EN; reg 3:0 Q; always
13、 (posedge CP or negedge nCR) begin if(nCR) Q=4b0000;/nCR=0,计数器被异步清零 else if(EN) Q=Q;/EN=0,暂停计数 else if(Q=4b1001) Q=4b0000; else Q=Q+1b1;/计数器增加1 endendmodulemodule counter6(Q,nCR,EN,CP); output 3:0 Q; input CP; input nCR; input EN; reg 3:0 Q; always (posedge CP or negedge nCR) begin if(nCR) Q=4b0000;
14、 else if(EN) Q=Q; else if(Q=4b0101) Q=4b0000; else Q=Q+1b1; endendmodulemodule counter24(CntH,CntL,nCR,EN,CP,change,AMTM); output 3:0 CntH; output 3:0 CntL; output AMTM; input nCR; input EN; input CP,change; reg 3:0 CntH,CntL; reg AMTM; always (posedge CP or negedge nCR) begin if(nCR) CntH,CntL=8h00
15、;/清零 else if(change=0)/判断12或者24小时进制。change=0时为24进制,change=1时为12进制 begin AMTM=0;/上下午显示关闭if(EN) CntH,CntL4b0010)|(CntL4b1001)|(CntH=4b0010)&(CntL=4b0011) CntH,CntL=8h00; else if(CntH=4b0010)&(CntL4b0011) begin CntH=CntH; CntL=CntL+1b1; end else if(CntL=4b1001) begin CntH=CntH+1b1; CntL=4b0000; end els
16、e begin CntH=CntH; CntL=4b0001&CntL4b0010) begin CntH=CntH-1b1; CntL=CntL-2b10; AMTM=1; end/AMTM=1.,表示为下午 else if(EN) CntH,CntL4b0001)|(CntL4b1001)|(CntH=4b0001)&(CntL=4b0010) begin CntH,CntL=8h01; AMTM=AMTM; end/完成一次12小时计数,AMTM翻转一次,表示上下午的转换 else if(CntH=4b0001)&(CntL4b0001) begin CntH=CntH; CntL=Cn
17、tL+1b1; end else if(CntL=4b1001) begin CntH=CntH+1b1; CntL=4b0000; end else begin CntH=CntH; CntL=CntL+1b1; end end end/12进制小时计数完成 end endmodule4.仿真波形Counter10:Counter6:Counter24:24进制时:12进制时:总体波形: 注:number,temp等没有显示,change=0,即仿真波形为24进制。五、调试过程1.调试步骤首先设置引脚接口,其代码如下:引脚代码:NET Light0 LOC = F12;NET Light1
18、LOC = J12;NET Light2 LOC = M13;NET Light3 LOC = K14;NET number6 LOC = L14;NET number5 LOC = H12;NET number4 LOC = N14;NET number3 LOC = N11;NET number2 LOC = P12;NET number1 LOC = L13;NET number0 LOC = M12;NET Second0 LOC = M5;NET CP LOC = B8;NET nCR LOC = L3;NET EN LOC = P11;NET Adj_Hour LOC = B4;N
19、ET 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