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

西安交通大学实验报告数字钟设计

西安交通大学实验报告
数字钟设计
一、设计内容与要求
1、在basys2开发板上运行有关程序。

2、设计一个完整的数字钟,小时和分钟用数码管显示,秒用发光二极管闪烁显示,每秒闪烁一次。

3、增加清零和校时功能。

二、总体设计思路
1、采用421BCD计数,并在一个模块中实现时钟功能的Verilog程序。

2、由主时钟(50MHZ)分频得到秒信号,记秒到60时分加1,秒清零,几时到60时,时加1,分清零,记时到24时,时清零。

3、由四个数码管显示小时和分钟,LED M5作为秒信号显示。

4、通过数码管下方对应的两个的两个开关进行校时,按下时对应分或时加一。

5、通过开关P11实现清零,高电平时时钟清零。

三、源代码
module Clock(
input wire clk,
input wire clr,
input wire set1,
input wire set2,
output Second_Flash,
output reg [6:0] a_to_g,
output reg [3:0] an
);
//中间变量定义
//reg [3:0] LED0_num,LED1_num,LED2_num,LED3_num;
reg [1:0] s;
reg [3:0] digit;
reg [16:0] clkdiv; //(1FFFF)*20ns=2.6ms
reg [26:0] q1; //设一足够长的计数器
reg sec;
reg [3:0] Second_L;
reg [3:0] Second_H;
reg [3:0] Minute_L;
reg [3:0] Minute_H;
reg [3:0] Hour_L;
reg [2:0] Hour_H;
//动态数码管扫描显示
always @ ( * )
begin
an = 4'b1111; //禁止所有数码管显示
s <= clkdiv[16:15]; //间隔2.6ms使能An
an[s] = 0; //根据s使能数码管其中之一
case (s) //根据s取对应的数码管上要显示的数据
0: digit <= Hour_H[2:0];
1: digit <= Hour_L[3:0];
2: digit <= Minute_H[3:0];
3: digit <= Minute_L[3:0];
default: digit <= Hour_H[2:0];
endcase
case (digit) // 7段译码表
0: a_to_g = 7'b0000001;
1: a_to_g = 7'b1001111;
2: a_to_g = 7'b0010010;
3: a_to_g = 7'b0000110;
4: a_to_g = 7'b1001100;
5: a_to_g = 7'b0100100;
6: a_to_g = 7'b0100000;
7: a_to_g = 7'b0001111;
8: a_to_g = 7'b0000000;
9: a_to_g = 7'b0000100;
'hA: a_to_g = 7'b0001000;
'hB: a_to_g = 7'b1100000;
'hC: a_to_g = 7'b0110001;
'hD: a_to_g = 7'b1000010;
'hE: a_to_g = 7'b0110000;
'hF: a_to_g = 7'b0111000;
default: a_to_g = 7'b0000001; // 0
endcase
end
// 主时钟计数: 50MHz的时钟,周期为20ns,计数到1ffffh时的时长2621420ns,约2.6ms
always @ (posedge clk)
begin
clkdiv <= clkdiv + 1;
end
// 时钟程序:计数到50000000为1s,计秒得分always @ (posedge clk or posedge clr )
begin
if (clr )
q1 <= 0;
else if (Second_L>=10)
begin
Second_L<=0;
Second_H<=Second_H+1;
end
else if(Second_H>=6)
begin
Second_L<=0;
Second_H<=0;
Minute_L<=Minute_L+1;
end
else if (Minute_L>=10)
begin
Minute_L<=0;
Minute_H<=Minute_H+1;
end
else if(Minute_H>=6)
begin
Minute_L<=0;
Minute_H<=0;
Hour_L<=Hour_L+1; end
else if(Hour_L>=10)
begin
Hour_L<=0;
Hour_H<=Hour_H+1;
end
else if(Hour_L>=4&&Hour_H>=2)
begin
Hour_L<=0;
Hour_H<=0;
end
else if(set1&&q1==10000000)
begin
q1<=0;
Hour_L<=Hour_L+1;
end
else if(set2&&q1==10000000)。

相关主题