FPGA - 231227 - 5CSEMA5F31C6 - 电子万年历

  • TAG - F P G A 、 5 C S E M A 5 F 31 C 6 、电子万年历、 V e r i l o g FPGA、5CSEMA5F31C6、电子万年历、Verilog FPGA5CSEMA5F31C6、电子万年历、Verilog

  • 顶层模块
module TOP(
	input CLK,RST,inA,inB,inC,switch_alarm,
	output led,beep_led,
	output [41:0] dp
);

// 按键消抖模块
wire 			keyA_turn, keyB_turn, keyC_turn;             

// 按键处理模块
wire     	select_sign;
wire [1:0]	flag_turn;
wire [1:0] 	flag_switch;

wire     	year_add, month_add, day_add;
wire			hour_add, minute_add, second_add;
wire      	alarm_hour_add, alarm_minute_add, alarm_second_add;

// 时钟模块
wire [6:0] 	year;
wire [4:0] 	day;
wire [3:0] 	month;

wire [4:0] 	hour;
wire [5:0] 	minute;
wire [5:0] 	second;

// 数码管显示模块
wire [32:0]	digital_clock;

// 闹钟模块
wire [4:0]	alarm_hour; 
wire [5:0]	alarm_minute; 
wire [5:0]	alarm_second;
							
//按键消抖模块
right_key rk_A(
	.clk			(CLK),
	.rst_n		(RST),
	.key_in		(inA),
	.key_flag	(keyA_turn)
);
right_key rk_B(
.clk        	(CLK),
.rst_n      	(RST),
.key_in      	(inB),
.key_flag   	(keyB_turn)
);
right_key rk_C(
.clk        	(CLK),
.rst_n      	(RST),
.key_in     	(inC),
.key_flag  		(keyC_turn)
);

//按键处理模块
sel_add eg_sel_add(
.clk           	(CLK),
.rst_n          	(RST),

.key_turn      	(keyA_turn),
.key_switch     	(keyB_turn),
.key_add       	(keyC_turn),

.select_sign    	(select_sign),
.flag_turn     	(flag_turn),
.flag_switch  		(flag_switch),

.second_add     	(second_add), 
.minute_add    	(minute_add), 
.hour_add      	(hour_add),    
.day_add        	(day_add),    
.month_add     	(month_add),  
.year_add      	(year_add),   
.alarm_second_add	(alarm_second_add), 
.alarm_minute_add	(alarm_minute_add), 
.alarm_hour_add 	(alarm_hour_add)    
);

// 时钟模块
clock eg_clock(
.clk              	(CLK),
.rst_n            	(RST),

.select_sign     		(select_sign),

.second_add      		(second_add),
.minute_add        	(minute_add),
.hour_add          	(hour_add),
.day_add           	(day_add),
.month_add          	(month_add),
.year_add          	(year_add),

.hour               	(hour),
.minute             	(minute),
.second            	(second),
.day              	(day),
.month              	(month),
.year              	(year)
);

// 数码管显示模块
display eg_display(
.CLK	             	(CLK),
.RST  	           	(RST),

.flag_turn        	(flag_turn),
.flag_switch       	(flag_switch),

.alarm_h		        	(alarm_hour),
.alarm_m		      	(alarm_minute),
.alarm_s		      	(alarm_second),

.year              	(year),
.month             	(month),
.day               	(day),
.h		              	(hour),
.m		            	(minute),
.s		            	(second),

.dp		           	(dp)
);

// 闹钟模块
alarm eg_alarm(
.clk              	(CLK),
.rst_n           		(RST),

.switch_alarm     	(switch_alarm),
.second           	(second),
.minute            	(minute),
.hour              	(hour),
.alarm_second_add  	(alarm_second_add), 
.alarm_minute_add 	(alarm_minute_add), 
.alarm_hour_add   	(alarm_hour_add),
			
.led              	(led),	
.beep_led          	(beep_led),	

.alarm_second     	(alarm_second),
.alarm_minute      	(alarm_minute),
.alarm_hour       	(alarm_hour)             
);
endmodule 
  • 按键消抖模块
// 按键消抖模块
module right_key
#(parameter WIDTH = 20'd999_999)		
(
input				clk,rst_n,key_in,
output	reg 	key_flag
);
reg[19:0]	CNT_20MS;
always @(posedge clk or negedge rst_n) begin
	if(!rst_n) 						CNT_20MS<=20'd0;
	else if(key_in==1'b1) 		CNT_20MS<=20'd0;
	else if(CNT_20MS==WIDTH) 	CNT_20MS<=WIDTH;
	else 								CNT_20MS<=CNT_20MS+1;
end
 
always @(posedge clk or negedge rst_n) begin
	if(!rst_n) 						key_flag<=1'b0;
	else if(CNT_20MS==WIDTH-1) key_flag<=1'b1;
	else 								key_flag<=1'b0;
end

endmodule
  • 按键处理模块
// 按键处理模块
module sel_add(
input clk, rst_n,

input key_turn,
input key_switch,
input key_add,

output select_sign,
output reg [1:0] flag_switch,
output reg [1:0] flag_turn,

output reg second_add, minute_add, hour_add, day_add, month_add, year_add,
output reg alarm_second_add, alarm_minute_add, alarm_hour_add
);
 
reg [3:0] flag_add=0;	
reg [1:0] turn_state=0,turn_next_state=0;  //翻页状态机(分别是输出、现态、次态)
reg [1:0] switch_state=0,switch_next_state=0;//当前选择数码管状态机
 
assign select_sign=(flag_add==4'b0000);

// 1
//页面切换的状态机
	//次态电路
	always@(negedge key_turn or negedge rst_n) 
	
	begin
		if(!rst_n) turn_next_state=2'b00;
		else
			case(turn_state)
			2'b00:turn_next_state=2'b01;
			2'b01:turn_next_state=2'b10;
			2'b10:turn_next_state=2'b00;
			default:turn_next_state=2'b00;
			endcase
	end
	//次态到现态转换
	always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n)  turn_state<=2'b00;
		else        turn_state<=turn_next_state;
	end
	//输出电路
	always@(rst_n or turn_state)
	begin
		if(!rst_n)  flag_turn= 2'b00;
		else
			case(turn_state)
			2'b00:flag_turn=2'b00;
			2'b01:flag_turn=2'b01;
			2'b10:flag_turn=2'b10;
			default:flag_turn=2'b00;
			endcase
	end

// 2
//数码管闪烁选择的状态机
	//次态电路
	always@(negedge key_switch or negedge rst_n) 
	
	begin
		if(!rst_n) switch_next_state=2'b00;
		else
			case(switch_state)
			2'b00:switch_next_state=2'b01;
			2'b01:switch_next_state=2'b10;
			2'b10:switch_next_state=2'b11;
			2'b11:switch_next_state=2'b00;
			default:switch_next_state=2'b00;
			endcase
	end
	//次态-->现态转换
	always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n)  switch_state<=2'b00;
		else        switch_state<=switch_next_state;
	end
	//输出电路
	always@(rst_n or switch_state)
	begin
		if(!rst_n)  flag_switch= 2'b00;
		else
			case(switch_state)
			2'b00:flag_switch=2'b00;
			2'b01:flag_switch=2'b01;
			2'b10:flag_switch=2'b10;
			2'b11:flag_switch=2'b11;
			default:switch_next_state=2'b00;
			endcase
	end

// 3
	//增一选择项目
	always@(turn_state or switch_state or rst_n) 
	begin
		if(!rst_n) flag_add=4'b0000;//0000代表空状态(都没选)
		else
			case(turn_state)//当前页面
			2'b00:      //第一页(时分秒)
				case(switch_state)//当前数码管闪烁选择
				2'b00:flag_add=4'b0000;
				2'b01:flag_add=4'b0001;//选中秒
				2'b10:flag_add=4'b0010;//选中分
				2'b11:flag_add=4'b0011;//选中时
				endcase
			2'b01:    //第二页(年月日)
				case(switch_state)
				2'b00:flag_add=4'b0000;
				2'b01:flag_add=4'b0101;//选中日
				2'b10:flag_add=4'b0110;//选中月
				2'b11:flag_add=4'b0111;//选中年
				endcase
			2'b10:   //第三页(闹钟)
				case(switch_state)
				2'b00:flag_add=4'b0000;
				2'b01:flag_add=4'b1001;//选中闹钟秒
				2'b10:flag_add=4'b1010;//选中闹钟分
				2'b11:flag_add=4'b1011;//选中闹钟时
				endcase
			default:flag_add=4'b0000;
			endcase
	end
	
// 4
	//生成增一的专属信号
	always@(key_add)
	begin  
		case(flag_add)
		4'b0001:second_add=key_add;
		4'b0010:minute_add=key_add;
		4'b0011:hour_add=key_add;
		4'b0101:day_add=key_add;
		4'b0110:month_add=key_add;
		4'b0111:year_add=key_add;
		4'b1001:alarm_second_add=key_add;
		4'b1010:alarm_minute_add=key_add;
		4'b1011:alarm_hour_add=key_add;
		default:;                      //其它的都什么也不执行
		endcase
	end
	
endmodule 
  • 时钟模块
// 时钟模块
module clock(
input				clk,
input				rst_n,

input    		select_sign,

input				second_add,
input				minute_add,
input				hour_add,

input				day_add,
input				month_add,
input				year_add,

output reg [5:0]   second,
output reg [5:0]   minute,
output reg [4:0]   hour,

output reg [4:0]   day,
output reg [3:0]   month,
output reg [6:0]   year
);

parameter CNT_TIME = 50_000_000;

reg [31:0] cnt;

wire pulse_second;	//秒脉冲
wire pulse_minute; 	//分脉冲
wire pulse_hour;		//小时脉冲
wire pulse_day;		//日脉冲
wire pulse_month;		//月脉冲
wire pulse_year;		//年脉冲

reg [5:0] second_set;
reg [5:0] minute_set;
reg [4:0] hour_set;
reg [4:0] day_set;
reg [3:0] month_set;
reg [6:0] year_set;

reg [3:0] day_month;
reg [6:0] day_year;

// cnt
always@(posedge clk or negedge rst_n) 
begin
	if(!rst_n)
		cnt<=0;
	else
		if(cnt==CNT_TIME-1)
			cnt<=0;
		else
			cnt<=cnt+1;
end

// pulse
assign pulse_second=(cnt==CNT_TIME-1 && (select_sign==1'b1));	 
assign pulse_minute=(second==6'd59 && pulse_second==1'b1); 		 
assign pulse_hour=(minute==6'd59 && pulse_minute==1'b1);  
assign pulse_day=(hour==5'd23 && pulse_hour==1'b1);

assign pulse_month=((day==5'd28 && month==4'd2 && (year%4!=0) && pulse_day==1'b1)
||(day==5'd29 && month==4'd2 && (year%4==0) && pulse_day==1'b1) 
||(day==5'd30 && (month==4'd4 || month==4'd6 ||month==4'd9 || month==4'd11) && pulse_day==1'b1) 
||(day==5'd31 && (month==4'd1 || month==4'd3 ||month==4'd5 ||
	month==4'd7 || month==4'd8 || month==4'd10 || month==4'd12) && pulse_day==1'b1));
	
assign pulse_year=(month==4'd12 && pulse_month==1'b1);

// s
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		second<=6'd00;
	else 
		if(pulse_second)   			//秒脉冲
			if(second>=59)
				second<=0;
			else
				second<=second+1;
		else if(second_add)  		//增一信号
			second<=second_set;
		else
			second<=second;
end

// s_set
always@(posedge second_add)
begin
		second_set=second;  			//先读取当前秒
		if(second_set>=59)
			second_set=0;
		else
			second_set=second_set+1;
end
		
// m  
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		minute<=6'd00;
	else 
		if(pulse_minute)
			if(minute>=59)
				minute<=0;
			else
				minute<=minute+1;	
		else if(minute_add)
			minute<=minute_set;
		else
			minute<=minute;
end

// m_set
always@(posedge minute_add)
begin
		minute_set=minute;
		if(minute_set>=59)
			minute_set=0;
		else
			minute_set=minute_set+1;
end
 
// h
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		hour<=5'd0;
	else 
		if(pulse_hour)
			if(hour>=23)
				hour<=0;
			else
				hour<=hour+1;		
		else if(hour_add)
			hour<=hour_set;
		else
			hour<=hour;
end

//h_set
always@(posedge hour_add )
begin
		hour_set=hour;
		if(hour_set>=23)
			hour_set=0;
		else
			hour_set=hour_set+1;
end

// day
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		day<=1;
	else 
		if(pulse_day) //天脉冲
			if(month==1 || month==3 ||month==5 || month==7 || month==8 || month==10 || month==12)
				if(day>=31)
					day<=1;
				else
					day<=day+1;
			else if(month==4 || month==6 ||month==9 || month==11)
				if(day>=30)
					day<=1;
				else
					day<=day+1;
			else if(month==2 && (year%4==0))
				if(day>=29)
					day<=1;
				else
					day<=day+1;
			else
				if(day>=28)
					day<=1;
				else
					day<=day+1;	
		else if(day_add)
			day<=day_set;
		else
			day<=day;
end

// day_set
always@(posedge day_add)
begin
		day_set=day;
		day_month=month;
		day_year=year;
		if(day_month==1 || day_month==3 ||day_month==5 || day_month==7 || day_month==8 || day_month==10 || day_month==12)
			if(day_set>=31)
				day_set<=1;
			else
				day_set<=day_set+1;
		else if(day_month==4 || day_month==6 ||day_month==9 || day_month==11)
			if(day_set>=30)
				day_set<=1;
			else
				day_set<=day_set+1;
		else if(day_month==2 && (day_year%4==0))   //闰年
			if(day_set>=29)
				day_set<=1;
			else
				day_set<=day_set+1;
		else
			if(day_set>=28)
				day_set<=1;
			else
				day_set<=day_set+1;
end
		
// month
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		month<=1;
	else 
		if(pulse_month)
			if(month>=12)
				month<=1;
			else
				month<=month+1;
		else if(month_add)
			month<=month_set;
		else
			month<=month;
end

// month_set
always@(posedge month_add)
begin
		month_set=month;
		if(month_set>=12)
			month_set=1;
		else
			month_set=month_set+1;
end
 
// year
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		year<=0;
	else 
		if(pulse_year)
			if(year>=99)
				year<=0;
			else
				year<=year+1;
		else if(year_add)
			year<=year_set;
		else
			year<=year;
end

// year_set
always@(posedge year_add)
begin
		year_set=year;
		if(year_set>=99)
			year_set=0;
		else
			year_set=year_set+1;
end

endmodule 
  • 数码管显示模块
// 数码管显示模块
module display(
    input                       CLK,
    input                       RST,
	 
	 input           [1:0]       flag_turn,
	 input           [1:0]       flag_switch,
	 
	 input           [4:0]       alarm_h,
	 input           [5:0]       alarm_m,
	 input           [5:0]       alarm_s,

	 input           [6:0]       year,
	 input           [3:0]       month,
	 input           [4:0]       day,
	 input           [4:0]       h,
	 input           [5:0]       m,
	 input           [5:0]       s,
	 
    output   reg    [41:0]      dp
);

parameter per = 50_000_000;
parameter half_per = per / 2 - 1;
//
parameter NULL = 7'b 111_1111;
parameter s0 	= 7'b 100_0000;
parameter s1 	= 7'b 111_1001;
parameter s2 	= 7'b 010_0100;
parameter s3 	= 7'b 011_0000;
parameter s4 	= 7'b 001_1001;
parameter s5 	= 7'b 001_0010;
parameter s6 	= 7'b 000_0010;
parameter s7 	= 7'b 111_1000;
parameter s8 	= 7'b 000_0000;
parameter s9 	= 7'b 001_0000;

wire			p;
assign p = (cnt == half_per);
//
reg [29:0] 	cnt;
reg 			f1,f2,f3;

always @(posedge CLK or negedge RST) begin
	if(!RST) cnt = 0;
	else if (cnt == half_per) cnt = 0;
	else cnt = cnt + 1;
end

always @(posedge CLK or negedge RST) begin
	if(!RST) begin
		f1 = 1; f2 = 1; f3 = 1;
	end else if (p) begin
		case(flag_switch)
			2'b 01: begin f1 = ~f1; f2 = 1; f3 = 1; end
			2'b 10: begin f1 = 1; f2 = ~f2; f3 = 1; end
			2'b 11: begin f1 = 1; f2 = 1; f3 = ~f3; end
			default: begin f1 = 1; f2 = 1; f3 = 1; end
		endcase
	end
end

always @(posedge CLK or negedge RST) begin
	if (!RST) dp = 42'hfffffff;
	else if (flag_turn == 2'b 00) begin
		case (s%10)
			0: dp[6:0] = f1 ? s0 : NULL ;
			1: dp[6:0] = f1 ? s1 : NULL ;
			2: dp[6:0] = f1 ? s2 : NULL ;
			3: dp[6:0] = f1 ? s3 : NULL ;
			4: dp[6:0] = f1 ? s4 : NULL ;
			5: dp[6:0] = f1 ? s5 : NULL ;
			6: dp[6:0] = f1 ? s6 : NULL ;
			7: dp[6:0] = f1 ? s7 : NULL ;
			8: dp[6:0] = f1 ? s8 : NULL ;
			9: dp[6:0] = f1 ? s9 : NULL ;
			default: ;
		endcase
		
		case (s/10)
			0: dp[13:7] = f1 ? s0 : NULL ;
			1: dp[13:7] = f1 ? s1 : NULL ;
			2: dp[13:7] = f1 ? s2 : NULL ;
			3: dp[13:7] = f1 ? s3 : NULL ;
			4: dp[13:7] = f1 ? s4 : NULL ;
			5: dp[13:7] = f1 ? s5 : NULL ;
			6: dp[13:7] = f1 ? s6 : NULL ;
			7: dp[13:7] = f1 ? s7 : NULL ;
			8: dp[13:7] = f1 ? s8 : NULL ;
			9: dp[13:7] = f1 ? s9 : NULL ;
			default: ;
		endcase
		
		case (m%10)
			0: dp[20:14] = f2 ? s0 : NULL ;
			1: dp[20:14] = f2 ? s1 : NULL ;
			2: dp[20:14] = f2 ? s2 : NULL ;
			3: dp[20:14] = f2 ? s3 : NULL ;
			4: dp[20:14] = f2 ? s4 : NULL ;
			5: dp[20:14] = f2 ? s5 : NULL ;
			6: dp[20:14] = f2 ? s6 : NULL ;
			7: dp[20:14] = f2 ? s7 : NULL ;
			8: dp[20:14] = f2 ? s8 : NULL ;
			9: dp[20:14] = f2 ? s9 : NULL ;
			default: ;
		endcase
		
		case (m/10)
			0: dp[27:21] = f2 ? s0 : NULL ;
			1: dp[27:21] = f2 ? s1 : NULL ;
			2: dp[27:21] = f2 ? s2 : NULL ;
			3: dp[27:21] = f2 ? s3 : NULL ;
			4: dp[27:21] = f2 ? s4 : NULL ;
			5: dp[27:21] = f2 ? s5 : NULL ;
			6: dp[27:21] = f2 ? s6 : NULL ;
			7: dp[27:21] = f2 ? s7 : NULL ;
			8: dp[27:21] = f2 ? s8 : NULL ;
			9: dp[27:21] = f2 ? s9 : NULL ;
			default: ;
		endcase
		
		case (h%10)
			0: dp[34:28] = f3 ? s0 : NULL ;
			1: dp[34:28] = f3 ? s1 : NULL ;
			2: dp[34:28] = f3 ? s2 : NULL ;
			3: dp[34:28] = f3 ? s3 : NULL ;
			4: dp[34:28] = f3 ? s4 : NULL ;
			5: dp[34:28] = f3 ? s5 : NULL ;
			6: dp[34:28] = f3 ? s6 : NULL ;
			7: dp[34:28] = f3 ? s7 : NULL ;
			8: dp[34:28] = f3 ? s8 : NULL ;
			9: dp[34:28] = f3 ? s9 : NULL ;
			default: ;
		endcase
		
		case (h/10)
			0: dp[41:35] = f3 ? s0 : NULL ;
			1: dp[41:35] = f3 ? s1 : NULL ;
			2: dp[41:35] = f3 ? s2 : NULL ;
			3: dp[41:35] = f3 ? s3 : NULL ;
			4: dp[41:35] = f3 ? s4 : NULL ;
			5: dp[41:35] = f3 ? s5 : NULL ;
			6: dp[41:35] = f3 ? s6 : NULL ;
			7: dp[41:35] = f3 ? s7 : NULL ;
			8: dp[41:35] = f3 ? s8 : NULL ;
			9: dp[41:35] = f3 ? s9 : NULL ;
			default: ;
		endcase

	end else if (flag_turn == 2'b 01) begin	//
	
		case (day%10)
			0: dp[6:0] = f1 ? s0 : NULL ;
			1: dp[6:0] = f1 ? s1 : NULL ;
			2: dp[6:0] = f1 ? s2 : NULL ;
			3: dp[6:0] = f1 ? s3 : NULL ;
			4: dp[6:0] = f1 ? s4 : NULL ;
			5: dp[6:0] = f1 ? s5 : NULL ;
			6: dp[6:0] = f1 ? s6 : NULL ;
			7: dp[6:0] = f1 ? s7 : NULL ;
			8: dp[6:0] = f1 ? s8 : NULL ;
			9: dp[6:0] = f1 ? s9 : NULL ;
			default: ;
		endcase
		
		case (day/10)
			0: dp[13:7] = f1 ? s0 : NULL ;
			1: dp[13:7] = f1 ? s1 : NULL ;
			2: dp[13:7] = f1 ? s2 : NULL ;
			3: dp[13:7] = f1 ? s3 : NULL ;
			4: dp[13:7] = f1 ? s4 : NULL ;
			5: dp[13:7] = f1 ? s5 : NULL ;
			6: dp[13:7] = f1 ? s6 : NULL ;
			7: dp[13:7] = f1 ? s7 : NULL ;
			8: dp[13:7] = f1 ? s8 : NULL ;
			9: dp[13:7] = f1 ? s9 : NULL ;
			default: ;
		endcase
		
		case (month%10)
			0: dp[20:14] = f2 ? s0 : NULL ;
			1: dp[20:14] = f2 ? s1 : NULL ;
			2: dp[20:14] = f2 ? s2 : NULL ;
			3: dp[20:14] = f2 ? s3 : NULL ;
			4: dp[20:14] = f2 ? s4 : NULL ;
			5: dp[20:14] = f2 ? s5 : NULL ;
			6: dp[20:14] = f2 ? s6 : NULL ;
			7: dp[20:14] = f2 ? s7 : NULL ;
			8: dp[20:14] = f2 ? s8 : NULL ;
			9: dp[20:14] = f2 ? s9 : NULL ;
			default: ;
		endcase
		
		case (month/10)
			0: dp[27:21] = f2 ? s0 : NULL ;
			1: dp[27:21] = f2 ? s1 : NULL ;
			2: dp[27:21] = f2 ? s2 : NULL ;
			3: dp[27:21] = f2 ? s3 : NULL ;
			4: dp[27:21] = f2 ? s4 : NULL ;
			5: dp[27:21] = f2 ? s5 : NULL ;
			6: dp[27:21] = f2 ? s6 : NULL ;
			7: dp[27:21] = f2 ? s7 : NULL ;
			8: dp[27:21] = f2 ? s8 : NULL ;
			9: dp[27:21] = f2 ? s9 : NULL ;
			default: ;
		endcase
		
		case (year%10)
			0: dp[34:28] = f3 ? s0 : NULL ;
			1: dp[34:28] = f3 ? s1 : NULL ;
			2: dp[34:28] = f3 ? s2 : NULL ;
			3: dp[34:28] = f3 ? s3 : NULL ;
			4: dp[34:28] = f3 ? s4 : NULL ;
			5: dp[34:28] = f3 ? s5 : NULL ;
			6: dp[34:28] = f3 ? s6 : NULL ;
			7: dp[34:28] = f3 ? s7 : NULL ;
			8: dp[34:28] = f3 ? s8 : NULL ;
			9: dp[34:28] = f3 ? s9 : NULL ;
			default: ;
		endcase
		
		case (year/10)
			0: dp[41:35] = f3 ? s0 : NULL ;
			1: dp[41:35] = f3 ? s1 : NULL ;
			2: dp[41:35] = f3 ? s2 : NULL ;
			3: dp[41:35] = f3 ? s3 : NULL ;
			4: dp[41:35] = f3 ? s4 : NULL ;
			5: dp[41:35] = f3 ? s5 : NULL ;
			6: dp[41:35] = f3 ? s6 : NULL ;
			7: dp[41:35] = f3 ? s7 : NULL ;
			8: dp[41:35] = f3 ? s8 : NULL ;
			9: dp[41:35] = f3 ? s9 : NULL ;
			default: ;
		endcase
		
	end else begin											//
		
		case (alarm_s%10)
			0: dp[6:0] = f1 ? s0 : NULL ;
			1: dp[6:0] = f1 ? s1 : NULL ;
			2: dp[6:0] = f1 ? s2 : NULL ;
			3: dp[6:0] = f1 ? s3 : NULL ;
			4: dp[6:0] = f1 ? s4 : NULL ;
			5: dp[6:0] = f1 ? s5 : NULL ;
			6: dp[6:0] = f1 ? s6 : NULL ;
			7: dp[6:0] = f1 ? s7 : NULL ;
			8: dp[6:0] = f1 ? s8 : NULL ;
			9: dp[6:0] = f1 ? s9 : NULL ;
			default: ;
		endcase
		
		case (alarm_s/10)
			0: dp[13:7] = f1 ? s0 : NULL ;
			1: dp[13:7] = f1 ? s1 : NULL ;
			2: dp[13:7] = f1 ? s2 : NULL ;
			3: dp[13:7] = f1 ? s3 : NULL ;
			4: dp[13:7] = f1 ? s4 : NULL ;
			5: dp[13:7] = f1 ? s5 : NULL ;
			6: dp[13:7] = f1 ? s6 : NULL ;
			7: dp[13:7] = f1 ? s7 : NULL ;
			8: dp[13:7] = f1 ? s8 : NULL ;
			9: dp[13:7] = f1 ? s9 : NULL ;
			default: ;
		endcase
		
		case (alarm_m%10)
			0: dp[20:14] = f2 ? s0 : NULL ;
			1: dp[20:14] = f2 ? s1 : NULL ;
			2: dp[20:14] = f2 ? s2 : NULL ;
			3: dp[20:14] = f2 ? s3 : NULL ;
			4: dp[20:14] = f2 ? s4 : NULL ;
			5: dp[20:14] = f2 ? s5 : NULL ;
			6: dp[20:14] = f2 ? s6 : NULL ;
			7: dp[20:14] = f2 ? s7 : NULL ;
			8: dp[20:14] = f2 ? s8 : NULL ;
			9: dp[20:14] = f2 ? s9 : NULL ;
			default: ;
		endcase
		
		case (alarm_m/10)
			0: dp[27:21] = f2 ? s0 : NULL ;
			1: dp[27:21] = f2 ? s1 : NULL ;
			2: dp[27:21] = f2 ? s2 : NULL ;
			3: dp[27:21] = f2 ? s3 : NULL ;
			4: dp[27:21] = f2 ? s4 : NULL ;
			5: dp[27:21] = f2 ? s5 : NULL ;
			6: dp[27:21] = f2 ? s6 : NULL ;
			7: dp[27:21] = f2 ? s7 : NULL ;
			8: dp[27:21] = f2 ? s8 : NULL ;
			9: dp[27:21] = f2 ? s9 : NULL ;
			default: ;
		endcase
		
		case (alarm_h%10)
			0: dp[34:28] = f3 ? s0 : NULL ;
			1: dp[34:28] = f3 ? s1 : NULL ;
			2: dp[34:28] = f3 ? s2 : NULL ;
			3: dp[34:28] = f3 ? s3 : NULL ;
			4: dp[34:28] = f3 ? s4 : NULL ;
			5: dp[34:28] = f3 ? s5 : NULL ;
			6: dp[34:28] = f3 ? s6 : NULL ;
			7: dp[34:28] = f3 ? s7 : NULL ;
			8: dp[34:28] = f3 ? s8 : NULL ;
			9: dp[34:28] = f3 ? s9 : NULL ;
			default: ;
		endcase
		
		case (alarm_h/10)
			0: dp[41:35] = f3 ? s0 : NULL ;
			1: dp[41:35] = f3 ? s1 : NULL ;
			2: dp[41:35] = f3 ? s2 : NULL ;
			3: dp[41:35] = f3 ? s3 : NULL ;
			4: dp[41:35] = f3 ? s4 : NULL ;
			5: dp[41:35] = f3 ? s5 : NULL ;
			6: dp[41:35] = f3 ? s6 : NULL ;
			7: dp[41:35] = f3 ? s7 : NULL ;
			8: dp[41:35] = f3 ? s8 : NULL ;
			9: dp[41:35] = f3 ? s9 : NULL ;
			default: ;
		endcase
		
	end
end

endmodule 
  • 闹钟模块
// 闹钟模块
module alarm(
	input                clk,
	input                rst_n,
	input     [5:0]      second,
	input     [5:0]      minute,
	input     [4:0]      hour,
   input                switch_alarm,
	input                alarm_second_add,
	input                alarm_minute_add,
	input                alarm_hour_add,
   output               led,
	output               beep_led,  
	output reg [5:0]     alarm_second,
	output reg [5:0]     alarm_minute,
	output reg [4:0]     alarm_hour
	);
	assign led=switch_alarm;   
	assign beep_led=(second==alarm_second && minute==alarm_minute 
						&& hour==alarm_hour && switch_alarm==1'b1); 
	//设置秒
	always@(negedge alarm_second_add or negedge rst_n)
	begin
		if(!rst_n)
			alarm_second<=6'd5;
		else
			if(alarm_second>=59)
				alarm_second<=0;
			else
				alarm_second<=alarm_second+1;
	end
	//设置分
	always@(negedge alarm_minute_add or negedge rst_n)
	begin
		if(!rst_n)
			alarm_minute<=6'd0;
		else
			if(alarm_minute>=12)
				alarm_minute<=0;
			else
				alarm_minute<=alarm_minute+1;
	end
	//设置时
	always@(negedge alarm_hour_add or negedge rst_n)
	begin
		if(!rst_n)
			alarm_hour<=5'd0;
		else
			if(alarm_hour>=23)
				alarm_hour<=0;
			else
				alarm_hour<=alarm_hour+1;
	end	
endmodule	

实现细节

  • 状态机
  • 秒脉冲

参考示意图

  • 电子万年历设计要求
  • 芯片选择
  • 时钟 管脚配置
  • 数码管 管脚配置
  • 开关 管脚配置
  • LED灯 管脚配置
  • 按键 管脚配置
  • 实物展示 正确显示闰年二月
  • 实物展示 闹钟时间下左灯亮起

参考链接

  • // – 电子万年历 – //
  • FPGA项目(12)—— 基于FPGA的万年历设计
  • FPGA项目(3)-- 按键消抖
  • FPGA项目(5)-- FPGA控制数码管动态显示的原理
  • // – 语法 – //
  • Verilog中`define、parameter、localparam三者的区别及举例
  • // – 模块化设计 – //
  • 【FPGA】Verilog:模块化组合逻辑电路设计 | 半加器 | 全加器 | 串行加法器 | 子模块 | 主模块
  • // – 报错 – //
  • error (12153): can’t elaborate
  • Error (12153): Can‘t elaborate top-level user hierarchy
  • // – 撰写报告 – //
  • word怎么让封面、目录没有页码,页码从正文开始

作者 | 乐意奥AI

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/281870.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

00-Git 详解

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具&#xff0c;也称之为代码版本控制工具&#xff0c;代码版本控制或管理的工具用的最多的&#xff1a; svn、 git。 SVN 是采用的 同步机制&#xff0c;即本地的代码版本和服务器的版本保持一致&#xff08;提…

社区医院挂号预约服务管理系统95an6

社区医院管理服务系统具有社区医院信息管理功能的选择。社区医院管理服务系统采用p[ython技术&#xff0c;基于django框架&#xff0c;mysql数据库进行开发&#xff0c;实现了首页、个人中心、用户管理、医生管理、预约医生管理、就诊信息管理、诊疗方案管理、病历信息管理、健…

创建您的第一个记忆卡片游戏

大家好&#xff01;今天&#xff0c;我们将一起探索如何用HTML、CSS和JavaScript创建一个有趣的记忆卡片游戏。我们的游戏规则很简单&#xff1a;用户需要找到一对一样的卡片。如果你是编程新手&#xff0c;不用担心&#xff0c;我会逐步引导你完成这个项目。 正文&#xff1a…

MFC扩展库BCGControlBar Pro v34.0 - 仪表盘控件全面升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v34.0已正式发布了&#xff0c;该版本包括新的主题任务对话框、图像效果、旋转圆形刻度、…

C语言转WebAssembly的全流程,及Web端调用测试

第一步&#xff1a;安装环境 参考网址&#xff1a;https://emscripten.org/docs/getting_started/downloads.html 具体过程&#xff1a; 克隆代码&#xff1a;git clone https://github.com/emscripten-core/emsdk.git进入代码目录&#xff1a;cd emsdk获取最新远端代码&…

uniapp 安卓模拟器链接

下载genymotion 安装 配置adb路径 模拟端口设为 5307

C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版)

1、介绍 对于上位机开发来说&#xff0c;欧姆龙PLC支持的主要的协议有Hostlink协议&#xff0c;FinsTcp/Udp协议&#xff0c;EtherNetIP协议&#xff0c;本项目使用Hostlink协议。 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可…

qt中信号槽第五个参数

文章目录 connent函数第五个参数的作用自动连接(Qt::AutoConnection)直接连接(Qt::DirectConnection - 同步)同线程不同线程 队列连接(Qt::QueuedConnection - 异步)同一线程不同线程 锁定队列连接(Qt::BlockingQueuedConnection) connent函数第五个参数的作用 connect(const …

数据统计的一些专业术语学习

数据统计的一些专业术语学习 1. 极差2. 方差3. 标准差4. 均值绝对差 1. 极差 数据统计的极差&#xff0c;又称全距&#xff0c;是指一组数据中最大值和最小值之差。 举个例子&#xff0c;如果我们有一组数据&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c…

C# 图标标注小工具-查看重复文件

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Windows.Forms;namespace ImageDuplicate {public partial clas…

vue-springboot基于javaEE的二手手机交易平台的设计与实现

在此基础上&#xff0c;结合现有二手手机交易平台体系的特点&#xff0c;运用新技术&#xff0c;构建了以 SpringBoot为基础的二手手机交易平台信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;根据需求分析结果进行了系统的设计&#xff0c;并将其划分为管理员、用户…

C#进阶-IIS应用程序池崩溃的解决方案

IIS是微软开发的Web服务器软件&#xff0c;被广泛用于Windows平台上的网站托管。在使用IIS过程中&#xff0c;可能会遇到应用程序池崩溃的问题&#xff0c;原因可能有很多&#xff0c;包括代码错误、资源不足、进程冲突等。本文将为大家介绍IIS应用程序池崩溃的问题分析和解决方…

(2023)PanGu-Draw:通过时间解耦训练和可重用的 Coop-Diffusion 推进资源高效的文本到图像合成

PanGu-Draw: Advancing Resource-Efficient Text-to-Image Synthesis with Time-Decoupled Training and Reusable Coop-Diffusion 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要…

力扣精选题

题目: 写出最大数 回答: let count function(a,b){ let num1 a.toString() let num2 b.toString() return (num2num1)-(num1num2) } let last arr.sort(count) let arr [18,20,33,4,5] let num last.join() console.log(last,last) 最终得出最大数字符串: …

Python魔法方法之__getattr__和getattribute

在Python中有这两个魔法方法容易让人混淆&#xff1a;__getattr__和getattribute。通常我们会定义__getattr__而从来不会定义getattribute&#xff0c;下面我们来看看这两个的区别。 __getattr__魔法方法 class MyClass:def __init__(self, x):self.x xdef __getattr__(self, …

技术博客官网也是一个不错的学习平台(第411篇)

技术博客官网也是一个不错的学习平台(第411篇) 今天的主题是OSPF 大纲 技术成就梦想51CTO-中国知名的数字化人才学习平台和技术社区 OSPF 概念型问题_wx655f0abb3511b的技术博客_51CTO博客 OSPF协议介绍及配置 - airoot - 博客园 (cnblogs.com) 一、OSPF概述 回顾一下距离矢…

python+vue高校体育器材管理信息系统5us4g

优秀的高校体育馆场地预订系统能够更有效管理体育馆场地预订业务规范&#xff0c;帮助管理者更加有效管理场地的使用&#xff0c;有效提高场地使用效率&#xff0c;可以帮助提高克服人工管理带来的错误等不利因素&#xff0c;所以一个优秀的高校体育馆场地预订系统能够带来很大…

通信原理课设(gec6818) 008:LED+蜂鸣器+串口+MQ01+GY39+RFID

目录 1、LED和蜂鸣器 a. 安装驱动 b. 代码 2、串口 3、MQ01烟雾传感器 4、GY39 1、LED和蜂鸣器 a. 安装驱动 在开发板上要使用led和蜂鸣器需要安装对应的驱动 链接&#xff1a;https://pan.baidu.com/s/15I1kGKhT1kENqplu5Dmg5Q?pwdlebe 提取码&#xff1a;lebe 将上…

【并行计算】GPU,CUDA

一、CUDA层次结构 1.kernel核函数 一个CUDA程序是一个kernel核函数被GPU的多个计算单元并行执行的过程&#xff0c;CUDA给了如下抽象 dim3 threadsPerBlock(4, 3, 1); dim3 numBlocks(3, 2, 1); matrixAdd<<<numBlocks, threadsPerBlock>>>(A, B, C); 2.G…

git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作)

文章目录 1. Git概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git简史1.5 Git工作机制1.6 Git和代码托管中心 2. Git安装3. Git常用命令3.1 设置用户签名3.1.1 说明3.1.2 语法3.1.3 案例实操 3.2 初始化本地库3.2.1 基本语法3.2.2 案例实操3.2.3 结果查看 3…