• 正文
  • 相关推荐
申请入驻 产业图谱

带闹钟可调时间的数字时钟系统的设计Verilog代码Quartus仿真

12/16 13:45
250
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:带闹钟可调时间的数字时钟系统的设计Verilog代码ISE仿真

软件:Xilinx ISE

语言:Verilog

代码功能:

本项目实现了一个完整的数字时钟系统,具有以下功能:

- 实时时钟显示:时、分、秒的实时显示

- 时间设置功能:支持时、分、秒的独立设置

- 闹钟功能:可设置闹钟时间,到达时间时触发提醒

- 按键控制:通过按键实现时间设置和功能切换

- BCD转换:二进制到BCD码的实时转换

代码实现思路:

系统采用分频器将高频时钟转换为秒脉冲,通过计数器实现时间计数:

1. 时钟分频:将50MHz系统时钟分频为1Hz秒脉冲

2. 时间计数:秒、分、时分别计数,实现进位逻辑

3. BCD转换:将二进制时间转换为BCD码用于显示

4. 按键处理:实现按键消抖和功能控制

系统工作流程:

系统时钟 → 分频器 → 秒计数器 → 分计数器 → 时计数器 → BCD转换 → 数码管显示

代码结构:

项目采用模块化设计,主要模块包括:

- Digital_clock:顶层模块,系统集成

- BCD:二进制到BCD码转换模块

- 分频器模块:时钟分频和脉冲生成

- 计数器模块:时、分、秒计数

- 显示控制模块:数码管驱动

部分代码:

 

// 数字时钟顶层模块
module Digital_clock(
    input clk,           // 50MHz系统时钟
    input rst,           // 复位信号
    input set_hour,      // 设置小时
    input set_minute,    // 设置分钟
    input set_second,    // 设置秒钟
    output [7:0] seg,    // 数码管段选
    output [5:0] dig     // 数码管位选
);

wire clk_1hz;           // 1Hz时钟
wire [5:0] hour;        // 小时(二进制)
wire [5:0] minute;      // 分钟(二进制)
wire [5:0] second;      // 秒钟(二进制)
wire [3:0] hour_ten;    // 小时十位(BCD)
wire [3:0] hour_unit;   // 小时个位(BCD)
wire [3:0] min_ten;     // 分钟十位(BCD)
wire [3:0] min_unit;    // 分钟个位(BCD)
wire [3:0] sec_ten;     // 秒钟十位(BCD)
wire [3:0] sec_unit;    // 秒钟个位(BCD)

// 时钟分频模块
clk_divider u_clk_divider(
    .clk_50m(clk),      // 50MHz输入
    .rst(rst),          // 复位
    .clk_1hz(clk_1hz)   // 1Hz输出
);

// 时间计数模块
time_counter u_time_counter(
    .clk_1hz(clk_1hz),  // 1Hz时钟
    .rst(rst),          // 复位
    .set_hour(set_hour), // 设置小时
    .set_minute(set_minute), // 设置分钟
    .set_second(set_second), // 设置秒钟
    .hour(hour),        // 小时输出
    .minute(minute),    // 分钟输出
    .second(second)     // 秒钟输出
);

// BCD转换模块
BCD u_bcd_hour(
    .bin(hour),         // 二进制输入
    .ten(hour_ten),     // 十位输出
    .unit(hour_unit)    // 个位输出
);

BCD u_bcd_minute(
    .bin(minute),       // 二进制输入
    .ten(min_ten),      // 十位输出
    .unit(min_unit)     // 个位输出
);

BCD u_bcd_second(
    .bin(second),       // 二进制输入
    .ten(sec_ten),      // 十位输出
    .unit(sec_unit)     // 个位输出
);

// 显示控制模块
display_controller u_display(
    .clk(clk),          // 系统时钟
    .hour_ten(hour_ten), // 小时十位
    .hour_unit(hour_unit), // 小时个位
    .min_ten(min_ten),  // 分钟十位
    .min_unit(min_unit), // 分钟个位
    .sec_ten(sec_ten),  // 秒钟十位
    .sec_unit(sec_unit), // 秒钟个位
    .seg(seg),          // 段选输出
    .dig(dig)           // 位选输出
);

endmodule

// BCD转换模块
module BCD(
    input [5:0] bin,    // 6位二进制输入
    output reg [3:0] ten,  // BCD十位
    output reg [3:0] unit  // BCD个位
);

always @(*)
begin
    if (bin < 10)
    begin
        ten = 4'b0000;
        unit = bin[3:0];
    end
    else if (bin < 20)
    begin
        ten = 4'b0001;
        unit = bin - 6'd10;
    end
    else if (bin < 30)
    begin
        ten = 4'b0010;
        unit = bin - 6'd20;
    end
    else if (bin < 40)
    begin
        ten = 4'b0011;
        unit = bin - 6'd30;
    end
    else if (bin < 50)
    begin
        ten = 4'b0100;
        unit = bin - 6'd40;
    end
    else
    begin
        ten = 4'b0101;
        unit = bin - 6'd50;
    end
end

endmodule

 

【来源:www.hdlcode.com

相关推荐

登录即可解锁
  • 海量技术文章
  • 点点互娱官网入口下载
  • 产业链客户资源
  • 写文章/发需求
立即登录
Baidu
map