毕业设计论文
多功能数字钟的VHDL设计
系 xxxxxxxxxxxxxxxxx 专业 xxxxxxxxxxxxx 学号 xxxxxxxxxxx 姓名 xxxxxxx 班级 xxxxxxxxxxxx 指导老师 xxxxxxxxxx 职称
指导老师职称
毕业设计时间 2009年11月——2010年1月
摘要:应用VHDL语言编程,进行了多功能数字钟的设计,并在MAX PLUSⅡ环境下通过了编译、仿真、调试。
关键词:VHDL;EDA;数字钟;仿真图
0.引言
随着科学技术的迅猛发展,电子工业界经历了巨大的飞跃。集成电路的设计正朝着速度快、性能高、容量大、体积小和微功耗的方向发展。基于这种情况,可编程逻辑器件的出现和发展大大改变了传统的系统设计方法。可编程逻辑器件和相应的设计技术体现在三个主要方面:一是可编程逻辑器件的芯片技术;二是适用于可逻辑编程器件的硬件编程技术,三是可编程逻辑器件设计的EDA开发工具,它主要用来进行可编程逻辑器件应用的具体实现。在本实验中采用了集成度较高的FPGA 可编程逻辑器件, 选用了VHDL硬件描述语言和MAX + p lusⅡ开发软件。VHDL硬件描述语言在电子设计自动化( EDA)中扮演着重要的角色。由于采用了具有多层次描述系统硬件功能的能力的“自顶向下”( Top - Down)和基于库(L ibrary - Based)的全新设计方法,它使设计师们摆脱了大量的辅助设计工作,而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短
了产品的研制周期。MAX + p lusⅡ是集成了编辑器、仿真工具、检查/分析工具和优化/综合工具的这些所有开发工具的一种集成的开发环境,通过该开发环境能够很方便的检验设计的仿真结果以及建立起与可编程逻辑器件的管脚之间对应的关系。
1. EDA简介
20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL
完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
2. VHDL简介
硬件描述语言HDL(HardwareDescriptionLanguage)诞生于1962年。HDL是用形式化的方法描述数字电路和设计数字逻辑系统的语言。主要用于描述离散电子系统的结构和行为。与SDL(SoftwareDescriptionLanguage)相似,经历了从机器码(晶体管和焊接)、汇编(网表)、到高级语言(HDL)的过程。
VHDL翻译成中文就是超高速集成电路硬件描述语言,他诞生于1982年。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL 进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,(即IEEE标准的1076-1993版本)主要是应用在数字电路的设计中。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。目前,它在中国的应用多数是用FPGA/CPLD/EPLD 的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
2.1 VHDL的特点
应用VHDL进行系统设计,有以下几方面的特点。
(一)功能强大
VHDL具有功能强大的语言结构。它可以用明确的代码描述复杂的控制逻辑设计。并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。VHDL是一种设计、仿真和综合的标准硬件描述语言。
(二)可移植性
VHDL语言是一个标准语言,其设计描述可以为不同的EDA工具支持。它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。此外,通过更换库再重新综合很容易移植为ASIC设计。
(三)独立性
VHDL的硬件描述与具体的工艺技术和硬件结构无关。设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。程序设计的硬件目标器件有广阔的选择范围,可以是各系列的CPLD、FPGA及各种门阵列器件。
(四)可操作性
由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
(五)灵活性
VHDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。使其在任何大系统的设计中,随时可对设计进行仿真模拟。所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。
2.2 VHDL的设计结构
VHDL描述数字电路系统设计的行为、功能、输入和输出。它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。
VHDL将一个设计称为一个实体Entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。所以,内部和外部的概念对系统设计的VHDL是十分重要的。
外部的实体名或连接由实体声明Entity来描述。而内部的实体算法或实现则由结构体Architecture来描述。结构体可以包含相连的多个进程process或者组建component等其他并行结构。需要说明的是,它们在硬件中都是并行运行的。
2.3 VHDL的设计步骤
采用VHDL的系统设计,一般有以下6个步骤。
1)要求的功能模块划分;
2)VHDL的设计描述(设计输入);
3)代码仿真模拟(前仿真);
4)计综合、优化和布局布线;
5)布局布线后的仿真模拟(后仿真);
6)设计的实现(下载到目标器件)。
3. MAX+plusII仿真软件的使用简介
Max+plusII(或写成Maxplus2,或MP2) 是Altera公司推出的的第三代PLD开发系统(Altera第四代PLD开发系统被称为:QuartusII,主要用于设计新器件和大规模CPLD/FPGA)。使用MAX+PLUSII的设计者不需精通器件内部的复杂结构。设计者可以用自己熟悉的设计工具(如原理图输入或硬件描述语言)建立设计,MAX+PLUSII把这些设计转自动换成最终所需的格式。其设计速度非常快。对于一般几千门的电路设计,使用MAX+PLUSII,从设计输入到器件编程完毕,用户拿到设计好的逻辑电路,大约只需几小时。设计处理一般在数分钟内内完成。特别是在原理图输入等方面,MaxplusII被公认为是最易使用,人机界面最友善的PLD开发软件,特别适合初学者使用。PLD器件的逻辑功能描述一般分为原理图描述和硬件描述语言描述,原理图描述是一种直观简便的方法,它可以将现有的小规模集成电路实现的功能直接用PLD器件来实现,而不必去将现有的电路用语言来描述,但电路图描述方法无法做到简练;硬件描述语言描述是可编程器件设计的另一种描述方法,语言描述可能精确和简练地表示电路的逻辑功能,现在PLD的设计过程中广泛使用。常用的硬件描述语言有ABEL,VHDL语言等。
在这里我们可以先看一看用FPGA/CPLD开发工具进行电路设计的一般流程
通常可将FPGA/CPLD设计流程归纳为以下7个步骤,这与ASIC设计有相似之处。
1.设计输入。在传统设计中,设计人员是应用传统的原理图输入方法来开始设计的。自90年代初, Verilog、VHDL、AHDL等硬件描述语言的输入方法在大规模设计中得到了广泛应用。
2.前仿真(功能仿真)。设计的电路必须在布局布线前验证电路功能是否有效。(ASCI设计中,这一步骤称为第一次Sign-off)PLD设计中,有时跳过这一步。
3.设计编译。设计输入之后就有一个从高层次系统行为设计向门级逻辑电路设转化翻译过程,即把设计输入的某种或某几种数据格式(网表)转化为软件可识别的某种数据格式(网表)。
4.优化。对于上述综合生成的网表,根据布尔方程功能等效的原则,用更小更快的综合结果代替一些复杂的单元,并与指定的库映射生成新的网表,这是减小电路规模的一条必由之路。
5.布局布线。在PLD设计中,3-5步可以用PLD厂家提供的开发软件(如Maxplus2)自动一次完成。
6.后仿真(时序仿真)需要利用在布局布线中获得的精确参数再次验证电路的时序。(ASCI设计中,这一步骤称为第二次Sign—off)。
7.生产。布线和后仿真完成之后,就可以开始ASCI或PLD芯片的投产。
同样,使用MaxplusII基本上也是有以上几个步骤,但可简化为:设计输入、设计编译、设计仿真、下载。
4. 电子钟的设计要求与总体设计
4.1设计要求
本次设计的多功能数字钟具有如下功能:
1.秒/分/时的依次显示并正确计数;
2.定时闹钟:实现整点报时,扬声器发出报时声音;
3.时间设置,即手动调时功能:当认为时钟不准确时,可以分别对分/时进行调整;
4.2 总体设计
4.2.1 设计框图
图1 顶层框图
4.2.2外部输入输出要求
外部输入要求:输入信号有1kHz/1Hz时钟信号、低电平有效的秒清零信号CLR、低电平有效的调分信号SETmin、低电平有效的调时信号SEThour;
外部输出要求:整点报时信号SOUND(59分51/3/5/7秒时未500Hz 低频声,59分59秒时为1kHz高频声)、时十位显示信号h1(a,b,c,d,
e,f,g)、时个位显示信号h0(a ,b,c,d,e,f,g)、分十位显示信号m1及分个位m0、秒十位s1及秒个位s0;数码管显示位选信号SEL0/1/2等三个信号。
4.2.3内部各功能模块:
1)FREQ分频模块:
整点报时用的1kH与500Hz的脉冲信号,这里的输入信号是1KHz信号,所以只要一个二分频即可;时间基准采用1Hz输入信号直接提供(当然也可以分频取得,这里先用的是分频取得的信号,后考虑到精度问题而采用硬件频率信号。
2)秒计数模块SECOND:
60进制,带有进位和清零功能的,输入为1Hz脉冲和低电平有效的清零信号CLR,输出秒个位、时位及进位信号CO。
3)分计数模块MINUTE
60进制,带有进位和置数功能的,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位及进位信号CO。
4)时计数模块HOUR:
24进制,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位。
5)扫描模块SELTIME:
输入为秒(含个/十位)、分、时、扫描时钟CLK1K,输出为D和显示控制信号SEL。
6)整点报时功能模块ALERT:
输入为分/秒信号,输出为高频声控Q1K和Q500。
7)译码显示功能模块DISPLAY:
输入为D,输出为Q
5. VHDL程序设计
5.1分频模块(原理图输入)
图2 顶层设计
5.2 秒模块程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SECOND is
port(clk,clr:in std_logic;
sec1,sec0:out std_logic_vector(3 downto 0); co:out std_logic);
end SECOND;
architecture SEC of SECOND is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0); begin
if clr='1' then
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;
end process;
end SEC;
图3 秒模块仿真波形
5.3分模块程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0); co:out std_logic);
end MINUTE;
architecture MIN of MINUTE is
begin
process(clk,en)
variable cnt1,cnt0:std_logic_vector(3 downto 0); begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;
end process;
end MIN;
图4 分模块仿真波形
5.4时模块程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity HOUR is
port(clk,en:in std_logic;
h1,h0:out std_logic_vector(3 downto 0)); end HOUR;
architecture hour_arc of HOUR is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0); begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0010" and cnt0="0011" then
cnt1:="0000";
cnt0:="0000";
elsif cnt0>="1001" then
cnt1:=cnt1+1;
cnt0:="0000";
else
cnt0:=cnt0+1;
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;
end process;
end hour_arc;
图5 时模块仿真波形
5.5扫描模块程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity SELTIME is
port(
clk:in std_logic;
sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0); daout:out std_logic_vector(3 downto 0);
sel:out std_logic_vector(2 downto 0));
end SELTIME;
architecture fun of SELTIME is
signal count:std_logic_vector(2 downto 0);
begin
sel<=count;
process(clk)
begin
if(clk'event and clk='1') then
if(count>="101") then
count<="000";
else
count<=count+1;
end if;
end if;
case count is
when"000"=>daout<= sec0;
when"001"=>daout<= sec1;
when"010"=>daout<= min0;
when"011"=>daout<= min1;
when"100"=>daout<=h0;
when others =>daout<=h1;
end case;
end process;
end fun;
图6 扫描模块仿真波形5.6显示模块程序
library ieee;
use ieee.std_logic_1164.all;
entity DISPLAY is
port(d:in std_logic_vector(3 downto 0); q:out std_logic_vector(6 downto 0)); end DISPLAY;
architecture disp_are of DISPLAY is
begin
process(d)
begin
case d is
when"0000" =>q<="0111111";
when"0001" =>q<="0000110";
when"0010" =>q<="1011011";
when"0011" =>q<="1001111";
when"0100" =>q<="1100110";
when"0101" =>q<="1101101";
when"0110" =>q<="1111101";
when"0111" =>q<="0100111";
when"1000" =>q<="1111111";
when others =>q<="1101111";
end case;
end process;
end disp_are;
图7 显示模块仿真波形
5.7 定时闹钟模块程序
library ieee;
use ieee.std_logic_1164.all;
entity ALERT is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);
clk:in std_logic;
q500,qlk:out std_logic);
end ALERT;
architecture sss_arc of ALERT is
begin
process(clk)
begin
if clk'event and clk='1' then
if m1="0101" and m0="1001" and s1="0101" then
if s0="0001" or s0="0011" or s0="0101" or s0="0111" then q500<='1';
else
q500<='0';
end if;
end if;
if m1="0101" and m0="1001" and s1="0101" and s0="1001" then qlk<='1';
else
qlk<='0';
end if;
end if;
end process;
end sss_arc;
图8 定时闹钟模块仿真波形5.8 顶层文件(原理图输入)
6. 结语
毕业设计,也许是我大学生涯交上的最后一个作业了。想借次机会感谢三年以来给我帮助的所有老师、同学,你们的友谊是我人生的财富,是我生命中不可或缺的一部分。感谢老师对我的教育培养,你们细心指导我的学习,在此,我要向诸位老师深深地鞠上一躬。
毕业论文的撰写过程是对所学的电子技术基本理论知识的综合运用,对三年专业知识的一次综合应用、扩充和深化,也是对我们理论运用于实际设计的一次锻炼。通过毕业论文的撰写过程,我不仅温习了以前在课堂上学习的专业知识,同时我也得到了老师和同学的帮助,学习和体会到了电子技术的基本技能和思想。
从开始接到论文题目到电路图的设计,再到论文文章的完成,每走一步对我来说都是新的尝试与挑战。在这段时间里,我学到了很多知识也有很多感受。当然在做的过程中也遇到过很多的麻烦,一些没有接触过的元件,它们的封装需要自己去书籍、网上搜索,在更新的时候会有一些错误,自己很难改正,只得求助老师,最后得以解决。这次毕业设计使我开始了自主的学习和试验,查看相关的资料和书籍,让自己头脑中模糊的概念逐渐清晰,使自己非常稚嫩作品一步步完善起来,每一次改进都是我学习的收获,每一次的成功都会让我兴奋好一段时间。
此次设计过程中,各种系统的适用条件,各种程序的选用标准,各种元件的安装方式,我都是随着设计的不断深入而不断熟悉并学会应用的。和老师的沟通交流更使我对设计有了新的认识也对自己提出了新的要求。课题设计过程中我不怕失败,在失败中总结经验,为成功积累素材;学着自我超越,敢于尝试,在尝试中进步,这对我能力的提高大有好处。设计中有太多的不懂和陌生,但是我会多看、多想、多问、多学,认真的对待每一次老师交代的任务,每一个任务都是一个锻炼的机会和成长的过程,我在规定的时间尽善尽美的完成,把自己的能力发挥到最大限度。这些本是我工作后才会意识到的问题,通过这次毕业设计让我提前了解了这些知识,这是很珍贵的。
这个课题设计的过程让我学习、工作的思路有了更为明朗的认识:它是站在一定高度上去工作的,眼界要放宽,思路要开阔,内容要饱满。我曾经也做过不少课程设计,但都是局限在课本中,而这次实验设计,能够让我走出来,仿佛推开门看见外面的世界是如此之大,如同井底之蛙跳上井沿过程中要有很好的团结合作意识和责任感,积极的参与到实验设计的讨论中去,学习和听取别人的意见,我也主动的发表意见,用一个积极上进、激情乐观的态度面对每一天的实验设计生活,让我的学习生活丰富多彩。
非常感谢学院能给我们提供这样的一个可以自己动脑、动手进行设计的机会,同时也大大加强了同学之间的沟通,以及学生与老师之间的交流,这是一个放飞自我的平台,也是我们理想与实际结合的升华,我想学院给我们提供的这些,教会我们的这些不仅仅在现在有用,对于我们今后步入社会也是同样有用的。目前我已经在一家公司实习了,我明显感到在社会上更加需要团体合作,以及自身的严谨作风。我在工作中不怕失败,在失败中总结经验,为成功积累素材;学着自我超越,敢于尝试,在尝试中进步,这对我能力的提高大有好处。
这次做论文的经历也会使我终身受益,我感受到做论文是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破,那也就不叫论文了。希望这次的
经历能让我在以后工作中激励我继续进步。离开学校完成论文,是一个终点,又是另外一个起点!喝水不忘挖井人,我将铭记大家对我的帮助,以后更好的为人民为社会服务!在这个竞争激烈、物欲浮躁的社会,怀着一颗认真、平和的心,踏实的走好每一步,我相信我的未来就一定不是梦,也坚信这次课程设计将成为我一辈子的财富,其所折射出的光芒将照亮我的前程,成为我人生中的一道亮丽风景。
7. 参考文献
1.姜雪松,吴钰淳,王鹰1VHDL 设计实例与仿真[M ]1北京:机械工业出版社, 2007.1。
2.Stefan Sjohp lm,LennartL indh1VHDL设计电子线路[M]1边计年,薛宏熙,译1北京:清华大学出版社, 20001。
3.李国洪,沈明山.可编程器件EDA 技术与实践[M].北京:机械工业出版社,2004
4.周红,刘光蓉,张红武. 利用MAX+ plus Ⅱ进行数字逻辑课程设计[J ] . 武汉工业学院学报,2004.4。