www.pudn.com > eternityclock.rar > clockcore.v
`timescale 1ns / 100ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 21:16:45 07/21/2007
// Design Name:
// Module Name: clockcore
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module clockcore(clk, b1, b2, b3, b4, P, N);
input clk;
input b1;
input b2;
input b3;
input b4;
output [3:0] P;
output [7:0] N;
//reg[3:0] P;
reg[3:0] ptmp;
reg[3:0] pmask;
reg[7:0] N;
reg[10:0] scan;
reg[3:0] month[1:0],day[1:0],hour[1:0],min[1:0],sec[1:0];
reg sclk, mclk, hclk, dayc, monc,year1c,year2c,year3c,year4c;
reg[25:0] divcounter;
reg[3:0] year[3:0];
reg[1:0] screen;
reg[2:0] state;
reg enable;//enable signal for clock;
reg sven,mven,hven,dven,monthven,y1ven,y2ven,y3ven,y4ven;//enable varying of counters
reg[3:0] daynummsb,daynumlsb;
reg[3:0] dispdata;
reg dot;
// wire sv,mv,hv,dv,monthv,y1v,y2v,y3v,y4v;
wire bigmonth,feb;
wire leapyear;// remark for leap year;
wire[3:0] yearten;//ten digit of year;
wire[3:0] yearls;
wire[3:0] monthmsb,monthlsb;
wire sclkbuf,mclkbuf,hclkbuf,daycbuf,moncbuf,y1buf,y2buf,y3buf,y4buf;
// parameter SEC = 26'h00000ff;
parameter SEC = 26'h27fffff;
parameter d0 = 8'b10001000,
d1 = 8'b11011011,
d2 = 8'b10100010,
d3 = 8'b10010010,
d4 = 8'b11010001,
d5 = 8'b10010100,
d6 = 8'b10000100,
d7 = 8'b11011010,
d8 = 8'b10000000,
d9 = 8'b10010000,
dp = 8'b01111111,
dnone = 8'b00001111;
always @( dispdata or dot) begin
case(dispdata)
4'b0000: N = d0 & {dot,7'b1111111};
4'b0001: N = d1 & {dot,7'b1111111};
4'b0010: N = d2 & {dot,7'b1111111};
4'b0011: N = d3 & {dot,7'b1111111};
4'b0100: N = d4 & {dot,7'b1111111};
4'b0101: N = d5 & {dot,7'b1111111};
4'b0110: N = d6 & {dot,7'b1111111};
4'b0111: N = d7 & {dot,7'b1111111};
4'b1000: N = d8 & {dot,7'b1111111};
4'b1001: N = d9 & {dot,7'b1111111};
4'b1010,4'b1011,4'b1100,4'b1101,4'b1110,4'b1111: N = dnone;
endcase
end
assign yearten = year[1];
assign yearls = year[0];
assign leapyear = ~((yearten[0]^yearls[1])|yearls[0]);
//code for display:
always @(posedge clk or negedge b1) begin
if( b1 == 0) scan <= 0;
else scan <= scan+1;
end
always @(screen or scan[10:9] or year[3] or year[2] or year[1] or year[0] or
month[1] or month[0] or day[1] or day[0] or hour[1] or hour[0]
or min[1] or min[0] or sec[1] or sec[0]) begin
case({screen, scan[10:9]})
4'b1100: begin dispdata = year[3]; dot = 1; end
4'b1101: begin dispdata = year[2]; dot = 1 ;end
4'b1110: begin dispdata = year[1]; dot = 1 ;end
4'b1111: begin dispdata = year[0]; dot = 1; end
4'b1000: begin dispdata = month[1]; dot = 1; end
4'b1001: begin dispdata = month[0]; dot = 0; end
4'b1010: begin dispdata = day[1]; dot = 1 ; end
4'b1011: begin dispdata = day[0]; dot = 1 ;end
4'b0100: begin dispdata = hour[1]; dot = 1 ;end
4'b0101: begin dispdata = hour[0]; dot = 0; end
4'b0110: begin dispdata = min[1]; dot = 1; end
4'b0111: begin dispdata = min[0]; dot = 1; end
4'b0000: begin dispdata = min[1]; dot = 1; end
4'b0001: begin dispdata = min[0]; dot = 0; end
4'b0010: begin dispdata = sec[1]; dot = 1; end
4'b0011: begin dispdata = sec[0]; dot = 1; end
default: begin dispdata = 4'b0000; dot = 1; end
endcase
end
/* always @(scan[10:9] or min[1] or min[0] or sec[1] or sec[0]) begin
case(scan[10:9])
2'b00: dispdata = min[1];
2'b01: dispdata = min[0];
2'b10: dispdata = sec[1];
2'b11: dispdata = sec[0];
endcase
end*/
always @(scan[10:9]) begin
case(scan[10:9])
2'b11: ptmp = 4'b1000;
2'b10: ptmp = 4'b0100;
2'b01: ptmp = 4'b0010;
2'b00: ptmp = 4'b0001;
endcase
end
//code for state machine:
always @(negedge b4 or negedge b1)
begin
if(b1 == 0) screen <= 2'b00;
else begin
case(screen)
2'b00: screen<=2'b01;
2'b01: screen<=2'b10;
2'b10: screen<=2'b11;
2'b11: screen<=2'b00;
default: screen<=2'b00;
endcase
end
end
always @(negedge b3 or negedge b1) begin
if(b1 == 0) state <= 3'b000;
else begin
case(state)
3'b000: state<=3'b100;
3'b100: state<=3'b101;
3'b101: begin if( screen == 2'b11) state<=3'b110; else state<=3'b000; end
3'b110: state<=3'b111;
3'b111: state<=3'b000;
default: state<=3'b000;
endcase
end
end
always @(state) begin
if(state[2]==0) begin
enable = 1;
sven = 0; mven = 0; hven = 0; dven = 0; monthven = 0; y1ven=0; y2ven=0; y3ven=0; y4ven=0;
end
else begin
enable = 0;
case({screen,state[1:0]})
4'b0100:
begin
sven = 1; mven = 1; hven = 0; dven = 1; monthven = 1; y1ven=1; y2ven=1; y3ven=1; y4ven=1;
end
4'b0101:
begin
sven = 1; mven = 0; hven = 1; dven = 1; monthven = 1; y1ven=1; y2ven=1; y3ven=1; y4ven=1;
end
4'b0000:
begin
sven = 1; mven = 0; hven = 1; dven = 1; monthven = 1; y1ven=1; y2ven=1; y3ven=1; y4ven=1;
end
4'b0001:
begin
sven = 0; mven = 1; hven = 1; dven = 1; monthven = 1; y1ven=1; y2ven=1; y3ven=1; y4ven=1;
end
4'b1000:
begin
sven = 1; mven = 1; hven = 1; dven = 1; monthven = 0; y1ven=1; y2ven=1; y3ven=1; y4ven=1;
end
4'b1001:
begin
sven = 1; mven = 1; hven = 1; dven = 0; monthven = 1; y1ven=1; y2ven=1; y3ven=1; y4ven=1;
end
4'b1100:
begin
sven = 1; mven = 1; hven = 1; dven = 1; monthven = 1; y1ven=1; y2ven=1; y3ven=1; y4ven=0;
end
4'b1101:
begin
sven = 1; mven = 1; hven = 1; dven = 1; monthven = 1; y1ven=1; y2ven=1; y3ven=0; y4ven=1;
end
4'b1110:
begin
sven = 1; mven = 1; hven = 1; dven = 1; monthven = 1; y1ven=1; y2ven=0; y3ven=1; y4ven=1;
end
4'b1111:
begin
sven = 1; mven = 1; hven = 1; dven = 1; monthven = 1; y1ven=0; y2ven=1; y3ven=1; y4ven=1;
end
default:
begin
sven = 1; mven = 1; hven = 1; dven = 1; monthven = 1; y1ven=1; y2ven=1; y3ven=1; y4ven=1;
end
endcase
end
end
always @(screen or state) begin
if(state[2] == 0) pmask = 4'b1111;
else if(screen == 2'b11) begin
case(state[1:0])
2'b00: pmask = 4'b0001;
2'b01: pmask = 4'b0010;
2'b10: pmask = 4'b0100;
2'b11: pmask = 4'b1000;
endcase
end
else begin
case(state[1:0])
2'b00: pmask = 4'b0011;
2'b01: pmask = 4'b1100;
default: pmask = 4'b0000;
endcase
end
end
assign P = ptmp & pmask;
//code for verdict the month:
assign monthmsb = month[1];
assign monthlsb = month[0];
assign bigmonth = monthmsb[0]^monthlsb[3]^monthlsb[0];
assign feb = ~monthlsb[3]&~monthlsb[2]&monthlsb[1]&~monthlsb[0]& ~bigmonth;
always @(leapyear or bigmonth or feb) begin
if(feb == 1 && leapyear == 0)begin daynummsb = 4'd2; daynumlsb = 4'd8; end
else if(feb == 1 && leapyear == 1)begin daynummsb = 4'd2;daynumlsb = 4'd9;end
else if(bigmonth == 1)begin daynummsb = 4'd3;daynumlsb = 4'd1;end
else begin daynummsb = 4'd3;daynumlsb = 4'd0;end
end
//code for counters:
assign sclkbuf = sclk|~b2;//to enable signals, 1 for clk and 0 for b2
assign mclkbuf = mclk|~b2;
assign hclkbuf = hclk|~b2;
assign daycbuf = dayc|~b2;
assign moncbuf = monc|~b2;
assign y1buf = year1c|~b2;
assign y2buf = year2c|~b2;
assign y3buf = year3c|~b2;
assign y4buf = year4c|~b2;
//code for frequency dividing:
always @(posedge clk or negedge b1) begin
if(b1 == 0)begin divcounter<=0; sclk<=0;end
else begin
if(divcounter == SEC)begin
divcounter <= 0;
if(enable == 1) sclk <= 1;
else sclk<=0;
end
else begin
divcounter <= divcounter+1;
sclk <= 0;
end
end
end
always @(posedge sclkbuf or negedge b1) begin
if(b1 == 0)begin sec[1]=0;sec[0]=0;mclk=0;end
else if(sven == 1)begin sec[1] = sec[1]; sec[0] = sec[0]; mclk = 0; end
else begin
if(sec[0]==4'd9)begin sec[1]=sec[1]+1;sec[0]=0;end
else begin sec[1]=sec[1];sec[0]=sec[0]+1;end
if(sec[1]==4'd6)begin sec[1]=0; mclk=1; end
else begin sec[1]=sec[1]; mclk=0; end
end
end
always @(posedge mclkbuf or negedge b1) begin
if(b1 == 0)begin min[1]=1;min[0]=5;hclk=0;end
else if(mven == 1)begin min[1] = min[1]; min[0] = min[0]; hclk = 0; end
else begin
if(min[0]==4'd9)begin min[1]=min[1]+1;min[0]=0;end
else begin min[1]=min[1];min[0]=min[0]+1;end
if(min[1]==4'd6)begin min[1]=0; hclk=1; end
else begin min[1]=min[1]; hclk=0; end
end
end
always @(posedge hclkbuf or negedge b1) begin
if(b1 == 0)begin hour[1]=1;hour[0]=1;dayc=0;end
else if(hven == 1)begin hour[1] = hour[1]; hour[0] = hour[0]; dayc = 0;end
else begin
if(hour[1] == 2 && hour[0]==3)begin hour[1]=0; hour[0]=0; dayc=1; end
else if(hour[0] == 9)
begin hour[1] = hour[1] + 1; hour[0] = 0 ; dayc = 0;end
else begin hour[0] = hour[0]+1; hour[1]=hour[1]; dayc=0; end
end
//else begin hour[1] = hour[1] ; hour[0] = hour[0]; dayc=0; end
end
always @(posedge daycbuf or negedge b1) begin
if(b1 == 0)begin day[1]=2;day[0]=8;monc=0;end
else if(dven == 1)begin day[1] = day[1]; day[0] = day[0]; monc = 0; end
else begin
if(day[1] == daynummsb && day[0] == daynumlsb)
begin day[1] = 0; day[0] = 1; monc = 1; end
else if(day[0] == 9)
begin day[1] = day[1]+1; day[0]=0; monc = 0; end
else begin
day[0] = day[0]+1; day[1] = day[1]; monc = 0;
end
end
//else begin day[1]=day[1]; day[0]=day[0]; monc=0; end
end
always @(posedge moncbuf or negedge b1) begin
if(b1 == 0)begin month[1]=0;month[0]=7;year1c=0;end
else if(monthven == 1)
begin month[1] = month[1]; month[0]=month[0]; year1c = 0; end
else begin
if(month[1] == 1 && month[0] == 2) begin
month[1]=0; month[0]=1; year1c = 1;
end
else if(month[0] == 9) begin
month[1] = month[1]+1; month[0] = 0; year1c =0;
end
else begin
month[1] = month[1]; month[0] = month[0]+1; year1c = 0;
end
end
//else begin month[1] = month[1]; month[0] = month[0]; year1c = 0; end
end
//counters for year:
always @(posedge y1buf or negedge b1) begin
if(b1 == 0)begin year[0]=7;year2c=0;end
else if(y1ven == 1)begin year[0] = year[0]; year2c = 0; end
else begin
if(year[0]==9)begin year[0]=0; year2c=1; end
else begin year[0]=year[0]+1; year2c = 0; end
end
end
always @(posedge y2buf or negedge b1) begin
if(b1 == 0)begin year[1]=0;year3c=0;end
else if(y2ven == 1)begin year[1] = year[1]; year3c = 0; end
else begin
if(year[1]==9)begin year[1]=0; year3c=1; end
else begin year[1]=year[1]+1; year3c = 0; end
end
end
always @(posedge y3buf or negedge b1) begin
if(b1 == 0)begin year[2]=0;year4c = 0;end
else if(y3ven == 1)begin year[2] = year[2]; year4c = 0 ;end
else begin
if(year[2]==9)begin year[2]=0; year4c=1; end
else begin year[2]=year[2]+1; year4c = 0; end
end
end
always @(posedge y4buf or negedge b1) begin
if(b1 == 0) year[3]=2;
else if(y4ven == 1)begin year[3] = year[3]; end
else begin
if(year[3]==9)begin year[3]=0; end
else begin year[3]=year[3]+1; end
end
end
endmodule