第七章 数字时钟

FPGA至简设计实例


目录

FPGA至简设计实例

前言

二、设计背景

三、设计实现

1. 顶层信号

2. 信号设计

3. 信号定义

四、总代码

五、综合上板

总结


前言


一、项目背景

        数字时钟是采用数字电路技术实现时、分、秒计时显示的装置,可以用数字同时显示时,分,秒 的精确时间并实现准确校时,具备体积小、重量轻、抗干扰能力强、对环境要求高、高精确性、容易 开发等特性。与传统表盘式机械时钟相比,数字时钟具有更高的准确性和直观性,由于没有机械装置, 其使用寿命更长。本设计基于 FPGA 开发板的数码管功能进行数字时钟的设计,在前面章节中已经 详细讲解了数码管的工作原理,这里就不再进行赘述,有需要详细学习可以回到前面章节进行学习。 本案例将详细介绍用至简设计法实现数字时钟功能的设计。

二、设计背景

        本工程使用6个数码管实现数字时钟功能。与数字时钟相同,其可以显示00:00:00到23:59:59 范围的时间。

三、设计实现

1. 顶层信号

        新建目录:D:\mdy_book\my_shizhong,并在该目录中,新建一个名为 my_shizong.v 的文件。 用GVIM打开后开始编写代码。这里建议初学者按照本书中提供的文件路径以及文件名进行设置,避 免后续出现未知错误。

        第一步应确定顶层信号。开发板上共 8 个数码管,分析设计目标可知,本次设计的功能是控制 其使其中2个数码管常灭,其余6个数码显示不同的数字。FPGA通过控制位选信号来控制8个数码 管,即应输出一个8位的位选信号,将其设定为seg_sel。其中seg_sel[0]对应数码管0,seg_sel[1] 对应数码管1,以次类推,seg_sel[7]对应数码管7。同样地,数码管控制方法中讲解过:只要控制每 个数码管上的7个子段就可以实现数码管上不同数字的显示,即控制段选信号实现数码管的数字显示。 本设计中不需要用到h子段,共需要7个子段,因此FPGA需要输出一个7位的段选信号,将其设 定为 seg_ment,seg_ment[6]~segm_ment[0]分别对应数码管的 abcdefg(注意对应顺序)。当然, 除位选信号和段选信号外,设计中进行工程控制的时钟信号和复位信号也同样必不可少。

        综上所述,本设计一共需要4个信号:时钟信号clk,复位信号rst_n,输出的位选信号seg_sel 和输出的段选信号seg_ment。信号和硬件的对应关系如下表所示。

        将module的名称定义为my_shizhong,已知该模块有4个信号:clk、rst_n、seg_sel和seg_ ment,在顶层信号代码中需要将与外部相连接的输入/输出信号列出,从而实现信号与管脚的连接。 具体顶层代码如下:

        随后声明信号的输入输出属性,在模块中需要声明这一信号对于FPGA来说属于输入信号还是 输出信号。信号若为输入的话则声明其为input,若为输出声明则声明其为output。在本设计中,由 于clk是外部的晶振输入给FPGA的,因此在FPGA中clk为1位的输入信号input;同样地,rst_n 是外部按键给FPGA的,因此在FPGA中rst_n也为1位的输入信号input;seg_sel是FPGA控制 数码管亮灭的信号,因此seg_sel是8位的输出信号output;seg_ment是FPGA控制数码管显示数 字内容的信号,因此seg_ment是7位的输出信号output。按照以上分析将输入输出端口定义补充完 整,其具体代码如下:

2. 信号设计

        在设计信号之前,先按照至简设计法的思路来进行架构设计。根据设计目标先来分析要实现的功能,8个数码管中有6个一直处于亮的状态,其余2个为灭的状态。在不同的时刻时,相应位数的数 码管会一直变化,比如每一秒时间过后,表示秒钟个位的数字发生变化。每十秒之后,表示秒钟十位 的数字会发生变化。每60秒之后,表示分钟个位的数字发生变化,以此类推。随着时间的变化这些数字按照既定规律进行变化,从而达到显示正确时间的效果。

        从分析中可以看出每个数字的变化条件是不同的,有的数字是每秒都在变化,有的数字则一小时 才变化一次。对于初学者来说这项设计可能实现起来比较复杂,但只要遵循至简设计法的思想就可以 简化成最直接最简单的思路。下面请各位将时钟的概念抛开,将每个数码管单独看作是不同时间不同 位置显示的数码管,比如数码管0显示秒钟个位,数码管1显示秒钟十位,数码管2显示分钟个位。 在不同的时刻,数码管显示的数字不同,这样一来就很好理解了。

        本设计用m_g,m_s,f_g,f_s,s_g,s_s 分别表示秒钟个位、秒钟十位、分钟个位、分钟十 位、小时个位和小时十位所表示的数字值,m_g_s,m_s_s,f_g_s,f_s_s,s_g_s,s_s_s 分别表 示秒钟个位、秒钟十位、分钟个位、分钟十位、小时个位和小时十位所表示数码管的段选值。

        数码管0显示的是秒钟个位值,翻译成信号即seg_sel的值为8’b1111_1110,seg_ment的值为: m_g_s。数码管1显示秒钟十位,即seg_sel的值为8’b1111_1101,seg_ment的值为m_s_s。以此 类推,数码管5显示小时十位,即seg_sel的值为8’b1101_1111,seg_ment的值为s_s_s。输出信号的时序波形图如下所示

        从波形图中可以看出在不同时刻下,seg_ment和seg_sel的值会发生变化。那么多久会变化一 次呢?这里需要学习一个新知识,即数码管动态扫描原理。

        数码管动态显示接口是应用最为广泛的显示方式之一。动态驱动是将数码管的8个显示笔划"a, b,c,d,e,f,g,h"的同名端连在一起,每个数码管的公共极 COM 需增加由各自独立 I/O 线控制的位选通 控制电路。当要输出某一字形码时,所有数码管都会接收到相同的字形码,但究竟是哪个数码管会显 示出字形取决于单片机对位选通COM端电路的控制。只需将显示数码管的选通控制打开,该位就会 显示出字形,而没有选通的数码管并不会点亮。综上所述,动态驱动是通过分时轮流控制各数码管的 C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值