📄 dispcontrol.v
字号:
//模块:数码管显示控制模块
//功能:不同模式下控制数码管的显示输出,需要时加上数字的闪烁
//输入:Mode,SetSel加上所有要显示的数字
//输出:8个数码显示,两个一组:[7:0]D87,D65,D43,D21,D87,D65,D43的三个点号[4:2]Dots
`timescale 1ns / 100ps
module DispControl
(Clk2Hz,Clk512Hz,Reset,Mode,SetSel,SetSelKey,SetKey,IsFastAdjust,
IsHour12,AM,Hour12,Hour,Min,Sec,
YMD,Weekday,
AAM,AHour12,AHour,AMin,
StopWatch,//Stop watch
Digital,LightOn) ;
// ------------ Port declarations --------- //
input Clk2Hz,Clk512Hz,Reset,IsHour12,AM,AAM,SetSelKey,SetKey,IsFastAdjust;
input [1:0]Mode;
input [2:0]SetSel;
input [4:0]Hour12,AHour12;
input [5:0]Hour,AHour;
input [6:0]Min,Sec,AMin;
input [23:0]YMD;
input [2:0]Weekday;
input [31:0]StopWatch;
output [3:0]Digital;
reg [3:0]Digital;
output [7:0] LightOn;
reg [7:0]T21,T43,T65,T87;//temp digital to display
parameter DANGLE4=4'h0;
parameter DANGLE8=8'h00;
wire [3:0] AMDisp =IsHour12? (AM ? 4'ha:4'hb) : 0; //AM:A PM:B
wire [3:0]AAMDisp =IsHour12?(AAM ? 4'ha:4'hb) : 0;
wire [7:0] HourDisp =IsHour12? {3'h0, Hour12} : {2'h0, Hour};
wire [7:0] AHourDisp =IsHour12? {3'h0, AHour12} : {2'h0, AHour};
wire [15:0]MinSecDisp={1'b0,Min ,1'b0,Sec};
wire [31:0]TimeDisp ={HourDisp ,MinSecDisp,DANGLE4,AMDisp};
wire [31:0]AlarmDisp={AHourDisp,1'b0,AMin,DANGLE8,DANGLE4,AAMDisp};
wire [31:0]CalendarDisp={YMD,5'b0,Weekday};
wire [7:0] ScanCode;
reg [7:0] LEDEnable;
reg [7:0] Blink;
RingCounter #(8) U_RingCounter8(.Reset(Reset),.Clk(Clk512Hz),.CE(1'b1),.Count(ScanCode));
always @(LightOn ,T87,T65,T43,T21)
case (LightOn)
8'h01: Digital<= T21[3:0];
8'h02: Digital<= T21[7:4];
8'h04: Digital<= T43[3:0];
8'h08: Digital<= T43[7:4];
8'h10: Digital<= T65[3:0];
8'h20: Digital<= T65[7:4];
8'h40: Digital<= T87[3:0];
8'h80: Digital<= T87[7:4];
default:Digital<= 4'hF;
endcase
assign LightOn=(ScanCode & LEDEnable &(Blink |{8{Clk2Hz}}));
always @(Mode,SetSel,SetSelKey,SetKey,TimeDisp,CalendarDisp,AlarmDisp,StopWatch,IsHour12,IsFastAdjust)
if(Mode==2'b01)
begin //Stop Watch
{T87,T65,T43,T21}<=StopWatch;
LEDEnable<=8'b1111_1111;
Blink<=8'b1111_1111;
end
else if(Mode==2'b10)
begin //Time and calendar Set
if(SetSel[2]) {T87,T65,T43,T21}<=CalendarDisp;
else {T87,T65,T43,T21}<=TimeDisp;
case (SetSel[2:0])
0: begin //hour
Blink<=IsFastAdjust ? 8'b1111_1111 : 8'b0011_1111;
LEDEnable<={7'b111_1110,((IsHour12)?1'b1:1'b0)};
end
1: begin //minute
Blink<=IsFastAdjust ? 8'b1111_1111 : 8'b1100_1111;
LEDEnable<={7'b111_1110,((IsHour12)?1'b1:1'b0)};
end
2: begin //second
Blink<=IsFastAdjust ? 8'b1111_1111 : 8'b1111_0011;
LEDEnable<={7'b111_1110,((IsHour12)?1'b1:1'b0)};
end
3: begin Blink<=8'b1111_1110;LEDEnable<=8'b1111_1101;end//24-12
4: begin //year
Blink<=IsFastAdjust ? 8'b1111_1111 : 8'b1011_1111;
LEDEnable<=8'b1111_1101;
end
5: begin //month
Blink<=IsFastAdjust ? 8'b1111_1111 : 8'b1100_1111;
LEDEnable<=8'b1111_1101;
end
6: begin //day
Blink<=IsFastAdjust ? 8'b1111_1111 : 8'b1111_0011;
LEDEnable<=8'b1111_1101;
end
default: begin Blink<=8'b1111_1111; LEDEnable<=8'b1111_1101;end
endcase
end
else if(Mode==2'b11)
begin //Alarm Set
{T87,T65,T43,T21}<=AlarmDisp;
LEDEnable<={7'b111_1000,((IsHour12)?1'b1:1'b0)};
case (SetSel[1:0])
0: Blink<=IsFastAdjust ? 8'b1111_1111 : 8'b0011_1111;
1: Blink<=IsFastAdjust ? 8'b1111_1111 : 8'b1100_1111;
default:Blink<=8'b1111_1111;
endcase
end
else //default
begin //display only
if(SetSelKey) //show Calendar
begin
{T87,T65,T43,T21}<=CalendarDisp;
LEDEnable<=8'b1111_1101;
end
else if(SetKey) //show alarm time
begin
{T87,T65,T43,T21}<=AlarmDisp;
LEDEnable<={7'b111_1000,((IsHour12)?1'b1:1'b0)};
end
else
begin
{T87,T65,T43,T21}<=TimeDisp;
LEDEnable<={7'b111_1110,((IsHour12)?1'b1:1'b0)};
end
Blink<=8'b1111_1111;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -