您好,欢迎来到尔游网。
搜索
您的当前位置:首页基于VHDL的万年历设计

基于VHDL的万年历设计

来源:尔游网


目录

摘 要 .......................................................... (1) Abstract ....................................................... (2) 绪论 ........................................................... (3) 第1章 基本概念简介 ........................................... (4) 1.1 EDA技术和FPGA/CPLD简介 ............................... (4) 1.2 VHDL的简介 ............................................ (4) 1.3 Quartus II的简介 ...................................... (5) 第2章 系统设计 ............................................... (6) 2.1 设计思想 ............................................... (6) 2.2 设计原理图 ............................................. (7) 2.3 设计流程图 ............................................. (8) 第3章 模块分析 ............................................... (9) 3.1 计数器模块分析 ......................................... (9) 3.1.1 秒和分计数器模块 .................................. (9) 3.1.2 时计数器模块 ...................................... (10) 3.1.3 日计数器模块 ...................................... (12) 3.1.4 月计数器模块 ...................................... (16) 3.1.5 年计数器模块 ..................................... (19) 3.2 校时模块 .............................................. (22) 3.3 显示及显示方式切换模块 ................................ (24) 3.4 顶层原理图 ............................................ (26) 第4章 引脚设定与验证 ........................................ (29) 4.1 引脚设定 .............................................. (29) 4.2 下载验证 .............................................. (31) 总结 .......................................................... (33) 参考文献 ...................................................... (34) 致谢 ........................................... (错误!未定义书签。)

摘 要

随着EDA(电子设计自动化)技术的发展和应用领域的扩大,EDA技术在电子信息、通信、自动化控制及计算机应用领域的重要性日益突出。EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description language)为系统逻辑描述手段完成的设计文件,自动完成逻辑化简、逻辑分割、逻辑综合(布局布线)、逻辑优化和仿真测试等项功能,直至实现既定性能的电子线路系统功能。EDA的关键技术之一是用形式化方法来描述数字系统的硬件电路、即用所谓的硬件描述语言来描述硬件电路。

本设计是基于VHDL语言的万年历。在设计中,首先介绍了万年历的设计思路,且在Quartus II开发环境中编译和仿真所设计各个模块的程序,并逐一调试程序使各模块达到设计目的。其次,利用各元器件生成顶层文件,进行系统仿真。最后,对顶层原理图进行引脚设定,并下载到试验箱验证,证明系统的可行性。

关键字:VHDL 万年历 Quartus II

1

Abstract

With the development of EDA (electronic design automation) technology and expansion of application fields ,the importance of EDA technology in electronic information, communication, auto control, and computer applications is becoming increasingly prominent. EDA technology is the core of the modern electronic design techniques, which rely on powerful computers . In EDA tools software platform, computer automatically completes logic simplification,logical partitions, logic synthesis , logic optimization ,logical simulation and other functions until the electronic circuit system achieves the stated performance. However, the realization of these function bases on the description of the system using the hardware description language HDL (Hardware Description language) . One of the key technologies of the EDA is to use formal methods to describe digital systems hardware circuit, which uses the so-called hardware description language to describe the hardware circuit.

The design is the calendar based on VHDL language. Firstly, in which ,I introduce ideas about designing the calendar. In addition, I compile and simulate the program of different modules in the Quartus II development environment and debug one by one to make different modules meet objectives of the design. Secondly, I take advantage of all components,which is created according to program to generate top-level file . Finally, I make pin settings and download to the test chamber to prove the feasibility of the system. Key words: VHDL calendar Quartus II

2

绪论

EDA技术以计算机为工具,而设计者只需在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动完成逻辑编译、化简、分割、综合、布局、布线和仿真,直至对于特定目标芯片的适配编译,逻辑映射和编程下载等工作。其中,EDA的关键技术之一是用形式化方法来描述数字系统的硬件电路,即用硬件描述语言来描述硬件电路。 本设计是基于VHDL语言的万年历,故名思议,需要用VHDL语言描述万年历的硬件电路。就万年历的功能而言,首先,其不仅要计算时间,且需要计算日期,尤其需要正确的判断每月的天数。在其中,比较困难的是如何正确的计算2月份的天数,因为闰年的2月份有29天,但平年的2月份只有28天。由此,引出一个新的问题:在系统中除计算年份外,还需判断其是否为闰年。其次,系统还要将时间显示,显示方式分为时分秒、年月日这两种显示方式。最后,为增加系统的实用性,本设计还增加校时功能,主要实现当计时出现误差时进行校正的功能。在本设计中,通过程序使系统有7种不同的工作状态,分别为正常计时、校分、校时、校日、校月、校年低位、校年高位。除此,为了显示目前所处的工作状态,用6个指示灯的亮灭来表示,6个灯都不亮时表示正常计时,其余每个灯的亮灭依次表示6种不同的工作状态。在系统设计中,先用VHDL语言实现各个模块的功能,然后用原理图方式生成顶层文件,使设计思路清晰。最后,对顶层原理图进行引脚设定,并进行下载验证,证明系统的可行性。

3

第1章 基本概念简介

1.1 EDA技术和FPGA/CPLD简介

EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description language)为系统逻辑描述手段完成的设计文件,自动完成逻辑化简、逻辑分割,逻辑综合(布局布线),以及逻辑优化和仿真测试等项功能,直至实现既定性能的电子线路系统功能。EDA技术使得设计者的工作几乎仅限于利用软件的方式,即利用硬件描述语言HDL和EDA软件来完成对系统硬件功能的实现。

CPLD(Complex Programmable Logic Device),即复杂可编程逻辑器件,是从PAL和GAL器件发展出来的器件,相对而言规模大,结构复杂,属于大规模集成电路。它是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现数字系统的设计。

FPGA(Field-Programable Gate Array) ,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

它们的特点是直接面向用户,具有极强的灵活性和通用性,使用方便,硬件测试和实现快捷,开发效率高,成本低,上市时间短,工作可靠性好等。FPGA和CPLD的应用是EDA技术有机融合硬件电子设计技术、SOC和ASIC设计,以及对自动设计与自动实现最典型的诠释。

1.2 VHDL的简介

硬件描述语言发展至今已有几十年的历史,并已成功地应用到系统的仿真,验证和设计综合等方面。到20世纪80年代后期,已出现上百种硬件描述语言,它们对设计自动化起了促进和推动作用。但是,它们大多针对特定设计领域,没有统一的标准,从而使一般用户难以使用。广大用户期盼一种面向设计的多层次,宽领域且得到一致认同的标准硬件语言。80年代后期有美国国防部开发的VHDL语言(VHSIC Hardware Description Language)恰好满足上述要求,并在1987年12月由IEEE标准化VHDL(定为IEEE std 1076-1987标

4

准,1993年进一步修订,被定为ANSI/IEEE std 1076-1993标准)。VHDL语言的出现为电子设计自动化(EDA)的普及和推广奠定了坚实的基础。据1991年有关统计资料表明,VHDL语言已被广大设计爱好者所接受,据称已有90%的设计者使用或即将使用VHDL语言设计数字系统。另外,众多CAD厂商也纷纷使自己新开发的电子设计软件与VHDL语言兼容。由此可见,使用VHDL语言来设计数字系统是电子设计技术的大势所趋。

VHDL的一个突出优点是移植性强。因为它是一种标准语言,故它的设计描述可以被不同的工具所支持。它可以从一个模拟工具移植到另一个模拟工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台去执行。同时,这意味着许多设计不必个个都从头再来,只要在更高层次上把已有的模块利用起来,就可以达到事半功倍的效果。此外,VHDL本身的生命期长。因为VHDL的硬件描述与工艺技术无关,不会因为工艺变化而使描述过时。而与工艺技术有关的参数可通过VHDL提供的属性加以描述,当生产工艺改变时,只需修改相应程序中的属性参数即可。

1.3 Quartus II的简介

Quartus II 是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。 Quartus II可以在XP、Linux和Unix上使用,除了可以使用Tcl脚本完成设计流程外,还提供了完善的用户图形界面设计方式。它具有运行速度快,界面统一,功能集中,易学易用等特点。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。除此,对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统和支持Altera的片上可编程系统(SOPC)开发。总之,Quartus II集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。

5

第2章 系统设计

2.1 设计思想

本设计是基于VHDL语言的万年历设计。在设计中,采用模块化的设计思想实现万年历的设计。根据万年历的预定功能,将万年历分为计时模块、显示及显示方式切换模块,校时模块。

计时模块又包含了秒、分、时、日、月、年模块。其中,秒和分都采用60进制计数器,时采用24进制计数器,月采用12进制计数器,年高位和年低位都采用100进制计数器(高位计数器可不需要进位输出)。在所有计数器进制设定方面,比较特别的是日计数器进制的设定,因为它有四种不同的情况,若为大月(1、3、5、7、8、10、12)则为31进制计数器,若为小月(4、6、9、11),则为30进制计数器,若为闰年的2月,则为29进制计数器,若为平年的2月份,则为28进制的计数器。因此,在年计数器中,需要判断其是否为闰年,并将此信号引入月计时器中,配合月份输出判断信号,再将此判断信号引入日计数器模块。根据设计要求,判断信号需分为4中,分别代表大月,小月,平年的2月,闰年的2月。此外,每个计数器(除年高位计数器)都应该有进位输出端,每个计数器都有显示输出端,低位计数器的进位输出要作为高位计数器的脉冲输入,比如秒计数器的进位输出作为分计数器的脉冲输入,而分计数器的进位输出作为时计数器的脉冲输入,以此类推。

计时功能仅仅是万年历的基本功能,若要实现校时功能,则必须包含校时模块,本设计中校时模块主要通过两个按键来实现。校时模块使系统具有7种工作方式,分别为正常计时、校分、校时、校日、校月、校年低位、年高位的工作方式。在设计中,通过按键K1来选择工作方式,若按一下按键,则进入校分的工作方式,且在校分时秒计数器不正常工作,即秒的进位输出不作为分的输入。若再按一次按键则进入校时的工作方式,在进入校时工作方式时,秒计数器和分计数器正常工作,以此类推,按K1按键6次后则进入校年高位的工作方式,在进入校年高位工作方式时,秒计数器、分计数器、日计数器和月计数器均正常工作,避免在校对年高位时影响其他时间位的正确性。若在进入校年高位的工作方式时,再按K1键,则再次进入正常计时。此外,利用LED灯1至LED灯6作为显示工作方式的指示灯,如,正常计时时LED灯1至LED灯6都不亮,进入校分的工作方式时,LED灯1亮,其余都不亮,以此类推,进入校年高位的工作方式时,LED灯6亮,其余都不亮,而通过这些LED灯,可以方便地观察到目前系统所处的工作方式。此外,通过按键K2来改变各个计数器的值,当检测到按下K2按键时,对应的计数器则加1。例如,目前

6

系统处于2013年4月20日18点57分23秒时,而真正的时间为19时整,则可以先按K1按键1下,进入校分的工作方式,则再按K2按键3下,使分计数器加3,再按下K2键,进入校时工作方式,再按下K2即可实现。最后,万年历不仅要正确计时,而且要显示时间,而本设计中显示方式有两种,一种是时分秒的显示方式,另一种则是年月日的显示方式,因此,设计中需增加显示及显示方式切换模块。在设计中,显示方式的轮流切换通过按键K3来实现,若按偶数次K3,则显示方式为时分秒;若按奇数次K3,则显示方式为年月日。此外,利用LED灯8作为显示方式的指示灯,当处于时分秒的显示方式时,LED灯8不亮,否则LED灯8亮。

2.2 设计原理图

万年历的设计原理图如图2.1所示:

7段数码管 7段数码管 7段数码管 7段数码管 7段数码管 7段数码管 7段数码管 7段数码管 译码驱动 年千位计数器 年百位计数器 年/时十位计数器 年/时个位计数器 月/分十位计数器 月/分个位计数器 日/秒十位计数器 日/秒个位计数器 校时模块,显示方式切换模块k1,k2,k3 1Hz 图2.1 万年历设计原理图 万年历由计时模块,显示及显示方式切换模块,校时模块组成。计时模块由秒、分、时、日、月、年计数器实现。显示方式切换功能由K3实现,校时功能由K1、K2实现。显示功能由数码管和译码器组实现,译码器的输入端为D、C、B、A,各个计数器的输出作为译码器的输入,7段译码器有7个输出端,分别接到数码管的7个显示输入端:a、b、c、d、e、f和g,从而使数码管显示相应的数字,进而实现显示功能。

7

2.3 设计流程图

万年历的设计流程图如图2.2所示:

开始 秒计时 分计时 Y 时计时 时分秒显示 校时模块 日计时 K3按偶数次

N 月计时 年月日显示 Y 年计时 闰年 N 图2.2 设计流程图

程序下载后,上电各个计数器开始计时,并将进位输出作为后一计数器的时钟触发输入,实现各计数器之间的连接。K1、K2为校时控制输入端,检测到K1上升沿,使系统进入不同的工作状态,通过检测K2上升沿的到来,使相应的计数器的值增加1,从而实现校时功能。此外,通过K3来控制显示方式,按偶数次K3,显示方式为时分秒,按奇数次为年月日。

8

第3章 模块分析

3.1 计数器模块分析 3.1.1 秒和分计数器模块

秒和分计数器模块都为60进制计数器,源程序如下:

LIBRARY IEEE

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt_60m IS

PORT(clk:IN STD_LOGIC;

q1,q2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

c:OUT STD_LOGIC);

END ENTITY cnt_60m;

ARCHITECTURE rt_1 OF cnt_60m IS

SIGNAL q11,q22:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

PROCESS(clk)

BEGIN

IF clk'EVENT AND clk='1' THEN q11<=q11+'1';

IF q11=9 AND q22/=5 THEN q11<=\"0000\";q22<=q22+'1'; END IF;

IF q22=5 AND q11=9 THEN q22<=\"0000\";q11<=\"0000\";c<='1'; ELSE c<='0'; END IF;

END IF; END PROCESS;

9

q1<=q11;q2<=q22; END ARCHITECTURE rt_1;

秒计数器的波形仿真如图3.1所示:

图3.1 秒计数器仿真图

如图3.1所示,当秒计数器计数至59时,等待至clk信号下一个脉冲上升沿到来时,进位输出c产生一个输出脉冲,同时秒计数器再次从0开始计数,故设计正确。

3.1.2 时计数器模块

时计数器模块为24进制计数器,源程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt_24 IS

PORT(clk:IN STD_LOGIC;

q1,q2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

c:OUT STD_LOGIC);

END ENTITY cnt_24;

ARCHITECTURE rt_1 OF cnt_24 IS

SIGNAL q11,q22:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

1 0

PROCESS(clk) BEGIN

q11<=q11+'1';

IF q11=9 THEN

q11<=\"0000\";q22<=q22+'1'; END IF;

IF q22=2 AND q11=3 THEN q22<=\"0000\";q11<=\"0000\";c<='1'; ELSE c<='0'; END IF;

IF clk'EVENT AND clk='1' THEN

END IF; END PROCESS; q1<=q11;q2<=q22;

END ARCHITECTURE rt_1;

时计数器的波形仿真如图3.2所示:

图3.2 时计数器仿真图

如图3.3所示,当时计数器计数至23时,等待至clk信号下一个脉冲上升沿到来时,进位输出c产生一个输出脉冲,同是时计数器再次从0开始计数,故设计正确。

11

3.1.3 日计数器模块

日计数器模块是比较特别的,因为它的进制设定有四种不同的情况,若该月为大月(1、3、5、7、8、10、12)日计数器计数至31时才产生进位信号。若为该月小月(4、6、9、11),日计数器计数至30时就产生进位信号。若该月为闰年的2月,日计数器计数至29时就产生进位信号。若该月为平年的2月份,日计数器计数至28时就产生进位信号。所以,在日计数器中需要输入判断信号,该判断信号可用2位2进制表示,若判断信号为00,则日计数器为31进制计数器;若判断信号为01,则日计数器为30进制计数器;若判断信号为10,则日计数器为28进制计数器;若判断信号为11,则日计数器为29进制计数器。该判断信号panduan可从月计数器的判断信号的输出pan引入。

日计数器的源程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY day IS

PORT(panduan:IN STD_LOGIC_VECTOR(1 DOWNTO 0); clk :IN STD_LOGIC;

q1 :OUT STD_LOGIC_VECTOR (3 DOWNTO 0); q2 :OUT STD_LOGIC_VECTOR (3 DOWNTO 0); c :OUT STD_LOGIC); END ENTITY day;

ARCHITECTURE rt_1 OF day IS

SIGNAL q3,q4:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL pan:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN

PROCESS(clk,panduan) BEGIN

q3<=q3+'1'; IF q3=9 THEN

q4<=q4+'1';q3<=\"0000\"; END IF;

1 2

IF clk'EVENT AND clk='1' THEN

pan<=panduan;

CASE pan IS

WHEN \"00\"=>IF q3=\"0001\" AND q4=\"0011\" THEN q3<=\"0001\";q4<=\"0000\";c<='1'; ELSE c<='0'; END IF;

WHEN \"01\"=>IF q3=\"0000\" AND q4=\"0011\"THEN q3<=\"0001\";q4<=\"0000\";c<='1'; ELSE c<='0';

END IF;

WHEN \"10\"=>IF q3=\"1000\" AND q4=\"0010\"THEN

q3<=\"0001\";q4<=\"0000\";c<='1';

ELSE c<='0';

END IF;

WHEN \"11\"=>IF q3=\"1001\" AND q4=\"0010\"THEN

q3<=\"0001\";q4<=\"0000\";c<='1';

ELSE c<='0';

END IF; WHEN OTHERS=>NULL; END CASE; END IF; q1<=q3;q2<=q4; END PROCESS; END ARCHITECTURE rt_1 ;

日计数器的波形仿真如图3.3至图3.6所示:

1)当判断信号panduan为00时,日计数器的波形仿真如图3.3所示:

1 3

图3.3 判断信号panduan为00时日计数器的仿真图

如图3.3所示,当输入信号panduan为00时,日计数器计数至31时,等待至clk信号下一个脉冲上升沿到来时,进位输出c产生一个输出脉冲,同时日计数器再次从1开始计数,故设计正确。

2)当输入信号panduan为01时,日计数器的波形仿真如图3.4所示:

图3.4 判断信号panduan为01时日计数器的仿真图

如图3.4所示,当输入的panduan为01时,日计数器计数至30时,等待至clk信号下一个脉冲上升沿到来时,进位输出c产生一个输出脉冲,同时日计数器再次从1开始计数,故设计正确。

3)当输入信号panduan为10时,日计数器的波形仿真如图3.5所示:

1 4

图3.5 判断信号panduan为10时日计数器的仿真图

如图3.5所示,当输入的panduan为10时,日计数器计数至28时,等待至clk信号下一个脉冲上升沿到来时,进位输出c产生一个输出脉冲,同时日计数器再次从1开始计数,故设计正确。

4)当输入信号panduan为11时,日计数器的波形仿真如图3.6所示:

图3.6 判断信号panduan为11时日计数器的仿真图

如图3.6所示,当输入的panduan为11时,日计数器计数至29时,等待至clk信号下一个脉冲上升沿到来时,进位输出c产生一个输出脉冲,同时日计数器再次从1开始计

1 5

数,故设计正确。

3.1.4 月计数器模块

月计数器为12进制计数器,但需要为日计数器的进制提供判断信号,所以该模块需要有判断信号的输出。此外,由于闰年的2月和平年的2月,判断信号输出不同,所以该模块需要从年计数模块引入闰年的判断信号。最终,其必须达到如下设计要求:若月份是大月,则该信号pan输出00,若月份是小月,则该信号pan输出01,若月份是平年的2月,则该信号pan输出10,若月份是闰年的2月,则该信号pan输出11。

月计数器的源程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt_12 IS port(clk :IN STD_LOGIC; run :IN STD_LOGIC; c:OUT STD_LOGIC;

pan :OUT STD_LOGIC_VECTOR(1 DOWNTO 0);

q1,q2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY cnt_12;

ARCHITECTURE rt_1 OF cnt_12 IS

SIGNAL qq1,qq2: STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL q3: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN

PROCESS(clk) BEGIN

IF clk'EVENT AND clk='1' THEN qq1<=qq1+'1'; IF qq1=9 THEN

qq2<=qq2+1;qq1<=\"0000\"; END IF;

IF qq2=1 AND qq1=2 THEN qq1<=\"0001\";qq2<=\"0000\";c<='1';

1 6

ELSE c<='0'; END IF;

END IF; q3<=qq2&qq1; CASE q3 IS

WHEN \"00000001\"=>pan<=\"00\"; --january WHEN \"00000010\"=>IF run='1' THEN pan<=\"11\"; ELSE pan<=\"10\";

END IF; --february WHEN \"00000011\"=>pan<=\"00\"; -- march WHEN \"00000100\"=>pan<=\"01\"; --april WHEN \"00000101\"=>pan<=\"00\"; --may WHEN \"00000110\"=>pan<=\"01\"; --june WHEN \"00000111\"=>pan<=\"00\"; --july WHEN \"00001000\"=>pan<=\"00\"; --august WHEN \"00001001\"=>pan<=\"01\"; --september WHEN \"00010000\"=>pan<=\"00\"; --october WHEN \"00010001\"=>pan<=\"01\"; --november WHEN \"00010010\"=>pan<=\"00\"; --december WHEN others=>NULL; END CASE; q1<=qq1;q2<=qq2; END PROCESS;

END ARCHITECTURE rt_1;

月计数器的波形仿真如图3.7至图3.8所示:

1)当输入信号run为1时,即表示该年份为闰年,月计数器的波形仿真如图3.7所示:

1 7

图3.7 闰年时月计数器的仿真图

如图3.7所示,当输入信号run为高电平,即表示闰年时,在2月份,输出判断信号pan为11;在大月,输出判断信号pan为00;在小月,输出判断信号pan为01;与日计数器的进制判断要求一致,故设计正确。

2)当输入信号run为0时,即表示该年份为平年,月计数器的波形仿真如图3.8所示:

图3.8 平年时月计数器的仿真图

1 8

如图3.8所示,当输入信号run为低电平,即表示平年时,在2月份,输出判断信号pan为10;在大月,输出判断信号pan为00;在小月,输出判断信号pan为01;与日计数器的进制判断要求一致,故设计正确。

3.1.5 年计数器模块

1) 年低位计数器

年低位计数器为100进制计数器,同时在年低位计数器中需要判断该年是否为闰年。除此,低位计数器不仅要有触发输入,也要有进位输出,作为年高位计数器的触发输入。 年低位计数器源程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY year_1 IS

PORT(clk:IN STD_LOGIC;

y1,y2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); run,c:OUT STD_LOGIC);

END ENTITY year_1;

ARCHITECTURE rt_1 OF year_1 IS

SIGNAL q1,q2,q3:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

PROCESS(clk) BEGIN

IF clk'EVENT AND clk='1' THEN

q1<=q1+'1'; IF q1=9 THEN

q1<=\"0000\";q2<=q2+'1'; END IF;

IF q2=9 AND q1=9 THEN q2<=\"0000\";q1<=\"0000\";c<='1'; ELSE c<='0'; END IF;

1 9

END IF; END PROCESS; PROCESS(clk) BEGIN

IF clk'EVENT AND clk='1' THEN

q3<=q3+'1';

IF q3=3 THEN q3<=\"0000\";run<='1'; ELSE run <='0'; END IF;

END IF; y1<=q1;y2<=q2;

END PROCESS; END ARCHITECTURE rt_1;

年低位计数器的波形仿真如图3.9所示:

图3.9 年低位计数器的仿真图

如图3.9所示,当年低位计数器计数至99时,等待至clk信号的下一个脉冲上升沿到来时,进位输出信号c产生一个脉冲输出,同时年低位计数器重新从0开始计数。此外,从图中可以观察到每过4年,信号run都会输出一个脉冲,故设计正确。

2 0

2) 年高位计数器

年高位计数器是100进制计数器,因为本设计是万年历,所以年高位计数器不用进位输出。此外,因为100的倍数必定是4的倍数,当年份的低位能被4整除,不管高位是什么数字,该年份一定是闰年,所以在年高位计数器中无需判断其是否为闰年。

年高位计数器源程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY year_2 IS

PORT(clk:IN STD_LOGIC;

y3,y4:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END ENTITY year_2;

ARCHITECTURE rt_1 OF year_2 IS

SIGNAL q1,q2,q3:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

PROCESS(clk) BEGIN

IF clk'EVENT AND clk='1' THEN

q1<=q1+'1';

q1<=\"0000\";q2<=q2+'1'; END IF;

IF q2=9 AND q1=9 THEN q2<=\"0000\";q1<=\"0000\"; END IF; IF q1=9 THEN

END IF; y3<=q1;y4<=q2; END PROCESS;

END ARCHITECTURE rt_1;

年高位计数器的波形仿真如图3.10所示:

2 1

图3.10 年高位计数器的仿真图

如图3.10所示,当年高位计数器计数至99时,等待至clk信号的下一个脉冲上升沿到来时,计数器重新从0开始计数,故设计正确。

3.2 校时模块

校时模块的主要功能是校对时间,而校时功能通过按键K1、K2来实现。当不按K1按键时,计数器正常计时,而当按下K1按键时,根据所按的次数不同进入不同的工作模式,利用K2改变对应计数器的值,每按下K2,对应计数器的值加1。

校时模块源程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11. ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY jiaoshi IS

PORT(mo,fo,so,ro,yo,n1o:IN STD_LOGIC; --调时模块的输入信号

k1,k2:IN STD_LOGIC; --调时模块的控制,调时信号输入 fi,si,ri,yi,n1i,n2i:OUT STD_LOGIC; --各计数器的输入时钟信号 l1,l2,l3,l4,l5,l6:OUT STD_LOGIC); --工作模式显示灯的控制信号 END ENTITY jiaoshi;

ARCHITECTURE rt_1 OF jiaoshi IS

SIGNAL a:STD_LOGIC_VECTOR(2 DOWNTO 0);

2 2

BEGIN

PROCESS(k1,k2) BEGIN

IF k1'EVENT AND k1='1' THEN a<=a+1; IF a=6 THEN a<=\"000\"; END IF; END IF; CASE a IS

WHEN\"000\"=>fi<=mo;si<=fo;ri<=so;yi<=ro;n1i<=yo;n2i<=n1o; l1<='0';l2<='0';l3<='0';l4<='0';l5<='0';l6<='0'; -- 模式0正常计时

WHEN\"001\"=>fi<=k2;si<='0';ri<='0';yi<='0';n1i<='0';n2i<='0'; l1<='1';l2<='0';l3<='0';l4<='0';l5<='0';l6<='0'; --模式1,选通分模块,调分

WHEN\"010\"=>fi<=mo;si<=k2;ri<='0';yi<='0';n1i<='0';n2i<='0'; l1<='0';l2<='1';l3<='0';l4<='0';l5<='0';l6<='0'; --模式2,选通时模块,调时

WHEN\"011\"=>fi<=mo;si<=fo;ri<=k2;yi<='0';n1i<='0';n2i<='0'; l1<='0';l2<='0';l3<='1';l4<='0';l5<='0';l6<='0'; --模式3,选通日模块,调日

WHEN\"100\"=>fi<=mo;si<=fo;ri<=so;yi<=k2;n1i<='0';n2i<='0'; l1<='0';l2<='0';l3<='0';l4<='1';l5<='0';l6<='0'; --模式4, 选通月模块,调月

WHEN\"101\"=>fi<=mo;si<=fo;ri<=so;yi<=ro;n1i<=k2;n2i<='0'; l1<='0';l2<='0';l3<='0';l4<='0';l5<='1';l6<='0'; --模式5 选通年低位模块,调年低位 WHEN\"110\"=>fi<=mo;si<=fo;ri<=so;yi<=ro;n1i<=yo;n2i<=k2; l1<='0';l2<='0';l3<='0';l4<='0';l5<='0';l6<='1'; --模式6 选通年高位模块,调年高位 WHEN OTHERS=>NULL;

2 3

END CASE; END PROCESS; END ARCHITECTURE rt_1;

校时模块的波形仿真如图3.11所示:

图3.11 校时模块的仿真图

如图3.11所示,当不按K1按键时,进入正常计时模式,l1至l5输出都为低电平。当按下按键K1一次,则进入校分的工作模式,l1输出为高电平。此时再按K2按键,可以观察到K2与分计数器的触发输入信号fi一致,即每按一下K1相当于给分计数器一个触发信号,使分计数器的值加1,从而实现校分的功能。若再按一下K2,则进入校时的工作模式,l1变为低电平,l2变为高电平,同时K2波形与时计数器的触发输入信号si一致。若再按4下,则进入校年高位的工作模式,l6输出高电平,其余全部输出低电平。故设计正确。

3.3 显示及显示方式切换模块

显示与显示方式切换模块主要为了实现显示功能及显示方式切换功能。万年历不仅要显示时间,而且要显示日期。显示功能由K3按键来实现,模块程序中检k3按键的高电平,轮流切换显示方式。

显示及显示方式切换模块源程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

2 4

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY change_1 IS

PORT(s1,s2,min1,min2,h1,h2,d1,d2,mon1,mon2,y22,y21,y12,y11:IN

k3:IN STD_LOGIC; led:OUT STD_LOGIC;

q1,q2,q3,q4:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); STD_LOGIC_VECTOR(3 DOWNTO 0);

q5,q6,q7,q8:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY change_1;

ARCHITECTURE rt_1 OF change_1 IS

SIGNAL a:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN

PROCESS(k3) BEGIN

IF k3'EVENT AND k3='1' THEN IF a=1 THEN

END IF;

a<=a+'1'; a<=\"00\"; END IF; CASE a IS

WHEN\"01\"=> q8<=y22;q7<=y21;q6<=y12;q5<=y11;q4<=mon2; q3<=mon1;q2<=d2;q1<=d1;led<='1'; --01时显示模式为年月日,指示灯亮

WHEN\"00\"=>q8<=\"0000\";q7<=\"0000\";q6<=h2;q5<=h1;

q4<=min2;q3<=min1;q2<=s2;q1<=s1;led<='0'; --00时显示模式为时分秒,指示灯不亮 WHEN OTHERS=>NULL;

END CASE; END PROCESS;

END ARCHITECTURE rt_1 ;

显示及显示方式切换模块的波形仿真如图3.12所示:

2 5

图3.12 显示及显示方式切换模块仿真图

如图3.12所示,当不按K3按键时,显示方式为时分秒显示,led输出低电平,作为显示方式的指示信号。在秒、分、时的显示方式中,将秒计数器、分计数器、时计数器的输入给输出q1至q6,q7和q8都为”0000”。当按下K3按键后,led输出为高电平,同时将日计数器、月计数器、年低位计数器、年高位计数器给输出q1至q8,显示方式为年月日。若再次按K3按键,又进入时分秒显示模式,从而实现用K3按键循环切换显示方式的功能,故设计正确。

3.4 顶层原理图

顶层设计采用原理图输入法,从而达到设计思路清晰、直观的目的。

顶层原理图包含计时模块、校时模块、显示及显示方式切换模块,其中,计时模块包含秒、分、时、日、月、年计时模块。

生成顶层原理图的方法是基于上述各模块的源程序,将各个源程序创建成为一个元器件。在创建完各模块的元器件后,在原理图的任意一个位置上双击鼠标左键出现一个元件选件窗,然后在Project库中选择上述各模块生成的元件,在primitives中选择input和output管脚,按照设计思想,将各个元器件连接,形成顶原理图,顶层原理图如图3.13所示:

2 6

图3.13 顶层原理图

顶层原理图的波形仿真如图3.14所示:

图3.14 顶层原理图的仿真波形

如图3.14所示,系统首先进入正常计时,且显示方式为时分秒,即ll1至ll6和xsfs输出低电平。然后,按下K1按键,系统进入校分模式,ll1输出高电平,再按下K2按键3次,可观察到每按下K2,qq3输出会加1。其次,按下K3按键,系统显示方式为年月日,

2 7

xsfs输出高电平,再按下K1按键3次,系统进入校月模式,ll4输出高电平,q55随着K2按键的按下而增加1。然后,再按下K1按键5次,进入校日模式。最后,按下K1按键4次,进入正常计时模式,且按下K3按键,显示方式切换为时分秒,ll1至ll6,xsfs输出均为低电平。

2 8

第4章 引脚设定与验证

4.1 引脚设定

因为设计中需要用到8个数码管来显示时间和日期;需要3个按键作为校时模块、显示方式切换模块的控制输入端;需要7个LED灯作为工作模式和显示方式的指示信号。综上所述,设计电路结构图如图4.1所示:

87654321实实实PIO19-PIO16PIO23-PIO20PIO27-PIO24PIO31-PIO28PIO35-PIO32PIO39-PIO36PIO43-PIO40PIO47-PIO44D8PIO15D7PIO14D6PIO13D5PIO12D4PIO11D3PIO10D2PIO9D1PIO8FPGA/CPLD实实实实PIO15-PIO8PIO7PIO6PIO5PIO4PIO3PIO2PIO1PIO0D16D15D14D13D12D11D10D9实8实7实6实5实4实3实2实1实实实实实实实NO.3SPEAKER实实实实实实实实实实实实实实实实实实实实实实实实

图4.1 设计结构电路图

由于电路图中有译码器和数码管,这两者实现显示功能,本设计只需将校时模块的输 作为译码器的输入。

本设计中目标芯片选用EP1K30TC144-3,可根据芯片引脚对照表和实验结构电路图对输入输出引脚进行匹配,完成匹配后,再对顶层原理图进行编译。其中,芯片引脚对照表如表4.1所示:

2 9

表4.1 GW48CK芯片引脚对照表

结构图上的信号名 GW48-CCPGWAK100A EP1K100QC208 引脚号 引脚名称 ,GW48-SOC+/ GW48-DSP EP20K200/300EQC240 引脚号 引脚名称 GWAK30/50 EP1K30/50TQC144 GWAC3 EP1C3TC144 引脚号 引脚名称 引脚号 引脚名称 PIO0 PIO1 PIO2 PIO8 PIO9 PIO10 PIO11 PIO12 PIO13 PIO14 PIO15 PIO16 PIO17 PIO18 PIO19 PIO20 PIO21 PIO22 PIO23 PIO24 PIO25 PIO26 PIO27 PIO28 PIO29

7 8 9 17 18 24 25 26 27 28 29 30 31 36 37 38 39 40 41 44 45 113 114 115 116 I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O 224 225 226 235 236 237 238 239 2 3 4 7 8 9 10 11 13 16 17 18 20 131 133 134 135 I/O0 I/O1 I/O2 I/O8 I/O9 I/O10 I/O11 I/O12 I/O13 I/O14 I/O15 I/O16 I/O17 I/O18 I/O19 I/O20 I/O21 I/O22 I/O23 I/O24 I/O25 I/O26 I/O27 I/O28 I/O29 3 0

8 9 10 20 21 22 23 26 27 28 29 30 31 32 33 36 37 38 39 41 42 65 67 68 69 I/O0 I/O1 I/O2 I/O8 I/O9 I/O10 I/O11 I/O12 I/O13 I/O14 I/O15 I/O16 I/O17 I/O18 I/O19 I/O20 I/O21 I/O22 I/O23 I/O24 I/O25 I/O26 I/O27 I/O28 I/O29 1 2 3 11 32 33 34 35 36 37 38 39 40 41 42 47 48 49 50 51 52 67 68 69 70 I/O0 I/O1 I/O2 DPCLK1 VREF2B1 I/O10 I/O11 I/O12 I/O13 I/O14 I/O15 I/O16 I/O17 I/O18 I/O19 I/O20 I/O21 I/O22 I/O23 I/O24 I/O25 I/O26 I/O27 I/O28 I/O29 PIO30 PIO31 PIO32 PIO33 PIO34 PIO35 PIO36 PIO37 PIO38 PIO39 PIO40 PIO41 PIO42 PIO43 PIO44 PIO45 PIO46 PIO47 CLOCK0 119 120 121 122 125 126 127 128 131 132 133 134 135 136 139 140 141 142 182 I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O I/O 136 138 143 156 157 160 161 163 1 166 169 170 171 172 173 174 178 180 185 I/O30 I/O31 I/O32 I/O33 I/O34 I/O35 I/O36 I/O37 I/O38 I/O39 I/O40 I/O41 I/O42 I/O43 I/O44 I/O45 I/O46 I/O47 I/O 70 72 73 78 79 80 81 82 83 86 87 88 90 91 92 95 96 126 I/O30 I/O31 I/O32 I/O33 I/O34 I/O35 I/O36 I/O37 I/O38 I/O39 I/O40 I/O41 I/O42 I/O43 I/O44 I/O45 I/O46 I/O47 INPUT1 71 72 73 74 75 76 77 78 83 84 85 96 97 98 99 103 105 106 123 I/O30 I/O31 I/O32 I/O33 I/O34 I/O35 I/O36 I/O37 I/O38 I/O39 I/O40 I/O41 I/O42 I/O43 I/O44 I/O45 I/O46 I/O47 I/O clk选择时钟CLK0,其引脚号为126,按键K1,K2,K3的配置首先由设计结构图可知,可以选择引脚名称为I/O0、I/O1、I/O2,再由表4.1可知,其对应的引脚号分别为8、9、10;而显示模块的输出q11至q88分别对应引脚名称为I/016-I/O19、I/020-I/O23、I/024-I/O27、I/028-I/O31、I/032-I/O35、I/036-I/O39、I/040-I/O43、I/044-I/O47,然后由表4.11查出这些引脚名称所对应的引脚号。设定完引脚号后,再重新编译顶层电路图。

4.2 下载验证

下载完成后,按实验箱上的模式选择键直至模式显示数码管显示3,把时钟CLK0短路帽接在1Hz上。经验证,验证结果与预期的设计结果一致,当没有按下K1按键时,万年历正常计时,LED1至LED6和LED8都不亮,当按下K1键时,进入校分的工作模式,此时LED1

3 1

亮,LED2至LED6不亮,当每按一次K2键,数码管显示的数据加1,而在校对时间时,校对位的位低一位和校对位的高位不会产生进位输出,其余位正常产生进位输出。验证中,通过按K1键进入不同的工作模式,利用LED1至LED6的亮灭来判断目前所处于的工作模式。当进入调日、月、年作模式时,按下K3键,切换显示方式,便于观察校对情况。若将月计数器校为3月份,再通过K1按键进入校日工作模式,观察到日计数器计数至31时,再按K2按键,日计数器重新从1开始计数;若将月计数器校为4月份,再通过K1按键进入校日工作模式,观察到日计数器计数至30时,再按K2按键,日计数器重新从1开始计数。若选择年份为平年且将月计数器校为2月份,再通过K1按键进入校日工作模式,观察到日计数器计数至28时,再按K2按键,日计数器重新从1开始计数;若选择年份为闰年且将月计数器校为2月份,再通过K1按键进入校日工作模式,观察到日计数器计数至29时,再按K2按键,日计数器重新从1开始计数,符合设计要求,设计正确、可行且具有一定的实用性。

3 2

总结

本设计是基于VHDL语言的万年历设计,而万年历包括三个模块,分别为:计时模块,显示及显示方式切换模块,校时模块。此外,计时模块又包含秒计时模块、分计时模块、时计时模块、日计时模块、月计时模块、年计时模块。计时模块的作用是用于计算时间和日期,校时模块的作用是为了校准时间,而显示方式及显示方式切换模块的作用是为了显示所计算的时间、日期和轮流切换显示方式,显示方式主要分为时分秒显示和年月日显示。为了增加系统的实用性与正确性,设计充分考虑实际问题,如在年计时模块中判断某年是否为闰年,输出的闰年判断信号又与月份相结合从而为日计数器模块提供日计数器的进制判断信号,而具体情况分为四种:每年的大月,日计数器为31进制计数器;每年的小月,日计数器为30进制计数器;闰年的2月,日计数器为29进制计数器;平年的2月,日计数器为28进制计数器。校时模块功能主要通过两个按键K1,K2实现,使系统共有6种工作模式,分别为:正常计时、校分模式、校时模式、校日模式、校月模式、校年低位模式、校年高位模式。此外,为了方便观察系统所处的工作状态,用5个LED灯指示,若5个灯都不亮,则系统为正常计时,其余每个灯的亮灭分别代表一种工作方式。显示方式及显示方式切换模块主要将各计数器的输出端接到译码器的输入端,由译码器驱动七段数码管显示当前的时间与日期,而系统通过按键K3轮流切换显示方式。通过下载到实验箱验证,系统能实现预定的所有功能,设计正确、可行,且具有一定的实用性。

3 3

参考文献

(1)侯伯亨,刘凯,顾新.VHDL硬件描述语言与数字逻辑电路设计[M].2009年8月第3版.西安电子科技大学出版社.

(2)周润景,苏良碧.基于Quartus II的数字系统Verilog HDL设计实例详解[M].2010年5月第1版.北京电子工业出版社:31-82.

(3)李云,侯传教,冯永浩.VHDL电路设计实用教程[M].2009年3月第1版.北京机械工业出版社.

(4)陈雪松,滕立中.VHDL入门与应用[M].2000年12月第1版.北京人民邮电出版社. (5)潘松,黄继业.EDA技术使用教程-VHDL版[M].2010年6月第4版.北京科学出版社.

3 4

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

Copyright © 2019- axer.cn 版权所有 湘ICP备2023022495号-12

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务