quartus2简易数字时钟设计基本要求:能够正确显示时、分、秒,并有校时、半点报时和整点报时功能代码
时间: 2024-05-13 20:19:41 浏览: 263
基于vhdl硬件描述语言设计数字时钟交通灯LCD12864液晶显二进制转BCD码等示quartus工程实验例程代码合集(22个)
5星 · 资源好评率100%
下面是一个简单的数字时钟设计,实现了基本要求:
```verilog
module digital_clock(
input clk, // 时钟信号
input rst, // 复位信号
input [1:0] set_mode, // 设置模式,00 表示正常显示,01 表示校时模式,10 表示半点报时,11 表示整点报时
output reg [3:0] hour, // 时
output reg [3:0] minute, // 分
output reg [3:0] second // 秒
);
reg [3:0] cnt_1s = 0; // 计数器,用于计算秒数
reg [3:0] cnt_1m = 0; // 计数器,用于计算分钟数
reg [3:0] cnt_1h = 0; // 计数器,用于计算小时数
always @(posedge clk) begin
if (rst) begin // 复位
cnt_1s <= 0;
cnt_1m <= 0;
cnt_1h <= 0;
hour <= 4'b0000;
minute <= 4'b0000;
second <= 4'b0000;
end else begin
cnt_1s <= cnt_1s + 1; // 秒计数器加 1
if (cnt_1s == 10) begin // 每秒钟计数器到达 10,说明一秒钟已经过去了
cnt_1s <= 0;
second <= second + 1; // 秒数加 1
if (second == 10) begin // 秒数到达 10,进位到分钟
second <= 0;
cnt_1m <= cnt_1m + 1; // 分钟计数器加 1
if (cnt_1m == 6) begin // 每分钟计数器到达 6,说明一分钟已经过去了
cnt_1m <= 0;
minute <= minute + 1; // 分钟数加 1
if (minute == 10) begin // 分钟数到达 10,进位到小时
minute <= 0;
cnt_1h <= cnt_1h + 1; // 小时计数器加 1
if (cnt_1h == 6) begin // 每小时计数器到达 6,说明一小时已经过去了
cnt_1h <= 0;
hour <= hour + 1; // 小时数加 1
if (hour == 10'h24) begin // 小时数到达 24,归零
hour <= 4'b0000;
end
end
end
end
end
end
end
case (set_mode) // 根据设置模式输出相应信息
2'b00: ; // 正常显示,不需要输出任何信息
2'b01: begin // 校时模式,将当前时间输出到数码管上
hour <= 4'b0000;
minute <= 4'b0000;
second <= 4'b0000;
end
2'b10: begin // 半点报时
if (minute == 4'h0 or minute == 4'h30) begin
// 当前是整点或半点,输出小时数和"点"字
case (hour)
4'h0: begin hour <= 4'h12; end
4'h1: begin hour <= 4'h01; end
4'h2: begin hour <= 4'h02; end
4'h3: begin hour <= 4'h03; end
4'h4: begin hour <= 4'h04; end
4'h5: begin hour <= 4'h05; end
4'h6: begin hour <= 4'h06; end
4'h7: begin hour <= 4'h07; end
4'h8: begin hour <= 4'h08; end
4'h9: begin hour <= 4'h09; end
4'hA: begin hour <= 4'h10; end
4'hB: begin hour <= 4'h11; end
default: begin hour <= 4'bxxxx; end
end
minute <= 4'b0110; // "点"字用 0110 表示
second <= 4'bxxxx;
end else begin
// 不是整点或半点,不需要输出任何信息
hour <= 4'bxxxx;
minute <= 4'bxxxx;
second <= 4'bxxxx;
end
end
2'b11: begin // 整点报时
if (minute == 4'h0) begin
// 当前是整点,输出小时数和"点"字
case (hour)
4'h0: begin hour <= 4'h12; end
4'h1: begin hour <= 4'h01; end
4'h2: begin hour <= 4'h02; end
4'h3: begin hour <= 4'h03; end
4'h4: begin hour <= 4'h04; end
4'h5: begin hour <= 4'h05; end
4'h6: begin hour <= 4'h06; end
4'h7: begin hour <= 4'h07; end
4'h8: begin hour <= 4'h08; end
4'h9: begin hour <= 4'h09; end
4'hA: begin hour <= 4'h10; end
4'hB: begin hour <= 4'h11; end
default: begin hour <= 4'bxxxx; end
end
minute <= 4'b0110; // "点"字用 0110 表示
second <= 4'bxxxx;
end else begin
// 不是整点,不需要输出任何信息
hour <= 4'bxxxx;
minute <= 4'bxxxx;
second <= 4'bxxxx;
end
end
default: ; // 没有设置模式,不需要输出任何信息
endcase
end
endmodule
```
该设计使用了三个计数器和三个寄存器,分别用于计算秒、分、时,以及保存当前时间。在每个时钟周期中,先判断是否复位,如果是,则将所有计数器和寄存器清零,时间归零。否则,秒计数器加 1,如果计数器到达 10,说明一秒钟已经过去了,秒数加 1,如果秒数到达 10,进位到分钟,以此类推。在每个时钟周期中,根据设置模式输出相应信息。如果是正常显示模式,则不需要输出任何信息;如果是校时模式,则将当前时间输出到数码管上;如果是半点报时模式,则判断当前是否是整点或半点,如果是,则输出小时数和"点"字;如果是整点报时模式,则判断当前是否是整点,如果是,则输出小时数和"点"字。注意,"点"字用 0110 表示。
阅读全文