当前位置:文档之家› 西安交大数电数字钟实验报告

西安交大数电数字钟实验报告

交通大学数字电子技术实验报告数字钟设计姓名:**学院:**学院班级:**22学号:212******5一、实验名称基于Verilog HDL设计的多功能数字钟二、试验任务及要求实验要求以Verilog HDL语言为手段,设计多功能数字钟。

多功能数字钟应该具有的功能有:显示时—分—秒、整点报时、小时和分钟可调等基本功能。

整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的围为0~23时。

在实验中为了显示与编写方便,该设计采用一个位24位二进制码[23:0]cnt 记录时间,每四位记录一个数,从高到低分别为时针十位、时针个位、分针十位、分针个位、秒针十位、秒针个位。

实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz时钟信号,但是扫描需要一个比较高频率的信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟50Mhz进行分频。

关于调整时间功能,该设计采用四个按钮调整对应位的数值,从而调整时间。

三、实验条件该实验以Verilog HDL语言为手段,以Xilinx ISE Design Suite 13.4_1软件实现源程序的综合与仿真,并用BASYS2开发板作为目标器件。

四、设计过程1.列写多功能数字钟设计--层次结构图2.拟定数字钟的组成框图,在Xilinx ISE Design Suite 13.4_1软件中,使用Verilog语言输入,采用分层次分模块的方法设计电路;3.设计各单元电路并进行仿真;4.对数字钟的整体逻辑电路图,选择器件,分配引脚,进行逻辑综合;5.下载到Basys2实验平台上,实际测试数字钟的逻辑功能。

五、Verilog代码module clock(input clk,input en,input key1,input key2,input key3,input key4,output sec,output wire[7:0] seg,output wire[3:0] digit);wire[3: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 reg[7:0] sm_seg,output reg[3:0] an);reg[1:0] s;reg[3:0] digit;reg[16:0] clkdiv;always@(*)beginan=4'b1111;s<=clkdiv[16:15];an[s]=0;case(s)0:digit<=num0;1:digit<=num1;2:digit<=num2;3:digit<=num3;default:digit<=num0;endcasecase(digit)4'h0 : sm_seg = 8'hc0; // "0"4'h1 : sm_seg = 8'hf9; // "1"4'h2 : sm_seg = 8'ha4; // "2"4'h3 : sm_seg = 8'hb0; // "3"4'h4 : sm_seg = 8'h99; // "4"4'h5 : sm_seg = 8'h92; // "5"4'h6 : sm_seg = 8'h82; // "6"4'h7 : sm_seg = 8'hf8; // "7"4'h8 : sm_seg = 8'h80; // "8"4'h9 : sm_seg = 8'h90; // "9"default : sm_seg = 8'hff; // "x"endcaseendalways@(posedge clk)clkdiv<=clkdiv+17'd1;Endmodule/////////////////////////////////////////// module clk_gen(input clk,input en,input bt0,input bt1,input bt2,input bt3,output reg sec,output [3:0] num0,output [3:0] num1,output [3:0] num2,output [3:0] num3);reg[25:0] ctr;reg[3:0] mytime[3:0];reg[7:0] s;assign num0=mytime[0];assign num1=mytime[1];assign num2=mytime[2];assign num3=mytime[3];always@(posedge clk)beginctr<=ctr+26'd1;if(ctr==25000000-1)beginctr<=0;sec<=~sec;endend//wire sen;//assign sen=(sec)|(bt0)|(bt1)|(bt2)|(bt3);always@(negedge sec)if(!en)beginif(bt0)beginmytime[0]<=mytime[0]+4'd1;if(mytime[0]==9) mytime[0]<=0;endelse if(bt1)beginmytime[1]<=mytime[1]+4'd1;if(mytime[1]==5) mytime[1]<=0;endelse if(bt2)beginmytime[2]<=mytime[2]+4'd1;if(mytime[2]==9) mytime[2]<=0;endelse if(bt3)beginmytime[3]<=mytime[3]+4'd1;if(mytime[3]==2) mytime[3]<=0;endendelsebegins<=s+1;if(s==59)begins<=0;mytime[0]<=mytime[0]+4'd1;if(mytime[0]==9)beginmytime[0]<=0;mytime[1]<=mytime[1]+4'd1;if(mytime[1]==5)beginmytime[1]<=0;mytime[2]<=mytime[2]+4'd1;if(mytime[3]==2 && mytime[2]==3)beginmytime[2]<=0;mytime[3]<=0;endif(mytime[2]==9)beginmytime[2]<=0;mytime[3]<=mytime[3]+4'd1;endendendendendEndmodule约束文件NET "clk" LOC = "B8";NET"seg[0]" LOC="L14";NET"seg[1]" LOC="H12";NET"seg[2]" LOC="N14";NET"seg[3]" LOC="N11";NET"seg[4]" LOC="P12";NET"seg[5]" LOC="L13";NET"seg[6]" LOC="M12";NET"seg[7]" LOC="N13";NET "digit[0]" LOC = "F12";NET "digit[1]" LOC = "J12";NET "digit[2]" LOC = "M13";NET "digit[3]" LOC = "K14";NET "key4" LOC = "A7"; # Bank = 2, Signal name = BTN3 NET "key3" LOC = "M4"; # Bank = 2, Signal name = BTN2 NET "key2" LOC = "C11"; # Bank = 2, Signal name = BTN1 NET "key1" LOC = "G12"; # Bank = 2, Signal name = BTN0 NET "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,output sec,output wire[7:0] seg,output wire[3:0] digit);wire[3: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 reg[7:0] sm_seg,output reg[3:0] an);reg[1:0] s;reg[3:0] digit;reg[16:0] clkdiv;always@(*)beginan=4'b1111;s<=clkdiv[16:15];an[s]=0;case(s)0:digit<=num0;1:digit<=num1;2:digit<=num2;3:digit<=num3;default:digit<=num0;endcasecase(digit)4'h0 : sm_seg = 8'hc0; // "0"4'h1 : sm_seg = 8'hf9; // "1"4'h2 : sm_seg = 8'ha4; // "2"4'h3 : sm_seg = 8'hb0; // "3"4'h4 : sm_seg = 8'h99; // "4"4'h5 : sm_seg = 8'h92; // "5"4'h6 : sm_seg = 8'h82; // "6"4'h7 : sm_seg = 8'hf8; // "7"4'h8 : sm_seg = 8'h80; // "8"4'h9 : sm_seg = 8'h90; // "9"default : sm_seg = 8'hff; // "x"endcaseendalways@(posedge clk)clkdiv<=clkdiv+17'd1;Endmodule/////////////////////////////////////////// module clk_gen(input clk,input en,input bt0,input bt1,input bt2,input bt3,output reg sec,output [3:0] num0,output [3:0] num1,output [3:0] num2,output [3:0] num3);reg[25:0] ctr;reg[3:0] mytime[3:0];reg[7:0] s;assign num0=mytime[0];assign num1=mytime[1];assign num2=mytime[2];assign num3=mytime[3];always@(posedge clk)beginctr<=ctr+26'd1;if(ctr==25000000-1)beginctr<=0;sec<=~sec;endend//wire sen;//assign sen=(sec)|(bt0)|(bt1)|(bt2)|(bt3);always@(negedge sec)if(!en)beginif(bt0)beginmytime[0]<=mytime[0]+4'd1;if(mytime[0]==9) mytime[0]<=0;endelse if(bt1)beginmytime[1]<=mytime[1]+4'd1;if(mytime[1]==5) mytime[1]<=0;endelse if(bt2)beginmytime[2]<=mytime[2]+4'd1;if(mytime[2]==9) mytime[2]<=0;endelse if(bt3)beginmytime[3]<=mytime[3]+4'd1;if(mytime[3]==2) mytime[3]<=0;endendelsebegins<=s+1;if(s==59)begins<=0;mytime[0]<=mytime[0]+4'd1;if(mytime[0]==9)beginmytime[0]<=0;mytime[1]<=mytime[1]+4'd1;if(mytime[1]==5)beginmytime[1]<=0;mytime[2]<=mytime[2]+4'd1;if(mytime[3]==2 && mytime[2]==3).beginmytime[2]<=0;mytime[3]<=0;endif(mytime[2]==9)beginmytime[2]<=0;mytime[3]<=mytime[3]+4'd1;endendendendendendmodule六、实验总结:将程序下载到BASYS2板子上后,能够实现简易数字钟的功能,可以看到LED灯1s闪一下,4个数码管实现了数字钟小时和分钟的显示,而且通过开关控制可以将六位二进制数赋值给小时或分钟位,实现校表的功能。

相关主题