精华内容
下载资源
问答
  • 基于单片机的多功能数字时钟设计
    千次阅读
    2020-09-24 20:20:49

    文末下载完整资料

    二 硬件系统方案设计
    2.1电话拨号防盗报警器硬件系统方案
    2.1.1 硬件系统方案设计
       图2.1为电话拨号报警器的系统构成方框图,由单片机控制器、键盘输入、数码管显示、触发电路、拨号电路及电源等6部分组成。
       单片机控制器是整个系统的核心,负责控制检测输入/输出显示、模拟摘机、拨号摘机、拨号报警、挂机等一系列的程序动作。这里使用了小引脚、高性能、低价位的AT89S2052。
       键盘输入电路负责输入电片机中一系列工作参数及功能设定。
       发光二极管数码管显示器在整个系统工作过程中充当一个简单的人机界面,用以显示工作状况及输入/输出的数据等。
       电话拨号防盗报警器的触发电路用磁性开关(门磁开关),简单可靠,也可用红外探测器或无线门磁,以实现全方位远距离监测。报警器应采用隐蔽安装,防止小偷发现。
       拨号及报警电路用来完成模拟摘机、拨号、发出报警音、挂机等工作过程,它的工作由单片机控制。
      &emsp电源部分负责对整个系统供电。平时由电话线上取得工作电流并对后备电池充电,拨号报警时转由后备电池供电。
    在这里插入图片描述
    2.1.2 脉冲拨号原理
       脉冲拨号是目前电话机两种拨号方式中的一种,另一种为双音多频拨号方式。
       脉冲拨号就是指在电话机上拨入的电话号码以脉冲个数的形式发出,也就是说,在已经通以直流电流的回路上,利用拨号盘及发号电路将回路断开、再接通而形成的脉冲信号,来完成输入电话号码的发送。在操作中,若用户拨1,则送出1个脉冲,回路中断一次、接通一次;拨2,则发出2个脉冲,回路断一次、接通一次、再断一次;……;而拨0时,则发出10个脉冲,回路断、接通轮流10次。图2.2为电话号码“32”的脉冲波形。
    在这里插入图片描述
       正常拨号时,电路电流中断的时间一般在58~65ms之间,视断续比的不同而不同。快速拨号时,只要取一半时间即可。电路电流接通的时间(即在同一位号码中的2个断脉冲之间的接通电流时间)约在32~42ms之间,视断续比的不同而不同。快速拨号时,只要取一半时间即可。显然脉冲周期等于脉冲中断时间和脉冲接通时间之和,每一个周期的时间为100ms左右。快速拨号时,在50ms左右。2位号码(即2组脉冲串)之间的最小时间间隔,通常为800ms左右;而快速拨号时,其值减半,为400ms左右。
       我国目前采用的电话脉冲拨号的速率是10PPS(每秒的脉冲数),即每秒发出10个脉冲,因此上述各参数不存在快速拨号时的值。
       为了提高拨号的可靠性及稳定性,这里设计时选定更低的脉冲拨号速率:1个脉冲代表播出1,2个脉冲代表拨出2,……,10个脉冲代表拨出0,每个脉冲的宽度和间隔为100ms。工作时首先进行模拟摘机,然后开始脉冲拨号,拨出1位号码后停顿500ms(保持接通)再拨下一位,直至全部拨完后再发报警音,……,最后挂机。
    2.1.3 脉冲拨号实现过程
       图2.3为脉冲拨号的实现电路。平时电话线上的电压约为50~60V左右。未拨号时电片机的P3.0、P3.1 均输出低电平。
    拨号过程如下:
       ①单片机的P3.0输出高电平,使TR1导通,由于电话线路上接入了负载R1,这样电话线的电压下降,模拟摘机。
       ②单片机的P3.0开始输出拨号脉冲,使电话线的电压(电平)也呈高、低变化。1个脉冲代表拨出1,2个脉冲代表拨出2,……,10个脉冲代表拨出0,每个脉冲的宽度和间隔均为100ms。拨出1位号码后停顿500ms(保持P3.0高电平)再拨下一位,直至全部拨完。
       ③P3.0 保持高电平(保持电话线路接通),P3.1输出1KHz的报警音脉冲驱动TR2,以2Hz进行调制(即接通1kHz信号0.5s、断开1kHz信号0.5s),这样从接听方的电话中就会听到“嘟、嘟……”的报警声。报警音的时间根据设计为60s。
       ④60后,P3.1输出低电平,TR2 截止,停止报警。随后P3.0也输出低电平,模拟挂机。完成一次报警过程。
    在这里插入图片描述

    2.2 时钟计时器的硬件设计方案论证分析
    2.2.1 功能要求
       时钟计时器要求用六位LED数码管显示时、分、秒、以二十四小时方式运行,使用按键开关实现时,分调整功能。
    2.2.2 方案论证
       为实现LED显示器的数字显示,可以采用静态显示法和动态显示法。由于静态显示法需要数据锁存器等硬件,接口复杂一些,考虑到时钟显示只有六位,且系统没有其它复杂的处理任务,所以决定用动态扫描实现LED显示。单片机采用易购的AT89S52系列,这种单片机可具有足够的空余硬件资源,以实现其它的扩充功能。若使用电池供电,可采用低电压的LV系列单片机时钟计时器电路系统的总体设计框架如图3.1所示。
    在这里插入图片描述
    2.2.3 系统硬件电路设计
       电话拨号防盗报警器的硬件电路设计描述
       为了发挥电片机强大的计算、控制能力,充分发挥软件的优势,这里极大地简化了电路,但可实现以前需要几片甚至十几片小规模数字电路才能完成的任务。
       电路原理如图所示,共有4个按键,即rst、ok、up、set。
       rst:系统复位键。
       ok:输入数据确认键。
       up:显示的数字增加键。
       set:工作模式设定键,可设定管机、工作、输入时间t1、输入时间t2及输入电话号码5种模式。
       磁性开关即为装于门或窗口的防盗感应开关,门关闭时常开,门打开时闭合接通。当然也可改用其他的感应器件,如激光探测、超声波感应、热释电感应、主动红外线探测或无线门磁等,以实现全方位远距离检测。为了防止磁性开关离控制器较远而产生引入干扰,使用了光耦作信号传递,效果良好。LED数码管用于工作状态指示或输入数据指示。L1、L2接电话线,ZND为击穿电压120V的压敏二极管,防止电路受雷电干扰。平时系统处于低功耗待机状态(此时耗电仅2mA左右),由电话线上取电工作,并对3.6V/60mA镍铬电池充电,当输入数据进行设定或进行拨号报警时,耗电会达到10mA,这时主要由镍铬电池供电。由于有镍铬电池后备供电,即使电话线断电也不会使已输入的数据丢失。该机除用于防盗报警外,若对软件进行一些修改,也可通过电话线进行远程数据传递。三极管T1、T2及电阻R1、R2构成拨号及报警电路,其工作原理前面已作详细介绍。
    4.1.2时钟计时器的硬件电路设计描述
       时钟计时器的硬件电路,采用AT89S52单片机最小化应用设计,显示采用共阳七段LED显示器,P0口输出段数码数据,P2.0~P2.5口作列扫描输出,P1.0,P1.1和P1.2口接三个按钮开关用以实现调时,调分功能.为了提供共阳LED数码管的驱动电压,用三极管8550作电源驱动输出。采用12MHZ晶振有利于提高秒计时的精确性。硬件电路图如图3.2示。
    在这里插入图片描述

    三 系统的软件设计
    3.1电话拨号防盗报警器程序设计
    3.1.1主程序设计
       主程序的工作过程为:先进行初始化工作,随后根据输入的键值分别散转输入的键值分别散转至对应的子程序(管机、警戒工作、输入时间t1、输入时间t2、输入电话号码)循环工作。T0为100ms定时中断服务子程序,它实现精确的拨号脉冲时序。INT0外中断服务子函数用于实现功能选择;而INT1外中断服务子函数则检测防盗触发开关的状态。
       主程序状态流程图如图3.6所示。INT0外中断服务子函数状态流程图及INT1外中断服务子函数的状态流程图分别如图3.7、图3.8所示。
    在这里插入图片描述


    全套资料免费下载:
    关注v-x-公-众-号:【嵌入式基地
    后-台-回-复:【毕业设计】 即可获资料
    回复【编程】即可获取
    包括有:C、C++、C#、JAVA、Python、JavaScript、PHP、数据库、微信小程序、人工智能、嵌入式、Linux、Unix、QT、物联网、算法导论、大数据等资料
    在这里插入图片描述

    更多相关内容
  • 基于Multisim10.0.1多功能数字钟设计,同时也适用于Multisim13,均经过测试可完美实现,其基本功能如下:能够简单显示时钟、分钟、秒钟的相应时间,且该数字时钟具有校正时间(可分别对时钟、分钟、秒钟校正)、...
  • 多功能数字时钟设计资料.7z
  • 基于QuartusII的多功能数字钟设计
  •  本文以FPGA平台为基础,在QuartusⅡ开发环境下设计开发多功能数字钟。数字钟实现的功能如下:  1)计时功能:进行正常的时、分、秒计时,并由6只8段数码管分别显示时、分、秒时间。  2)校时功能:当时校时...
  • 首先分析了多功能数字钟设计要求、所需实现的功能,然后分析了实现每个功能所需要的基础模块,最后进一步分析了各种基础模块。在具体设计时,采用的是自底向上的设计方法。首先设计各种基础模块,然后设计各种功能...
  • author:komdec time:20180701 内容:论文、原理图,电路设计和MS11源文件 基于multisim仿真软件的数字电路设计:篮球比赛计时器的设计、 多功能数字钟设计
  • 大二多功能数字钟课程设计报告,内容详细有借鉴意义
  • 多功能数字钟设计

    2013-03-30 18:57:36
    内容:多功能数字钟设计 基本要求:1)由振荡器输出稳定的高频脉冲信号作为时间基准,经分频器输出标准的秒脉冲。 2)秒计数器满60向分计数器进位,分计数器满60向小时计数器进位,小时计数器按“12翻1”规律计数,...
  • 多功能数字钟是学习数字电路必做的实验,经过学习整理,这份实验指导详尽的介绍了饰演的原理、内容,还把实验中的代码分模块的卸载了文件夹中
  • 基于QuartusII的多功能数字钟设计 应用QuartusII9.0软件采用模块化设计方法设计一数字时钟,用原理图输入进行设计,使之具有清零、整点报时、闹钟设置、彩铃和星期显示调节等功能。软件仿真调试成功后编译下载至可...
  • 多功能数字钟

    2018-10-15 19:50:04
    实现Verilog多功能数字钟,(1)完成VerilogHDL课件2例2.10的闰年判断程序设计,年号的四位数字应该用BCD码表示; (2)用VerilogHDL设计一个测试向量,用枚举方式产生激励信号,列举不少于10个典型年号,将被测模块...
  •  本文以FPGA平台为基础,在QuartusⅡ开发环境下设计开发多功能数字钟。数字钟实现的功能如下:  1)计时功能:进行正常的时、分、秒计时,并由6只8段数码管分别显示时、分、秒时间。  2)校时功能:当时校时...
  • 设计电路最终选用AT89C51作为主控系统来控制时钟的准时运转,采用独立式按键控制系统实现的所有功能,选用LED来显示时间等,带Proteus文件
  • 本文主要使用VDHL语言完成了多功能数字钟设计,利用QuartusII7.0完成设计、仿真等工作。并利用Altera公司开发的Cyclone III系列EP3C25F324C8实验箱实现电路。
  • 基于单片机的 多功能数字钟设计 不错的文档哦
  • 在FPGA开发环境下,以QuartusII软件为系统设计平台,采用Verilog HDL语言,运用自上而下的模块化编程思想和实现方案对多功能数字钟各功能模块进行设计.在原理图文件中添加各功能模块元件符号,然后通过连线组合各底层...
  • 数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,已得到广泛的使用。数字钟从原理上讲是一种典型的数字电路,其中包括了组合...
  • 基于FPGA/CPLD的多功能数字钟设计,付丽娜,,本文介绍了利用VHDL硬件描述语言结合FPGA/CPLD芯片设计多功能数字钟,并对整个系统的各个模块设计过程作了具体介绍。在MAX PLUS II开发软
  • 首先分析了多功能数字钟设计要求、所需实现的功能,然后分析了实现每个功能所需要的基础模块,最后进一步分析了各种基础模块。在具体设计时,采用的是自底向上的设计方法。首先设计各种基础模块,然后设计各种功能...
  • 本文利用 Verilog HDL 语言的设计方法设计多功能数字钟,并通过 vivado 2016.3 完 成综合实现。此程序通过下载到 FPGA 芯片后,可应用于实际的数字钟显示中,实现了基本 的计时显示(时分到分秒的切换)和设置,调整...
  • 【Proteus】多功能数字时钟设计

    千次阅读 2021-12-27 19:44:40
    数字时钟设计

    课设

    首先是课设的内容
    我们将该电路分为几个部分:

    1:显示电路(用6个共阴数码管来显示)
    2:译码电路(用CD4511来现实译码显示)
    3:进制电路(用CD4518计数器来完成进时功能)
    4:脉冲产生器(555定时器产生1khz的信号)
    5:分频电路(用CD4518进行3次10分频产生1hz信号)
    6:校时电路(用CD4011二输入与非门实现)
    7:整点报时电路(用CD4012和CD4011实现)

    原理框图

    24进制
    60进制
    60进制
    1khz
    1hz
    1hz
    1hz
    译码显示器
    时计数器
    分计数器
    秒计数器
    振荡器
    多级分频器
    报时电路
    校时电路

    原理框图如上.

    一:各芯片引脚介绍:

    1:数码管:1

    引脚图:
    在这里插入图片描述

    课设中为共阴极(CC).

    2:CD4511(译码显示):2

    引脚图:
    在这里插入图片描述

    CD4511引脚功能:
    BI:4脚是消隐输入控制端,当BI=0 时,不管其它输入端状态是怎么样的,七段数码管都会处于消隐也就是不显示的状态。
    LE:锁定控制端,当LE=0时,允许译码输出。 LE=1时译码器是锁定保持状态,译码器输出被保持在LE=0时的数值。
    LT:3脚是测试信号的输入端,当BI=1,LT=0 时,译码输出全为1,不管输入 DCBA 状态如何,七段均发亮全部显示。它主要用来检测数7段码管是否有物理损坏。
    A1、A2、A3、A4、为8421BCD码输入端。
    a、b、c、d、e、f、g:为译码输出端,输出为高电平1有效。

    真值表:
    在这里插入图片描述

    3:CD4518(计数器)3

    引脚图:
    在这里插入图片描述

    CD4518是二、十进制(8421编码)同步加计数器,内含两个单元的加计数器。每单个单元有两个时钟输入端CLK和EN,可用时钟脉冲的上升沿或下降沿触发。可知,若用ENABLE信号下降沿触发,触发信号由EN端输入,CLK端置“0”;若用CL℃K信号上升沿触发,触发信号由CL℃K端输入,ENABLE端置“1”。RESET端是清零端,RESET端置“1”时,计数器各端输出端Q1~Q4均为“0”,只有RESET端置“0”时,CD4518才开始计数

    CD4518是一个同步加计数器,在一个封装中含有两个可互换二/十进制计数器,其功能引脚分别为1~7和9~{15}。该CD4518计数器是单路系列脉冲输入(1脚或2脚;9脚或10脚),4路BCD码信号输出(3脚~6脚;{11}脚~{14}脚)

    真值表:
    在这里插入图片描述

    3:555定时器

    引脚图:
    在这里插入图片描述
    内部结构:
    在这里插入图片描述
    在这里插入图片描述

    555定时器可接成多谐振荡器,多谐振荡器也称无稳态触发器,它没有稳定状态,同时毋须外加触发脉冲,就能输出一定频率的矩形脉冲(自激振荡)。用555实现多谐振荡,需要外接电阻R1,R2和电容C,并外接+5V的直流电源。选用合适的参数,使555定时器给数字钟提供一个频率稳定准确的1kHz的方波信号,可保证数字钟的走时准确及稳定。

    4:CD4011和CD4012

    在这里插入图片描述
    在这里插入图片描述
    1个2输入与非门,一个4输入与非门.

    二:各部分电路图搭建

    这里重点说一下校时电路和整点报时电路.
    先上电路图:

    1:校正时间电路

    在这里插入图片描述
    该图中的校时脉冲是555产生的1khz信号经过分频后的1hz信号.当开关没有按下去之前至时个位计数器和至分个位计数器的输出都是由分十位进位脉冲和秒十位进位脉冲控制的.因为没有按下开关前非门都输出1,阻断了校时脉冲的输入.反之当按下开关时非门都输出为1.而对校时脉冲没有影响,但零电位将输入与非门阻断十位的脉冲.这样就能时分,时进1.

    2:整点报时电路

    在这里插入图片描述
    在这里插入图片描述
    该电路当分为59秒为51时以500hz的信号输入蜂鸣器.
    当秒各位Q3为9秒时以1khz输入蜂鸣器.

    3:分频电路

    在这里插入图片描述
    555产生的1khz的信号,经过3次10分频后输出1hz信号.

    4:进制电路

    进制电路是由计数器CD4518来完成.CD4518的输出Q3是10分频.当CD4518来10个下降沿(脉冲)时Q3才会翻转一次.
    在这里插入图片描述
    吧Q3输出到另一个4518的输入.且当该4518的Q2,Q1输出为1时接到一个与门输出一个1,给这俩个4518的清零端.24进制也如此.

    芯片个数
    共阴数码管6
    CD45116
    CD45186
    CD40116
    CD40121
    电阻电容若干

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述


    1. 两个com都要接地,如果是共阳极的话com端都接VCC ↩︎

    2. 3,4引脚在实际接线时应接为低电平 ↩︎

    3. 实际接线为了节省接线,使用CD4518的下降沿,那么芯片的1,9引脚接地 ↩︎

    展开全文
  • 多功能数字钟设计实验报告.doc
  • ISE实现多功能数字钟设计.doc
  • 用HDL设计一个多功能数字钟,包含以下主要功能: 1.计时及校时,时间可以24小时制或12小时制显示 2.日历:显示年月日星期,及设定设定功能 3.跑表:启动/停止/保持显示/清除 4.闹钟:设定闹钟时间,整点提示
  • 多功能数字钟设计及FPGA实验板实现实验报告

    千次阅读 热门讨论 2021-05-01 11:20:58
    用FPGA器件和EDA技术实现多功能数字钟的设。 基本功能: 1、以数字形式显示时、分、秒的时间; 2、小时计数器为同步24进制; 3、要求手动校时、校分。 扩展功能: 1、任意时刻闹钟; 2、小时显示(12/24)...

    一、实验任务

    用FPGA器件和EDA技术实现多功能数字钟的设。

    基本功能:

    1、以数字形式显示时、分、秒的时间;

    2、小时计数器为同步24进制;

    3、要求手动校时、校分。

    扩展功能:

    1、任意时刻闹钟;

    2、小时显示(12/24)切换电路

    3、仿广播电台正点报时;

    4、自动报整点时数。

    二、实验要求

    1、熟悉EDA软件的使用;

    2、拟定数字钟的组成框图,划分模块;

    3、采用分模块、分层次的方法设计电路;

    4、各单元模块电路的设计与仿真;

    5、总体电路的设计与仿真;

    6、总体电路的下载与调试。

    7、设计可以采用原理图或HDL语言

    三、实验环境

    1.Windows10操作系统

    2. ISE软件Vivado2020.2

    3.FPGA实验开发装置Nexys4-DDR

     

    四、数字钟设计方案及组成框图

    本次设计的多功能数字钟分为主体电路与扩展电路两个部分,其中主体电路分为计数器模块、显示模块、校时模块,扩展电路分为闹钟模块与仿电台正点报时模块。在100MHz的CP信号激励下主电路计数器模块与闹钟定时计数器模块中的寄存器分别输出时分秒对应的BCD码,经由数据选择器输入显示模块,BCD码在该模块中译码为数码管对应编码,通过500Hz的CP信号动态扫描将数码管编码经过总线分时映射到对应的位数码管上,实现译码器与输出端口的复用。闹钟模块将主电路计数器模块底层寄存器中的BCD码闹钟计数器中寄存器进行对比,,相同则产生间隔1秒的1秒500Hz的低音。整点报时与仿电台正点报时模块将主电路计数器模块底层寄存器中的BCD码与报时时刻进行对比,在每个小时的59分51秒、53秒、55秒、57秒产生1秒500Hz的低音,在59秒产生1秒的1000Hz高音提示整点已到,此后再产生与对应小时数相等次数的500Hz低音进行报时。


    综上所述,多功能数字钟组成框图如下图所示:

    图1 多功能数字钟组成框图

    五、分模块源代码设计及注释


    多功能数字钟的模块设计如下所示:

    图2 多功能数字钟模块设计组成图

    MIPS汇编语言源程序分模块设计如下:

    (1) 主电路计数器模块


    主电路计数器模块主要由分频器、模60计数器、模24计数器构成,其中模60计数器由模10计数器与模6计数器构成。100MHz时钟信号CP经分频器得到1Hz时钟信号,将其分别作为两个模60计数器与一个模24计数器的激励实现秒计数、分计数与时计数。秒计数器使能恒为有效,分计数器使能在秒计数器数值为59时或调分信号有效时有效,时计数器使能在分计数器、秒计数器为59时或调时信号有效时有效。当系统为显示时间模式正常计时,另外可以通过改变调分、调时开关的是否有效实现校时功能。此外通过模式转换按钮trans实现12小时/24小时模式切换,因计数电路只使用了模24计数器,因此通过24时制与12时制的转换关系可以直接得到12时制的输出结果。整体层次关系如下:

    图3 主电路计数器整体层次关系

    各计数器均基于模10计数器或模6计数器等四位输出计数器实现,各模块verilog源码如下:

    module freq_divider(//分频器
    
        input CP100M,
    
        output reg CP1
    
        );
    
        integer i,j;
    
           initial begin
    
              j=0;
    
              CP1=0;
    
        end
    
           always @(posedge CP100M)
    
                  begin
    
                         j <= j + 1;
    
                         if(j==32'd49999999)
    
                                begin j <= 1'b0; CP1 <= ~CP1; end     
    
                  end
    
    endmodule
    
    

    在顶层模块中与主体部分计时器有关的代码以及注释如下:

    freq_divider(CP,CP1);//分频
    
    counter60 u0(nCR,EN,CP1,second[7:0]);//秒变量60进制计数器
    
        counter60 u1(nCR,min_EN && EN,CP1,minute[7:0]);//分变量60进制计数器
    
        assign min_EN=Adj_Min ? Vdd && ~alarm_clock:(second==8'h59);
    
        //分进位信号,如果调分使能有效且闹钟调时使能无效,则进位使能有效。如果调分使能无效但秒变量为59时,分进位使能有效
    
        counter24 u2(nCR,hour_EN && EN,CP1,hour[7:0]);
    
        //时变量24进制计数器
    
        assign hour_EN=Adj_Hour ? Vdd && ~alarm_clock:((minute == 8'h59) && (second == 8'h59));
    
        //时进位信号,如果调时使能有效且闹钟调时使能无效,则进位使能有效。如果调时使能无效但分变量和秒变量为59时,时进位使能有效
    
        //数字钟主体部分

    (2) 闹钟定时计数器模块

    整体层次关系与详细设计与主电路计数器模块基本相同。不同的是闹钟定时计数器模块的三级计数器使能信号都需要与闹钟调时信号alarm_clock相与。

    在顶层模块中与主体部分计时器有关的代码如下:

    counter60 a0(nCR,alarm_clock,CP1,second_alarm[7:0]);
    
        counter60 a1(nCR,minalarm_EN && alarm_clock,CP1,minute_alarm[7:0]);
    
        assign minalarm_EN=Adj_Min ? Vdd:(second_alarm==8'h59);
    
        counter24 a2(nCR,houralarm_EN && alarm_clock,CP1,hour_alarm[7:0]);
    
        assign houralarm_EN=Adj_Hour ? Vdd:((minute_alarm == 8'h59) && (second_alarm == 8'h59));
    
        //当闹钟调时使能有效时,原调时信号直接作用于闹钟定时变量
    
        //闹钟主体
    module counter60(//60进制计数器
    
        input nCR,
    
        input EN,
    
        input CP,
    
        output wire [7:0] Cnt
    
        );
    
        wire ENP;
    
        counter10 UC0 (nCR, EN, CP, Cnt[3:0]); //计数器的个位
    
        counter6 UC1 (nCR, ENP, CP, Cnt[7:4]); //计数器的十位
    
        assign ENP = (Cnt[3:0]==4'h9) & EN; //产生计数器十位的使能信号
    
    endmodule
    
    
    module counter10(//10进制计数器
    
        input nCR,
    
        input EN,
    
        input CP,
    
        output reg [3:0] Q
    
        );
    
        initial begin
    
            Q=4'b0000;
    
        end
    
        always @(posedge CP or negedge nCR)
    
            begin
    
            if(~nCR) Q <= 4'b0000; // nCR=0,计数器被异步清零
    
            else if(~EN) Q <= Q; //EN=0,暂停计数
    
            else if(Q == 4'b1001) Q <= 4'b0000;
    
            else Q <= Q + 1'b1; //计数器增1计数
    
            end
    
    endmodule
    
    
    module counter6(//6进制计数器
    
        input nCR,
    
        input EN,
    
        input CP,
    
        output reg [3:0] Q
    
        );
    
        initial begin
    
            Q=4'b0000;
    
        end
    
        always @(posedge CP or negedge nCR)
    
            begin
    
            if(~nCR) Q <= 4'b0000; // nCR=0,计数器被异步清零
    
            else if(~EN) Q <= Q; //EN=0,暂停计数
    
            else if(Q == 4'b0101) Q <= 4'b0000;
    
            else Q <= Q + 1'b1; //计数器增1计数
    
            end
    
    endmodule
    module counter24(
        input nCR,
        input EN,
        input CP,
        output reg [7:0] Q
        );
        wire ENP;
        initial begin
            Q = 8'b00000000;
        end
         always @(posedge CP or negedge nCR)
            begin
                if(~nCR) Q[7:0] <= 8'b00000000; // nCR=0,计数器被异步清零
                else if(~EN) Q <= Q; //EN=0,暂停计数
                else if(Q[7:0] == 8'b00100011) Q[7:0] <= 8'b00000000;
                else if(Q[3:0] == 4'b1001)
                    begin 
                    Q[3:0] <= 4'b0000; 
                    Q[7:4] <= Q[7:4] + 1'b1;
                    end
                else Q <= Q+ 1'b1; //计数器增1计数
            end
            
    endmodule

    (3) 显示模块


    显示模块由BCD-数码管译码器、位移寄存器、复用器构成。显示模块工作原理是基于人眼视觉暂留效应将6片计数器中的4位BCD码数据通过复用器分时输入至译码器,经码得到与之对应的8位码驱动6片数码管阴极引脚,其中共阳极由位移寄存器驱动分时高频率依次点亮各片数码管实现动态扫描。整体层次关系如下:

    图3 显示模块整体层次关系

    其中数码管译码器设计为:

    module decoder(
    
        input [3:0] I,
    
        output reg [7:0] Y
    
        );
    
         always @(*) begin
    
                  casex(I)      
    
                          4'b0000: Y = 8'b11000000;    //0
    
                          4'b0001: Y = 8'b11111001;    //1
    
                          4'b0010: Y = 8'b10100100;    //2
    
                          4'b0011: Y = 8'b10110000;    //3
    
                          4'b0100: Y = 8'b10011001;    //4
    
                          4'b0101: Y = 8'b10010010;    //5
    
                          4'b0110: Y = 8'b10000010;    //6
    
                          4'b0111: Y = 8'b11111000;    //7
    
                          4'b1000: Y = 8'b10000000;    //8
    
                          4'b1001: Y = 8'b10010000;    //9
    
                          4'b1010: Y = 8'b10001000;    //A
    
                          4'b1011: Y = 8'b10000011;    //b
    
                          4'b1100: Y = 8'b11000110;    //C
    
                          4'b1101: Y = 8'b10100001;    //d
    
                          4'b1110: Y = 8'b10000110;    //E
    
                          4'b1111: Y = 8'b10001110;    //F
    
                  endcase
    
         end
    
    endmodule
    
    

    位移寄存器设计为,其中freq_divider2为100MHz分为500Hz扫描CP信号:

    module shift(
    
        input CLK,
    
        output reg[7:0] AN
    
        );
    
        wire CP;
    
        initial begin
    
            AN <= 8'b1111_1110;
    
        end
    
        freq_divider2 sdivider_u0(CLK,CP);//分频
    
        always @(posedge CP) begin
    
            AN[5:0] <= {AN[0],AN[5:1]};//循环位移
    
        end
    
    endmodule
    module freq_divider2(
        input CLK,
        output  reg CP
        );
         reg     [25: 0]         clk_cnt; //分频计数器
           
           initial begin
               CP <= 'd0;
               clk_cnt <= 0;
           end
           
           always  @(posedge CLK) begin//分频
                     if(clk_cnt == 'd99999)  
                       clk_cnt <= 'd0;
                   else
                       clk_cnt <=  clk_cnt + 1'b1;
           end
           always  @(posedge CLK) begin
                      if(clk_cnt == 'd99999)
                      CP <=  ~CP;
           end
    endmodule

    复用器设计如下:

    module switch(
    
        input [63:0] I,//6端8位数码管码拼接
    
        input [7:0] AN,//位移寄存器输出,共阴极
    
        output reg [7:0] BCD
    
        );
    
        always @(*) begin//AN[i]循环位移并对输入信号选择
    
            if(~AN[0])     BCD <= I[7:0];
    
            else if(~AN[1])BCD <= I[15:8];
    
            else if(~AN[2])BCD <= I[23:16];
    
            else if(~AN[3])BCD <= I[31:24];
    
            else if(~AN[4])BCD <= I[39:32];
    
            else if(~AN[5])BCD <= I[47:40];
    
            else if(~AN[6])BCD <= I[55:48];
    
            else if(~AN[7])BCD <= I[63:56];
    
            end
    
    endmodule
    
    

    扫描显示顶层模块如下:

    module scan(
    
        input [23:0] I,
    
        input CLK,
    
        output wire [7:0] Y,
    
        output wire [7:0] AN
    
        );
    
        wire [3:0]BCD;
    
        shift shift_u0(CLK,AN);//位移寄存器
    
        switch switch_u0(I,AN,BCD);//数据分配器
    
        decoder decoder_u0(BCD,Y);//BCD数码管译码器
    
    endmodule
    
    

    数字钟顶层通过调用scan函数实现循环扫描:

    scan( scanner, CP , Y[7:0], AN[7:0]);
    
        //scanner是通过多次选择得到的闹钟或时钟12/24时制的输出显示BCD码
    
        //Y为扫描得出的阳极信号
    
        //AN为扫描得出的阴极信号

    (4) 音频模块(闹钟或仿电台正点报时与整点报时)

    多功能数字钟的闹钟模块与仿电台正点报时与整点报时模块为实现音频输出调用了FPGA实验板自带的音频输出引脚,通过连接外置耳机播放。该模块的设计要求在闹钟音频信号有效时,输出间隔1秒,时长为1秒的500Hz音频信号至音频输出引脚;在每个小时59分51秒、53秒、55秒以及57秒别响时长一秒的低音并在59秒响时长一秒的高音从而实现正点报时目的;在进入下一小时时产生与小时数相等次数的低频响声,保持时间1s,间隔时间1s。其中音频控制模块verilog代码如下:

    module baoshi(CP1,CP100M,hour,second,second_alarm,minute,AUD_PWM,alarm);
    
     //输入1Hz、100MHz的CP信号,主体时钟的时分秒BCD码,闹钟模块的秒BCD码,音频输出,闹钟使能信号
    
    input [7:0]hour,minute,second,second_alarm;
    
    input CP1,CP100M;
    
    input alarm;  //闹钟信号
    
    output reg AUD_PWM;
    
    wire CP1K,CP500;
    
    
    
    freq_divider3 f0(CP100M,CP500,CP1K);
    
    //分频器3,将100MHz信号分为500Hz和1000Hz的音频信号
    
    
    
    always@(CP1) begin
    
                  if(alarm)
    
                  //闹钟使能信号有效
    
                         begin
    
                             if(second[0] == second_alarm[0]) AUD_PWM <= CP500;
    
                             //在主体模块与闹钟模块的秒计数器最低位相等时直接将500Hz音频信号赋予音频输出
    
                             else AUD_PWM <= 0;
    
                             //不相等时无声音
    
                         end
    
                  else if(minute == 'd89)//当59分时
    
                         begin
    
                                if(second == 'd83 || second == 'd85 || second == 'd87 || second == 'd81)
    
                                       AUD_PWM <= CP500;
    
                              //53、55、57、51秒将500Hz低音信号输入
    
                                else if(second == 'd89)
    
                                       AUD_PWM <= CP1K;
    
                                //59秒将1000Hz高音信号输入
    
                                else
    
                                       AUD_PWM <= 'd0;
    
                                //其他时间无声音
    
                         end
    
               else if((hour == 0 || hour == 'd18) && minute == 'd0  )//12点敲12下
    
                  begin
    
                   if(second <= 'd34)begin
    
                        if (second[0] == 0) AUD_PWM <= CP500;
    
                        else AUD_PWM <= 'd0;
    
                    end
    
                     end
    
                  else if(minute == 'd0 && second[7:4]*10 + second[3:0] <= 2*((hour[3:0]+hour[5:4]*10)%12)-1'b1 ) begin
    
                      //整点报时,当主体模块秒计数器的值小于2*(时%12)-1时,刚好实现指定次数的报时
    
                      if (second[0] == 0) begin
    
                        AUD_PWM <= CP500;
    
                        //低位为0时敲钟
    
                      end
    
                      else AUD_PWM <= 'd0;
    
                  end
    
                  else AUD_PWM <= 'd0;
    
           end
    
    endmodule

    在顶层模块中调用baoshi函数实现音频控制

    baoshi(CP1,CP,hour,second,second_alarm,minute,AUD_PWM,alarm);
    
        //1HZ的CP信号
    
        //100MHz的CP信号
    
        //时分秒计数器
    
        //闹钟秒计数器
    
        //音频输出变量
    
        //闹钟使能信号

    (5) 顶层模块

    顶层模块输入有:清零端,使能端,调分,调时,闹钟调时,闹钟开关,12、24时制转换,100MHz时钟信号CP。

    输出有:音频输出,七段数码管阳极信号、阴极信号

    调用分频器1得到1Hz时钟;调用60进制以及24进制计数器实现主体模块以及闹钟模块的计数,调用scan函数扫描显示,调用baoshi函数实现音频控制

    主模块完成逻辑功能:

    1、通过多次选择得到的闹钟或时钟的12/24时制的输出显示BCD码scanner[7:0]

    2、通过比较时钟主体计数器与闹钟计数器各位,获得闹钟音频信号alarm

    module top_clock(
    
        input  alarm_clock,alarm_switch,//闹钟的输入控制信号,分别为闹钟调时和闹钟开关
    
        output wire AUD_PWM,//闹钟声音信号输出至耳机插口端
    
        input CP,//输入FPGA自带晶振的100MHz时钟信号
    
        input nCR,EN,//清零端,使能端
    
        input Adj_Min,Adj_Hour,trans,//分调整,时调整,12-24小时转换
    
        output wire [7:0]Y,[7:0]AN //Y为七段数码管的显示结果,AN为8个数码管中选择一个显示
    
        );
    
        reg [23:0]scanner;//scanner为6位数码管输出信号,用作扫描输出
    
        wire [7:0] hour,minute,second;//顶层模块时分秒wire变量
    
        wire [7:0] hour_alarm, minute_alarm, second_alarm;//顶层模块闹钟时分秒wire变量
    
        supply1 Vdd;//高电平
    
        wire min_EN,hour_EN,minalarm_EN,houralarm_EN;//时分以及闹钟时分进位使能信号
    
        wire CP1;//1Hz时钟信号
    
        freq_divider(CP,CP1);//分频
    
        reg alarm;//闹钟内置开关寄存器变量
    
        initial begin
    
            alarm = 0;//初始时闹钟关闭
    
        end
    
        counter60 u0(nCR,EN,CP1,second[7:0]);//秒变量60进制计数器
    
        counter60 u1(nCR,min_EN && EN,CP1,minute[7:0]);//分变量60进制计数器
    
        assign min_EN=Adj_Min ? Vdd && ~alarm_clock:(second==8'h59);
    
        //分进位信号,如果调分使能有效且闹钟调时使能无效,则进位使能有效。如果调分使能无效但秒变量为59时,分进位使能有效
    
        counter24 u2(nCR,hour_EN && EN,CP1,hour[7:0]);
    
        //时变量24进制计数器
    
        assign hour_EN=Adj_Hour ? Vdd && ~alarm_clock:((minute == 8'h59) && (second == 8'h59));
    
        //时进位信号,如果调时使能有效且闹钟调时使能无效,则进位使能有效。如果调时使能无效但分变量为59时,时进位使能有效
    
        //数字钟主体部分
    
       
    
        counter60 a0(nCR,alarm_clock,CP1,second_alarm[7:0]);
    
        counter60 a1(nCR,minalarm_EN && alarm_clock,CP1,minute_alarm[7:0]);
    
        assign minalarm_EN=Adj_Min ? Vdd:(second_alarm==8'h59);
    
        counter24 a2(nCR,houralarm_EN && alarm_clock,CP1,hour_alarm[7:0]);
    
        assign houralarm_EN=Adj_Hour ? Vdd:((minute_alarm == 8'h59) && (second_alarm == 8'h59));
    
        //当闹钟调时使能有效时,原调时信号直接作用于闹钟定时变量
    
        //闹钟主体
    
       
    
        always @(*) begin
    
        if (alarm_clock == 0) begin
    
            //闹钟调时信号无效,输出时钟主体计数器模块
    
            if(trans && hour[7:0] == 8'b00000000) scanner = {8'b00010010, minute[7:0], second[7:0]};
    
            //trans时制转换信号有效,且为24时制的0点,时显示输出12时制12点
    
            else if(trans && hour[7:0] > 8'b00010010 ) scanner = {hour[7:0]-8'b00010010, minute[7:0], second[7:0]};
    
            //trans时制转换信号有效,时显示输出24时制的时计数器时间-12
    
            else scanner = {hour[7:0], minute[7:0], second[7:0]};
    
            //trans时制转换信号无效,时显示输出24时制的时计数器时间
    
        end
    
        else  begin//闹钟调时信号有效,输出时钟计数器模块
    
            if(trans && hour_alarm[7:0] == 8'b00000000) scanner = {8'b00010010, minute_alarm[7:0], second_alarm[7:0]};
    
            //trans时制转换信号有效,且为24时制的0点,时显示输出12时制12点
    
            else if(trans && hour_alarm[7:0] > 8'b00010010) scanner = {hour_alarm[7:0]-8'b00010010, minute_alarm[7:0], second_alarm[7:0]};
    
            //trans时制转换信号有效,时显示输出24时制的时计数器时间-12
    
            else scanner = {hour_alarm[7:0], minute_alarm[7:0], second_alarm[7:0]};
    
            //trans时制转换信号无效,时显示输出24时制的时计数器时间
    
        end
    
       
    
        if ({hour[7:0], minute[7:0], second[7:0]} == {hour_alarm[7:0], minute_alarm[7:0], second_alarm[7:0]} && (alarm_switch == 1))
    
            alarm = 1;
    
            //闹钟模块使能有效,时钟主体计数器与闹钟计数器各位相同,闹钟音频信号有效
    
        else if(alarm_switch == 0) alarm = 0;
    
        //闹钟部分
    
        end
    
       
    
        scan( scanner, CP , Y[7:0], AN[7:0]);
    
        //scanner是通过多次选择得到的闹钟或时钟的12/24时制的输出显示BCD码
    
        //Y为扫描得出的阳极信号
    
        //AN为扫描得出的阴极信号
    
        baoshi(CP1,CP,hour,second,second_alarm,minute,AUD_PWM,alarm);
    
        //1HZ的CP信号
    
        //100MHz的CP信号
    
        //时分秒计数器
    
        //闹钟秒计数器
    
        //音频输出变量
    
        //闹钟使能信号
    
    endmodule

     

    6) 引脚约束

    set_property -dict { PACKAGE_PIN T10   IOSTANDARD LVCMOS33 } [get_ports { Y[7] }]; #IO_L24N_T3_A00_D16_14 Sch=ca
    
    set_property -dict { PACKAGE_PIN R10   IOSTANDARD LVCMOS33 } [get_ports { Y[6] }]; #IO_25_14 Sch=cb
    
    set_property -dict { PACKAGE_PIN K16   IOSTANDARD LVCMOS33 } [get_ports { Y[5] }]; #IO_25_15 Sch=cc
    
    set_property -dict { PACKAGE_PIN K13   IOSTANDARD LVCMOS33 } [get_ports { Y[4] }]; #IO_L17P_T2_A26_15 Sch=cd
    
    set_property -dict { PACKAGE_PIN P15   IOSTANDARD LVCMOS33 } [get_ports { Y[3] }]; #IO_L13P_T2_MRCC_14 Sch=ce
    
    set_property -dict { PACKAGE_PIN T11   IOSTANDARD LVCMOS33 } [get_ports { Y[2] }]; #IO_L19P_T3_A10_D26_14 Sch=cf
    
    set_property -dict { PACKAGE_PIN L18   IOSTANDARD LVCMOS33 } [get_ports { Y[1] }]; #IO_L4P_T0_D04_14 Sch=cg
    
    set_property -dict { PACKAGE_PIN H15   IOSTANDARD LVCMOS33 } [get_ports { Y[0] }]; #IO_L19N_T3_A21_VREF_15 Sch=dp
    
    #阳极信号
    
    
    
    set_property -dict { PACKAGE_PIN J17   IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0]
    
    set_property -dict { PACKAGE_PIN J18   IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1]
    
    set_property -dict { PACKAGE_PIN T9    IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2]
    
    set_property -dict { PACKAGE_PIN J14   IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3]
    
    set_property -dict { PACKAGE_PIN P14   IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4]
    
    set_property -dict { PACKAGE_PIN T14   IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5]
    
    set_property -dict { PACKAGE_PIN K2    IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6]
    
    set_property -dict { PACKAGE_PIN U13   IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7]
    
    #阴极信号
    
    
    
    set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets alarm_switch_IBUF]
    
    set_property -dict { PACKAGE_PIN E3    IOSTANDARD LVCMOS33 } [get_ports { CP}]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
    
    #100MHz时钟信号CP
    
    
    
    set_property -dict { PACKAGE_PIN A11   IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm
    
    #音频输出端口
    
    
    
    set_property -dict { PACKAGE_PIN J15   IOSTANDARD LVCMOS33 } [get_ports { nCR }]; #IO_L24N_T3_RS0_15 Sch=sw[0]
    
    set_property -dict { PACKAGE_PIN L16   IOSTANDARD LVCMOS33 } [get_ports { EN }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1]
    
    set_property -dict { PACKAGE_PIN M13   IOSTANDARD LVCMOS33 } [get_ports { Adj_Min }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2]
    
    set_property -dict { PACKAGE_PIN R15   IOSTANDARD LVCMOS33 } [get_ports { Adj_Hour}]; #IO_L13N_T2_MRCC_14 Sch=sw[3]
    
    set_property -dict { PACKAGE_PIN R17   IOSTANDARD LVCMOS33 } [get_ports { alarm_clock }]; #IO_L12N_T1_MRCC_14 Sch=sw[4]
    
    set_property -dict { PACKAGE_PIN T18   IOSTANDARD LVCMOS33 } [get_ports { alarm_switch }]; #IO_L7N_T1_D10_14 Sch=sw[5]
    
    set_property -dict { PACKAGE_PIN U18   IOSTANDARD LVCMOS33 } [get_ports { trans }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6]
    
    #开关,分别为清零端,使能端,调分,调时,闹钟调时,闹钟开关,12、24时制转换

    六、实现过程

    1)模60计数器的设计与仿真

    整体仿真,调出60进制计数器模块

    图4 模6计数器仿真波形

    图5 模10计数器仿真波形

    图6 模60计数器仿真波形

     

    图7 模24计数器仿真波形

    2)显示模块的仿真

    图8 位选信号仿真波形

    图9 七段数码管段选信号仿真波形

    七、实现过程

    1、依照上述设计进行代码编写,逻辑中和,布线。

    2、进行引脚绑定,生成bit流。

    3、将程序bit流下载到FPGA实验板。

    展开全文
  • 使用Quartus进行多功能数字钟设计.doc
  • 多功能数字钟设计Verilog语言编写.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,266
精华内容 19,706
关键字:

多功能数字钟设计