基于FPGA的电子计时时钟设计VHDL代码Quartus仿真
名称:基于FPGA的电子计时时钟设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
利用VHDL语言,实现电子计时时钟,要求能够显示分钟、秒钟,显示输出为共阴极数码管,要求:
1、电子计时时钟具有异步清零、同步置数功能,用VHDL实现计数逻辑,并阐述设计原理,给出关键block diagram设计框图。
2、用VHDL实现译码显示逻辑,并阐述设计原理,给出关键block diagram设计框图。
3、驱动的数码管为共阴极数码管,阐述电路原理,给出相应编码方式。
4、报告要求:
(1)按设计指导书中要求的格式书写,所有内容一律打印;
(2)报告内容包括设计过程、软件仿真的结果及分析;
(3)报告中要有整体电路原理图、各模块原理图;
(4)软件仿真包括各个模块的仿真和整体电路的仿真;
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
设计文档:
1、课题任务及要求
1.1课题任务
利用VHDL语言,实现电子计时时钟,要求能够显示分钟、秒钟,显示输出为共阴极数码管,要求:
1、电子计时时钟具有异步清零、同步置数功能,用VHDL实现计数逻辑,并阐述设计原理,给出关键block diagram设计框图。
2、用VHDL实现译码显示逻辑,并阐述设计原理,给出关键block diagram设计框图。
3、驱动的数码管为共阴极数码管,阐述电路原理,给出相应编码方式。
1.2课题要求
●设计指标一 具有异步清零功能
●设计指标二 具有同步置数功能
●设计指标三 能够通过共阴极数码管显示分钟、秒钟
2、设计内容
2.1 设计总体功能简介
根据功能要求,电子计时时钟需要具有异步清零、同步置数功能,且能够显示分钟、秒钟。依次本设计采用模块化设计思想,分为计时模块和显示模块两部分。在通过顶层原理图的方式将两个模块连接起来组成整体系统。其中异步清零、同步置数功能在计时模块内完成,分钟、秒钟的显示在显示模块完成。
2.2 计时模块功能
计时模块输入信号有时钟CP、异步清零Clear、同步置数Load_en、置数分钟Load_minute、置数秒钟Load_second。输出信号有分钟高位Minute_1、分钟低位Minute_2、秒钟高位Second_1、秒钟低位Second_2。模块框图如下:

计时模块以CP为控制时钟,在Clear信号控制下异步清零,在Load_en信号控制下同步置数,置数值为置数分钟Load_minute、置数秒钟Load_second。最终输出为秒信号和分钟信号。
2.3 显示模块功能
显示模块输入信号为BCD格式的时间数据time_BCD,输出为数码管译码信号segment。模块框图如下:

显示模块将输入的4位BCD码格式的信号转换为数码管对应的译码值,时数码管显示十进制的数字。
2.4 逻辑模块功能
顶层逻辑链接框图如下图所示。

系统调用一个计时模块和4个显示模块,其中每一个显示模块显示一个十进制数,分钟的十位和个位对应2个数码管,秒钟的十位和个位对应2个数码管。将计时模块的分钟、秒钟信号输出连接到显示模块的输入。
3、设计及实现方法
3.1 计时模块设计方法
计时模块代码采用2个进程,一个进程控制秒钟计时,一个进程控制分钟计时,秒钟控制进程首先实现异步清零功能,即Clear为高电平时,输出直接变为零,不需要考虑时钟当前是什么状态。然后实现同步置数功能,因为是同步置数,需要在时钟上升沿的时候判断Load_en信号是否为有效,若有效(高电平),则将Load_second信号赋值给second_s,当Clear和Load_en均无效时,可以正常秒计时,计时的逻辑为:首先判断是否计时到59秒,若是,则秒清零,否则继续判断是否计时到9秒,若是,秒十位加1,秒个位清零,若上诉2个都不是则秒个位加1。
分钟的控制和秒钟类似,也是先实现异步清零和同步置数功能,这部分和秒钟的控制完全一致,只是在分钟的正常计时逻辑中,需要加一个条件,即秒钟为59时,才能进行分钟的计时,其他控制逻辑与秒钟一致。
3.2 显示模块设计方法
进行显示模块的设计首先需要了解数码管显示原理,数码管原理图如下图所示。

图中,数码管的阴极均连在一起,阳极作为控制端,当阳极输入高电平时,对应的数码管亮,当控制多个数码管同时亮时,则可以显示出对应的数字。比如要显示数字5,则数码管的a,f,g,c,d均亮,其他不亮,我们按dp,g,f,e,d,c,b,a的顺序排列,对应的二进制码为:“01101101”,这就是译码原理。同理我们可以得到0~9的所有译码值。他们分别为00111111、00000110、01011011、01001111、01100110、01101101、01111101、00000111、01111111、01101111。然后再通过判断语句,判断输入的二进制BCD码为多少,就可以输出对应的译码值。
4、调试及运行结果
4.1 计时模块调试及运行结果
计数模块的需要仿真异步清零,同步置数以及,秒种、分钟的计时功能,对应的仿真图如下图所示。

上图中,当异步清零信号clear为高电平时,输出秒钟和分钟均为0,故异步清零功能仿真正确。且当Load_en为高电平是,输出为59:14,故同步置数功能验证正确。再将仿真图放大,观察分钟和秒钟计时功能,如下图所示

对于上图中,可以看到秒钟按十进制计时0~59,当秒钟计时到59时,分钟加1,且分钟到59后也变为0。因此分钟秒钟的计时功能仿真正确。
4.2 显示模块调试及运行结果
显示模块的仿真需要仿真输入BCD码为0~9的不同情况下对应的译码值是否正确。显示模块仿真图如下图所示。

通过仿真图可以看到,输入信号为0000~1001即为0~9,输出的数码管译码值分别为00111111、00000110、01011011、01001111、01100110、01101101、01111101、00000111、01111111、01101111。与设计值一致,故显示模块仿真正确。
4.3系统总体调试及运行结果
对系统整体进行仿真,主要仿真计时模块和显示模块的连接是否能正确完成对应的功能,整体仿真图如下图所示。

上图中,当异步清零信号Clear为高电平时,输出秒钟和分钟均为0,故异步清零功能仿真正确。且当Load_en为高电平是,输出为59:25,故同步置数功能验证正确。然后观察计时模块输出的分钟和秒钟信号是否正确转换为对应的数码管译码值。图中以置数处的时间为例,时间为59:25,此时数码管应该显示5925,即segment1显示5,segment2显示9,segment3显示2,segment4显示5,观察仿真图可以看到,segment1为01101101,segment2为01101111,segment3为01011011,segment4为01101101,对应的数字就是5925,因此整体仿真正确。
5、设计总结
5.1设计中的问题、原因分析及解决方法
在本设计中,我也遇到了不少问题,比如一开始没有好好理解异步清零的实现方法,混淆了同步异步的设计,后来通过仔细翻阅书本和上网查找资料后才有了深入的认识。后面设计数码管译码时也是一开始没有理解数码管原理,后面通过查找资料后,理解原理设计起来就比较轻松了。
5.2设计方案的优缺点
本设计中的电子时钟是生活中常用的功能,具有很强的实用性,但是这个设计使用的同步置数功能来实现时钟的修改,这在实际应用中不太常用,一般是通过按键一个一个的修改分钟和秒钟得值,这方面还需要继续改进。
5.3心得体会
这次设计,使我加深了对Quartus软件的使用了解以及对VHDL语言更加熟悉,这对于后面使用VHDL代码设计一些更加复杂的电路具有很大的帮助。而且通过这次设计,我增强了自我学习的能力,对于一时不懂或者不了解的东西,要多看,多问,多学,付出努力才能得到回报。
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --计时模块 ENTITY time_cnt IS PORT ( CP : IN STD_LOGIC;--时钟 Clear : IN STD_LOGIC;--异步清零 Load_en : IN STD_LOGIC;--同步置数 Load_minute : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--置数分钟 Load_second : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--置数秒钟 Minute_1 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--分钟高位 Minute_2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--分钟低位 Second_1 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--秒钟高位 Second_2 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --秒钟低位 ); END time_cnt; ARCHITECTURE behaveral OF time_cnt IS SIGNAL minute_s : STD_LOGIC_VECTOR(7 DOWNTO 0);--分钟信号 SIGNAL second_s : STD_LOGIC_VECTOR(7 DOWNTO 0);--秒钟信号 BEGIN --秒钟计时 PROCESS (CP,Clear) BEGIN IF(Clear='1')THEN--异步复位 second_s <= "00000000"; ELSIF (CP'EVENT AND CP = '1') THEN--计时 IF(Load_en='1')THEN--同步置数 second_s <= Load_second;--置数秒钟 ELSIF (second_s = X"59") THEN--59秒后变为0 second_s <= "00000000"; ELSIF (second_s(3 downto 0) = X"9") THEN--低位为9秒 second_s(7 downto 4) <= second_s(7 downto 4) + "0001";--秒钟高位加1 second_s(3 downto 0)<="0000"; ELSE second_s <= second_s + "00000001";--秒钟加1 END IF; END IF; Second_1 <= second_s(7 downto 4);--秒钟 Second_2 <= second_s(3 downto 0);--秒钟 END PROCESS; --分钟计时 PROCESS (CP,Clear) BEGIN IF(Clear='1')THEN--异步复位 minute_s <= "00000000"; ELSIF (CP'EVENT AND CP = '1') THEN--计时 IF(Load_en='1')THEN--同步置数 minute_s <= Load_minute;--置数分钟 ELSIF (minute_s = X"59" AND second_s = X"59") THEN--59分59秒 minute_s <= X"00"; ELSIF (minute_s(3 downto 0) = X"9" AND second_s = X"59") THEN--9分59秒 minute_s(7 downto 4) <= minute_s(7 downto 4) + "0001";--分钟高加1 minute_s(3 downto 0) <= "0000"; ELSIF (second_s = X"59") THEN--59秒
代码文件(付费下载):
![]()
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 基于FPGA的电子计时时钟设计VHDL代码Quartus仿真
发表评论
模板文件不存在: ./template/plugins/comment/pc/index.htm