课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
(综合实验)报告
( 2014-- 2015 年度第 1 学期)
名 称:VHDL语言与数字系统设计
题 目: 电子秒
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
院 系:
班 级:
学 号:
学生姓名:
指导教师: 陈晓梅
设计周数: 2周
成 绩:
日期:2015年1月23日
目录
一、课程设计(综合实验)的目的与要求 1
二、设计(实验)正文 2
三、课程设计(综合实验)总结或结论 5
四、参考文献 6
附录(设计流程图、程序、表格、数据等) 7
一、课程设计(综合实验)的目的与要求
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信号发生变化时,启动计数功能
IF clr='1' THEN --复位清零信号有效
tmp<="0000"; --任何时刻都将计数器清零
ELSIF clk'EVENT AND clk='1' THEN --时钟上升沿
IF ena='1' THEN --允许计数
IF tmp="1001" THEN --计数器满
tmp<="0000";
ELSE
tmp<=tmp+'1'; --计数器加1
eND IF;
END IF;
END IF;
END PROCESS;
PROCESS(tmp) --当计数器发生变化时,启动输出功能
BEGIN
IF tmp="0000"THEN --计数器状态为0时
co<='1'; --进位输出信号有效
ELSE
co<='0'; --否则,为0
END IF;
END PROCESS;
q<=tmp; --输出计数器的值
END rtl;
1. 2六进制计数器
六进制计数器就是输入一个时钟脉冲计一个数,技术当前值通过4位输出端口输出。当计数到六且再来一个脉冲时计数输出清零,且进位端给出高电平。再来脉冲继续计数,进位端清零。计数只有在使能端为1时有效,否则保持。
部分源程序及说明:
PROCESS(clk,clr,ena)
BEGIN
IF clr='1' THEN
tmp<="0000";
ELSIF clk'EVENT AND clk='1' THEN
IF ena='1' THEN
IF tmp="0101" THEN --计数器到6,计数器满
tmp<="0000";
ELSE
tmp<=tmp+'1';
END IF;
END IF;
END IF;
END PROCESS;
1. 3顶层模块设计
将十进制计数模块与六进制模块通过例化,级联在一起,得到电子秒表
例化程序说明:
BEGIN --原件例化语句,通过计数器的级联实现数字秒表
U1:cnt10 PORT MAP (clk0,clr0,en,dataout(3 downto 0),co1);
U2:cnt10 PORT MAP (co1,clr0,en,dataout(7 downto 4),co2);
U3:cnt10 PORT MAP (co2,clr0,en,dataout(11 downto 8),co3);
U4:cnt6 PORT MAP (co3,clr0,en,dataout(15 downto 12),co4);
U5:cnt10 PORT MAP (co4,clr0,en,dataout(19 downto 16),co5);
U6:cnt6 PORT MAP (co5,clr0,en,dataout(23 downto 20));
END rtl;
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 十进制计数器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cnt10 IS
PORT(
clk:IN STD_LOGIC;
clr:IN STD_LOGIC;
ena:IN STD_LOGIC;
q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
co:OUT STD_LOGIC
);
END cnt10;
ARCHITECTURE rtl OF cnt10 IS
SIGNAL tmp :STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk,clr,ena)
BEGIN
IF clr='1' THEN
tmp<="0000";
ELSIF clk'EVENT AND clk='1' THEN
IF ena='1' THEN
IF tmp="1001" THEN
tmp<="0000";
ELSE
tmp<=tmp+'1';
eND IF;
END IF;
END IF;
END PROCESS;
PROCESS(tmp)
BEGIN
IF tmp="0000"THEN
co<='1';
ELSE
co<='0';
END IF;
END PROCESS;
q<=tmp;
END rtl;
1.2 六进制计数器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cnt6 IS
PORT(
clk:IN STD_LOGIC;
clr:IN STD_LOGIC;
ena:IN STD_LOGIC;
q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
co:OUT STD_LOGIC
);
END cnt6;
ARCHITECTURE rtl OF cnt6 IS
SIGNAL tmp :STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk,clr,ena)
BEGIN
IF clr='1' THEN
tmp<="0000";
ELSIF clk'EVENT AND clk='1' THEN
IF ena='1' THEN
IF tmp="0101" THEN
tmp<="0000";
ELSE
tmp<=tmp+'1';
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(tmp)
BEGIN
IF tmp="0000"THEN
co<='1';
ELSE
co<='0';
END IF;
END PROCESS;
q<=tmp;
END rtl;
1.3 顶层模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY stopwatch IS
PORT(
clk0:IN STD_LOGIC;
clr0:IN STD_LOGIC;
en:IN STD_LOGIC;
dataout1 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
dataout2 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
dataout3 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
dataout4 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
co:OUT STD_LOGIC
);
END stopwatch;