西安交大数电数字钟实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交通大学数字电子技术实验报告
数字钟设计
姓名:**
学院:**学院
班级:**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 1
3.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@(*)
begin
an=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;
endcase
case(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"
endcase
end
always@(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)
begin
ctr<=ctr+26'd1;
if(ctr==25000000-1)
begin
ctr<=0;
sec<=~sec;
end
end
//wire sen;
//assign sen=(sec)|(bt0)|(bt1)|(bt2)|(bt3);
always@(negedge sec)
if(!en)
begin
if(bt0)
begin
mytime[0]<=mytime[0]+4'd1;
if(mytime[0]==9) mytime[0]<=0;