2.2 时钟分频
2.2.1 时钟输入电路
下图2-2为小脚丫FPGA板的时钟输入信 (CLK)电路,输入固有频率为12MHz。晶体振荡器电路能提供精度较高的脉冲信 ,其缺点为输出信 频率由晶振的固有频率决定,最终要得到1HZ的脉冲信 ,必须增加分频电路才能实现。
图2-2 输入频率电路图
2.2.2 分频器
时钟信 的处理是FPGA的特色之一,因此分频器也是FPGA设计中使用频率非常高的设计之一。我们需要对系统时钟进行分频,可用计数的方式。分频频率等于输入信 频率除以分频系数(clk_div = clk/PERIOD), 占空比为1/ PERIOD(在一个输入信 的周期中)。而输入固有频率为12MHz且占空比为50%,由此可推算出分频参数大约为6000000使其分频出的信 的占空比也为50%,即可通过计数器划为1Hz频率(12000000/1)*50%=6000000,当计数器达到它的时候电平进行翻转,就可以实现结果了。图2-3为分频器的流程图。同时,在产生 警信 时使用了另外一个分频器,但原理和此分频器一致,可以精确地从 警时开始计时。
图2-3 分频器设计流程框图
2.3 按键消抖
按键消抖,通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因此在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。本设计中的“按键消抖”是必不可少的,对于用户的体验也是直线上升。在没有按键消抖下的设计,按键功能是不太靠谱的,常常出现无法正常使用的情况。在本设计中采用通过“延时消抖”方法,可任意设置按键的个数。如图2-4为按键原理图。
图2-4 按键原理图
2.3.1 延时前脉冲边沿检测
检测按键按下时要用到脉冲边沿检测的方法,捕捉信 的突变、捕捉时钟的上升沿或下降沿时经常会用到这种方法。简单地说就是用一个频率更高的时钟去触发要检测的信 ,用两个寄存器去储存相邻两个时钟采集到的值,然后进行异或运算,如果不为零,代表产生了上升沿或下降沿。
在“按键消抖”的过程中,同样运用了脉冲边沿检测。用两个寄存器储存相邻时钟采集的值(例如keypre,key),然后将data取反与前一个值相与(state=keypre&(~key)),如果为1则判断有下降沿,即按键按下由高到低;否则无变化。
将一个信 由连续时钟采集,相邻两个钟触发的值存入两个寄存器。此时利用了非阻塞赋值的特点,经过两个时钟触发,key_rst存储的是当前时刻key的值,key_rst_pre存储的是前一个时钟的key的值。图2-3为按键状态的存储流程图。脉冲边沿检测:key_edge= key_rst_pre & (~key_rst)。当key检测到下降沿时,key_edge产生一个时钟周期的高电平。
图2-5 按键状态存储流程图
2.3.2 产生延时
当检测到key_edge有效是计数器清零开始计数。([17:0] cnt)产生延时所用的计数器,系统时钟12MHz,要延时20ms左右时间,至少需要18位计数器。如图2-6为延时流程图。
图2-6 延时流程图
2.3.3 延时后检测按键
如果按键状态变低产生一个时钟的高脉冲。如果按键状态是高的话说明按键无效。通过两个寄存器:key_sec_pre和key_sec,当延时结束后将第一次上key_sec赋值。如图2-7为延时后按键存储的流程图。
图2-7 延时后按键存储流程图
与此同时,检测电平寄存器变量key_sec_pre会存储key_sec的值。如图2-8。
图2-8 电平按键存储流程图
通过边沿检测,输出信 key_pulse = key_sec_pre & (~key_sec)。得到“按键消抖”后的按键值。
2.4 倒计时
该模块为此设计的核心部分,完成对数码管的动态显示和倒计时的功能实现。首先,完成对数码管的显示值进行编码。其为两个七段数码管,并且显示0-F的值,通过初始化的方式将写入16位寄存器seg中。需要设置时所使用的“个”与“十”寄存器、供其显示的“个”与“十”寄存器、输入分频的脉冲信 和输入信 、输出的两个数码管的寄存器和状态标志位。每当分频脉冲信 为高电平且开始标志为高电平时进入倒计时,每次对“个”寄存器进行减1。当个位为0时先判断十位是否为0,如果为0倒计时结束发出 警通过数码管显示“FF”,并伴有RGB灯和LED流水灯的显示效果,否则十位减1。如此循环则进入倒计时。
2.4.1 数码管设计
数码管是工程设计中使用很广的一种显示输出器件,此开发板为两个7段数码管组成,每个数码管分别由a、b、c、d、e、f、g和表示小数点的dp组成。如图2-9为数码管原理图。
图2-9 数码管原理图
下图2-10为7段数码管原理图。
图2-10 7段数码管原理图
数码管实际上是由8个led灯组成。共阴极8段数码管的信 端低电平有效,可以控制输出信 控制FPGA的管脚进而使数码管显示。如下表2-1所示。
表2-1 数码管显示表
输入码 |
输出码(共阴极) |
字型 |
A3 A2 A1 A0 |
g f e d c b a |
|
0 0 0 0 |
0 1 1 1 1 1 1 |
0 |
0 0 0 1 |
0 0 0 0 1 1 0 |
1 |
0 0 1 0 |
1 0 1 1 0 1 1 |
2 |
0 0 1 1 |
1 0 0 1 1 1 1 |
3 |
0 1 0 0 |
1 1 0 0 1 1 0 |
4 |
0 1 0 1 |
1 1 0 1 1 0 1 |
5 |
0 1 1 0 |
1 1 1 1 1 0 1 |
6 |
0 1 1 1 |
0 0 0 0 1 1 1 |
7 |
1 0 0 0 |
1 1 1 1 1 1 1 |
8 |
1 0 0 1 |
1 1 0 1 1 1 1 |
9 |
1 0 1 0 |
1 1 1 0 1 1 1 |
A |
1 0 1 1 |
1 1 1 1 1 0 0 |
B |
1 1 0 0 |
0 1 1 1 0 0 1 |
C |
1 1 0 1 |
1 0 1 1 1 1 0 |
D |
1 1 1 0 |
1 1 1 1 0 0 1 |
E |
1 1 1 1 |
1 1 1 0 0 0 1 |
F |
数码管可正常显示倒计时,并且同步用户操作的“数码管”显示功能。在状态0时,当计数的“个”与“十”寄存器发生变化将会触发“数码管”显示保存的操作。在状态1时,当设置的“个”与“十”寄存器发生变化将会触发“数码管”显示当前数的操作。在 警时和 警后正常显示“FF”。如图2-11为倒计时功能流程图。
图2-11 倒计时流程图
2.5 按键控制模块
此前,我们已经对按键进行了“消抖”处理,接下来对四个按键的功能进行了划分。按键1具有中断计数和设置数加1的功能、按键2具有开始计时、暂停计时和设置数减1的功能、按键3具有复位的功能以及按键4具有选择功能状态的功能。以此规划按键,可以节省不少资源,设置好按键值后可自动保存倒计时的值,从而使得倒计时可以通过按键操作实现设置0-99的倒计时数。当按下按键时,KEY导通,对应为上升沿。所以敏感信 为上升沿触发,并且各按键设置有标志位,用于协调系统的运行。例如,通过状态位来控制各个按键的具体功能是什么,是设置还是计时。如图2-11为按键电路图。这里只介绍设置个和十位寄存器的部分。
图2-12 按键电路
2.5.1 按键规划
规划按键在本设计中存在一定问题,但根据实际使用来说已是够用,且有一定的人机交互体验。如图2-12为按键框图。
图2-13 按键框图
2.5.2 设置部分
当按键1或按键2操作时对应进行加减,当遇到其为0或9时进行判断处理来设置个位寄存器和十位寄存器。如图2-13为设置部分流程图。
图2-14 设置部分流程图
2.6 RGB灯模块
RGB灯实际上是由三基色红绿蓝组成,在电路中由三个LED灯组成一个RGB灯。如图2-13为RGB电路原理图。当FPGA对应引脚产生低电平时,对应灯点亮。对其进行编码可以组成23 = 8种色,在设计中只使用了三基色闪烁,并且随着 警的计数值变化。
图2-15 RGB灯电路
根据需求对输入进行编码。如表2-2。
表2-2 RGB显示表
输入信 |
输出信 |
G B R |
颜色 |
0 1 1 |
绿 |
1 0 1 |
蓝 |
1 1 0 |
红 |
2.7 流水灯模块
流水灯电路由8个LED灯组成,且当FPGA引脚在处于低电平时导通LED灯使其点亮。本设计模拟 警系统,在计数状态和 警结束后显示1个LED灯,在 警过程中所有LED灯点亮。
图2-16 流水灯电路
第3章 基于小脚丫FPGA的Quartus II使用
3.1 配置
使用不同型 的FPGA配置也是不同的,不仅要对应芯片的类型,还要将软件所定义的输入与输出对应于硬件的管脚。此设计使用的开发板兼容Quartus,并且安装了相应的器件包,对于开发来说是一件容易的事。
3.1.1 设备的配置
在下载程序前对设备进行配置。如下图3-1,选择10M08SCM153I7G,修改I/O standard为3.3-V LVTTL,修改Reserve all unused pins为as input tri-stated with weak pull-up。
图3-1 硬件配置
3.1.2 管脚的配置
在Assignments->Pin Planer中配置管脚信息,可用手输入也可使用text文件导入等,但其实工作量差不多,如果为copy别人的项目或者任务分工来说这样会大大缩短开发时间。下图3-2对应了FPGA管脚的配置,根据提供的手册中的管脚分布图可自由分配管脚。
图3-2 管脚配置
3.2 RTL视图
在Tools->Netlist Viewers->RTL Viewer中打开可观察各模块之间的关系,使用者可分析原理图的结果与所设想中的设计一致,可以校验代码的正确性,排除一些简单问题的错误。
图3-3 RTL视图
例如,下图3-4为时钟分频模块结构图。
图3-4 时钟分频RTL图
3.3 程序下载
如果拥有开发板,并且可以有烧录程序,下载时间也不算特别长。我们可以把测试的部分往后稍稍,先将代码送入开发板,观察板子的具体运行状态。
开发板使用的是USB-Blaster,在软件目录中有驱动程序的安装文件。
第一步,打开Tools->Programmer,硬件选择USB-Blaster。
第二步,点击Add File,在output files文件夹中选择“.pof”文件。
第三步,选中Program/Configure和Verify并点击Start,开始烧录。如下图为已下载成功。如下图3-5程序下载图。
图3-5 程序下载图
该设计为本人电子课程设计。
完整代码及说明连接:https://download.csdn.net/download/qq_42047541/12093274
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!