⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clockcore.v.bak

📁 一个在Xilinx spartan3实现的时钟
💻 BAK
字号:
`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;	 wire[3:0] sec1, sec0, min1, min0;    //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;//	 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;	 assign sec1 = sec[1];	 assign sec0 = sec[0];	 assign min1 = min[1];	 assign min0 = min[0];/*	 function [7:0] encode;		input[3:0] num;		input dispen;		begin			if(dispen == 1)begin				case(num)				4'b0000: encode = d0;				4'b0001: encode = d1;				4'b0010: encode = d2;				4'b0011: encode = d3;				4'b0100: encode = d4;				4'b0101: encode = d5;				4'b0110: encode = d6;				4'b0111: encode = d7;				4'b1000: encode = d8;				4'b1001: encode = d9;				default: encode = dnone;				endcase			end			else encode = 8'b11111111;		end	 endfunction*/	 always @( dispdata) begin				case(dispdata)				4'b0000: N = d0;				4'b0001: N = d1;				4'b0010: N = d2;				4'b0011: N = d3;				4'b0100: N = d4;				4'b0101: N = d5;				4'b0110: N = d6;				4'b0111: N = d7;				4'b1000: N = d8;				4'b1001: N = d9;				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: dispdata = year[3]; 			4'b1101: dispdata = year[2];			4'b1110: dispdata = year[1];			4'b1111: dispdata = year[0];			4'b1000: dispdata = month[1];			4'b1001: dispdata = month[0];			4'b1010: dispdata = day[1];			4'b1011: dispdata = day[0];			4'b0100: dispdata = hour[1];			4'b0101: dispdata = hour[0];			4'b0110: dispdata = min[1];			4'b0111: dispdata = min[0];			4'b0000: dispdata = 4'b0000;			4'b0001: dispdata = 4'b0000;			4'b0010: dispdata = sec[1];			4'b0011: dispdata = sec[0];			default: dispdata = 4'b0000;		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 @(screen or state) begin			if(state[2]==0) begin 
				enable = 1;				sven = 1; mven = 1; hven = 1; dven = 1; monthven = 1; y1ven=1; y2ven=1; y3ven=1; y4ven=1;			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,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;				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 = (enable&sclk&sven)|~(b2|sven);//to enable signals, 1 for clk and 0 for b2 		assign mclkbuf = (enable&mclk&mven)|~(b2|mven);		assign hclkbuf = (enable&hclk&hven)|~(b2|hven);		assign daycbuf = (enable&dayc&dven)|~(b2|dven);		assign moncbuf = (enable&monc&monthven)|~(b2|monthven);		assign y1buf = (enable&year1c&y1ven)|~(b2|y1ven);		assign y2buf = (enable&year2c&y2ven)|~(b2|y2ven);		assign y3buf = (enable&year3c&y3ven)|~(b2|y3ven);		assign y4buf = (enable&year4c&y4ven)|~(b2|y4ven);				//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;					sclk <= 1;				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 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 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 begin				if(hour[0]==4'd3)begin hour[1]=hour[1]+1;hour[0]=0;end				else begin hour[1]=hour[1];hour[0]=hour[0]+1;end				if(hour[1]==4'd3)begin hour[1]=0; dayc=1; end				else begin hour[1]=hour[1]; dayc=0; end			end		end				always @(posedge daycbuf or negedge b1) begin			if(b1 == 0)begin day[1]<=2;day[0]<=8;monc<=0;end			else begin				if(day[0]==daynumlsb)begin
					day[0]<=0;
					if(day[1] == daynummsb)begin day[1]<=0; monc<=1; end 
					else begin day[1]<=day[1]+1; monc<=0; end
				end				else begin day[1]<=day[1];day[0]<=day[0]+1; monc<=0; end			end		end				always @(posedge moncbuf or negedge b1) begin			if(b1 == 0)begin month[1]=0;month[0]=7;year1c=0;end			else begin				if(month[0]==2)begin month[1]=month[1]+1;month[0]=0;end				else begin month[1]=month[1];month[0]=month[0]+1;end				if(month[1]==2)begin month[1]=0; year1c=1; end				else begin month[1]=month[1]; year1c=0; end			end		end		//counters for year:		always @(posedge y1buf or negedge b1) begin			if(b1 == 0)begin year[0]=7;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 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 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 begin				if(year[3]==9)begin year[3]=0; end				else begin year[3]=year[3]+1; end			end		end		endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -