资源描述
课 程 设 计
课程设计名称: EDA课程设计
专 业 班 级 电科1303
学 生 姓 名 : 张渊博
学 号 : 201316030301
指 导 教 师 : 王彩红
课程设计时间: 2016-6-20~2016-7-2
电子信息科学与技术 专业课程设计任务书
学生姓名
张渊博
专业班级
电科1303
学号
201316030301
题 目
数显秒表的设计
课题性质
工程设计
课题来源
自拟课题
指导教师
王彩红
同组姓名
主要内容
(1)设计一个带数字显示的秒表,可随时清零、暂停和计时。
(2)要求能准确的计时并显示,开机显示00.00.00。
(3)要求计时范围为59分59.99秒。
(4)要求技术精度为0.01s。
任务要求
①根据设计题目要求编写相应程序代码
②对编写的VHDL程序代码进行编译和仿真
③总结设计内容,完成课程设计说明书
参考文献
[1] EDA课程设计指导书.郑州:河南工业大学,2008
[2] 潘松,黄继业.EDA技术实用教程.北京:科学出版社,2002
[3] 焦素敏.EDA技术基础.北京:清华大学出版社,2014
[4] http://www.ele- 中国电子制作网 网站
审查意见
指导教师签字: 王彩红
教研室主任签字: 王彩红 2016年 6月 20日
说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1 设计任务及要求
(1)设计一个带数字显示的秒表,可随时清零、暂停和计时。
(2)要求能准确的计时并显示,开机显示00.00.00。
(3)要求计时范围为59分59.99秒。
(4)要求技术精度为0.01s。
功能分析:
数显秒表要实现上述要求的功能,首先要具有计时控制器模块、计时模块、分频模块、数据选择器、显示模块。首先输入1KHZ脉冲首先经分频器10分频,变为计数最小单位0.01s然后经过十进制的毫秒计数器,计满进位给秒计数器然后是分计数器左后送给数码管进行显示。直到全部计满然位59.59.99后变为00.00.00,重新开始计数。在计数过程中可以通过计数控制模块可以控制计数暂停、计数、清零的操作。
2设计原理及总体框图
1KHZ输入
分频模块 毫秒计数 秒计数
计数控制模块 分计数
BCD显示 数据选择
图一
图二
实现原理:
各模块功能原理如下:
a、计时控制器模块:
计时控制器模块的作用是将按键信号转变为计时器的控制信号。本设计中设置了两个按键,即启动/暂停和清零贱键,由他们产生计数允许保持和清零信号。启动/暂停键是多用途键,在“按下—>松开—>再按下—>在松开”的过程中,所起的作用分别是“启动—>暂停—>继续”。这类电路适合用状态机描述。
b、计时模块
计数器通过对10ms的脉冲计数,达到计时的目的。由于计数器的范围是0到59分59.99秒,所以计时模块共需要4个十进制计数器和2个六进制计数器。
c、分频模块
时基分频器对1KHZ的脉冲分频产生100HZ的时基,它同十进制计数器的方法一样,因此可直接调用。
d、数据选择器
数据选择器的作用是对10ms、100ms、s和min的6个BCD数进行扫描。它实际上由6进制计数器、3~6译码器和24选4多路开关3个部分组成。
e、BCD/七段译码器模块
主要用于整体设计秒表的最后显示,由7位组成。
3 程序设计
VHDL简介:
VHDL主要用于描述 数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL 系统设计的基本点。本次设计主要就是采用VHDL语言进行编程。
a、计时控制器模块程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jishi_kongzhi IS
PORT(CLK,K:IN STD_LOGIC;
EN:OUT STD_LOGIC);
END jishi_kongzhi;
ARCHITECTURE ONE OF jishi_kongzhi IS
TYPE MY_STATE IS (S0,S1,S2,S3);
SIGNAL STATE:MY_STATE;
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
CASE STATE IS
WHEN S0=>IF K='1' THEN STATE<=S0;
ELSE STATE<=S1;
END IF;
WHEN S1=>IF K='0' THEN STATE<=S1;
ELSE STATE<=S2;
END IF;
WHEN S2=>IF K='1' THEN STATE<=S2;
ELSE STATE<=S3;
END IF;
WHEN S3=>IF K='0' THEN STATE<=S3;
ELSE STATE<=S0;
END IF;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS;
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
CASE STATE IS
WHEN S0=>EN<='0';
WHEN S1=>EN<='1';
WHEN S2=>EN<='1';
WHEN S3=>EN<='0';
WHEN OTHERS=>EN<='0';
END CASE;
END IF;
END PROCESS;
END ONE;
b、计时模块程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT6 IS
PORT(CLK,CLR,EN:IN STD_LOGIC;
Q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
C6:OUT STD_LOGIC);
END CNT6;
ARCHITECTURE ONE OF CNT6 IS
BEGIN
PROCESS(CLR,CLK)
BEGIN
IF CLR='1' THEN
Q<="0000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN='1' THEN
IF Q<"0101" THEN Q<=Q+1;
ELSE Q<="0000";
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF Q="0101" THEN C6<='1';
ELSE C6<='0';
END IF;
END IF;
END PROCESS;
END ONE;
c、分频模块程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fen_pin IS
PORT(CLK,CLR,EN:IN STD_LOGIC;
Q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
C10:OUT STD_LOGIC);
END fen_pin;
ARCHITECTURE ONE OF fen_pin IS
BEGIN
PROCESS(CLR,CLK)
BEGIN
IF CLR='1' THEN
Q<="0000";
C10<='0';
ELSIF CLK' EVENT AND CLK='1' THEN
IF EN='1' THEN
IF Q="1001" THEN
Q<="0000";
C10<='1';
ELSE
Q<=Q+'1';
C10<='0';
END IF;
END IF;
END IF;
END PROCESS;
END ONE;
d、数据选择器程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY shu_xuan IS
PORT(CLK:IN STD_LOGIC;
MSL,MSH,SL,SH,ML,MH:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Q:BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0);
OUT1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
SEG:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END shu_xuan;
ARCHITECTURE ONE OF shu_xuan IS
BEGIN
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF Q<"101" THEN Q<=Q+1;
ELSE Q<="000";
END IF;
END IF;
END PROCESS;
PROCESS(Q)
BEGIN
CASE Q IS
WHEN "000"=>OUT1<=MSL;SEG<="111110";
WHEN "001"=>OUT1<=MSH;SEG<="111101";
WHEN "010"=>OUT1<=SL;SEG<="111011";
WHEN "011"=>OUT1<=SH;SEG<="110111";
WHEN "100"=>OUT1<=ML;SEG<="101111";
WHEN "101"=>OUT1<=MH;SEG<="011111";
WHEN OTHERS=>NULL;
END CASE;
` END PROCESS;
END ONE;
e、BCD/七段译码器模块程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DISPLAY IS
PORT(D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
X:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DISPLAY;
ARCHITECTURE ONE OF DISPLAY IS
BEGIN
PROCESS(D)
BEGIN
CASE D IS
WHEN "0000"=>X<="0111111";
WHEN "0001"=>X<="0000110";
WHEN "0010"=>X<="1011011";
WHEN "0011"=>X<="1001111";
WHEN "0100"=>X<="1100110";
WHEN "0101"=>X<="1101101";
WHEN "0110"=>X<="1111101";
WHEN "0111"=>X<="0100111";
WHEN "1000"=>X<="1111111";
WHEN "1001"=>X<="1101111";
WHEN OTHERS=>X<="0000000";
END CASE;
END PROCESS;
END ONE;
4 编译及仿真
软件编译:
本次编译所需软件环境有Windows系统平台及其Quartus II软件环境。
仿真波形图如下:
A、Clk第一次按下的仿真波形如图三所示:
1号位置
图三
分析:此图加上脉冲之后开始计数当到大一号位置后增加了一个KEY脉冲,此后计数暂停。说明当运行程序后按下第一次按键计数停止。
B、Clk第二次按下的仿真波形如图四所示:
2号位置
图四
分析: 当时间到达2号位置之后又加的一个KEY脉冲,此后计数开始继续。说明当程序运行后第二次按下按键能够继续计数。
C、进位仿真波形如图五所示:
3号位置
图五
分析:当程序运行到达3号位置,也就是最小单位到达9之后,可以从波形图中看出最小单位产生进位十位变为1,个位重新开始计数。此图说明程序进位正确。
4号位置
D、CLR清零仿真波形如图六所示:
图六
分析:当程序运行到四号位置之后,外加了一个CLR的清零信号,可从波形图上看出添加清零信号之后所有的结果都被清零然后重新开始计时。说明程序的清零功能正确。
5 硬件调试与结果分析
调试步骤:
(1) 按照锁定的引脚位置及功能作用连接线路。
(2) 下载程序
(3) 打开电源观察程序运行结果
调试结果及分析:
本次硬件验证过程还算顺利,在此过程中出现了一个小的问题,上电后最小计时位跟各位工作能够正常的计时进位,可是秒位计满之后往分钟位进的时候出现问题,每次进位分钟位也会跳变,但是结果不正确显示的时乱码。然后就检查了程序,做了一遍软件波形仿真发现波形正确。后来就按照锁定引脚顺序的检查线路,发现也没连接错误。最后没办法把分钟部分单独拿出来进行调试,才发现是引脚锁定时高位跟低位弄反了。经过改正之后又重新上电运行,结果非常完美。按钮按一次计时暂停,再按一次继续计时,当清零按钮按下全部计时结果都变为零。
6 参考文献
[1] EDA课程设计指导书.郑州:河南工业大学,2008
[2] 潘松,黄继业.EDA技术实用教程.北京:科学出版社,2002
[3] 焦素敏.EDA技术基础.北京:清华大学出版社,2014
[4] http://www.ele- 中国电子制作网 网站
心得体会
经过本次课程设计,让我进一步的复习和深入的对EDA技术有了进一步的了解。虽然EDA课程结束到做EDA课程设计之间隔了整整一个学期的间隔,但是并没有影响我学习EDA技术的热情。重新拿起课本尽管好多地方及细节都及得不太清楚,但总体大的框架还是记得的。在重新学习这门课程的过程中也遇到了不少的问题,比如有些功能语句的使用、端口的定义、有关的语法问题等等。后来经过在网上查阅资料,翻阅相关的书籍、询问同学最终得以把问题解决。在制作项目的具体过程中总体还算顺利,之间也会遇到一些小的问题但是也都能通过自己分析查找得以解决。最后想说的就是通过本次的课程设计收获还是挺大的,不仅又重新学习了一遍EDA这门课程,在这个过程中也学到了很多之前上课学不到的而且又非常实用东西。非常感谢学校给安排这样一个机会,让我们真正的学以致用,不再是单纯的理论知识。这样既巩固了我们的理论,又增强了我们的动手能力‘
展开阅读全文