1、0西安交通大学数字电子技术实验报告数字钟设计姓名:*学院:*学院班级:*22学号:212*51一、 实验名称基于 Verilog HDL 设计的多功能数字钟二、 试验任务及要求实验要求以 Verilog HDL 语言为手段,设计多功能数字钟。多功能数字钟应该具有的功能有:显示时分秒、整点报时、小时和分钟可调等基本功能。整个钟表的工作应该是在 1Hz 信号的作用下进行,这样每来一个时钟信号,秒增加 1 秒,当秒从 59 秒跳转到 00 秒时,分钟增加 1 分,同时当分钟从 59 分跳转到 00 分时,小时增加 1 小时,小时的范围为 023 时。在实验中为了显示与编写方便,该设计采用一个位 24
2、 位二进制码23:0cnt 记录时间,每四位记录一个数,从高到低分别为时针十位、时针个位、分针十位、分针个位、秒针十位、秒针个位。 实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是 1Hz 时钟信号,但是扫描需要一个比较高频率的信号,因此为了得到准确的 1Hz 信号,必须对输入的系统时钟 50Mhz 进行分频。关于调整时间功能,该设计采用四个按钮调整对应位的数值,从而调整时间。三、 实验条件该实验以 Verilog HDL 语言为手段,以 Xilinx ISE Design Suite 13.4_1软件实现源程序的综合与仿真,并用 BASYS2 开发板作为目标器件。四、 设计过程1.
3、列写多功能数字钟设计-层次结构图2.拟定数字钟的组成框图,在 Xilinx ISE Design Suite 13.4_1 软件中,使用 Verilog 语言输入,采用分层次分模块的方法设计电路;3.设计各单元电路并进行仿真;4.对数字钟的整体逻辑电路图,选择器件,分配引脚,进行逻辑综合;5.下载到 Basys2 实验平台上,实际测试数字钟的逻辑功能。2五、 Verilog 代码module clock(input clk,input en,input key1,input key2,input key3,input key4,output sec,output wire7:0 seg,out
4、put wire3:0 digit);wire3:0 num0,mum1,num2,num3;disp u0(clk,num0,mum1,num2,num3,seg,digit);clk_gen u1(clk,en,key1,key2,key3,key4,sec,num0,mum1,num2,num3);endmodule/module disp(input clk,input 3:0 num0,input 3:0 num1,input 3:0 num2,input 3:0 num3,output reg7:0 sm_seg,output reg3:0 an);reg1:0 s;reg3:0
5、digit;reg16:0 clkdiv;always(*)beginan=4b1111;s=clkdiv16:15;ans=0;case(s)0:digit=num0;1:digit=num1;2:digit=num2;3:digit=num3;default:digit=num0;3endcasecase(digit)4h0 : sm_seg = 8hc0; / “0“4h1 : sm_seg = 8hf9; / “1“4h2 : sm_seg = 8ha4; / “2“4h3 : sm_seg = 8hb0; / “3“4h4 : sm_seg = 8h99; / “4“4h5 : sm
6、_seg = 8h92; / “5“4h6 : sm_seg = 8h82; / “6“4h7 : sm_seg = 8hf8; / “7“4h8 : sm_seg = 8h80; / “8“4h9 : sm_seg = 8h90; / “9“default : sm_seg = 8hff; / “x“endcaseendalways(posedge clk)clkdiv=clkdiv+17d1;Endmodule/module clk_gen(input clk,input en,input bt0,input bt1,input bt2,input bt3,output reg sec,o
7、utput 3:0 num0,output 3:0 num1,output 3:0 num2,output 3:0 num3);reg25:0 ctr;reg3:0 mytime3:0;reg7:0 s;assign num0=mytime0;assign num1=mytime1;assign num2=mytime2;assign num3=mytime3;always(posedge clk)4beginctr=ctr+26d1;if(ctr=25000000-1)beginctr=0;sec=sec;endend/wire sen;/assign sen=(sec)|(bt0)|(bt
8、1)|(bt2)|(bt3);always(negedge sec)if(!en)beginif(bt0)beginmytime0=mytime0+4d1;if(mytime0=9) mytime0=0;endelse if(bt1)beginmytime1=mytime1+4d1;if(mytime1=5) mytime1=0;endelse if(bt2)beginmytime2=mytime2+4d1;if(mytime2=9) mytime2=0;endelse if(bt3)beginmytime3=mytime3+4d1;if(mytime3=2) mytime3=0;endend
9、elsebegins=s+1;if(s=59)5begins=0;mytime0=mytime0+4d1;if(mytime0=9)beginmytime0=0;mytime1=mytime1+4d1;if(mytime1=5)beginmytime1=0;mytime2=mytime2+4d1;if(mytime3=2 mytime3=0; endif(mytime2=9)beginmytime2=0;mytime3=mytime3+4d1;endendendendendEndmodule约束文件NET “clk“ LOC = “B8“; NET“seg0“ LOC=“L14“;NET“se
10、g1“ LOC=“H12“;NET“seg2“ LOC=“N14“;NET“seg3“ LOC=“N11“;NET“seg4“ LOC=“P12“;NET“seg5“ LOC=“L13“;NET“seg6“ LOC=“M12“;NET“seg7“ LOC=“N13“;NET “digit0“ LOC = “F12“; NET “digit1“ LOC = “J12“; NET “digit2“ LOC = “M13“; 6NET “digit3“ LOC = “K14“;NET “key4“ LOC = “A7“; # Bank = 2, Signal name = BTN3NET “key3
11、“ LOC = “M4“; # Bank = 2, Signal name = BTN2NET “key2“ LOC = “C11“; # Bank = 2, Signal name = BTN1NET “key1“ LOC = “G12“; # Bank = 2, Signal name = BTN0NET “en“ LOC = “P11“; # Bank = 2, Signal name = sw0NET “sec“LOC=“M5“;测试代码module clock(input clk,input en,input key1,input key2,input key3,input key4
12、,output sec,output wire7:0 seg,output wire3:0 digit);wire3:0 num0,mum1,num2,num3;disp u0(clk,num0,mum1,num2,num3,seg,digit);clk_gen u1(clk,en,key1,key2,key3,key4,sec,num0,mum1,num2,num3);endmodule/module disp(input clk,input 3:0 num0,input 3:0 num1,input 3:0 num2,input 3:0 num3,output reg7:0 sm_seg,
13、output reg3:0 an);reg1:0 s;reg3:0 digit;reg16:0 clkdiv;always(*)begin7an=4b1111;s=clkdiv16:15;ans=0;case(s)0:digit=num0;1:digit=num1;2:digit=num2;3:digit=num3;default:digit=num0;endcasecase(digit)4h0 : sm_seg = 8hc0; / “0“4h1 : sm_seg = 8hf9; / “1“4h2 : sm_seg = 8ha4; / “2“4h3 : sm_seg = 8hb0; / “3“
14、4h4 : sm_seg = 8h99; / “4“4h5 : sm_seg = 8h92; / “5“4h6 : sm_seg = 8h82; / “6“4h7 : sm_seg = 8hf8; / “7“4h8 : sm_seg = 8h80; / “8“4h9 : sm_seg = 8h90; / “9“default : sm_seg = 8hff; / “x“endcaseendalways(posedge clk)clkdiv=clkdiv+17d1;Endmodule/module clk_gen(input clk,input en,input bt0,input bt1,in
15、put bt2,input bt3,output reg sec,output 3:0 num0,output 3:0 num1,output 3:0 num2,output 3:0 num3);8reg25:0 ctr;reg3:0 mytime3:0;reg7:0 s;assign num0=mytime0;assign num1=mytime1;assign num2=mytime2;assign num3=mytime3;always(posedge clk)beginctr=ctr+26d1;if(ctr=25000000-1)beginctr=0;sec=sec;endend/wi
16、re sen;/assign sen=(sec)|(bt0)|(bt1)|(bt2)|(bt3);always(negedge sec)if(!en)beginif(bt0)beginmytime0=mytime0+4d1;if(mytime0=9) mytime0=0;endelse if(bt1)beginmytime1=mytime1+4d1;if(mytime1=5) mytime1=0;endelse if(bt2)beginmytime2=mytime2+4d1;if(mytime2=9) mytime2=0;endelse if(bt3)beginmytime3=mytime3+
17、4d1;if(mytime3=2) mytime3=0;9endendelsebegins=s+1;if(s=59)begins=0;mytime0=mytime0+4d1;if(mytime0=9)beginmytime0=0;mytime1=mytime1+4d1;if(mytime1=5)beginmytime1=0;mytime2=mytime2+4d1;if(mytime3=2 mytime3=0; endif(mytime2=9)beginmytime2=0;mytime3=mytime3+4d1;endendendendendendmodule六、 实验总结:将程序下载到 BASYS2 板子上后,能够实现简易数字钟的功能,可以看到 LED 灯闪一下,4 个数码管实现了数字钟小时和分钟的显示,而且通过开关控制可以将六位二进制数赋值给小时或分钟位,实现校表的功能。本次多功能数字钟设计实验,从刚开始对 Verilog 语言非常陌生,到最后接近熟练地掌握 Verilog 语言的程度,期间花费不少时间和精力,同时也收获了很多,学会了使用 Verilog语言编程仿真电路实验,熟悉了 Verilog 语言中的模块化设计方法,对于设计一个简单的数字系统有了初步的了解。