EDA课程设计,数字秒表的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《EDA技术及应用课程设计》
课程设计报告
题目:数字秒表的设计
院(系):
专业班级:
学生姓名:
学号:
指导教师:
20 13 年 6 月 24 日至20 13 年 7 月 3 日
华中科技大学武昌分校制
数字秒表的设计课程设计任务书
目录
目录 (1)
摘要 (2)
1.设计目的 (3)
2.设计要求 (3)
3.设计过程 (3)
3.1设计规划 (3)
3.2建立工程 (4)
3.3建立各个功能模块程序并进行仿真调试 (5)
3.3.1 50MHz分频为1000Hz分频器的源程序 (5)
3.3.2 50MHz分频为100Hz分频器的源程序 (5)
3.3.3 改变分频系数 (6)
3.3.4 十进制计数器的源程序 (7)
3.3.5 六进制计数器的源程序 (8)
3.3.6 数字秒表的源程序 (10)
3.3.7 数码管显示的源程序 (12)
3.4建立逻辑图 (13)
3.5系统与外设端口的连接 (15)
3.6启动程序观察结果 (15)
4.设计总结 (16)
5.参考资料 (17)
附录 (18)
摘要
随着人们生活水平的日益提高,社会体系的日益完善,人们对于各种应用器件的要求也越来越高。
秒表作为日常生活中,特别是体育运动中应用的特别广泛,所以精确且方便使用的秒表就被越来越多的人所选择。
本秒表计时器用于体育竞赛及各种要求有较精确时的各领域,往常利用中小规模集成电路实现,但一般体积大,使用携带不方便。
利用VHDL在FPGA或CPLD上实现1/100秒计时控制器,能充分发挥VHDL与可编程逻辑器件灵活、高效、集成度高的特点。
利用VHDL语言设计基于计算机电路中时钟脉冲原理的数字秒表。
该秒表能对0秒~59分59.59秒范围进行计时,显示最长时间是59分59秒。
计时精度达到10ms。
设计了复位开关和启停开关。
复位开关可以在任何情况下使用,使用以后计时器清零,并做好下一次计时的准备。
关键词:EDA技术 VHDL语言计时器数码管
1.设计目的
本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,进一步了解EDA技术,同时也对计算机系统中时钟控制系统进行了解,掌握状态机工作原理,同时了解计算机时钟脉冲是怎么产生和工作的,以及怎样变频的。
在掌握所学课程理论知识时。
通过对数字秒表的设计,进行理论与实际的结合,提高与计算机有关设计能力,提高分析、解决计算机技术实际问题的能力。
通过课程设计深入理解计算机结构与控制实现的技术,达到课程设计的目标。
并让我们从中认识到自己的不足,以便以后加以改正,弥补自己的不足,以达到实验效果。
2. 设计要求
1.计时精度应大于1/100S,计时器能显示1/100S的时间,误差小于0.5秒。
2.计时器的最大计时时间为1小时,为此需要6位的显示器,显示的最长时间为59分 59.99秒。
3.设置有复位和起/停开关,复位开关用来使计数器清零,做好计时准备。
起停开关的使用方法与传统的机械式计数器相同,即按一下,启动计时器开始计时,再按一下计时终止。
3. 设计过程
3.1 设计规划
根据数字秒表的设计要求可以采用自顶向下的设计方案,系统的整体组装设计原理图如图1所示,它主要由控制模块、时基分频模块,计时模块和显示模块四部分组成。
各模块分别完成计时过程的控制功能、计时功能与显示功能。
图1 系统组成框图
3.2 建立工程名
打开QuartusII4.1,先执行File下的New命令,新建源程序,新建文件类型的选择界面如图2所示。
再执行File下的New Project Wizard命令,如图3所示,打开新建工程向导,根据提示进行有关设置或选择,创建一个新的工程,并要求工程名与顶层文件名一致。
对于已经建立的文件或工程,需要使用时打开即可。
图2 新建文件类型的选择界面
图3 新建工程向导操作
3.3 建立各个功能模块程序并进行仿真调试
3.3.1 50MHz分频为1000Hz分频器的源程序library ieee;
use ieee.std_logic_1164.all;
entity clkgen1 is
port(clk:in std_logic;
newclk:out std_logic);
end entity clkgen1;
architecture art of clkgen1 is
signal cnt:integer range 0 to 10#49999#;
begin
process(clk)is
begin
if clk'event and clk='1' then
if cnt=10#49999#then cnt<=0;
else cnt<=cnt+1;
end if;
end if;
end process;
process(cnt)is
begin
if cnt=10#49999#then newclk<='1';
else newclk<='0';
end if;
end process;
end architecture art;
3.3.2 50MHz分频为100Hz分频器的源程序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 cnt:integer range 0 to 10#499999#;
begin
process(clk)is
begin
if clk'event and clk='1' then
if cnt=10#499999#then cnt<=0;
else cnt<=cnt+1;
end if;
end if;
end process;
process(cnt)is
begin
if cnt=10#499999#then newclk<='1';
else newclk<='0';
end if;
end process;
end architecture art;
3.3.3 改变分频系数
在本次设计中因为分频常数为500000比较大,其输出需要计数500000次才发生一次变化,在我们设定的时间间隔内,根本看不到输出的变化,也无法判断该程序的真确与否,故我们将分频系数改为30其仿真程序如下:
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 cnt:integer range 0 to 10#499999#;
signal cnt:integer range 0 to 10#29#;
begin
process(clk)is
begin
if clk'event and clk='1' then
--if cnt=10#499999#then cnt<=0;
if cnt=10#29#then cnt<=0;
else cnt<=cnt+1;
end if;
end if;
end process;
process(cnt)is
begin
--if cnt=10#499999#then newclk<='1';
if cnt=10#29#then newclk<='1';
else newclk<='0';
end if;
end process;
end architecture art;
仿真结果如下图4所示:
图4 CLKGEN的时序仿真结果
3.3.4 十进制计数器的源程序
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;
cq:out std_logic_vector(3 downto 0);
co:out std_logic);
end entity cnt10;
architecture art of cnt10 is
signal cqi:std_logic_vector(3 downto 0);
begin
process(clk,clr,ena)is
begin
if clr='1' then cqi<="0000";
elsif clk'event and clk='1' then
if ena='1' then
if cqi="1001" then cqi<="0000";
else cqi<=cqi+'1';end if;
end if;
end if;
end process;
process(cqi)is
begin
if cqi="0000" then co<='1';
else co<='0';end if;
end process;
cq<=cqi;
end architecture art;
其仿真结果如下图5所示:
图5 十进制计数器的时序仿真结果
3.3.5 六进制计数器的源程序
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;
cq:out std_logic_vector(3 downto 0);
co:out std_logic);
end entity cnt6;
architecture art of cnt6 is
signal cqi:std_logic_vector(3 downto 0);
begin
process(clk,clr,ena)is
begin
if clr='1' then cqi<="0000";
elsif clk'event and clk='1' then
if ena='1' then
if cqi="0101" then cqi<="0000";
else cqi<=cqi+'1';end if;
end if;
end if;
end process;
process(cqi)is
begin
if cqi="0000" then co<='1';
else co<='0';end if;
end process;
cq<=cqi;
end architecture art;
其仿真结果如下图6所示:
图6 六进制计数器的时序仿真结果
六进制计数器无进位和清零信号和使能信号的源程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cnt6666 is
port(clk:in std_logic;
cq:out std_logic_vector(2 downto 0));
end entity cnt6666;
architecture art of cnt6666 is
signal cqi:std_logic_vector(2 downto 0);
begin
process(clk)is
begin
if clk'event and clk='1' then
if cqi="101" then cqi<="000";
else cqi<=cqi+'1';end if;
end if;
end process;
cq<=cqi;
end architecture art;
其仿真结果如下图7所示:
图7 六进制(无清零信号和使能信号)的时序仿真结果
3.3.6 数字秒表的源程序
library ieee;
use ieee.std_logic_1164.all;
entity times is
port(clr:in std_logic;
clk:in std_logic;
ena:in std_logic;
dout:out std_logic_vector(23 downto 0));
end entity times;
architecture art of times is
component clkgen is
port(clk:in std_logic;
newclk:out std_logic);
end component clkgen;
component cnt10 is
port(clk,clr,ena:in std_logic;
cq:out std_logic_vector(3downto 0);
co:out std_logic);
end component cnt10;
component cnt6 is
port(clk,clr,ena:in std_logic;
cq:out std_logic_vector(3downto 0);
co:out std_logic);
end component cnt6;
signal s0:std_logic;
signal s1,s2,s3,s4,s5:std_logic;
begin
u0:clkgen port map(clk=>clk,newclk=>s0);
u1:cnt10 port map(s0,clr,ena,dout(3 downto 0),s1); u2:cnt10 port map(s1,clr,ena,dout(7 downto 4),s2); u3:cnt10 port map(s2,clr,ena,dout(11 downto 8),s3); u4:cnt6 port map(s3,clr,ena,dout(15 downto 12),s4); u5:cnt10 port map(s4,clr,ena,dout(19 downto 16),s5); u6:cnt6 port map(s5,clr,ena,dout(23 downto 20));
end architecture art;
其仿真结果如下图8所示:
图8 数字秒表的时序仿真结果
3.3.7 数码管显示的源程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity led is
port(din: in std_logic_vector(3 downto 0);
dout: out std_logic_vector(6 downto 0));
end led;
architecture behv of led is
begin
process(din)
begin
case din is
when "0000" => dout<="0111111";
when "0001" => dout<="0000110";
when "0010" => dout<="1011011";
when "0011" => dout<="1001111";
when "0100" => dout<="1100110";
when "0101" => dout<="1101101";
when "0110" => dout<="1111101";
when "0111" => dout<="0000111";
when "1000" => dout<="1111111";
when "1001" => dout<="1101111";
when "1010" => dout<="1110111";
when "1011" => dout<="1111100";
when "1100" => dout<="0111001";
when "1101" => dout<="1011110";
when "1110" => dout<="1111001";
when "1111" => dout<="1110001";
when others => dout<="0000000";
end case;
end process;
end behv;
3.4 建立逻辑图
逻辑总图如下图9:
图9逻辑总图
其中times逻辑图如下图10:
图10 times逻辑图
LED的显示模块原理:LED有段码和位码之分,所谓段码就是让LED显示出8.的八位数据,一般情况下要通过一个译码电路,将输入的4位2进制数转换为与LED显示对应的8位段码。
位码也就是LED的显示使能端,对于共阴级的LED而言,低电平使能(在本实验箱中所有的LED均位共阴级的),在本实验中设计了一个3位的循环计数器,将计数结果输入到3-8译码器74ls138,译码结果输出即可依次使能每个LED。
Display逻辑图如下图11:
图11 Display逻辑图
3.5 系统与外设端口的连接
系统与外设端口的连接如下图12:
图12 系统与外设端口的连接
3.6 启动程序观察结果
系统与外设端口连接完毕就可以开始下载、选择、启动,观察结果如下图13:
图13 观察结果图
4. 设计总结
在本次设计过程中,我查阅了大量的书籍,不但巩固和加深了所学的专业基础课知识,还将所学的知识融会贯通,并且将课本与实际相结合,真正实现了学有所用。
通过这次课程设计之后,一定把以前所学过的知识重新温故。
我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。
在课程设计过程中遇到各种问题是常有的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的。
课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
我们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,若遇到实在搞不明白的问题就会及时请教老师,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。
通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
我在做设计时总是会犯一些错误,只有经过不停的改错不停的编译得到正确的程序说明了作为软件编程人员是不能粗心大意的,一个程序的质量的高低与你细心与否有着一定的联系。
在编程时,我充分使用了结构化的思想,这样程序检查起来也比较方便,调试时也给了我很大方便,只要一个模块一个模块的进行调就可以了,充分体现了结构化编程的优势。
在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件顺序执行的差别及其在电路设计上的优越性。
用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法在数字系统设计中发挥越来越重要的作用。
通过本次实验我对EDA软件更加了解,同时将所学的理论知识加以运用,以加深对理论知识的理解,也锻炼了自己的动手能力,在此次实验中我充分认识到自己的不足,并努力加以改正。
5. 参考资料
[1] 谭会生,张昌凡.EDA技术及应用.第2版.西安:西安电子科技大学出版社.
[2] 潘松,黄继业.EDA技术与VHDL.第3版.北京:清华大学出版社,2003.
[3] 李兰英.NiosII嵌入式软核SOPC设计原理及应用.北京:北京航空航天大学出版社,2006.
附录:
课程设计成绩评定表
评估指标体系
19。