VHDL数字秒表设计.docx
《VHDL数字秒表设计.docx》由会员分享,可在线阅读,更多相关《VHDL数字秒表设计.docx(11页珍藏版)》请在冰豆网上搜索。
VHDL数字秒表设计
课程设计(综合实验)报告
(2014--2015年度第1学期)
名称:
VHDL语言与数字系统设计
题目:
电子秒表
院系:
班级:
学号:
学生:
指导教师:
晓梅
设计周数:
2周
成绩:
日期:
2015年1月23日
一、课程设计(综合实验)的目的与要求
1.目的
1.1学习使用VHDL语言,以及EDA芯片的下载仿真。
1.2掌握较为复杂的逻辑设计和调试。
1.3学习用原理图+VHDL语言设计逻辑电路。
1.4掌握Quartues软件的使用方法。
2.实验要求
2.1设计一块电子秒表,能够精确反映计时时间。
2.2秒表计时的最大围为1小时,精度为0.01秒,秒表可得到计时时间的分、秒、0.1秒等量度。
2.3当复位清零有效时,秒表清零并做好计时准备。
2.4设置秒表的启动/停止开关
二、设计(实验)正文
1设计过程
1.1十进制计数器
十进制计数器就是输入一个时钟脉冲计一个数,技术当前值通过4位输出端口输出。
当计数到九且再来一个脉冲时计数输出清零,且进位端给出高电平。
再来脉冲继续计数,进位端清零。
计数只有在使能端为1时有效,否则保持。
部分源程序及说明:
BEGIN--当clk,clr,ena信号发生变化时,启动计数功能
IFclr='1'THEN--复位清零信号有效
tmp<="0000";--任何时刻都将计数器清零
ELSIFclk'EVENTANDclk='1'THEN--时钟上升沿
IFena='1'THEN--允许计数
IFtmp="1001"THEN--计数器满
tmp<="0000";
ELSE
tmp<=tmp+'1';--计数器加1
eNDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(tmp)--当计数器发生变化时,启动输出功能
BEGIN
IFtmp="0000"THEN--计数器状态为0时
co<='1';--进位输出信号有效
ELSE
co<='0';--否则,为0
ENDIF;
ENDPROCESS;
q<=tmp;--输出计数器的值
ENDrtl;
1.2六进制计数器
六进制计数器就是输入一个时钟脉冲计一个数,技术当前值通过4位输出端口输出。
当计数到六且再来一个脉冲时计数输出清零,且进位端给出高电平。
再来脉冲继续计数,进位端清零。
计数只有在使能端为1时有效,否则保持。
部分源程序及说明:
PROCESS(clk,clr,ena)
BEGIN
IFclr='1'THEN
tmp<="0000";
ELSIFclk'EVENTANDclk='1'THEN
IFena='1'THEN
IFtmp="0101"THEN--计数器到6,计数器满
tmp<="0000";
ELSE
tmp<=tmp+'1';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
1.3顶层模块设计
将十进制计数模块与六进制模块通过例化,级联在一起,得到电子秒表
例化程序说明:
BEGIN--原件例化语句,通过计数器的级联实现数字秒表
U1:
cnt10PORTMAP(clk0,clr0,en,dataout(3downto0),co1);
U2:
cnt10PORTMAP(co1,clr0,en,dataout(7downto4),co2);
U3:
cnt10PORTMAP(co2,clr0,en,dataout(11downto8),co3);
U4:
cnt6PORTMAP(co3,clr0,en,dataout(15downto12),co4);
U5:
cnt10PORTMAP(co4,clr0,en,dataout(19downto16),co5);
U6:
cnt6PORTMAP(co5,clr0,en,dataout(23downto20));
ENDrtl;
2.仿真结果
2.1十进制计数器仿真结果
2.2六进制计数器仿真结果
2.3顶层模块仿真结果
2.4启动/停止与清零功能
说明:
在8.0ns到9.5ns时,清零信号为高电平1有效,清零功能触发,秒表清零,在15ns到18ns时,使能信号为低电平0,此时不再继续计数,即暂停功能触发。
三、课程设计(综合实验)总结或结论
1.结论:
这次课程设计是要求用EDA技术中的QuartusⅡ6.0作为开发工具,设计一个简单的电子秒表,秒表的时钟信号源可由时钟脉冲得到。
整个设计分为3个主要模块,十进制计数模块、六进制计数模块和顶层模块。
该数字式秒表具有清零功能,能够在计时过程中随时停止计时,恢复到初始状态。
且该秒表还有启动/停止功能。
实验证明该秒表工作正常,基本上已达到了预期的设计要求。
2.体会及感想、收获:
开始做设计时总是会犯一些错误,参考书上的例题,问老师和同学,慢慢的对编程熟悉了一些。
在不停的改错不停的编译下得到了正确的程序。
在设计中要求我们要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,比如一个分号,或者一个冒号,再或者赋值时的形式,而对错误的检查要求我要有足够的耐心。
通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。
现在,又掌握了一个新的技能,虽然还不熟练,但后来会好起来的,我相信。
四、参考文献
[1]欲晓方强黄宛宁《EDA技术与VHDL电路开发应用实践》电子工业2009年4月第一版.
[2]付永庆《VHDL语言及其应用》高等教育2005年5月第一版
[3]潘松黄继业《EDA技术与VHDL》清华大学2013年4月第四版
附录(设计流程图、程序、表格、数据等)
1设计过程
1.1十进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt10IS
PORT(
clk:
INSTD_LOGIC;
clr:
INSTD_LOGIC;
ena:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
co:
OUTSTD_LOGIC
);
ENDcnt10;
ARCHITECTURErtlOFcnt10IS
SIGNALtmp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk,clr,ena)
BEGIN
IFclr='1'THEN
tmp<="0000";
ELSIFclk'EVENTANDclk='1'THEN
IFena='1'THEN
IFtmp="1001"THEN
tmp<="0000";
ELSE
tmp<=tmp+'1';
eNDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(tmp)
BEGIN
IFtmp="0000"THEN
co<='1';
ELSE
co<='0';
ENDIF;
ENDPROCESS;
q<=tmp;
ENDrtl;
1.2六进制计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt6IS
PORT(
clk:
INSTD_LOGIC;
clr:
INSTD_LOGIC;
ena:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
co:
OUTSTD_LOGIC
);
ENDcnt6;
ARCHITECTURErtlOFcnt6IS
SIGNALtmp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk,clr,ena)
BEGIN
IFclr='1'THEN
tmp<="0000";
ELSIFclk'EVENTANDclk='1'THEN
IFena='1'THEN
IFtmp="0101"THEN
tmp<="0000";
ELSE
tmp<=tmp+'1';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(tmp)
BEGIN
IFtmp="0000"THEN
co<='1';
ELSE
co<='0';
ENDIF;
ENDPROCESS;
q<=tmp;
ENDrtl;
1.3顶层模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYstopwatchIS
PORT(
clk0:
INSTD_LOGIC;
clr0:
INSTD_LOGIC;
en:
INSTD_LOGIC;
dataout1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
dataout2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
dataout3:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
dataout4:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
co:
OUTSTD_LOGIC
);
ENDstopwatch;
ARCHITECTURErtlOFstopwatchIS
COMPONENTcnt6IS
PORT(
clk:
INSTD_LOGIC;
clr:
INSTD_LOGIC;
ena:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
co:
OUTSTD_LOGIC
);
ENDcomponentcnt6;
COMPONENTcnt10IS
PORT(
clk:
INSTD_LOGIC;
clr:
INSTD_LOGIC;
ena:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
co:
OUTSTD_LOGIC
);
ENDCOMPONENTcnt10;
SIGNALco1:
STD_LOGIC;
SIGNALco2:
STD_LOGIC;
SIGNALco3:
STD_LOGIC;
BEGIN
U1:
cnt10PORTMAP(clk0,clr0,en,dataout1(3downto0),co1);
U2:
cnt10PORTMAP(co1,clr0,en,dataout2(3downto0),co2);
U3:
cnt10PORTMAP(co2,clr0,en,dataout3(3downto0),co3);
U4:
cnt6PORTMAP(co3,clr0,en,dataout4(3downto0));
ENDrtl;