module digitalclk(
input clk,//時鐘
input reset,//復位
input set_m,//分鐘調時
input set_h,//時鐘較時
output reg [3:0]hour_g=0,//時鐘數的個位
output reg [3:0]hour_s=0,//時鐘數的十位
output reg[3:0]minute_g,//分數的個位
output reg[3:0]minute_s,//分數的十位
output reg [3:0]second_g,//秒個位
output reg [3:0]second_s,//秒十位
output reg[6:0]ds_reg,//接數碼管
output reg[3:0]ds_en, //數碼管選擇
output reg DS_DP
);
reg [31:0]cnt;
//聲明常量
parameter [6:0]NUM_0=7'b0111111;
parameter [6:0]NUM_1=7'b0000110;
parameter [6:0]NUM_2=7'b1011011;
parameter [6:0]NUM_3=7'b1001111;
parameter [6:0]NUM_4=7'b1100110;
parameter [6:0]NUM_5=7'b1101101;
parameter [6:0]NUM_6=7'b1111101;
parameter [6:0]NUM_7=7'b0000111;
parameter [6:0]NUM_8=7'b1111111;
parameter [6:0]NUM_9=7'b1101111;
parameter [6:0]NUM_BLK=7'b0000000;
parameter [3:0]EN_1=4'b1110;
parameter [3:0]EN_2=4'b1101;
parameter [3:0]EN_3=4'b1011;
parameter [3:0]EN_4=4'b0111;
parameter [3:0]EN_A=4'b0000;
always@(posedge clk or negedge reset)
begin
if(reset==0)//清零
begin
hour_g<=0;
hour_s<=0;
minute_g<=0;
minute_s<=0;
second_g<=0;
second_s<=0;
end
else
begin
if(cnt==50000000)//時間達到一秒-50000000*20ns(默認時鐘爲50Hz,週期爲20ns)
begin
cnt<=0;
if(set_m==0)//設置分鐘
begin
if(minute_g==9)
begin
minute_g<=0;
if(minute_s==5)
minute_s<=0;
else
minute_s<=minute_s+1;
end
else
minute_g<=minute_g+1;
end
if(set_h==0)//設置小時
begin
if(hour_g==9)
begin //
hour_g<=0;
hour_s<=hour_s+1;
end//
else
begin
if(hour_g==3 && hour_s==2)
begin
hour_g<=0;hour_s<=0;
end
else
hour_g<=hour_g+1;
end
end
if(second_g==9)//05
begin
second_g<=0;
if(second_s==5)//04
begin
second_s<=0;
if(minute_g==9)//03
begin
minute_g<=0;
if(minute_s==5)//02
begin
minute_s<=0;
if(hour_g==3&&hour_s==2)
begin
hour_g<=0;
hour_s<=0;
end
else
begin
if(hour_g==9)//01
begin hour_g<=0;hour_s<=hour_s+1;end//00
else
hour_g<=hour_g+1;//01
end
end
else
minute_s<=minute_s+1;//02
end
else
minute_g<=minute_g+1;//03
end
else
second_s<=second_s+1;//04
end
else
begin second_g<=second_g+1;DS_DP<=1;end//05
end
else
begin cnt<=cnt+1;DS_DP<=0;end;
end
end
//數碼管動態顯示(時:分)
always @(*)
begin
if(cnt[16:15] == 2'b00)//選任意幾位其實都可以,關鍵是弄清楚掃描頻率:當掃描頻率大於25Hz,肉眼將看不出變化
case (hour_s)
4'h0 : begin ds_reg = NUM_0; ds_en=EN_1;end
4'h1 : begin ds_reg = NUM_1; ds_en=EN_1;end
4'h2 : begin ds_reg = NUM_2; ds_en=EN_1;end
4'h3 : begin ds_reg = NUM_3; ds_en=EN_1;end
4'h4 : begin ds_reg = NUM_4; ds_en=EN_1;end
4'h5 : begin ds_reg = NUM_5; ds_en=EN_1;end
4'h6 : begin ds_reg = NUM_6; ds_en=EN_1;end
4'h7 : begin ds_reg = NUM_7; ds_en=EN_1;end
4'h8 : begin ds_reg = NUM_8; ds_en=EN_1;end
4'h9 : begin ds_reg = NUM_9; ds_en=EN_1;end
default: begin ds_reg = NUM_BLK; ds_en=EN_1;end
endcase
if(cnt[16:15] == 2'b01)
case (hour_g)
4'h0 : begin ds_reg = NUM_0; ds_en=EN_2;end
4'h1 : begin ds_reg = NUM_1; ds_en=EN_2;end
4'h2 : begin ds_reg = NUM_2; ds_en=EN_2;end
4'h3 : begin ds_reg = NUM_3; ds_en=EN_2;end
4'h4 : begin ds_reg = NUM_4; ds_en=EN_2;end
4'h5 : begin ds_reg = NUM_5; ds_en=EN_2;end
4'h6 : begin ds_reg = NUM_6; ds_en=EN_2;end
4'h7 : begin ds_reg = NUM_7; ds_en=EN_2;end
4'h8 : begin ds_reg = NUM_8; ds_en=EN_2;end
4'h9 : begin ds_reg = NUM_9; ds_en=EN_2;end
default: begin ds_reg = NUM_BLK; ds_en=EN_2;end
endcase
if(cnt[16:15] == 2'b10)
case (minute_s)
4'h0 : begin ds_reg = NUM_0; ds_en=EN_3;end
4'h1 : begin ds_reg = NUM_1; ds_en=EN_3;end
4'h2 : begin ds_reg = NUM_2; ds_en=EN_3;end
4'h3 : begin ds_reg = NUM_3; ds_en=EN_3;end
4'h4 : begin ds_reg = NUM_4; ds_en=EN_3;end
4'h5 : begin ds_reg = NUM_5; ds_en=EN_3;end
4'h6 : begin ds_reg = NUM_6; ds_en=EN_3;end
4'h7 : begin ds_reg = NUM_7; ds_en=EN_3;end
4'h8 : begin ds_reg = NUM_8; ds_en=EN_3;end
4'h9 : begin ds_reg = NUM_9; ds_en=EN_3;end
default: begin ds_reg = NUM_BLK; ds_en=EN_3;end
endcase
if(cnt[16:15] == 2'b11)
case (minute_g)
4'h0 : begin ds_reg = NUM_0; ds_en=EN_4;end
4'h1 : begin ds_reg = NUM_1; ds_en=EN_4;end
4'h2 : begin ds_reg = NUM_2; ds_en=EN_4;end
4'h3 : begin ds_reg = NUM_3; ds_en=EN_4;end
4'h4 : begin ds_reg = NUM_4; ds_en=EN_4;end
4'h5 : begin ds_reg = NUM_5; ds_en=EN_4;end
4'h6 : begin ds_reg = NUM_6; ds_en=EN_4;end
4'h7 : begin ds_reg = NUM_7; ds_en=EN_4;end
4'h8 : begin ds_reg = NUM_8; ds_en=EN_4;end
4'h9 : begin ds_reg = NUM_9; ds_en=EN_4;end
default: begin ds_reg = NUM_BLK; ds_en=EN_4;end
endcase
end
endmodule
/*.ucf文件*/
NET "clk" LOC = P56;
#KEY
#NET "KEY2" LOC = P21;
NET "set_m" LOC = P17;
NET "set_h" LOC = P16;
NET "reset" LOC = P15;
#
#DIGITAL CUBE
NET "DS_DP" LOC =P85;
NET "ds_reg[6]" LOC = P84;
NET "ds_reg[2]" LOC = P83;
NET "ds_reg[3]" LOC = P82;
NET "ds_reg[4]" LOC = P81;
NET "ds_reg[0]" LOC = P80;
NET "ds_reg[1]" LOC = P79;
NET "ds_reg[5]" LOC = P78;
NET "ds_en[0]" LOC = P66;
NET "ds_en[1]" LOC = P74;
NET "ds_en[2]" LOC = P67;
NET "ds_en[3]" LOC = P75;
#