基于BASYS 2开发板的多功能数字钟Verilog程序

本文详述了使用EDA技术在BASYS 2开发板上设计一个多功能数字钟的过程,包括设定闹钟、12/24小时制切换、整点报时等功能。通过分频器、计数器、译码器等模块实现,并提供了仿真截图及实验感悟。
摘要由CSDN通过智能技术生成

写在最前:

纸上得来终觉浅,绝知此事要编程!

一、实验目的

用 EDA 技术设计多功能数字钟

  • 能够实现任意设定闹铃时间,到达闹钟时间时闹钟持续响一分钟

  • 能够对小时进行12/24进制切换,并用LED指示AM和PM

  • 整点报时,从整点零分一秒开始,奇数秒亮LED,偶数秒熄灭,几点钟LED闪烁几下。如果是12小时进制的显示情况下,需要按照24小时进制下面的计数进行报时,零点或者下午12点都需要报时24下,报时完毕LED熄灭

  • 利用ISE软件对其进行仿真,并给出各功能实现关键点的截图和解释

二、实验代码

//******************* my_Clock.v ***********************

module my_Clock(
    input CLK_50,            // 50MHz clock
     input nCR, EN,           // reset, enable
     input Adj_Min, Adj_Hour, // adjust signal of minute and hour

     input Set_Alarm,         // decide whether to set alarm clock
     input Set_Min, Set_Hour, // set signal of alarm clock
     output Clock,            // alarm control signal

     output [5:0] Second_B,   // binary code of second
     output [3:0] Bit,        // position
     output [7:0] Seg,        // number

     input Set_count,         // decide 12 counting or 24 counting 
     output AP,               // AM or PM

     output Int_time          // integral time accounce 
     );

    //============ Parameters =========================

    wire [7:0] Hour, Minute, Second;   // time
    supply1 Vdd;                       // logical true
    wire MinL_EN, MinH_EN, Hour_EN;    // enable signal
    wire CP_1Hz;                       // freq 1Hz
    wire CP_200Hz;                     // freq 100Hz
    wire [7:0] HEX2, HEX3, HEX4, HEX5;

    wire [7:0] C_Hour, C_Minute;       // clock time
    wire C_MinL_EN, C_MinH_EN;
    wire C_Hour_EN; 

    wire [7:0] B_Hour;                 // 12 counting 
    wire [7:0] CB_Hour;                // 12 counting for clock time
    wire [5:0] Hour_B;                 // binary code of 12 counting hour

    wire [5:0] Hour_24;

    //============ Divider50MHz ========================

    // divide 50MHz to 1Hz
    Divider50MHz U0 (.CLK_50M(CLK_50),
                          .nCLR(nCR),
                          .CLK_1Hzout(CP_1Hz));
    defparam U0.N = 25,
                U0.CLK_Freq = 50000000,
                U0.OUT_Freq = 1;

    // divide 50MHz to 100Hz
    Divider50MHzto100Hz X0 (.CLK_50M(CLK_50),
                                    .nCLR(nCR),
                                    .CLK_200Hzout(CP_200Hz));
    defparam X0.N = 25,
                X0.CLK_Freq = 50000000,
                X0.OUT_Freq = 200;


    //========== Hour & Minute & Second counter ========

    // Second counter
    counter10 S0 (Second[3:0], nCR, EN, CP_1Hz);
    counter6  S1 (Second[7:4], nCR, (Second[3:0] == 4'h9), CP_1Hz);
    // Change Second to binary code
    change_B  S2 (Second[7:0], Second_B[5:0]);

    // Minute counter
    counter10 M0 (Minute[3:0], nCR, MinL_EN, CP_1Hz);
    counter6  M1 (Minute[7:4], nCR, MinH_EN, CP_1Hz);
    // assign enable signal
    assign MinL_EN = Adj_Min?Vdd:(Second == 8'h59);       // we can adjust M0 by using Adj_Min
    assign MinH_EN = (Adj_Min && (Minute[3:0] == 4'h9))   // the conditions which add 1 to M1
                      || ((Minute[3:0] == 4'h9) && (Second == 8'h59));

    // Hour counter (24 counting)
    counter24 H0(Hour[7:4], Hour[3:0], nCR, Hour_EN, CP_1Hz);
    // Hour counter (12 counting)
    counter12 P0(B_Hour[7:4], B_Hour[3:0], nCR, Hour_EN, CP_1Hz);
    // assign enable signal
    assign Hour_EN = Adj_Hour?Vdd:((Minute == 8'h59) && (Second == 8'h59));

    // AM or PM 
    // initial AP = 0;
    change_B  S3 (Hour[7:0], Hour_B[5:0]);     // change hour to be binary code
    assign AP = (Hour_B > 5'b01011)?0:1;       // AM: AP = 1   PM: AP = 0


    //============ Set Alarm clock ======================

    // Minute counter
    counter10 M2 (C_Minute[3:0], nCR, C_MinL_EN, CP_1Hz);
    counter6  M3 (C_Minute[7:4], nCR, C_MinH_EN, CP_1Hz);
    // assign enable signal
    assign C_MinL_EN = (Set_Min && Set_Alarm);
    assign C_MinH_EN = (Set_Min && (C_Minute[3:0] == 4'h9) && Set_Alarm);

    // Hour counter (24 counting)
    counter24 H1(C_Hour[7:4], C_Hour[3:0], nCR, C_Hour_EN, CP_1Hz);
    // Hour counter (12 counting)
    counter12 P1(CB_Hour[7:4], CB_Hour[3:0], nCR, C_Hour_EN, CP_1Hz);
    // assign enable signal
    assign C_Hour_EN = 
  • 9
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: 多功能数字钟Verilog程序是一个用Verilog语言编写的模拟数字钟程序数字钟通常具有显示时间、日期、闹钟功能等多个功能。 首先,该程序需要使用Verilog定义几个模块:时钟模块、显示模块、日期模块和闹钟模块。 时钟模块用于生成数字钟的数据,它包括时、分、秒和毫秒等信息。该模块可以使用Verilog中的计数器来实现,可以通过信号调整时钟的频率。 显示模块用于显示时钟的数据,它包括数码管和显示控制逻辑。数码管通常由七段显示器组成,每个显示器可以显示0到9的数字。显示控制逻辑决定哪个数码管显示哪个数字。 日期模块用于显示日期信息,它包括年、月和日等信息。日期信息可以通过时钟模块更新,并通过显示模块显示出来。 闹钟模块用于定时提醒,它包括闹钟启动时间和闹钟结束时间等信息。闹钟可以由用户设定,并在设定时间到达时通过显示模块进行提醒。 在主模块中,需要实例化以上模块并进行连接。可以通过按键输入设置时间和日期,设置闹钟启动时间等。 总之,多功能数字钟Verilog程序实现了数字钟的多项功能,包括时间、日期显示和闹钟设置。通过合理设计模块、连接模块和用户交互,可以实现一个完整的数字钟程序。 ### 回答2: 多功能数字钟Verilog程序是一个使用Verilog编程语言实现的数字钟功能的电路程序数字钟是一种便携式设备,可以显示时间,并具有多种功能,如闹钟、定时器、计时器等。 该Verilog程序主要包括以下几个模块: 1. 时钟模块:该模块通过计数器实现了时钟的功能。它会不断地计数并更新时间,以保持时间的准确性。可以根据实际需要设置时钟的精度。 2. 显示模块:该模块通过将时钟模块的输出值转换为可识别的数字,以在数码管上显示当前时间。它会根据时钟模块的输出值,将其转换为具体的时间格式,并将其显示在数码管上。 3. 闹钟模块:该模块用于设置闹钟并在设定的时间响铃。它可以接收用户输入的闹钟时间,并在设置的时间到达时,触发蜂鸣器或发出提示音。 4. 定时器模块:该模块可以通过用户输入的时间间隔来设置定时器。当定时器倒计时完成时,它可以触发蜂鸣器或发出提示音。 5. 计时器模块:该模块可以通过用户的启动和停止命令来实现计时功能。它会记录从启动到停止的时间,并将其显示在数码管上。 通过使用这些模块,我们可以实现一个具有多功能数字钟。用户可以设置闹钟、定时器和计时器,并通过显示模块将时间显示在数码管上。 希望这个回答对你有帮助。 ### 回答3: 多功能数字钟是一种能够显示时间、日期和闹钟功能的时钟设备。它由多个部分组成,在verilog程序中可以通过不同的模块实现。 首先,我们需要一个时钟模块,它负责计时和显示时间。这个模块使用一个时钟信号作为输入,并根据需要的精度进行计数。它可以包含一个计数器和一个显示器,用于将时间显示在数字面板上。 其次,我们需要一个日期模块,它负责计算和显示日期。它可以包含一个日历计算器和一个显示器,可以根据当前的时间信息计算出正确的日期,并将其显示在数字面板上。 最后,我们需要一个闹钟模块,它负责设置和触发闹钟。这个模块包含一个设置器和一个触发器。设置器可以接收用户的输入,并根据用户的设置来设置闹钟时间。触发器会在闹钟时间到达时触发警报,并将其显示在数字面板上。 以上是多功能数字钟的主要模块。在verilog程序中,我们可以编写每个模块的相关代码,并将它们连接在一起形成完整的数字钟设计。在设计完毕后,我们可以通过仿真器来验证程序的正确性,然后将程序下载到FPGA开发板上进行实际的测试。 总结起来,多功能数字钟verilog程序实现了时间、日期和闹钟功能的整合。这种设计需要使用多个模块来完成不同的任务,并将它们连接在一起来实现完整的数字钟系统。通过编写适当的代码和进行验证测试,我们可以确保数字钟程序的正确性和稳定性。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值