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) beginif(!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;
endalways @(posedge clk or negedge rst_n) beginif(!rst_n) 						key_flag<=1'b0;else if(CNT_20MS==WIDTH-1) key_flag<=1'b1;else 								key_flag<=1'b0;
endendmodule
  • 按键处理模块
// 按键处理模块
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) beginif(!rst_n) turn_next_state=2'b00;elsecase(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;endcaseend//次态到现态转换always@(posedge clk or negedge rst_n)beginif(!rst_n)  turn_state<=2'b00;else        turn_state<=turn_next_state;end//输出电路always@(rst_n or turn_state)beginif(!rst_n)  flag_turn= 2'b00;elsecase(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;endcaseend// 2
//数码管闪烁选择的状态机//次态电路always@(negedge key_switch or negedge rst_n) beginif(!rst_n) switch_next_state=2'b00;elsecase(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;endcaseend//次态-->现态转换always@(posedge clk or negedge rst_n)beginif(!rst_n)  switch_state<=2'b00;else        switch_state<=switch_next_state;end//输出电路always@(rst_n or switch_state)beginif(!rst_n)  flag_switch= 2'b00;elsecase(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;endcaseend// 3//增一选择项目always@(turn_state or switch_state or rst_n) beginif(!rst_n) flag_add=4'b0000;//0000代表空状态(都没选)elsecase(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;//选中时endcase2'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;//选中年endcase2'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;//选中闹钟时endcasedefault:flag_add=4'b0000;endcaseend// 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:;                      //其它的都什么也不执行endcaseendendmodule 
  • 时钟模块
// 时钟模块
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) 
beginif(!rst_n)cnt<=0;elseif(cnt==CNT_TIME-1)cnt<=0;elsecnt<=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)
beginif(!rst_n)second<=6'd00;else if(pulse_second)   			//秒脉冲if(second>=59)second<=0;elsesecond<=second+1;else if(second_add)  		//增一信号second<=second_set;elsesecond<=second;
end// s_set
always@(posedge second_add)
beginsecond_set=second;  			//先读取当前秒if(second_set>=59)second_set=0;elsesecond_set=second_set+1;
end// m  
always@(posedge clk or negedge rst_n)
beginif(!rst_n)minute<=6'd00;else if(pulse_minute)if(minute>=59)minute<=0;elseminute<=minute+1;	else if(minute_add)minute<=minute_set;elseminute<=minute;
end// m_set
always@(posedge minute_add)
beginminute_set=minute;if(minute_set>=59)minute_set=0;elseminute_set=minute_set+1;
end// h
always@(posedge clk or negedge rst_n)
beginif(!rst_n)hour<=5'd0;else if(pulse_hour)if(hour>=23)hour<=0;elsehour<=hour+1;		else if(hour_add)hour<=hour_set;elsehour<=hour;
end//h_set
always@(posedge hour_add )
beginhour_set=hour;if(hour_set>=23)hour_set=0;elsehour_set=hour_set+1;
end// day
always@(posedge clk or negedge rst_n)
beginif(!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;elseday<=day+1;else if(month==4 || month==6 ||month==9 || month==11)if(day>=30)day<=1;elseday<=day+1;else if(month==2 && (year%4==0))if(day>=29)day<=1;elseday<=day+1;elseif(day>=28)day<=1;elseday<=day+1;	else if(day_add)day<=day_set;elseday<=day;
end// day_set
always@(posedge day_add)
beginday_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;elseday_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;elseday_set<=day_set+1;else if(day_month==2 && (day_year%4==0))   //闰年if(day_set>=29)day_set<=1;elseday_set<=day_set+1;elseif(day_set>=28)day_set<=1;elseday_set<=day_set+1;
end// month
always@(posedge clk or negedge rst_n)
beginif(!rst_n)month<=1;else if(pulse_month)if(month>=12)month<=1;elsemonth<=month+1;else if(month_add)month<=month_set;elsemonth<=month;
end// month_set
always@(posedge month_add)
beginmonth_set=month;if(month_set>=12)month_set=1;elsemonth_set=month_set+1;
end// year
always@(posedge clk or negedge rst_n)
beginif(!rst_n)year<=0;else if(pulse_year)if(year>=99)year<=0;elseyear<=year+1;else if(year_add)year<=year_set;elseyear<=year;
end// year_set
always@(posedge year_add)
beginyear_set=year;if(year_set>=99)year_set=0;elseyear_set=year_set+1;
endendmodule 
  • 数码管显示模块
// 数码管显示模块
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) beginif(!RST) cnt = 0;else if (cnt == half_per) cnt = 0;else cnt = cnt + 1;
endalways @(posedge CLK or negedge RST) beginif(!RST) beginf1 = 1; f2 = 1; f3 = 1;end else if (p) begincase(flag_switch)2'b 01: begin f1 = ~f1; f2 = 1; f3 = 1; end2'b 10: begin f1 = 1; f2 = ~f2; f3 = 1; end2'b 11: begin f1 = 1; f2 = 1; f3 = ~f3; enddefault: begin f1 = 1; f2 = 1; f3 = 1; endendcaseend
endalways @(posedge CLK or negedge RST) beginif (!RST) dp = 42'hfffffff;else if (flag_turn == 2'b 00) begincase (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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcaseend 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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcaseend 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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcasecase (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: ;endcaseend
endendmodule 
  • 闹钟模块
// 闹钟模块
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)beginif(!rst_n)alarm_second<=6'd5;elseif(alarm_second>=59)alarm_second<=0;elsealarm_second<=alarm_second+1;end//设置分always@(negedge alarm_minute_add or negedge rst_n)beginif(!rst_n)alarm_minute<=6'd0;elseif(alarm_minute>=12)alarm_minute<=0;elsealarm_minute<=alarm_minute+1;end//设置时always@(negedge alarm_hour_add or negedge rst_n)beginif(!rst_n)alarm_hour<=5'd0;elseif(alarm_hour>=23)alarm_hour<=0;elsealarm_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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<JavaEE> TCP 的通信机制(一) -- 确认应答 和 超时重传

目录 TCP的通信机制的核心特性 一、确认应答 1&#xff09;什么是确认应答&#xff1f; 2&#xff09;如何“确认”&#xff1f; 3&#xff09;如何“应答”&#xff1f; 二、超时重传 1&#xff09;丢包的概念 2&#xff09;什么是超时重传&#xff1f; 3&#xff09…

【VMware】Windows安装MySQL(5.78版本)及网络配置---图文并茂详细介绍

一 安装MySQL准备工作 ① 连接虚拟机传输MySQL压缩包 先查看虚拟机中的地址 命令&#xff1a; ipconfig 主机连接 在主机连接虚拟机后&#xff0c;将mysql压缩包和Navicat安装包复制到虚拟机下即可 ②解压MySQL压缩包 ③ my文件拷贝mysql安装根目录下 如下图的第一步&…

vue-springboot基于JavaWeb的家装一体化商城平台guptn

针对用户需求开发与设计&#xff0c;该技术尤其在各行业领域发挥了巨大的作用&#xff0c;有效地促进了家装一体化的发展。然而&#xff0c;由于用户量和需求量的增加&#xff0c;信息过载等问题暴露出来&#xff0c;为改善传统线下管理中的不足&#xff0c;本文将提出一套基于…

IntelliJ IDEA常用快捷键

【1】创建内容&#xff08;新建&#xff09;&#xff1a;altinsert 【2】main方法&#xff1a;psvm 【3】输出语句&#xff1a;sout 【4】复制行&#xff1a;ctrld 【5】删除行&#xff1a;ctrly&#xff08;很多编辑器ctrly是前进操作&#xff0c;如果选择 Delete Line&…

Apollo自动驾驶:改变交通运输的游戏规则

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo缓存层2. 本地状态管理库3. 离线同步和冲突解决4. 离线数据同步和离线优先策略结论 &#x1f4f2;&#x1f50c; 构建离线应用&#xff1a;Apollo…

磁盘和文件系统管理

一&#xff1a;磁盘结构&#xff1a; 1.磁盘基础&#xff1a; 扇区固定大小&#xff0c;每个扇区4k。磁盘会进行磨损&#xff0c;损失生命周期。 设备文件&#xff1a; 一切皆文件 设备文件&#xff1a;关联至一个设备驱动程序&#xff0c;进而能够跟与之对应硬件设备进行通…

【2023】通过docker安装hadoop以及常见报错

&#x1f4bb;目录 1、准备2、安装镜像2.1、创建centos-ssh的镜像2.2、创建hadoop的镜像 3、配置ssh网络3.1、搭建同一网段的网络3.2、配置host实现互相之间可以免密登陆3.3、查看是否成功 4、安装配置Hadoop4.1、添加存储文件夹4.2、添加指定配置4.3、同步数据 5、测试启动5.1…

纯CSS的华为充电动画,它来了

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; Krpano专栏&#xff1a;想学Krpano的&#xff0c;冲 &#x1f514…

Linux文件类型

在 Linux 系统中&#xff1a; b 文件类型&#xff1a;代表块设备文件。块设备文件通常是对应于设备&#xff0c;如硬盘驱动器或其他块设备&#xff0c;使用块级别的 I/O 操作。 c 文件类型&#xff1a;代表字符设备文件。字符设备文件通常是对应于设备&#xff0c;如串口、键盘…

腾讯云轻量服务器8核16G18M带宽CPU流量性能测评

腾讯云轻量应用服务器8核16G18M带宽优惠价1668元15个月&#xff0c;折合每月111元&#xff0c;18M公网带宽下载速度峰值可达2304KB/秒&#xff0c;折合2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;免费3500GB月流量&#xff0c;折合每天116GB流量。腾讯云百科txybk.com…

性能手机新标杆,一加 Ace 3 发布会定档 1 月 4 日

12 月 27 日&#xff0c;一加宣布将于 1 月 4 日发布新品一加 Ace 3。一加 Ace 系列秉持「产品力优先」理念&#xff0c;从一加 Ace 2、一加 Ace 2V 到一加 Ace 2 Pro&#xff0c;款款都是现象级爆品&#xff0c;得到了广大用户的认可与支持。作为一加 2024 开年之作&#xff0…

重装系统以后无法git跟踪

总结&#xff1a;权限问题 故障定位 解决方案&#xff1a; 复制一份新的文件夹。&#xff08;新建的文件创建和写入权限都变了&#xff09; 修改文件为新的用户 执行提示的命令

Redis经典五大类型源码及底层实现(一)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

LINUX 抓包工具Tcpdump离线安装教程

本次教程基于内网环境无法访问网络使用安装包进行安装抓包工具 1、首先给大家看下一共有6个安装包&#xff0c;依次进行解压&#xff0c;包我就放到csdn上了&#xff0c;需要的可以联系我进行下载 2打包然后传到服务器任意一个目录下&#xff0c;进入到当前目录&#xff0c;然后…

阿赵UE学习笔记——5、创建关卡元素

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   之前介绍了从空白模板创建关卡&#xff0c;接下来尝试着在这个空白的世界里面&#xff0c;创建一些内容。 一、创建地面 1、创建面片作为地面 创建——形状——平面&#xff0c;可以创建一个面片 在细节面板设置合适的…

C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频

数据是当今数字时代的核心资源&#xff0c;但是从互联网上抓取数据并不容易。本文将教您如何利用C#编程艺术和Fizzler库高效爬取Twitter上的音频数据&#xff0c;让您轻松获取所需信息。 Twitter简介 Twitter是全球最大的社交媒体平台之一&#xff0c;包含丰富的音频资源。用…

【基于VirtualBox及openEuler20.03 TLS SP1编译openGauss2.1.0源码】

【openEuler 20.03 TLS编译openGauss2.1.0源码】 一、安装环境二、安装步骤 一、安装环境 项目Value虚拟机virtualbox操作系统openEuler 20.03 TLSopenGauss2.1.0openGauss-third_party2.1.0 二、安装步骤 以下操作需要在root用户下执行 编辑/etc/selinux/config vim /etc/s…

CentOS 7 实战指南:目录操作命令详解

写在前面 想要在 CentOS 7 系统下更高效地进行目录操作吗&#xff1f;不要犹豫&#xff0c;在这里我为你准备了一篇精彩的技术文章&#xff01;这篇文章将带您深入了解 CentOS 7 下目录操作相关命令的使用方法。无论您是新手还是有一定经验的用户&#xff0c;这篇文章都将为您…

企业计算机服务器中了360后缀勒索病毒如何处理,勒索病毒应对步骤

网络技术的应用与发展&#xff0c;为企业的生产运营提供了有力保障&#xff0c;但也为网络安全威胁埋下隐患。近期&#xff0c;网络上的勒索病毒非常嚣张&#xff0c;严重影响了企业的生产运营。近日&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服…

P1019 [NOIP2000 提高组] 单词接龙 刷题笔记

P1019 [NOIP2000 提高组] 单词接龙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路来自 大佬 Chardo 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 匹配 &#xff1a; 将 第一个字符串末尾 和第二个字符串第一个开始匹配 如果 j<i这段走完了 flag还没…