您的当前位置:首页090910064_基于FPGA的多功能万年历

090910064_基于FPGA的多功能万年历

2024-01-06 来源:小侦探旅游网
基于FPGA的多功能万年历

1. 绪 论

现代科技在不断进步电子技术在不断发展,电子产品设计复杂程度也在不断增加。而且电子产品的更新换代也越来越快,现在只靠传统的纯硬件的设计方法已经不能满足现代人们的要求。EDA就是典型的硬件设计软件化的设计平台。

EDA是一项非常先进的技术,它有许多别的技术没有的优点:像单片机需要先画出硬件图再编写相对应的程序,而EDA是先编好程序再画图的,而且模块化的编程还会在软件中生成相应的封装元件,使最后画原理图变的更加简单;可以编好程序就直接仿真,程序出现错误可以在源文件内部直接改;并且设计好的总系统可以集成在一个体积小、功耗低、可靠性高的芯片上。

本设计采用VHDL语言,VHDL语言是一种全方位的数字系统设计和测试的硬件描述。它支持原理图输入方法以及传统的文件输入方。对于前者适用于小规模的数字集成电路,并进行模拟仿真。而对于大规模的、复杂的系统,如果用纯原理图设计方法的话的,由于种种条件和环境制约,会导致工作效率底而且容易出错的等缺点。在信息技术的今天,集成电路逐渐的趋向于系统化、微尺寸化、低功耗高集成化,因此,高密度可编程逻辑器件和VHDL越来越得到设计者的青睐。它具有极强的描述能力,支持结构、数据流、行为三种描述形式的混合的设计方式,描覆盖面广、抽象能力强。它能支持系统行为级、逻辑门级和寄存器传输级三个不同层次的设计。在本设计中用到的FPGA是特殊的ASIC芯片,ASIC是一种带有逻辑处理的加速处理器的专用的系统集成电路。它具有功耗低、速度快、集成度、设计制造成本低等优点。

本设计是研究基于FPGA的多功能万年历的设计,主要实现以下功能:能够显示年、月、日、时、分、秒,时间采用24小时制。当时间不准确时还可以手动校准。本系统还能实时的显示当前的温度,扩展了万年历的功能。我采用的是数字温度传感器DS18B20和FPGA组成的温度采集系统,此系统具有硬件电路简单,抗干扰能力强等优点。

第 1 页 共37页

1.1 项目研究的背景和意义

现在是一个科技迅速发展的时代。新的电子产品、电子技术日异更新。生在21世纪的我们应该都深深的体会到电子产品给我们带来的变化,而且电子产品更是随处可见。随着科技的发展人们的生活节奏也越来越快,时间对人们来说也是越来越宝贵。在这样快节奏的生活里,人们常常会忘记了时间,一旦遇到重要的会议或重要的事情而忘记了时间,这将会带来很大的损失。而传统的钟表已经不能满足这些人的要求。随着科技的发展和社会的进步,人们对数化日历的要求也越来越高。数字化的日历具有功耗低、多功能化、一劳永逸等优点,因此数字化的日历必将取代传统的日历走入寻常百姓家。

本设计采用的是数字温度传感器DS18B20和FPGA组成的温度采集系统。数字温度传感器DS18B20,可以直接与FPGA相连,构成简单的测量电路,这样就方便实现远距离传输和多点温度测量;而且FPGA相对于单片机来说速度快,修改方便,可以减少开发成本和时间,并增加了系统的灵活性。

EDA是一项非常先进的技术,它有许多别的技术没有的优点:像单片机需要先画出硬件图再编写相对应的程序,而EDA是先编好程序再画图的,而且模块化的编程还会在软件中生成相应的封装元件,使最后画原理图变的更加简单;可以编好程序就直接仿真,程序出现错误可以在源文件内部直接改;并且设计好的总系统可以集成在一个体积小、功耗低、可靠性高的芯片上。

1.1 课题相关技术的发展

现代电子产品基本上都是大量使用大规模的可编程的逻辑器件,这样就降低了产品

的功耗、缩小了电子产品的体积、功能也越来越多样化、产品的性能也得到提高。现代计算机技术在电子产品开发中得到了广泛的应用,以前需要一两个月才能开发出来的,现在只要几个星期甚至更短的时间,不仅仅缩短了电子产品的研发周期还提高了自动化程度,降低了生产的成本,增加了产品的竞争力。EDA(电子设计自动化)是最近几年才迅速发展起来的,它是将计算机软件、硬件、微电子技术交叉运用的现代电子技术。现在电子产品都在趋于数字化,基于EDA的数字系统的设计具有很大的应用市场。

可编程逻辑器件自EDA诞生以来,经历了PLA、PAL、GAL、CPLD、FPGA几个阶段。现在比较流行的可编程逻辑器件就是美国ALTERA公司的FPGA和CPLD。可编程逻

第 2 页 共37页

辑器件采用全新的结构和先进的技术可以根据用户的要求来构造逻辑功能的数字集成电路,加上MaxplusII(或最新的QUARTUS)开发环境,不仅简化了电路的设计,降低了成本,提高了系统的可靠性,也给数字化设计带了了重大变革。

电子设计的核心就是EDA技术,EDA技术是指以计算机为开发平台,融合应用电子技术,计算机技术而研制成的通用软包。EDA技术经历了70年代的计算机辅助设计CAD、80年代的计算机辅助工程CAE和电子系统设计自动化ESDA三个发展阶段。它的基本特征是:“自顶向下”的设计方法,对整个系统进行方案设计和功能划分,提高了设计的效率,比单片机或C语言要简单易懂。

本设计利用硬件描述语言结合可编程逻辑器件进行的,VHDL语言具有一下优点: (1)VHDL的描述范围宽使它成为高层次的设计的核心,将工作人员的重心提高到了系统功能的实现与调试。(2)VHDL可以用简洁的代码来描述复杂的控制逻辑设计,灵活且方便。(3)VHDL不依赖与特定的器件,方便了工艺的转换。(4)VHDL是一个标准的语言,众多的EDA厂商都支持,因此移植性强。

1.2 课题研究的内容

本设计主要研究基于FPGA的多功能万年历,要求如下:

(1)显示年、月、日、时、分、秒,时间以24小时为一个周期。

(2)具有校准以及报时功能,可以对年、月、日、时、分及秒进行单独校对,使其校正到标准时间。

(3)能够实时的显示当前温度。

1.3 设计方案论证与选择

方案一:运用单片机C语言实现多功能万年历的设计

按照设计要求,系统软件编程应包含三个部分:输入部分,选择导出部分,输出显示部分。相应的系统硬件部分除了核心模块单片机之外,主要的外围部件还有按键、传感器等。其中单片机系统作为中央处理单元,根据逻辑开关输入的信号转换为显示部分能识别的方式传递给显示部分,显示部分接到传来的指示信号做出相应的显示。此方法

第 3 页 共37页

运用了当前最常见的C语言,方案较简洁,不过C语言难以掌握,因此本设计不采用此方法。

方案二:运用数字逻辑电路实现多功能万年历的设计

采用74138、74161和其它器件构成实现对万年历控制功能的硬件电路。由设计要求可知,可以把电路分为按键控制电路,译码、显示、驱动等各部分电路。开关控制电路,译码与显示驱动电路,显示电路。这种方案是由纯硬件电路实现的设计,优点是省略了软件部分的设计,但是这种方案因为是纯硬件实现的,成本较高,误差较大,不灵活,因此在本次设计中也不予以采用。

方案三:运用EDA技术实现多功能万年历的设计

根据设计要求,系统设计依靠EDA的MAX+PLUS Ⅱ设计软件、VHDL硬件描述语言及FPGA芯片实现多功能万年历的设计。即在MAX+PLUS Ⅱ软件中用VHDL语言编写各模块程序,通过编译后分别封装成元器件,这些元器件生成顶层文件,再画出硬件电路图,这是EDA硬件软件化的一大特点。最后借助EDA实验箱实现硬件仿真的功能。软硬件相结合,层次分明,结构清晰。且VHDL语言简单易懂,FPGA芯片也是当今的流行趋势。

综合以上三种设计方案,方案三是最为经济合理的,也是我们最能理解的。

2. FPGA简介

2.1 FPGA概述

FPGA(Field Programmable Gate Array)即现场可编程门阵列,它是在PLA、GLA、CPLD等可编程器件的基础上进一步发展的产物。它是专用集成电路中的一种半定制电路,具有门电路数多的优点。

2.2 FPGA基本结构

FPGA器件在结构上,由逻辑功能块排列为阵列,它的结构可以分为三个部分:可编程逻辑块CLB(Configurable Logic Block)可编程I/O模块(Input/Output Block)和可编程内部连线PI(Programmable Interconnect)。

(1).CLB是FPGA的主要组成部分,图2-1是CLB基本结构框图。

第 4 页 共37页

CLB CLB CLB CLB 可编程开关矩 CLB CLBCLB CLB 块输入输出模 CLB CLB CLB CLB 互连资源 CLB CLB CLBCLB

图2-1 CLB基本结构

(2).可编程输入/输出模块IOB,编程灵活根据系统功能的需要可被配置为输入、输出或双向传输三种功能,实现不同的逻辑功能,满足不同的的逻辑接口的需要。

(3).可编程内部连线PI。XC4000系列芯片的连线资源由水平和垂直的布线通道构成,较短的线段分布于单个CLB中,较长的线段跨接与两个CLB之间,而最长的线段跨越怎个芯片。可编程开关用来把CLB的输入输出接到其周围的线段上,并且可以将两个不同的线段连接在一起。

3. 多功能万年历总体设计方案

3.1 多功能万年历的构成

日历实际上是一个对标准频率(1HZ)进行计数的计数电路。因此标准的1HZ时间信号必须做到准确稳定。通常使用石英晶体振荡器电路构成数字钟。同时为了保证与标准时间的一致,需要在电路上加上一个校准电路。同时图3-1所示为日历的一般构成框图。主要包括时间基准电路、计数器电路、控制电路、译码和显示电路。其核心的部分就是控制逻辑电路,不断完善它可以增加系统的功能。

第 5 页 共37页

译码驱动 译码驱动 译码驱动 译码驱动 译码驱动 译码驱动 时十位 计数 时个位 计数 分十位 计数 分个位 计数 秒十位 计数 秒个位 计数 校时控制电路 校分控制电路 1HZ 晶体振荡器电路 分频器电路 分频器电路

图3-1 日历时钟部分组成框图

本设计还具有显示年、月、日的功能,其显示范围为其总体框架如图3-2。

第 6 页 共37页

图3-2 总体框架

3.2 多功能万年历工作原理

日历的核心部分就是时钟部分,实际就是对标准的时钟信号进行计数,秒计数器对秒脉冲信号进行计数,记满60秒后就分计数器进位同时又从0开始计数;分计数器对秒的进位信号进行计数,记满60后向时计数器进位同时又从0开始计数;同理时计数器为24进制计数器,记满24向日计数器进位同时计数器清零,重新开始计数。由于日数根据年、月的不同天数也不同,必须由年、月共同决定,日记满后12个月后向年计数器进位。各个计数器的输出分别经过译码器送数码管显示。当计时出现错误时,可以用校准电路对年、月、日、时、分、秒进行校准。在系统中除了需要校准的控制信号外,还需要有时钟的使能信号、清零信号。这些控制信号由一个4×4矩形键盘输入。 七段译码器构成译码显示电路,数码管完成显示功能。在此的系统中利用数字温度传感器DS18B20和FPGA组成的温度采集系统经处理后送至数码管显示即可。

第 7 页 共37页

4 单元电路

4.1 分频模块电路设计与实现

在此系统中晶体振荡器的信号的稳定性与精准度直接影响到整个日历时钟的准确度。为了保证基准时钟的准确性,所以我决定选用特性非常好的石英晶体,它只让某一特定频率点的信号通过,其他频率段的信号全部会被它衰减,而且它震荡信号的频率与震荡电路中的元器件完全无关。所以这种震荡电路输出的是准确度极高的信号,再利用分频电路的话就会得到标准的秒信号,其组成框图如图4-1。

石英晶体 振荡电路 分频电路 秒信号

图4-1 秒信号产生电路框图

本系统使用的晶体振荡器电路给数字钟提供一个频率稳定准确的40MHz的方波信号,其输出至分频电路。分频电路的逻辑框图如图4-2所示。

图4-2 分频电路模块

第 8 页 共37页

图4-3 分频模块电路设计

其内部结构图见图4-3。电路中采用Max+plusII元器件库中的计数器7490进行硬件分频。经分频后输出1HZ的标准秒信号CLK1、4MHZ的按键扫描信号、1KHZ的按键去抖信号。该模块的时序仿真图如图4-4所示,满足设计要求。

图4-4 分频模块仿真图

4.2 温度测量模块电路设计与实现

在本统中利用数字温度传感器DS18B20和FPGA组成的温度采集系统,

这样就不需要模数转换电路和信号放大电路,组成的硬件电路简单,抗干扰能力强。 4.2.1温度传感器的选择

温度传感器根据是否要与被检测介质接触,分为接触式传感器和非接触式传感器两类。接触式传感器包括根据被测物体受温度影响的膨胀度制成的传感器;基于半导体或导体受温度影响电阻值或电荷数发生改变而制成的传感器;基于热电效应的热电偶传感

第 9 页 共37页

器等。非接触式传感器是根据温度与热辐射特性之间的关系对温度进行测量。由于这里测的是空气的温度,所以选择用接触式传感器。

常用的接触式温度传感器有铂电阻、热电偶和半导体热敏电阻等类型。它们的特点如下:

图4-5 温度传感器的比较

综合上述各个传感器的优缺点,这里选择半导体热电阻类型,在本系统中采用DS18B20温度传感器。由美国DALLAS公司生产DS18B20温度传感器是的可编程数字温度传感器,具有3个引脚,且封装形式多样,体积小,质量轻、线性度好、耐擦耐磨,传输距离远、性能稳定;温度测量的范围大概在-55℃~+125℃,可进行9的~12位A/D转换精度。温度测量的分辨率最高可达到0.0625℃,温度测量结果用带符号的16位数字量进行串行输出。 4.2.2 Ds18b20的主要特征

(1)、适用的电压范围比较宽,大概为3.0~5.5V,在特殊情况下还可以有数据线供电。

(2)、温度测量的范围为-55℃~+125℃,A/D转换精度为9~12位,精度越高那么测出的温度也就越精确,对应温度分辨率为0.5℃、0.25℃、0.125℃和0.0625℃,即它

第 10 页 共37页

可以实现高精度的温度测量。

(3)、最突出的特点在于它采用的是独特的单线接口方式,DS18B20在与FPGA连接时仅需要一条口线即可实现双向通讯。

(4)、DS18B20在使用方便简单,它不需要添加任何外围元件,传感元器件和温度转电路全部集成在器件中。

(5)、多个DS18B20能够相互并联,组成一个测温网络,并且这些DS18B20的数据线可以连在一根数据线上。

(6)、测量结果直接输出数字温度信号,以数据串行方式传送给FPGA,同时可传送校验码,具有极强的抗干扰纠错能力。

(7)、负压特性:当电源极性接反的时候,芯片不会因发热而烧毁,只是不能正常工作。

(8)、每个Ds18b20传感器都有一个唯一的64位序列码这样就可以解决分布式温度测量中处理器与多个传感器相连的问题。

Ds18b20与FPGA的连接电路如图4-6,VDD端口5V电源,GND接地,DG端口接FPGA的一位双向口,另外在数据连接线上还要接上一个4.7K的上拉电阻。

图4-6 Ds18b20与FPGA的连接图

4.2.3 Ds18b20的内部结构

DS18B20内部结构主要由四部分组成,如图4-7:

第 11 页 共37页

图4-7 DS18B20内部结构图

(1)、光刻ROM。其中的64位序列号是出厂前被光刻好的,它可以看作DS18B20的地址序。

(2)、温度传感器。该部分可以完成对温度的测量,以二进制补码的形式进行存储,并通过显示器进行16进制度的转换,从而进行当前稳定的显示。其温度存储的格式如下

表4-1: DS18B20温度值格式表

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 LS Byte 2 3

bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 MS Byte

23

第 12 页 共37页

22 21 20 2-1 2-2 2-3 2-4 22 21 20 2-1 2-2 2-3 2-4 表4-2: DS18B20温度数据表

(3)、配置寄存器。该字节各位的意义如下: TM 低五位一直都是\"1\",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用 户不要去改动。R1和R0用来设置分辨率,如下表所示: 表4-3: 温度分辨率设置表 R1 0 0 1 1 4.2.4 温度测量的软件设计

软件设计是使用VHDL语言与图形输入相结合的方法,clk1提供了系统工作时钟,data提供控制信号,DQ为传感器传入数据的接口,TEMP为输出信号,送到显示器显示。

第 13 页 共37页

R1 R0 1 1 1 1 1 R0 0 1 0 1 分辨率 9位 10位 11位 12位 温度最大转换时间 93.75ms 187.5ms 375ms 750ms 软件设计程序见附录。

图4-8 DS18B20与FPGA通信图

4.3 校时控制模块电路设计与实现

4.3.1 键盘接口电路原理

校时控制模块在本系统中也就是键盘接口电路部分。下面先介绍键盘接口电路的工作原理,如图4-9。本系统采用的就是这种行列式键盘接口,相对个按键的键盘接口来说节省了I/O接口。其中行线与列线分别与按键的两端相连。在查询工作方式中判断是否有按键按下的方法是:先有响应的I/O接口将列线输出为0电平,在由相应的I/O接口将所有的行线结果读入到控制器中。若有行线输入为0,则有键按下,反之,则没有键按下。

如果发现有按键按下界限来就是通过安检扫描来确定是哪个按键被按下,键盘扫描的过程是依次轮流将列线输出为0电平,然后再检查各行线的状态。若某行线输入为0,组对应的该行线与该列线的按键被按下,即可确定对应的键号。

第 14 页 共37页

图4-9 键盘接口电路

4.3.2 键盘接口的VHDL描述

(1).按键消抖

本系统采用的是软件消抖的办法去除按键抖动,基本原理是:首先判断有没有按键按下,如发现有按键按下则延时一段时间,在判断是否有按键按下的信号,如果有则确定有按键按下,就产生一个有按键按下的信号。这样就消除了按键的机械抖动。该模块的逻辑框图如图4-10所示。

图4-10 去抖逻辑框图

该电路的VHDL程序如下: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

第 15 页 共37页

entity qudou is port(clk1:in std_logic;

row:in std_logic_vector(3 downto 0); key_pre:out std_logic); end qudou;

architecture behav of qudou is

signal sig1,counter:std_logic_vector(3 downto 0); signal tmp1,sig2:std_logic; begin sig1<=row;

tmp1<=sig1(0)and sig1(1)and sig1(2)and sig1(3);

key_pre<=counter(0)and counter(1)and counter(2)and counter(3); process(clk1) begin

if(clk1'event and clk1='1')then if(tmp1='0')then if(sig2='0')then sig2<='1'; end if; end if; if(sig2='1')then

if(counter=\"1111\")then sig2<='0';

第 16 页 共37页

counter<=\"0000\"; else

counter<=counter+'1'; end if; end if; end if; end process; end behav; (2).键扫描模块

键扫描模块的框图如图4-11所示。

图4-11 按键扫描模块

CLKY是由分频器模块分出的4MHZ的输入时钟信号,因为键扫描是一个比较快的过程所以这里采用的是频率较高的时钟信号。Key_pre是去抖模块输出的有按键按下的信号作为启动按键扫描的使能信号。ROW[3..0]与键盘的行线相连,COM[3..0]与键盘的列线相连。SCAN_CODE[7..0]输出被按下键的键码。

键盘扫描程序如下: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

第 17 页 共37页

entity ajsm is

port(clky,key_pre:in std_logic;

row:in std_logic_vector(3 downto 0); com:out std_logic_vector(3 downto 0); scan_code:out std_logic_vector(7 downto 0)); end ajsm;

architecture behav of ajsm is

signal sig_com:std_logic_vector(3 downto 0); signal counter:std_logic_vector(1 downto 0); signal tmp,sig1,sig2:std_logic; begin

sig2<=key_pre;

tmp<=row(0) and row(1) and row(2) and row(3); process(clky) begin

if(clky'event and clky='1')then --计数进程 if(sig2='1')then if(counter=\"11\")then sig1<='0'; counter<=\"00\"; else

sig1<='1';

counter<=counter+'1';

第 18 页 共37页

end if; end if; end if; end process;

process(clky) --列线逐位输出低电平 variable jt :std_logic; begin

if(clky'event and clky='1')then if(sig1='1')then jt:=sig_com(3); for i in 3 downto 1 loop sig_com(i)<=sig_com(i-1); end loop; sig_com(0)<=jt; else

sig_com<=\"1110\"; end if; end if; end process; process(clky) begin

if(clky'event and clky='1')then if(sig1='1')then

第 19 页 共37页

com<=sig_com; else

com<=\"0000\"; end if; end if; end process;

process(clky) --键码信号赋值 begin

if(clky'event and clky='1')then if(sig1='1')then if(tmp='0')then

scan_code<=row & sig_com; else

scan_code<=\"11111111\"; end if; else

scan_code<=\"11111111\"; end if; end if; end process; end behav; (3).键码转换模块

该模块框图如图4-12所示。模块主要完成从键扫描码到按键编码的转换。

第 20 页 共37页

图4-12 键码转换模块逻辑框图

键码转换的核心程序如下: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity jmzh is

port(clky:in std_logic;

scan_code:in std_logic_vector(7 downto 0); key_code:out std_logic_vector(3 downto 0)); end jmzh;

architecture behav of jmzh is begin process(clky) begin

if(clky'event and clky='1')then case scan_code is

when \"11101110\"=>key_code<=\"0000\"; when \"11101101\"=>key_code<=\"0001\"; when \"11101011\"=>key_code<=\"0010\";

第 21 页 共37页

when \"11100111\"=>key_code<=\"0011\"; when \"11011110\"=>key_code<=\"0100\"; when \"11011101\"=>key_code<=\"0101\"; when \"11011011\"=>key_code<=\"0110\"; when \"11010111\"=>key_code<=\"0111\"; when \"10111110\"=>key_code<=\"1000\"; when \"10111101\"=>key_code<=\"1001\"; when \"10111011\"=>key_code<=\"1010\"; when \"10110111\"=>key_code<=\"1011\"; when \"01111110\"=>key_code<=\"1100\"; when \"01111101\"=>key_code<=\"1101\"; when \"01111011\"=>key_code<=\"1110\"; when others =>key_code<=\"1111\"; end case; end if; end process; end behav;

程序中采用case语句进行按键编码,也可以用elsif语句实现此段程序设计。 完整的键盘程序应加上刚开始介绍的分频模块,键盘接口电路总的逻辑连接框图如图4-13所示。

第 22 页 共37页

图4-13 键盘接口连接框图

4.4 计数模块的设计与实现

4.4.1 秒计数模块

秒计数模块逻辑框图如图4-14所示。

图4-14 秒计数模块框图

输入端口ENL是整个日历的使能信号也是秒计数器的使能信号,高电平有效;CLK是秒脉冲输入端口;RES是异步清零信号;MADD和MDEC是同步校时控制信号,MADD是控制秒信号加一,MDEC是控制秒信号减一;输出端口A[3..0]是秒时钟的低位,B[3..0]

第 23 页 共37页

是高位;CA端口是进位输出端口,当秒计数到59时输出高电平,其它时候输出低电平。秒计数模块的程序如下:

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity miao is

port(enl,res,clk,madd,mdec:in std_logic; a,b:out std_logic_vector(3 downto 0); ca:out std_logic); end miao;

architecture SEC of miao is begin

process(enl,clk,res)

variable m0,m1:std_logic_vector(3 downto 0); begin

if res='1' then m0:=\"0000\"; m1:=\"0000\"; ca<='0';

elsif clk'event and clk='1' then ca<='0';

if madd='1' or enl='1' then

if m0=\"1000\" and m1=\"0101\" then ca<='1'; --冲

第 24 页 共37页

实际是第59个--脉 end if;

if m0<\"1001\" then m0:=m0+1;

else m0:=\"0000\"; m1:=m1+1;

if m1>\"0101\" then m0:=\"0000\"; m1:=\"0000\"; ca<='0'; end if; end if;

elsif mdec='1' then

if m0=\"0000\" and m1=\"0000\" then m0:=\"1001\"; m1:=\"0101\"; elsif m0>\"0000\" then m0:=m0-1; else m0:=\"1001\"; m1:=m1-1; end if; end if; end if; a<=m0; b<=m1; end process; end SEC;

秒时钟的仿真波形图如图4-15所示,仿真图满足设计的要求。分计数和时计数模

第 25 页 共37页

块的设计原理与秒模块的类似。

图4-15 秒时钟仿真波形

4.4.2 日计数模块

由于一年中各个月份的日的长短不同,共有28、29、30和31天四种情况,可知日由年和月共同决定,如表4-1。年中0表示闰年,1表示平年;月中0表示1、2、3、5、7、8、10和12月,1表示其它月份;二月中1表示2月,0表示其它月份。

表4-1 日长短逻辑表

年 SEL[0] 0 1 0 1 0 1 0 1 月 SEL[1] 0 0 1 1 0 0 1 1 二月 SEL[2] 0 0 0 0 1 1 1 1 日 —— —— 31 —— 30 29 28 —— ——

日计数模块的逻辑框图如图4-16所示输入引脚SEL[2..0]是决定日长短的输入信号,其它信号功能与秒计数模块功能类似。

图4-16 日计数模块逻辑框图

第 26 页 共37页

日计数模块的核心程序如下: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ri is

port(enl,res,clk,radd,rdec:in std_logic; sel:in std_logic_vector(2 downto 0); a,b:out std_logic_vector(3 downto 0); ca:out std_logic); end ri;

architecture SEC of ri is

signal sr0,sr1:std_logic_vector(3 downto 0); begin process(sel) begin

if sel=\"001\" then sr0<=\"0001\"; sr1<=\"0011\"; end if;

if sel=\"011\" then sr0<=\"0000\"; sr1<=\"0011\"; end if;

if sel=\"100\" then sr0<=\"1001\"; sr1<=\"0010\";

第 27 页 共37页

end if;

if sel=\"101\" then sr0<=\"1000\"; sr1<=\"0010\"; end if; end process;

process(enl,clk,res)

variable r0,r1:std_logic_vector(3 downto 0); begin

if res='1' then r0:=\"0000\"; r1:=\"0000\"; ca<='0';

elsif clk'event and clk='1' then ca<='0';

if radd='1' or enl='1' then

if r0=sr0 and r1=sr1 then r0:=\"0001\"; r1:=\"0000\"; ca<='1'; elsif r0<\"1001\" then r0:=r0+1; ca<='0';

else r0:=\"0000\"; r1:=r1+1; end if;

elsif rdec='1' then

第 28 页 共37页

if r0=\"0001\" and r1=\"0000\" then r0:=sr0; r1:=sr1; elsif r0>\"0000\" then r0:=r0-1; else r0:=\"1001\"; r1:=r1-1; end if; end if; end if; a<=r0; b<=r1; end process; end SEC;

程序中第一个进程主要是对日的长短的设置,sr0和sr1分别是日的低位和高位的信号,它们的值由输入sel[2..0]决定。sel[0]由年计数模块输入,sel[1]和sel[2]由月计数模块输入。第二个进程主要实现计数和加减控制。日计数模块的时序仿真图如图4-17所示,仿真图满足设计的要求。

图4-17 日计数仿真时序图

4.4.3 月计数和年计数模块

第 29 页 共37页

(1).月计数模块逻辑框图如图4-18所示。输出ERYUE端口接日模块的sel[2],YSEL端口接sel[1] 。其VHDL程序描述见附录。

图4-18 月计数逻辑框图

其仿真时序图如图4-19所示。仿真图中有毛刺出现,但并不会对本模块的计数产生影响,满足本设计的需要。

图4-19 月模块仿真时序图

(2).年计数模块的逻辑框图如图4-20所示。年计数模块的输出NSEL端口接日模块的sel[0]。其它端口的功能与上述模块类似。其VHDL描述见附录。

图4-20 年计数逻辑框图

其仿真时序图如图4-21所示,满足设计的要求。

第 30 页 共37页

图4-21 年模块仿真时序图

4.5 动态扫描及显示电路设计与实现

4.5.1 动态扫描模块

该模块的主要功能是将计数器的输出转换为能够作为数码管的逻辑状态码,并且产生数码管的片选信号和位选信号。动态扫描方式就是一次只显示一位LED显示快的数据,其它位不显示,然后逐一的显示其他位的数据,只要每一位显示的时间间隔不要太大,这样由于人眼的视觉暂留现象,看上去好像所有的数码管都在同时显示着自己相对于的数据,只是如果带动的数码管比较多的话就会导致数码管的亮度不高。

图4-22 动态扫描逻辑框图

4.5.2 显示模块

本系统选择7448作为显示译码电路,选择数码管作为显示单元电路。计数器实现了计时的功能并以8421BCD码的形式输送到数码管扫描模块,再由其输出的端送到

第 31 页 共37页

7448,将BCD码转换为七段码,再由数码管显示出来。

数码管位选连接电路4-23所示。

图4-23 数码管位选实现电路

5. 调试与验证

调试是验证系统功能是否得以实现以及实现的情况。本次设计中综合使用了MAX+PLUS II软件的文本输入方式和图形输入方式,在每种方式下都需要对各个步骤进行调试以便观察结果。在文本输入方式下,编写的程序需要通过编译才能进行波形仿真、验证功能的实现以及封装成元器件。然后在图形输入方式下,对顶层文件进行仿真验证,系统所要求的功能得到成功实现后就可以下载到试验箱上进行硬件验证了。经过编译、仿真和硬件验证三个步骤,系统的调试基本完成了。

5.1 编译

MAX+PLUS II的编译器会检测输入文档是否有语法或逻辑错误,然后配置到一个Altera器件中,所有的信息、错误和警告将在自动打开的Message Processor信息处理窗口中显示出来。如果发现错误,按下Locate按钮即可选中该错误,并且可以看到该错误出现的位置。如果在编译时出现警告,则表示程序中某些参数设置的不合理,这需要及时的纠正,不然就会影响后面的操作。

第 32 页 共37页

在对文本文件进行编译时,有三个问题需要特别关注的,一是完成文本输入后,要对文本文件进行保存,保存时文件名要与实体名相同,后缀名为.vhd。二是要注意将文件设为工程文件。三是不能将设计文件存入根目录。

在设计检测过程中,需要对每个模块都进行编译。由于程序较多,很容易出现错误。除了一些显而易见的语法错误,还有一些失误。例如在设计中忘记将设计文件的后缀选为.vhd;忘记在建立波形仿真文件时建立工程文件了;还有在保存文本文件时没有把文件名设置成实体名,如实体名为zuoz错存为zuo.vhd。当编译没有错误,没有警告时,就可以建立波形仿真图了。不要小看这些小的错误,可能会酿成大错的。所以我们在编写程序的时候就要更加小心。

5.2 编程下载

如果以上的仿真测试正确无误,就将设计编程下载进选定的目标器件EPF10K10中,作进一步的硬件测试,以便最终了解设计项目的正确性。这就必须根据评估板、开发电路系统或EDA实验板的要求对设计项目输入输出引脚赋予确定的引脚,以便能够对其进行检测。 5.2.1 电路选择

本次设计使用GW48型EDA实验开发系统。

GW48型EDA实验开发系统广泛应用于数字电路课程设计的硬件验证。GW48型EDA实验开发系统有以下特点:

(1)该EDA实验开发系统设有通用在系统编程下载ASIC器件,可对Lattice、Xilinx、Altera、Vantis、Atmel和Cypress世界六大PLD商和各种isp编程下载方式或现场配置的FPGA/CPLD各系列器件进行识别、实验或开发;主系统板与目标芯片板采用接插式结构,动态电路结构自动切换工作方式,可自动切换12种实验电路结构模式。

(2)GW48系列具备对不同芯核电压(5V、3.3V、1.8V、1.5V)的FPGA/CPLD器件进行实验、开发和编程下载。

(3)该实验开发系统除具有丰富的实验资源外,还扩展了A/D、D/A、VGA视频、PS/2接口、RS232通信、单片机独立用户系统编程下载接口、50MHz高频时钟源以及数字频率计。

第 33 页 共37页

GW48-CK教学实验系统有12种不同的电路结构,每个电路结构都有各自的特点和适用范围。本次设计通过GW48-CK教学实验系统的模式3下载实现,电路结构图见图5.4。

该电路是在经过相应的软件设计和调试后将程序下载到芯片EPF10K10LC84-3中使用,然后进行引脚锁定再将芯片插入到B2中,连接好EDA试验箱的各个模块便可以进

行硬件检测了。

5.2.3 下载验证

首先把计算机的打印机口与目标板(如开发板或实验板)用下载线连接好,接着打开电源:

(1)、下载方式设定。选择MAX+plusII项及其中的编程器Programmer选项,跳出如图5-1左侧所示的编程器窗口,然后选择Options项的Hardware Setup硬件设置选项,其窗口如图6.5左侧所示。在其下拉菜单中选ByteBlaster(MV)编程方式。此编程方式对应计算机的并行口下载通道,“MV”是混合电压的意思,主要指对ALTERA的各类芯核电压(如5V、3.3V、2.5V与1.8V等)的FPGA/CPLD都能由此下载。此项设置只在初次装软件后第一次编程前进行,设置确定后就不必重复此设置了。

图5-1 设置编程下载方式

(2)、下载。如图5-2,点击Configure键,向EPF10K10下载配置文件,如果连线无误,应出现图5-2报告配置完成的信息提示。到此为止,完整的设计流程已经结束。

第 34 页 共37页

图5-2 向EPF10K10下载配置文件

6 实验结论

6.1 实验结论

将本设计下载到实验箱上调试验证,验证的结果基本上能实现预期的效果,年、月、日、时、分、秒都能够正常计数并显示,校准等控制功能也都正常,温度显示也能实现。基本上达到了此次设计的要求。

在这次多功能万年历的设计过程中,使我进一步掌握数字电路设计的流程,为了这次的设计我翻阅了大量的资料,确实学到了很多以前在课堂上被疏忽了的知识点。培养了独立思考,自己动手实践的能力。

在电子设计中往往都会遇到这样的问题,明明在仿真的时候一切都正常。然后你连接好实物或是下载到实验箱上就会发现一系列的问题,这是因为我们再设计的时候没有考虑到顶层或是底层的接口设计,再加上实物中器件回去信号有延时。因此仿真和下载验证还是有区别的。

此次万年历的设计主要重点在于各个模块代码的编写,虽然基本上吧所有的功能都实现了,但是对于各个模块的优化还有一定的缺陷。在本次设计调试的过程中遇到了如下的一些问题:

(1).当程序下载到实验箱上后,数码管显示全部为零,计数器不工作,经分析得

第 35 页 共37页

知程序中的总的清零信号保持有效状态,改动程序后计数器开始计数,数码管才正常显示。

(2).当秒数显示从59变到0时,分计数模块计数有点滞后。后面经思考并和老师讨论后发现有可能是因为器件的延时,为了消除滞后就把程序中秒的进位信号提前1秒,再验证时就能正常显示了。

(3).利用控制按键给月模块加计数时,发现的月加到12时,年则在没有按键按下的情况下一直加计数。检查程序后得知,月的进位信号在月为12后变一直有效,其它模块也存在这种情况,改动程序后各个模块工作正常。

第 36 页 共37页

结束语

VHDL语言的出现从根本上改变了以往数字电路的设计模式,使电路由硬件和软件分开设计转变为硬件部分软件化的简易模式。这样大大地提高了设计的灵活性,减少了设计的时间及复杂性。

经过两个月左右的设计实施,该作品终于按时完成,其功能基本上满足设计要求。本设计是利用当今最先进的EDA技术,依靠MAX+PLUS II软件设计平台,采用VHDL编程语言通过分模块编写。先是写出各个模块的代码,编译仿真无误后再封装成元器件,最后画出原理图就基本上完成了汽车信号灯控制器的总体设计。硬件部分是依据软件部分设计的成功实现的,将顶层文件下载到FPGA芯片上,再接入外围部件。本设计的外围部件少,EDA实验箱上的器材满足设计需要,即最后用EDA实验箱进行调试。

在设计途中,遇到过很多困难,例如程序编译错误,波形仿真结果不符合设计目的。不过当一个个击破这些险阻的时候,才是真正成长与学到知识的时候。

总的来说本次设计还算成功,希望评阅老师给予指正与建议。

第 37 页 共37页

因篇幅问题不能全部显示,请点此查看更多更全内容