📄 led.v
字号:
// **********************************************************************************
// FileName :led.v
//
// Discription :显示模块
//
// Date :
//
// Author : dandan
// **********************************************************************************
module led(glbclk,clk_1000,clk_100,clk_1,reset,mode,screen_mode,mode_time,mode_date,mode_clock,
year_count,month_count,day_count,hour_count,minute_count,sec_count,
clock_h_count,clock_m_count,sec_m_count,sec_s_count,sec_ms_count,
alm_light_on,o_light_on,led_scan,led_out);
input glbclk,clk_1000,clk_100,clk_1;
input reset;
input alm_light_on,o_light_on;
input [5:0] mode;
input [2:0] mode_time,mode_date,mode_clock;
input [1:0] screen_mode;
input [7:0] year_count,month_count,day_count,hour_count,minute_count,sec_count;
input [7:0] clock_h_count,clock_m_count,sec_m_count,sec_s_count,sec_ms_count;
inout [5:0] led_scan;
output [7:0] led_out; // led_out [7] : dp
// [6] : a
// [5] : b
// [4] : c
// [3] : d
// [2] : e
// [1] : f
// [0] : g
parameter led_out_0=7'b1111110,
led_out_1=7'b0110000,
led_out_2=7'b1101101,
led_out_3=7'b1111001,
led_out_4=7'b0110011,
led_out_5=7'b1011011,
led_out_6=7'b1011111,
led_out_7=7'b1110000,
led_out_8=7'b1111111,
led_out_9=7'b1111011;
//主状态机
parameter Time_screen=6'b000_001, //时间正常显示
Time_set=6'b000_010, //设置时间
Date_set=6'b000_100, //设置日期
Clock_set=6'b001_000, //设置闹钟
Sec_clock=6'b010_000, //秒表
O_light_set=6'b100_000; //设置整点报时
//显示状态机
parameter Screen_clock=2'b01, //显示闹钟
Screen_date=2'b10; //显示日期
//设置时间状态机
parameter Hour_set=3'b100, //设置小时
Minute_set=3'b010, //设置分钟
Sec_set=3'b001; //设置秒
//设置日期状态机
parameter Day_set=3'b001, //设置日子
Month_set=3'b010, //设置月
Year_set=3'b100; //设置年
//设置闹钟状态机
parameter Clock_on=3'b100, //设置闹钟开关
Clock_hour=3'b010, //设置闹钟的小时
Clock_minute=3'b001; //设置闹钟的分钟
//调用bcd码转换器
wire [3:0] input1,input2,input3,input4,input5,input6;
reg [7:0] led1,led2,led3;
//调用scan
wire [5:0] led_scan;
wire [3:0] led_bcd;
wire led1_shine,led2_shine,led3_shine;
reg [7:0] led_out;
//显示的内容
always @(posedge clk_1000)
begin
if(reset)
begin
led1<=0;
led2<=0;
led3<=0;
end
else
begin
if(((mode==Time_screen)&&(!screen_mode))||(mode==Time_set))
begin
led1<=hour_count; //当显示时间和设置时间时
led2<=minute_count;
led3<=sec_count;
end
else if((screen_mode==Screen_date)&&(mode==Time_screen)||(mode==Date_set))
begin
led1<=year_count; //当显示日期和设置日期时
led2<=month_count;
led3<=day_count;
end
else if((mode==Clock_set)||((mode==Time_screen)&&(screen_mode==Screen_clock))||(mode==O_light_set))
begin //当显示闹钟和设置闹钟,设置整点报时时
if(alm_light_on&&o_light_on) led1<=11;//闹钟和整点报时都开启
else if(alm_light_on) led1<=10;//只有闹钟开启
else if(o_light_on) led1<=01;//只有整点报时开启
else led1<=0; //都未开启
led2<=clock_h_count;
led3<=clock_m_count;
end
else if(mode==Sec_clock)
begin
led1<=sec_m_count; //当显示秒表时
led2<=sec_s_count;
led3<=sec_ms_count;
end
end
end
//小数点的显示
always@(led_scan)
begin
if(reset)
led_out[7]=1'b0;
else
begin
if(!led_scan[2]||!led_scan[4]) //当显示第2位和第4位时,显示小数点
led_out[7]=1'b1;
else led_out[7]=1'b0; //否则不显示
end
end
//led的显示
//当设置时间小时,设置日期年,设置闹钟开关,设置整点报时开关时,高2位闪烁
assign led1_shine=((mode==Time_set&&mode_time==Hour_set)||(mode==Date_set&&mode_date==Year_set)||(mode==Clock_set&&mode_clock==Clock_on)||(mode==O_light_set))&&(!led_scan[4]||!led_scan[3]);
//当设置时间分钟,设置日期月,设置闹钟小时时,中间2位闪烁
assign led2_shine=((mode==Time_set&&mode_time==Minute_set)||(mode==Date_set&&mode_date==Month_set)||(mode==Clock_set&&mode_clock==Clock_hour))&&(!led_scan[2]||!led_scan[1]);
//当设置时间秒,设置日期天,设置闹钟分钟时,低2位闪烁
assign led3_shine=((mode==Time_set&&mode_time==Sec_set)||(mode==Date_set&&mode_date==Day_set)||(mode==Clock_set&&mode_clock==Clock_minute))&&(!led_scan[5]||!led_scan[0]);
always @ (led_scan)
begin
if (reset) led_out[6:0] = 7'b0000_000;
else
begin
if(led1_shine||led2_shine||led3_shine) //当闪烁时
begin
if(clk_1) //半秒显示
begin
case(led_bcd)
4'd0: led_out[6:0]=led_out_0;
4'd1: led_out[6:0]=led_out_1;
4'd2: led_out[6:0]=led_out_2;
4'd3: led_out[6:0]=led_out_3;
4'd4: led_out[6:0]=led_out_4;
4'd5: led_out[6:0]=led_out_5;
4'd6: led_out[6:0]=led_out_6;
4'd7: led_out[6:0]=led_out_7;
4'd8: led_out[6:0]=led_out_8;
4'd9: led_out[6:0]=led_out_9;
endcase
end
else led_out[6:0]=0; //半秒显示"none"
end
else
begin
case(led_bcd) //否则正常显示
4'd0: led_out[6:0]=led_out_0;
4'd1: led_out[6:0]=led_out_1;
4'd2: led_out[6:0]=led_out_2;
4'd3: led_out[6:0]=led_out_3;
4'd4: led_out[6:0]=led_out_4;
4'd5: led_out[6:0]=led_out_5;
4'd6: led_out[6:0]=led_out_6;
4'd7: led_out[6:0]=led_out_7;
4'd8: led_out[6:0]=led_out_8;
4'd9: led_out[6:0]=led_out_9;
endcase
end
end
end
////////////////////////////////////////////////////////////////////////////////////////////////////////////
binary_to_BCD b2b1(.clk_i(glbclk),.rst_i(reset),.A(led3),.ONES(input1),.TENS(input2));
binary_to_BCD b2b2(.clk_i(glbclk),.rst_i(reset),.A(led2),.ONES(input3),.TENS(input4));
binary_to_BCD b2b3(.clk_i(glbclk),.rst_i(reset),.A(led1),.ONES(input5),.TENS(input6));
scan s(.clk_1000(clk_1000),.reset(reset),.input1(input1),.input2(input2),.input3(input3),.input4(input4),
.input5(input5),.input6(input6),.led_scan(led_scan),.led_bcd(led_bcd));
////////////////////////////////////////////////////////////////////////////////////////////////////////////
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -