当前位置: 首页 > news >正文

数电课设·简易数字钟(Quartus Ⅱ)

忽如一夜春风来,千树万树梨花开

                                                        —— 《白雪歌诵武判官归京》  岑参  【唐】


目录

简易数字钟

要点剖析: 

 逐步分析:

端口说明:

代码展示:

分部解释:

代码编译结果:

提醒 :

仿真实例:

仿真结果:

​编辑 

求一个免费的赞,也可以点一点关注,十分感谢

简易数字钟代码和PPT


通过网盘分享的文件:简易数字钟.zip
链接: https://pan.baidu.com/s/1oQ3v6up_G5D2VKsISCRmBQ?pwd=0406

提取码: 0406

为大家带来数电课设(简易数字钟)的教程。本教程基于Quartus Ⅱ来编写代码,进行仿真。文章内有代码,仿真报告,答辩PPT,按需自取。

简易数字钟

大家先看一看上面的题目和其要求实现的功能。

要点剖析: 

  1. 利用quartus软件,基于VHDL语言来编写。
  2. 时,分,秒三个计数器,分别是二十四进制计数器和六十进制计数器。
  3. 闹钟功能,并且设定时间,到时间鸣叫30秒。
  4. 具有整点报时功能,到预定时间鸣叫10秒。
  5. 完成仿真,具有基本功能。

 逐步分析:

1.对于这一点大家从b站找教程或者某宝找人远程下载,对于vhdl语言大家可以自行学习,这个课设需要的代码造诣不高,大家完全可以自学(相较于C++就十分简单了)。

2.计时器,VHDL代码内有基本的语法结构,我们只需要知道二十四位计数器需要五位二进制数,六十进制计数器需要六位二进制数,这就ok了。

3.闹钟功能,这个就需要我们独立设计逻辑。

4.整点报时基本和闹钟功能有着类似的代码逻辑,大家看后续代码。

5.仿真,大家就利用软件内置的来做。

端口说明:

代码展示:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;entity Simple_Clock isport(clk : in std_logic; reset : in std_logic;set_alarm : in std_logic;alarm_time_sec : in std_logic_vector(5 downto 0);alarm_time_min : in std_logic_vector(5 downto 0);alarm_time_hour : in std_logic_vector(4 downto 0);alarm_out : out std_logic;chime_out : out std_logic;sec_out : out std_logic_vector(5 downto 0);min_out : out std_logic_vector(5 downto 0);hour_out : out std_logic_vector(4 downto 0));
end entity Simple_Clock;architecture Behavioral of Simple_Clock issignal sec_count : unsigned(5 downto 0) := (others => '0');--六位无符号数,初始全为0signal min_count : unsigned(5 downto 0) := (others => '0');signal hour_count : unsigned(4 downto 0) := (others => '0');signal alarm_active : std_logic := '0';--表示闹钟是否激活signal chime_active : std_logic := '0';--表示整点报时是否激活signal alarm_timer : unsigned(4 downto 0) := (others => '0');--闹钟激活后的计时signal chime_timer : unsigned(3 downto 0) := (others => '0');signal alarm_time_sec_u : unsigned(5 downto 0);--类型转换为无符号的数signal alarm_time_min_u : unsigned(5 downto 0);signal alarm_time_hour_u : unsigned(4 downto 0);
begin-- 转换输入为unsigned类型alarm_time_sec_u <= unsigned(alarm_time_sec);alarm_time_min_u <= unsigned(alarm_time_min);alarm_time_hour_u <= unsigned(alarm_time_hour);-- 秒计数器process(clk, reset)--上下限beginif reset = '1' then-- 重置所有信号sec_count <= (others => '0');min_count <= (others => '0');hour_count <= (others => '0');alarm_active <= '0';chime_active <= '0';alarm_timer <= (others => '0');chime_timer <= (others => '0');elsif rising_edge(clk) then-- 秒计数逻辑if sec_count = 59 thensec_count <= (others => '0');if min_count = 59 thenmin_count <= (others => '0');if hour_count = 23 thenhour_count <= (others => '0');elsehour_count <= hour_count + 1;end if;elsemin_count <= min_count + 1;end if;elsesec_count <= sec_count + 1;end if;-- 闹钟逻辑if alarm_active = '1' and alarm_timer < 30 then--如果激活闹钟,那么闹钟计时小于30秒则加一,响铃一段时间alarm_timer <= alarm_timer + 1;elsif alarm_timer >= 30 then--大于三十则清零,便于下次计时alarm_active <= '0';alarm_timer <= (others => '0');end if;-- 整点报时逻辑if chime_active = '1' and chime_timer < 10 thenchime_timer <= chime_timer + 1;elsif chime_timer >= 10 thenchime_active <= '0';--关闭计时状态chime_timer <= (others => '0');end if;-- 激活闹钟和整点报时if set_alarm = '1' and sec_count = alarm_time_sec_u and min_count = alarm_time_min_u and hour_count = alarm_time_hour_u thenalarm_active <= '1';--启动闹钟alarm_timer <= (others => '0');elsif sec_count = 0 and min_count = 0 then--分,秒为零,意味着整点chime_active <= '1';chime_timer <= (others => '0');end if;end if;end process;-- 输出信号alarm_out <= alarm_active;chime_out <= chime_active;sec_out <= std_logic_vector(sec_count);min_out <= std_logic_vector(min_count);hour_out <= std_logic_vector(hour_count);
end architecture Behavioral;

分部解释:

-- 秒计数器process(clk, reset)--上下限beginif reset = '1' then-- 重置所有信号sec_count <= (others => '0');min_count <= (others => '0');hour_count <= (others => '0');alarm_active <= '0';chime_active <= '0';alarm_timer <= (others => '0');chime_timer <= (others => '0');elsif rising_edge(clk) then这里首先编写了一个关于清零的功能(类似于函数,但是并不调用)
是全部清零,包括闹钟的计时,时钟的计时都是会清零的,类似于恢复出厂设置-- 秒计数逻辑if sec_count = 59 thensec_count <= (others => '0');if min_count = 59 thenmin_count <= (others => '0');if hour_count = 23 thenhour_count <= (others => '0');elsehour_count <= hour_count + 1;end if;elsemin_count <= min_count + 1;end if;elsesec_count <= sec_count + 1;end if;这就是计时功能的相关代码,我们编写了计时功能,只要秒钟累加到59,那么下一次就会分钟加1,只要分钟累加到59,那么就会时钟加1。如果时钟累加到23,那么就会清零。-- 闹钟逻辑if alarm_active = '1' and alarm_timer < 30 then--如果激活闹钟,那么闹钟计时小于30秒则加一,响铃一段时间alarm_timer <= alarm_timer + 1;elsif alarm_timer >= 30 then--大于三十则清零,便于下次计时alarm_active <= '0';alarm_timer <= (others => '0');end if;-- 整点报时逻辑if chime_active = '1' and chime_timer < 10 thenchime_timer <= chime_timer + 1;elsif chime_timer >= 10 thenchime_active <= '0';--关闭计时状态chime_timer <= (others => '0');end if;两个功能的逻辑十分相似,都有一个置1且相关计时小于我们要求响铃的时长(闹钟 30;报时 10)那么就会响铃一段时间,如果功能内部的timer大于要求响铃的时长,那么timer就会清零,便于我们下一次使用-- 激活闹钟和整点报时if set_alarm = '1' and sec_count = alarm_time_sec_u and min_count = alarm_time_min_u and hour_count = alarm_time_hour_u thenalarm_active <= '1';--启动闹钟alarm_timer <= (others => '0');elsif sec_count = 0 and min_count = 0 then--分,秒为零,意味着整点chime_active <= '1';chime_timer <= (others => '0');end if;end if;end process;激活闹钟,首先要set_alarm = '1',然后给闹钟制定时间,到时间就会自动响铃。
激活整点报时,我们不需要set这个逻辑(因为整点报时是一直开着的),当分和秒为零,那么就意味着整点,即可以响铃

代码编译结果:

 

提醒 :

清零之后闹钟会响铃!这是因为我的代码中设置了在清零后闹钟响铃的程序(只要在闹钟打开的时间内清零,闹钟在清零结束后就会响铃)。我认为是有用的,也可以当作防伪标志。

仿真实例:

定时闹钟在45分时响铃。

仿真结果:

大家可以看一看ppt从中可以找到更多细节。 

求一个免费的赞,也可以点一点关注,十分感谢

http://www.lryc.cn/news/506350.html

相关文章:

  • 大模型中RAG模型的检索过程是如何实现的?(附最佳实践资料)
  • python:用 sklearn.metrics 评价 K-Means 聚类模型
  • Spring依赖注入不同类型的数据
  • Linux大杂烩!!!
  • 12.19问答解析
  • C语言——实现杨氏矩阵
  • 授权模型PAM
  • 【Leecode】子集⭐⭐
  • Linux高性能服务器编程 | 读书笔记 | 12. 多线程编程
  • [HNCTF 2022 Week1]baby_rsa
  • 解析Java中的Stream API:函数式编程与性能优化
  • java简单题目练习
  • Kaggler日志--Day9
  • OpenCVE:一款自动收集NVD、MITRE等多源知名漏洞库的开源工具,累计收录CVE 27万+
  • 麒麟信安参编的《能源企业数字化转型能力评价 技术可控》团体标准发布
  • 戴尔物理机更换完Raid控制器(阵列卡),启动服务器失败
  • 计算机基础知识——数据结构与算法(二)(山东省大数据职称考试)
  • docsify
  • GEE教程——使用 CHIRPS 和 GSMaP 数据集计算并可视化了特定区域的降水量
  • 前端实现页面自动播放音频方法
  • 【Nginx-5】Nginx 限流配置指南:保护你的服务器免受流量洪峰冲击
  • 【芯片设计- RTL 数字逻辑设计入门 番外篇 7.1 -- 基于ATE的IC测试原理】
  • SurfaceFlinger 学习
  • Flink SQL 从一个SOURCE 写入多个Sink端实例
  • python飞机大战游戏.py
  • 【C++】14___String容器
  • 数据特性库 前言
  • jdk和cglib动态代理区别
  • 部署Mysql、镜像和容器、常见命令
  • 【数学】P2671 [NOIP2015 普及组] 求和