TAG - F P G A 、 V e r i l o g 、课程设计、 5 C S E M A 5 F 31 C 6 、电子万年历 FPGA、Verilog、课程设计、5CSEMA5F31C6、电子万年历 FPGA、Verilog、课程设计、5CSEMA5F31C6、电子万年历
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);
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
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
always@(turn_state or switch_state or rst_n)
begin
if(!rst_n)