【数字钟】数字电路设计 24 小时数字钟(带加速、暂停、滴答声、清零功能)

在被数电无情折磨了两个日夜之后,我终于使用 Quartus II 以及 FPGA 学习板 V1.4(重邮 光电学院实验中心)做出了 24 小时数字钟,该数字钟拥有如下功能:

基本功能:24 小时计时

拓展功能:时间加速、时间暂停、秒钟滴答声、计时清零

首先是基础功能的实现,基础功能包含 60/24 进制计数模块、译码模块、位选模块、显示模块、分频模块,这些模块均为基础模块,可在《数字电路与逻辑设计 第二版》人民邮电出版社 邹虹 这本书上找到相应的设计方法。其中模 60/24 我是使用的 74161 芯片实现,这里放一下大致的电路图设计情况:

code_select 模块
count 24 模块(24 进制)

count 60 模块

count 6 模块

decoder 模块(译码模块)

dig_select 模块(位选模块)

display 显示模块

以上的就是这些基础模块的设计电路图,接下来让我们看一下最重要的模 60 以及模 24 的仿真情况。

count 24 波形仿真图

count 60 波形仿真图

 通过波形仿真图可以看到,我是将个位和十位分开做的清零和进位,count 60 部分,个位为 10 进制,十位部分为 6 进制,count 24 部分个位为 5 进制,十位为 3 进制,均使用 74161 芯片实现,这两个模块均有一个 carry 输出,carry 输出为进位信号(59 秒进 1 分,59 分进 1 小时),这样便可以将时、分、秒结合起来,实现数字钟的功能。

以下为 FPGA 数字钟顶层文件设计电路图:

 可以看到数字钟基本实现功能的思路为先将晶振 50MHz 的频率进行分频,分为 1Hz、1kHz 以及 500Hz 的频率,其中 1Hz 时钟信号用来驱动 count 60 模块进行数字钟计数,而 1kHz 和 500Hz 均可以用来驱动显像管显示,只要刷新率高于 1Hz 便可以正常实现显示功能。然后将时、分、秒计数信号输入 display 显示模块进行解码、显示等操作后(display 显示模块的设计电路图在上文中有介绍)最终输出,输出口连接 FPGA 开发板上的阴极管,即可在 FPGA 开发板上实现数字钟基础功能。

基础功能实现完之后我们再来看看拓展功能:

1. 计时滴答声:

将 1Hz 的时钟信号接入到蜂鸣器中,即可实现每秒钟一次“嘀嗒”响声。

2. 时间加速:

我们在分频 50MHz 的时候分出了 1Hz 以及 1kHz 的频率,我们新增一个 input 输入信号绑定一个开关,然后将这个输入信号与 1Hz 信号相与,再将该输入信号的反信号与 1kHz 信号相与,然后将两个信号相或,最终作为时钟信号输入到 count 60 的时钟信号 clk 中来驱动 count 60 模块的工作。如此,便实现了拨动开关控制时间加速的功能。

3. 时间暂停:

我们在 count 60 模块中新增一个输入信号“start or stop”,将该输入信号绑定一个开关,然后将该信号与输入的 1Hz 信号相与输入到 60 进制计数器中,这样我们便成功实现了拨动开关开始/停止计时的功能。

4. 计时清零:

这里用到了 74161 芯片CLRN 引脚清零功能,在 count 60、count 24 模块中增加一个输入信号“clear key”,将该信号与 FPGA 开发板上的一个按钮绑定,当按下按钮的时候,该输入信号为 1 ,经过一个非门之后接入到 74161 芯片的 CLRN 引脚上(CLRN 引脚为低电频有效,故需要接一个非门),这样我们便实现了按下按钮清零计时的功能。

  • 17
    点赞
  • 222
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
下面是具有清零暂停功能数字钟 VHDL 代码: ```vhdl library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity digital_clock is port( clk : in std_logic; rst : in std_logic; start_stop : in std_logic; clear : in std_logic; hour : out std_logic_vector(3 downto 0); minute : out std_logic_vector(5 downto 0); second : out std_logic_vector(5 downto 0) ); end digital_clock; architecture behavioral of digital_clock is signal count : unsigned(23 downto 0) := (others => '0'); signal sec : unsigned(5 downto 0) := (others => '0'); signal min : unsigned(5 downto 0) := (others => '0'); signal hr : unsigned(3 downto 0) := (others => '0'); signal pause : std_logic := '0'; begin process(clk, rst) begin if rst = '1' then count <= (others => '0'); sec <= (others => '0'); min <= (others => '0'); hr <= (others => '0'); pause <= '0'; elsif rising_edge(clk) then if clear = '1' then count <= (others => '0'); sec <= (others => '0'); min <= (others => '0'); hr <= (others => '0'); pause <= '0'; elsif pause = '0' then count <= count + 1; if count = 24000000 then sec <= sec + 1; if sec = 60 then sec <= (others => '0'); min <= min + 1; if min = 60 then min <= (others => '0'); hr <= hr + 1; if hr = 24 then hr <= (others => '0'); end if; end if; end if; end if; end if; end if; end process; hour <= std_logic_vector(to_unsigned(to_integer(hr), 4)); minute <= std_logic_vector(to_unsigned(to_integer(min), 6)); second <= std_logic_vector(to_unsigned(to_integer(sec), 6)); process(start_stop, clk) begin if start_stop = '1' and rising_edge(clk) then pause <= not pause; end if; end process; end behavioral; ``` 在该代码中,我们添加了两个输入信号 `start_stop` 和 `clear`,分别用于暂停清零数字钟。在时钟上升沿时,如果 `pause` 信号为 0,那么数字钟会正常计数;否则,数字钟会被暂停。当 `clear` 信号为 1 时,所有计数器都会被清零。 同时,我们还添加了一个 `pause` 信号,用于记录数字钟是否处于暂停状态。当 `start_stop` 信号为 1 且时钟上升沿到来时,`pause` 信号将被翻转,从而实现数字钟暂停和恢复功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值