资源描述
东 北 石 油 大 学
课 程 设 计
课 程 硬件课程设计
题 目 数字钟设计
院 系 计算机与信息技术学院
专业班级 计算机科学与技术07-1班
学生姓名
学生学号
指导教师 李 军
2009年 7 月 10 日
东北石油大学课程设计任务书
课程 硬件课程设计
题目 数字钟设计
专业 姓名 学号
主要内容、基本要求等
一、主要内容:
利用EL教学实验箱、微机和QuartusⅡ软件系统,使用VHDL语言输入方法设计数字钟。可以利用层次设计方法和VHDL语言,完成硬件设计设计和仿真。最后在EL教学实验箱中实现。
二、基本要求:
1.具有时,分,秒,计数显示功能,以24小时循环计时。
2.具有清零功能。
三、扩展要求
1.调节小时、分钟功能。
2.整点报时功能,整点报时的同时LED灯花样显示。
按照规范写出论文,要求字数在4000字以上,并进行答辩。论文内容包括概述(学习、调研、分析、设计的内容摘要)、EDA技术的现状和发展趋势、对EL教学实验箱和QuartusⅡ软件的掌握程度、数字钟的设计过程(包括原理图或程序设计、编译、仿真分析、硬件测试的全过程),论文中含有原理图、程序、仿真波形图及其分析报告。
完成期限 2周
指导教师
专业负责人
年 月 日
东北石油大学课程设计成绩评价表
课程名称
硬件课程设计
题目名称
数字钟设计
学生姓名
学号
指导教师姓名
职称
序号
评价项目
指 标(优秀)
满分
评分
1
选题难度
选题难度较高,或者对原题目进行了相当程度的改进。
10
2
工作量、工作态度和出勤率
工作量饱满,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。
10
3
课程设计质量
按期圆满的完成了规定的任务,方案设计合理,思考问题全面,系统功能完善。
40
4
报告质量
问题论述思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。
30
5
回答问题
在进行课程设计程序系统检查时,能正确回答指导教师所提出的问题。
10
6
创新(加分项)
工作中有创新意识,对前人工作有改进或有应用价值。在进行系统检查时能对创新性进行说明,并在报告中有相应的论述。
+5
总分
评语:
指导教师: 年 月 日
摘 要
本文介绍了利用EDA-V硬件系统和微机上的Quartus7.2-II等软件系统。VHDL的英文全名是Very-High-Speed Integrated Circuit HardwareDescription Language,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言 。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
本文设计主要利用VHDL语言在EDA平台上设计一个电子数字钟,它的计时周期为24小时,显示满刻度为23时59分59秒,另外还具有校时功能和闹钟功能。总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。并且使用Quartus7.2-II软件进行电路波形仿真,下载到EDA实验箱进行验证。
关键词: EDA(电子设计自动化);VHDL(硬件描述语言),数字钟。
目 录
第1章 概 述 1
1.1 EDA的概念 1
1.2 EDA的工作平台 3
第2章 数字钟设计的系统分析 4
2.1设计目的 4
2.2功能说明 4
2.3实验原理 4
2.4系统硬件 4
第3章 数字钟的底层电路设计 6
3.1设计规划 6
3.2设计说明 6
3.3底层电路程序 7
第4章 数字钟的顶层文件设计 14
4.1设计说明 14
4.2顶层文件程序 14
第5章 数字钟设计的测试与运行 17
5.1数字钟的编译与仿真 17
5.2数字钟的适配与测试 19
结 论 21
参考文献 22
东北石油大学本科生课程设计(论文)
第1章 概 述
1.1 EDA的概念
EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的[1]。
EDA代表了当今电子设计技术的最新发展方向,它的基本特征是:设计人员按照“自顶向下”的设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片或几片专用集成电路(ASIC)实现,然后采用硬件描述语言(HDL)完成系统行为级设计,最后通过综合器和适配器生成最终的目标器件,这样的设计方法被称为高层次的电子设计方法。
现在对EDA的概念或范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA 技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。本文所指的EDA技术,主要针对电子电路设计、PCB设计和IC设计。EDA 设计可分为系统级、电路级和物理实现级。本次毕业设计课题实现的核心技术即为EDA相关技术[2]。
1.1.1EDA技术及应用
电子设计技术的核心就是EDA技术,EDA是指以计算机为工作平台,融合应用电子技术、计算机技术、智能化技术最新成果而研制成的电子CAD通用软件包,主要能辅助进行三方面的设计工作,即IC设计、电子电路设计和PCB设计。EDA技术已有30年的发展历程,大致可分为三个阶段。70年代为计算机辅助设计(CAD)阶段,人们开始用计算机辅助进行IC版图编辑、PCB布局布线,取代了手工操作。80年代为计算机辅助工程(CAE)阶段。与CAD相比,CAE除了有纯粹的图形绘制功能外,又增加了电路功能设计和结构设计,并且通过电气连接网络表将两者结合在一起,实现了工程设计。CAE的主要功能是:原理图输人,逻辑仿真,电路分析,自动布局布线,PCB后分析。90年代为电子系统设计自动化(EDA)阶段[3]。
EDA技术发展迅猛,逐渐在教学、科研、产品设计与制造等各方面都发挥着巨大的作用。在教学方面:几乎所有理工科(特别是电子信息)类的高校都开设了EDA课程。主要是让学生了解EDA的基本原理和基本概念、鳞握用佃L描述系统逻辑的方法、使用扔A工具进行电子电路课程的模拟仿真实验并在作毕业设计时从事简单电子系统的设计,为今后工作打下基础。具有代表性的是全国每两年举办一次大学生电子设计竞赛活动。在科研方面:主要利用电路仿真工具(EwB或PSPICE、VLOL等)进行电路设计与仿真;利用虚拟仪器进行产品调试;将O)LI)/FPGA器件的开发应用到仪器设备中。例如在CDMA无线通信系统中,所有移动手机和无线基站都工作在相同的频谱,为区别不同的呼叫,每个手机有一个唯一的码序列,CDMA基站必须能判别这些不同观点的码序列才能分辨出不同的传呼进程;这一判别是通过匹配滤波器的输出显示在输人数据流中探调到特定的码序列;FPGA能提供良好的滤波器设计,而且能完成DSP高级数据处理功能,因而FPGA在现代通信领域方面获得广泛应用[4]。在产品设计与制造方面:从高性能的微处理器、数字信号处理器一直到彩电、音响和电子玩具电路等,EDA技术不单是应用于前期的计算机模拟仿真、产品调试,而且也在批量制作、电子设备的研制与生产、电路板的焊接等有重要作用。可以说电子EDA技术已经成为电子工业领域不可缺少的技术支持。
电子技术全方位纳入EDA领域,EDA使得电子领域各学科的界限更加模糊,更加互为包容,突出表现在以下几个方面:使电子设计成果以自主知识产权的方式得以明确表达和确认成为可能;基于EDA工具的ASIC设计标准单元已涵盖大规模电子系统及IP核模块;软硬件IP核在电子行业的产业领域、技术领域和设计应用领域得到进一步确认;SoC高效低成本设计技术的成熟。随着半导体技术、集成技术和计算机技术的迅猛发展,电子系统的设计方法和设计手段都发生了很大的变化。可以说电子EDA技术是电子设计领域的一场革命。传统的“固定功能集成块十连线”的设计方法正逐步地退出历史舞台,而基于芯片的设计方法正成为现代电子系统设计的主流。作为高等院校有关专业的学生和广大的电子工程师了解和掌握这一先进技术是势在必行,这不仅是提高设计效率的需要,更是时代发展的需求,只有攀握了EDA技术才有能力参与世界电子工业市场的竞争,才能生存与发展。随着科技的进步,电子产品的更新日新月异,EDA技术作为电子产品开发研制的源动力,已成为现代电子设计的核心。所以发展EDA技术将是电子设计领域和电子产业界的一场重大的技术革命,同时也对电类课程的教学和科研提出了更深更高的要求。特别是EDA技术在我国尚未普及,掌握和普及这一全新的技术,将对我国电子技术的发展具有深远的意义。
1.2 EDA的工作平台
1.2.1 EDA硬件工作平台
1.计算机。
2.EDA实验开发系统:EDA-V。
1.2.2 EDA 的软件工作平台
PLD(Programmable Logic Device)是一种由用户根据需要而自行构造逻辑功能的数字集成电路。目前主要有两大类型:CPLD(Complex PLD)和FPGA(Field Programmable Gate Array)。它们的基本设计方法是借助于EDA软件,用原理图、状态机、布尔表达式、硬件描述语言等方法,生成相应的目标文件,最后用编程器或下载电缆,由目标器件实现。生产PLD的厂家很多,但最有代表性的PLD厂家为Altera、Xilinx和Lattice 公司。
第2章 数字钟的系统分析
2.1设计目的
1.掌握多位计数器相连的设计方法。
2.掌握十进制,六进制,二十四进制计数器的设计方法。
3.继续巩固多位共阴极扫描显示数码管的驱动,及编码。
4.掌握扬声器的驱动。
5.LED灯的花样显示。
6.掌握CPLD技术的层次化设计方法。
2.2功能说明
1.具有时,分,秒,计数显示功能,以24小时循环计时。
2.具有清零,调节小时、分钟功能。
3.具有整点报时功能,整点报时的同时LED灯花样显示。
2.3实验原理
在同一EPLD芯片EPF10K10上集成了如下电路模块:
1.时钟计数: 秒——60进制BCD码计数;
分——60进制BCDD码计数;
时——24进制BCDD码计数;
同时整个计数器有清零,调分,调时功能。在接近整数时间能提供报时信号。
2.具有驱动8位八段共阴扫描数码管的片选驱动信号输出和八段字形译码输出。编码和扫描可参照“实验四”。
3.扬生器在整点时有报时驱动信号产生。
4. LED灯按个人口味在整点时有花样显示信号产生。
2.4系统硬件
1.主芯片EPF10K10LC84-4。
2.8个LED灯。
3.扬声器。
4.8位八段扫描共阴级数码显示管。
5.三个按键开关(清零,调小时,调分钟)。
第3章 数字钟的底层电路设计
3.1设计规划
该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个子模块:计时、报时(alarm1)、重置时间(setmin1、sethour1)。其中计时模块有3部分构成:秒计时器(second1)、分计时器(minute1)、时计时器(hour1)。
1. 秒计数模块:秒计数,在频率为1HZ的时钟下以60次为循环计数,并产生进位信号影 响分计数。
2. 分计数模块:分计数,在秒进位信号为高电平时,计数一次,同样以60次为一个循环计数,同时产生分进位信号影响时计数。
3. 时计数模块:时计数,在分进位信号为高电平时,计数一次,以24次为一个循环计数。
4. 时间显示模块:通过选中不同的数码管,同时进行一定频率的扫描显示时,分,秒。
5. 时间设置模块:设置调试使能端,可以调时,分。基本功能是在使能端为高电平时,可以使时和分循环计数;
6. 整点报时模块:在秒计数到50秒时,同时分计数到59分开始,丰鸣器产生每个2秒的鸣叫(500HZ),到整点是产生750HZ的鸣叫。
7. 闹钟模块:在设定闹钟闹铃时间后,当闹钟使能端有效时,可在闹铃时间闹铃,并有彩灯显示。
3.2设计说明
首先分析数字时钟,得出进位法则大体相同,故所得时分秒进位方式语法基本相同,因此可以将时分秒定义成六位输出端口,即分别将时分秒定义为3个component,分别给予设计。
3.3底层电路程序
3.3.1 秒计时器(VHDL语言编译)
其代码如下:(VHDL语言):
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY second IS
PORT(
clk, reset,setmin : IN STD_LOGIC;
enmin : OUT STD_LOGIC;
daout: out std_logic_vector (6 downto 0));
END entity second;
ARCHITECTURE fun OF second IS
SIGNAL count: STD_LOGIC_VECTOR( 6 downto 0);
BEGIN
daout <= count;
process ( clk , reset , setmin)
begin
-- enmin<=k;
if (reset='0') then
count <= "0000000";
elsif (setmin='0') then
enmin <= clk;
elsif (clk 'event and clk='1') then
if (count(3 downto 0)="1001") then
if (count <16#60#) then
if (count="1011001") then
enmin<='1';
count<="0000000";
ELSE
count<=count+7;
end if;
else
count<="0000000";
end if;
elsif (count < 16#60#) then
count <= count+1;
enmin<='0' after 100 ns;
else
count<="0000000";
end if;
end if;
end process;
END fun;
秒计时器实际上是一个60进制的计数器,它从时钟脉冲接受脉冲信号,每当一个脉冲信号来时,秒就自动加1,所以,输入的时钟信号应该是的频率应该是1hz,当秒计满60时,发出一个脉冲信号给分组件,再将本身清零。这样,每计满60s,分钟就加1,正好按着正常的时间规律计时。
3.3.2分计时器(VHDL语言编译)
其代码(VHDL语言)如下:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY minute IS
PORT(
clk, clk1,reset,sethour : IN STD_LOGIC;
enhour : OUT STD_LOGIC;
daout: out std_logic_vector (6 downto 0));
END entity minute;
ARCHITECTURE fun OF minute IS
SIGNAL count: STD_LOGIC_VECTOR( 6 downto 0);
BEGIN
daout <= count;
process ( clk,reset,sethour)
begin
if (reset='0') then
count <= "0000000";
elsif (sethour='0') then
enhour <= clk1;
elsif (clk' event and clk='1') then
if (count(3 downto 0)="1001") then
if (count <16#60#) then
if (count="1011001") then
enhour<='1';
count<="0000000";
ELSE
count<=count+7;
end if;
else
count<="0000000";
end if;
elsif(count <16#60#) then
count <= count + 1;
enhour<='0' after 100 ns;
else
count<="0000000";
end if;
end if;
end process;
END fun;
分计时器也是一个60进制的计数器,它从秒计时器的脉冲输出端接受脉冲信号。每当一个脉冲信号来时,分就自动加1,当分计满60时,发出一个脉冲信号给时组件,再将本身清零。这样,每计满60MIN,小时就加1,正好按着正常的时间规律计时。该模块还能对分进行数字调整,并可以将其全部清零。
3.3.3时计时器(VHDL语言)
代码如下:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY hour IS
PORT(
clk,reset: IN STD_LOGIC;
daout: out std_logic_vector (5 downto 0));
END entity hour;
ARCHITECTURE fun OF hour IS
SIGNAL count: STD_LOGIC_VECTOR( 5 downto 0);
BEGIN
daout <= count;
process ( clk,reset)
begin
if (reset='0') then
count <= "000000";
elsif (clk' event and clk='1') then
if (count(3 downto 0)="1001") then
if (count <16#24#) then
count<=count + 7;
else
count<="000000";
end if;
elsif(count <16#24#) then
count <= count + 1;
else
count<="000000";
end if;
end if;
end process;
END fun;
时计时器是一个24进制的计数器,它从分组件的脉冲信号输出端接受脉冲信号,每当一个脉冲信号来时,时就自动加1,并且输出个信号给时组件,直到计满24,再将本身清零。该组件还能对时进行数字调整,并可以将其全部清零。
3.3.4时间显示Deled(VHDL语言)
代码如下:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY deled IS
PORT(num: IN std_logic_vector( 3 downto 0);
led: OUT std_logic_vector(6 downto 0));
END deled;
ARCHITECTURE fun OF deled IS
BEGIN
led <= "1111110" when num= "0000" else
"0110000" when num= "0001" else
"1101101" when num= "0010" else
"1111001" when num= "0011" else
"0110011" when num= "0100" else
"1011011" when num= "0101" else
"1011111" when num= "0110" else
"1110000" when num= "0111" else
"1111111" when num= "1000" else
"1111011" when num= "1001" else
"1110111" when num= "1010" else
"0011111" when num= "1011" else
"1001110" when num= "1100" else
"0111101" when num= "1101" else
"1001111" when num= "1110" else
"1000111" when num= "1111" ;
END fun;
Deled模块是一个简单的电路,它的功能将时、分、秒三个组件中所计的数编码后,能对应在七段数码管山显示成数字形式。
3.3.5报时模块alert(VHDL语言)
代码如下:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY alert IS
PORT(
clk : IN STD_LOGIC;
dain : IN STD_LOGIC_VECTOR(6 DOWNTO 0);
speak: OUT STD_LOGIC;
lamp : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END alert ;
ARCHITECTURE fun OF alert IS
signal count : std_logic_vector( 1 downto 0);
signal count1: std_logic_vector( 1 downto 0);
BEGIN
speaker:process (clk)
begin
speak <= count1(1);
if (clk 'event and clk= '1') then
if (dain = "000000") then
if (count1>="10") then
count1<="00";
else
count1 <= count1 + 1;
end if;
end if;
end if;
end process speaker;
lamper:process(clk)
begin
if (rising_edge(clk))then
if (count <= "10") then
if (count ="00") then
lamp <= "001" ;
elsif (count = "01") then
lamp <= "010" ;
elsif(count="10") then
lamp <= "100" ;
end if;
count <= count + 1;
else
count <= "00";
end if;
end if;
end process lamper;
END fun ;
报时模块也是个简单的程序,它的功能是:当每满一个小时时,有该组件输出一个脉冲信号给试验箱上的喇叭,喇叭会相应其信号,能持续发出一段蜂鸣声,从而达到报时的目的。
3.3.6译码模块seltime(VHDL语言)
代码如下:
LIBRARY ieee;
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY seltime IS
PORT(
clk1, reset: IN STD_LOGIC;
sec,min : IN STD_LOGIC_VECTOR(6 downto 0);
hour : in std_logic_vector (5 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 ( clk1,reset)
begin
if (reset ='0') then
count <= "000";
elsif (clk1 'event and clk1='1') then
if ( count >= "101") then
count <= "000";
else
count <= count + 1;
end if;
end if;
case count is
when "000" => daout <= sec(3 downto 0);
when "001" => daout(3) <= '0';
daout(2 downto 0) <= sec (6 downto 4);
when "010" => daout <= min (3 downto 0);
when "011" => daout(3) <= '0';
daout(2 downto 0) <= min (6 downto 4);
when "100" => daout <= hour (3 downto 0);
when others => daout(3 downto 2) <= "00";
daout(1 downto 0) <= hour(5 downto 4);
end case;
end process;
译码模块时时钟显示的最重要的部件,它的功能时将时、分、秒共六位译码输出显示在六位的led显示器上。它的时钟信号应接到一个高频脉冲信号源上,这样,由于刷新的时间间隔很短,所以,led显示器才能一直持续的亮着。
第4章 数字钟的顶层文件设计
4.1设计说明
建立数字钟的顶层文件就是将已经设计好的各个功能组件组合调用,连成一个整体,使整个系统按照设计要求在实际中工作起来。
4.2顶层文件程序
代码如下:
library ieee;
use ieee.std_logic_1164.all;
entity clock_top is
port ( clk,reset,setmin,sethour,clkdsp:in std_logic;
speaker: out std_logic;
lamp: out std_logic_vector(2 downto 0);
sel: out std_logic_vector(2 downto 0);
a,b,c,d,e,f,g,dp: out std_logic);
end clock_top;
--*************************************************
architecture a of clock_top is
--*************************************************
--second counter
COMPONENT second
PORT(
clk, reset,setmin: IN STD_LOGIC;
daout: out std_logic_vector(6 downto 0);
enmin: OUT STD_LOGIC);
END COMPONENT;
--*************************************************
-- minute counter
COMPONENT minute
PORT(
clk, clk1,reset,sethour: IN STD_LOGIC;
enhour: OUT STD_LOGIC;
daout: out std_logic_vector(6 downto 0));
END COMPONENT;
--*************************************************
--hour counter
COMPONENT hour
PORT(clk, reset: IN STD_LOGIC; daout: out std_logic_vector(5 downto 0));
END COMPONENT;
--*************************************************
COMPONENT alert
PORT(
clk: IN STD_LOGIC;
dain:in std_logic_vector(6 downto 0);
lamp: out std_logic_vector(2 downto 0);
speak: OUT STD_LOGIC);
END COMPONENT;
--*************************************************
COMPONENT seltime
PORT(
clk1, reset: IN STD_LOGIC;
sec,min:in std_logic_vector(6 downto 0);
hour:in std_logic_vector(5 downto 0);
daout: out std_logic_vector(3 downto 0);
sel: OUT STD_LOGIC_vector(2 downto 0));
END COMPONENT;
--*************************************************
COMPONENT deled
PORT(
num: IN STD_LOGIC_vector(3 downto 0);
led: out std_logic_vector(6 downto 0));
END COMPONENT;
--*************************************************
展开阅读全文