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

📄 maincontrol.v

📁 基于Altera公司系列FPGA(Cyclone EP1C3T144C8)、Verilog HDL、MAX7219数码管显示芯片、4X4矩阵键盘、TDA2822功放芯片及扬声器等实现了《电子线路设计&
💻 V
字号:
//MainControl.v	 	数字钟时钟发生模块	2006-11-3	version:1.0		作者:田世坤
//输入:
//		
//		
//输出:

module MainControl(ClkIn, Reset, KeyIn, State, ClkOut1Hz, ClkOutLow, ClkOutHigh, ClkOutMid,
			D7, D6, D5, D4, D3, D2, D1, D0, DD7, DD6, DD5, DD4, DD3, DD2, DD1, DD0, SoundReport);
input ClkIn, Reset, ClkOut1Hz, ClkOutLow, ClkOutHigh, ClkOutMid;
input [7:0] KeyIn;
input [11:0] State;
output [3:0]D7, D6, D4, D3, D1, D0, DD7, DD6, DD5, DD4, DD3, DD2, DD1, DD0;
reg  [3:0]D7, D6, D4, D3, D1, D0, DD7, DD6, DD5, DD4, DD3, DD2, DD1, DD0;
output [3:0]D5, D2;
output SoundReport;
reg SoundReport, jEn;

wire [3:0]D5, D2;
assign D5 = 4'ha;
assign D2 = 4'ha;

reg [3:0]j1, j0;

parameter STset7 = 12'b1110_10000000, STset6 = 12'b1110_01000000, STset4 = 12'b1110_00010000, STset3 = 12'b1110_00001000, STset1 = 12'b1110_00000010, STset0 = 12'b1110_00000001;
parameter SDset5 = 12'b1101_00100000, SDset4 = 12'b1101_00010000, SDset3 = 12'b1101_00001000, SDset2 = 12'b1101_00000100, SDset1 = 12'b1101_00000010, SDset0 = 12'b1101_00000001;

integer i1 = 1;

always @ (posedge ClkIn or negedge Reset)
begin
if(!Reset)
	begin
		D0 = 4'h0;
		D1 = 4'h0;
		//D2 = 4'ha;
		D3 = 4'h0;
		D4 = 4'h3;
		//D5 = 4'ha;
		D6 = 4'h2;
		D7 = 4'h1;
		DD0 = 4'h5;
		DD1 = 4'h0;
		DD2 = 4'h1;
		DD3 = 4'h1;
		DD4 = 4'h6;
		DD5 = 4'h0;
		DD6 = 4'h0;
		DD7 = 4'h2;
		jEn = 1'b0;
	end
else
	begin
		i1 = i1 + 1;
		///////////////////////时、分、秒//////////////////////////
		if(i1 == 20000)
		begin
			i1 = 1;
			D0 = D0 + 4'h1;
			if(jEn == 1'b1)
				j0 = j0 + 4'h1;
		end
		
		if(D0 > 4'h9)
			begin
				D0 = 4'h0;
				D1 = D1 + 4'h1;
			end
		if(D1 > 4'h5)
			begin
				D1 = 4'h0;
				D3 = D3 + 4'h1;
			end
		if(D3 > 4'h9)
			begin
				D3 = 4'h0;
				D4 = D4 + 4'h1;
			end
		if(D4 > 4'h5)
			begin
				D4 = 4'h0;
				D6 = D6 + 4'h1;
			end
		if(D6 > 4'h9)
			begin
				D6 = 4'h0;
				D7 = D7 + 4'h1;
			end
		if({D7,D6} > 8'h23)
			begin
				D6 = 4'h0;
				D7 = 4'h0;
				DD0 = DD0 + 4'h1;    //天数加1
			end
			
		///////////////////年、月、日/////////////////////////////
		if(DD0 > 4'h9)				
			begin
				DD0 = 4'h0;
				DD1 = DD1 + 4'h1;
			end
		if(({DD3,DD2}==8'h02 && {DD1,DD0}>8'h28)||(({DD3,DD2}==8'h04||{DD3,DD2}==8'h06||{DD3,DD2}==8'h09||{DD3,DD2}==8'h11) && {DD1,DD0}>8'h30)||({DD1,DD0}>8'h31))
			begin
				DD0 = 4'h1;
				DD1 = 4'h0;
				DD2 = DD2 + 4'h1;
			end
		if(DD2 > 4'h9)
			begin
				DD2 = 4'h1;
				DD3 = DD1 + 4'h1;
			end
		if({DD3,DD2}>8'h12)
			begin
				DD2 = 4'h1;
				DD3 = 4'h0;
				DD4 = DD4 + 4'h1;
			end
		if(DD4 > 4'h9)
			begin
				DD4 = 4'h0;
				DD5 = DD5 + 4'h1;
			end
		if(DD5 > 4'h9)
			begin
				DD5 = 4'h0;
				DD6 = DD6 + 4'h1;
			end
		if(DD6 > 4'h9)
			begin
				DD6 = 4'h0;
				DD7 = DD7 + 4'h1;
			end
		if(DD7 > 4'ha)
			begin
				DD7 = 4'h0;
			end
		
		if(j0 > 4'h9)
			begin
				j0 = 4'h0;
				j1 = j1 + 4'h1;
			end
		if({j1, j0} > 8'h23)
			begin
				{j1, j0} = 8'h00;
			end
			
		if(KeyIn == 8'b11011110)/////////////////////////随时报时处理///////////////////////////
		begin
			{j1, j0} = 8'h00;
			jEn = 1'b1;
		end
		if({j1, j0} > {D7, D6})
		begin
			{j1, j0} = 8'h00;
			jEn = 1'b0;
		end
		
		
		
		case(State)///////////////////////////////状态判断/////////////////////////////////////
			STset7:
				begin
					if(KeyIn == 8'b01110111)
						D7 = D7 + 4'h1;
				end
			STset6:
				begin
					if(KeyIn == 8'b01110111)
						D6 = D6 + 4'h1;
				end
			STset4:
				begin
					if(KeyIn == 8'b01110111)
						D4 = D4 + 4'h1;
				end
			STset3:
				begin
					if(KeyIn == 8'b01110111)
						D3 = D3 + 4'h1;
				end
			STset1:
				begin
					if(KeyIn == 8'b01110111)
						D1 = D1 + 4'h1;
				end
			STset0:
				begin
					if(KeyIn == 8'b01110111)
						D0 = D0 + 4'h1;
				end
			SDset5:
				begin
					if(KeyIn == 8'b01110111)
						DD5 = DD5 + 4'h1;
				end
			SDset4:
				begin
					if(KeyIn == 8'b01110111)
						DD4 = DD4 + 4'h1;
				end
			SDset3:
				begin
					if(KeyIn == 8'b01110111)
						DD3 = DD3 + 4'h1;
				end
			SDset2:
				begin
					if(KeyIn == 8'b01110111)
						DD2 = DD2 + 4'h1;
				end
			SDset1:
				begin
					if(KeyIn == 8'b01110111)
						DD1 = DD1 + 4'h1;
				end
			SDset0:
				begin
					if(KeyIn == 8'b01110111)
						DD0 = DD0 + 4'h1;
				end
			default:
				begin
				
				end
		endcase
	end
end

always////////////////////报时控制部分//////////////////////
begin
	if({D4,D3}==8'h59 && {D1, D0}<=8'h59 && {D1, D0}>=8'h56)
		SoundReport = ClkOut1Hz & ClkOutMid;
	else if({D4,D3, D1, D0}==16'h0000)
		SoundReport = ClkOut1Hz & ClkOutHigh;
	else if({D4,D3}==8'h00 && {D1, D0}>8'h02 && {D1, D0}<={D7, D6+4'h2} || {j1, j0}!=8'h00)
		SoundReport = ClkOut1Hz & ClkOutLow;
	else
		SoundReport = 1'b0;
end
endmodule

⌨️ 快捷键说明

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