电子秒表课程设计报告
课 程 设 计 报 告
题 目:
课 程:
专业班级:
学生姓名:
学 号:
完成日期: 电子秒表 《EDA 技术》课程设计 电信07级 2 班 2010-6-15
机电工程学院
目 录
摘要……………………………………………………………………3
1概述…………………………………………………………………3
1.1课程设计目的……………………………………………………3
1.2课程设计内容……………………………………………………3
1.3课程设计原理……………………………………………………3
2设计过程……………………………………………………………4
2.1模块1……………………………………………………………4
2.2模块2……………………………………………………………4
2.3模块3……………………………………………………………5
2.4顶层设计模块……………………………………………………5
3系统仿真……………………………………………………………5
3.1 时序仿真…………………………………………………………5
3.2 电路功能验证……………………………………………………6
3.3 问题分析…………………………………………………………7
4心得体会………………………………………………………………7 参考文献…………………………………………………………………8 附录1:源程序清单………………………………………………………8
摘要
数字秒表是生活中大家都很熟悉的事物,在EDA 设计中也是一个不错的选
题。设计首先需要考虑秒表的整体构成,主要由分频器与计数器组成。通过计数器进位端相联系。设计好顶层原理图后,需要用VHDL 语言对各个模块进行行为描述,完成对各模块的设计。这应该属于自定向下,模块化的设计方法。
1
1.1课程设计目的
了解各种PLD 器件的基本结构,掌握QUARTUSII 的使用方法,用图形输入法和VHDL 完成规定的基本练习题,在此基础上完成一个数字系统设计题的设计、仿真、下载(FPGA 实现)。通过课程设计使学生能熟练掌握一种EDA 软件(QUARTUSII )的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程。使学生能利用EDA 软件(QUARTUSII )进行至少一个电子技术综合问题的设计(内容可由老师指定或自由选择),设计输入可采用图形输入法或VHDL 硬件描述语言输入法。使学生初步具有分析、寻找和排除电子电路中常见故障的能力。
1.2课程设计内容
使用VHDL 语言描述一个秒表电路,利用QuantusII 软件进行源
程序设计,编译,仿真,最后形成下载文件下载至装有FPGA 芯片的实验箱,进行硬件测试,要求实现秒表功能。
1.3课程设计原理
秒表的逻辑结构较简单,它主要由、显示译码器、分频器、十进制计数器和
6进制计数器组成。在整个秒表中最关键的是如何获得一个精确的100H Z 计时脉
冲,除此之外,整个秒表还需有一个启动信号和一个归零信号,以便秒表能随意停止及启动。秒有共有6个输出显示,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应,6个计数器的输出全都为BCD 码输出,这样便与同显示译码器(七段数码管驱动译码器)的连接,当计时达60分钟后,蜂鸣器鸣响10声。四个10进制计数器:用来分别对百分之一秒、十分之一秒、秒和分进行计数;两个6进制计数器:用来分别对十秒和十分进行计数;分频器:用来产生100H Z 计时脉冲;显示译码器:完成对显示的控制。选
定实验箱产生的频率送入分频器,输出100Hz 频率,驱动显示百分秒的十进制计概述
数器,此计数器进位端接显示时分秒的十进制计数器。依次接下去,分别是秒,十秒,分,十分。最后设计一个驱动蜂鸣器的模块。
2
2.1模块1——分频器
要驱动最小的时间单位百分秒需要一百赫兹的频率,而实验箱不
提供这个频率,所以需要一个分频器来提供。分频器原理:输入一个较高的频率,比如750kHz ,则设计算法,使得每输入7500个脉冲输出一个脉冲,这样输出端口就提供一个100Hz 的频率。
部分源程序及说明:
ARCHITECTURE ART OF CLKGEN IS
SIGNAL CNTER: INTEGER RANGE 0 TO 10#119999#;
BEGIN
PROCESS(CLK) IS
BEGIN
IF CLK' EVENT AND CLK='1'THEN
IF CNTER=10#119999#THEN CNTER
ELSE CNTER
END IF;
END IF;
end process;
PROCESS(CNTER) IS
BEGIN
IF CNTER=10#119999# THEN NEWCLK
次——输出一个脉冲
ELSE NEWCLK
END IF;
END PROCESS;
END ARCHITECTURE ART;
模块符号:
设计过程
2.2模块2——十进制计数器
十进制计数器就是输入一个时钟脉冲计一个数,计数当前值通过
4位输出端口输出。当计到九且再来一个脉冲时计数输出清零,且进位端给出高电平。再来脉冲继续计数,进位端清零。计数只有在使能端为1时有效,否则保持。
部分源程序及说明:
ARCHITECTURE behav OF CNT10 IS
BEGIN
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RST = '1' THEN CQI := (OTHERS =>'0') ; —
—清零
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN = '1' THEN
IF CQI
——计数,进位端清零
ELSE CQI := (OTHERS =>'0'); COUT
——计数端清零,进位端置1。
END IF;
END IF;
END IF;
CQ
END PROCESS;
END behav;
模块图:
2.3模块3——六进制计数器
六进制计数器与十进制的很相似,区别仅在于输入六个脉冲时计
数端清零,进位端置1。这里不再赘述。
2.4顶层设计模块
顶层文件是一个原理图文件,见附录源程序清单。
3
3.1 时序仿真
分频器时序仿真结果:
系统仿真
仿真时间是100ms ,输入脉冲是上面一排,下面是输出脉冲,100ms
内有100个脉冲,即输出是一个100Hz 时钟信号。
十进制计数器仿真结果:
仿真时间50us ,时钟周期2us 。由图可见,使能端使能功能,复
位端清零功能均正常。计数端十进制计数正常,进位端进位时间正常。
六进制计数器仿真结果:
仿真时间50us ,时钟周期2us 。由图可见,使能端使能功能,复
位端清零功能均正常。计数端六进制计数正常,进位端进位时间正常。
3.2 电路功能验证
各模块与整体设计完毕并仿真得到预期结果后,就开始分配管
脚,下载进行硬件测试。
分配管脚在Assignment Editor 里。根据自己选择的模式,选择
所需输入输出设备,比如按键,数码管。查表获知管脚名称,写好后
保存,全程编译。管脚就分配好了,在顶层原理图上会自动显示管脚名称。
接下来将程序下载至芯片。Tools 里的programer 。检测到硬件
后,选add fiel,找到自己的文件,选中后点Start 开始下载。
下载完成后就开始硬件测试。用短路帽选好实验箱上的时钟频
率,按下使能键,看到数码管显示秒表开始计时。再按使能键停止计时。按复位键清零。等到计时一个小时后,蜂鸣器响十秒。在此后的十分钟里,每分钟开始的十秒会响,十分钟后不再响。硬件测试达到预期效果。
3.3 问题分析
整个设计过程中遇到很多问题,选择其中有价值的几个说一下。
有一次硬件测试时发现秒的各位逢九就会向高位进位。就是说
18下一个是29,接下来是20,21。。。经过分析认为是计数器逻辑存
在问题,见九就进位,并不等待下一个上升沿到来。检查源程序,问题果然是这样的。修改源程序,使得计到9,再等到下一个时钟上升沿时才进位。保存,编译,再验证,问题解决。
还有一个问题就是发现秒走得太快,不符合实际。认为是分频器
有问题,但是检查源程序后发现逻辑是正确的。时序仿真后发现了问题:每一个输出脉冲都带一个毛刺,相当于输出频率提高了一倍。解决办法:修改源程序逻辑以降低输出频率到原来的一半,或者选用相当于原来一半的输入频率。
最后一个问题:将最高为的计数器进位输出端接扬声器,它不会
响。查阅资料后发现需要用一个有一定频率的高低变化电平来驱动扬声器。于是将十分与十秒的进位端还有1000Hz 的时钟接与门,将与门输出接扬声器,问题解决。
4心得体会
下面谈谈本次设计中的心得。通过这次设计,首先把课堂上学习的硬件描述
语言应用到了实际,巩固了已经学到的东西,并对它有了更深层次的理解。理论应用到实际总是能让人学到很多。其次,实际操作让我了解一个电子系统的实际
开发过程,这就是学到了实际操作方面的东西。还有,这个设计过程让我体会到了模块化设计法的优势。最后,在设计中遇到的各种问题让我产生很多思考,体会到依靠思考解决实际问题的乐趣。最后想说的是,这虽然是一个很简单的系统,但是在设计过程中也称得上困难重重,历经困惑。一个看上去挺简单的东西,要实现它却是另一回事,会有很多想不到的困难。那么看上去就很难的东西,实现起来就更难于上青天了。但是人们却能把这样的东西做出来,比如计算机系统。这就是人类智慧和现代科技的伟力。
参考文献:
《EDA 技术与PLD 设计》《VHDL 与可编程逻辑器件应用》《
《现场可编程门阵列(FPGA )及其应用》
百度百科
附录1:源程序清单:
clkgen.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CLKGEN IS
PORT (CLK :IN STD_LOGIC;
NEWCLK : OUT STD_LOGIC);
END ENTITY CLKGEN;
ARCHITECTURE ART OF CLKGEN IS
SIGNAL CNTER: INTEGER RANGE 0 TO 10#119999#;
BEGIN
PROCESS(CLK) IS
BEGIN
IF CLK' EVENT AND CLK='1'THEN
IF CNTER=10#119999#THEN CNTER
ELSE CNTER
EDA 技术及应用》
END IF;
END IF;
end process;
PROCESS(CNTER) IS
BEGIN
IF CNTER=10#119999# THEN NEWCLK
ELSE NEWCLK
END IF;
END PROCESS;
END ARCHITECTURE ART;
Cnt10.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT (CLK,RST,EN : IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT : OUT STD_LOGIC );
END CNT10;
ARCHITECTURE behav OF CNT10 IS
BEGIN
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RST = '1' THEN CQI := (OTHERS =>'0') ;
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN = '1' THEN
IF CQI
ELSE CQI := (OTHERS =>'0'); COUT
END IF;
END IF;
END IF;
CQ
END PROCESS;
END behav;
Cnt6.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT6 IS
PORT (CLK,RST,EN : IN STD_LOGIC; CQ : OUT STD_LOGIC_VECTOR(3
DOWNTO 0);
COUT : OUT STD_LOGIC );
END CNT6;
ARCHITECTURE behav OF CNT6 IS
BEGIN
PROCESS(CLK, RST, EN)
VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RST = '1' THEN CQI := (OTHERS =>'0') ; ELSIF CLK'EVENT AND CLK='1' THEN
IF EN = '1' THEN
IF CQI
'0';
ELSE CQI := (OTHERS =>'0'); COUT
'1';
END IF;
END IF;
END IF;
CQ
END PROCESS;
END behav;
顶层原理图文件:
11