毕业设计(论文)-基于EDA技术的快速计时器设计.doc_第1页
毕业设计(论文)-基于EDA技术的快速计时器设计.doc_第2页
毕业设计(论文)-基于EDA技术的快速计时器设计.doc_第3页
毕业设计(论文)-基于EDA技术的快速计时器设计.doc_第4页
毕业设计(论文)-基于EDA技术的快速计时器设计.doc_第5页
免费预览已结束,剩余18页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编号:03063076南阳师范学院2007届毕业生毕业论文(设计)题 目: 基于eda技术的快速计时器设计 完 成 人: 班 级: 2003-03 学 制: 4 年 专 业: 电子信息与科学技术 指导教师: 完成日期: 2007-03-31 目 录摘要 1 绪 论(1)1.1 eda技术(1)1.2 系统设计意义(2)2 数字快速计时器的设计方案及要求(2)2.1 系统设计要求(3)2.2 系统设计方案(3)3 程序设计及分析(4)3.1 时基分频模块的vhdl源程序(cb10.vhd)(4)3.2 控制模块的vhdl源程序(ctrl.vhd)(5)3.3 计时模块的vhdl源程序(6)3.3.1 十进制计数器的vhdl源程序(cdu10.vhd)(6)3.3.2 六进制计数器的vhdl源程序(cdu6.vhd)(7)3.3.3 计时器的vhdl源程序(count.vhd)(8)3.4 显示模块的vhdl源程序(10)3.4.1 数据选择器的vhdl源程序(mulx.vhd)(10)3.4.2 bcd七段译码驱动器的vhdl源程序(bcd7.vhd)(12)3.5 顶层设计的vhdl源程序(mb.vhd)(12)4 数字快速计时器的系统仿真及结果分析(15)4.3计时电路模块的仿真(16)4.3.1 十进制计数器的仿真(16)4.3.2 六进制计数器的仿真(16)4.4 显示电路模块的仿真(17)4.4.1 数据选择器的仿真(17)4.4.2 bcd七段译码驱动器的仿真(17)4.5 数字快速计时器整个系统的仿真(17)4.5.1 快速计时器的起始工作状态(17)4.5.2快速计时器的停止工作状态,(18)5 结论(19)参考文献.(18)abstract(20)基于eda技术的快速计时器设计 作 者:黄朝伟指导老师:张 帅摘 要:基于eda技术的使用,本文着重讨论了采用eda技术设计的快速计时器设计,使用硬件描述语言vhdl,在开发软件max+plus2进行输入、编译、综合、仿真,得到的仿真波形。实验结果表明,与原有的数控系统的控制电路部分相比采用eda技术的快速计时器使得数控系统具有更高的可靠性、实时性、高运算速度以及高集成度。同时由于eda技术中fpga芯片具有在系统可编程特性,因此该快速计时器的设计可像软件一样随时更改。关键词:eda;vhdl;快速计时器设计1 绪 论电子技术的发展推动着社会的发展,人民从使用收音机到黑白电视机、彩色电视机、数字电视机到计算机进入千家万户,通过internet网可以了解世界的变化,这一切都是电子技术发展的结果。但是,随着信息化社会的进一步发展,传统的电子技术设计与芯片的制造也就不能适应社会发展的需要,eda技术正是适应社会的这一需要而产生的。eda技术就是以大规模可编程逻辑器件为载体,以硬件描述语言为系统逻辑描述的表达方式,以计算机、大规模可编程逻辑器件的开发软件及试验开发系统为设计工具,通过有关的开发软件,自动完成电子系统的设计。利用eda技术进行电子设计它可以实现用软件的方式设计硬件;系统可现场编程,在线升级;整个系统低功耗,多功能等特点,成为现代电子设计发展的趋势123。1.1 eda技术随着数字集成技术的飞速发展,数字系统的规模和技术复杂度也在急剧增长,人工设计数字系统变得十分困难,必须依靠eda技术。eda( electronic design automation)技术就是电子设计自动化,用eda技术设计数字系统的实质是一种自顶向下的分层设计方法4。在每一层次上,都有描述、划分、综合和验证四种类型的工作。描述是把系统设计输入到eda软件的过程,它可以采用图形输入、硬件描述语言或二者混合使用的方法输入。整个设计过程只有该部分由设计者完成。划分、综合和验证则采用eda软件平台自动完成。这样做极大地简化了设计工作,提高了效率,因此,采用eda技术设计数字系统得到了越来越广泛的应用1。与手工设计相比eda技术有如下特点7: 采用自顶向下设计方案 应用硬件描述语言(hdl)描述设计 能够自动完成仿真和测试 开发技术的标准化和规范化 对工程技术人员的硬件知识和经验要求低1.2 系统设计意义快速计时器由于其计时精确,分辨率高(0.01秒),在各种竞技场所得到了广泛的应用。本数字快速计时器可用于体育比赛,计时精度大于1/100s,计时器能显示1/100s的时间,计时器的最长计时时间为1小时,显示的最长时间为59分59.99秒。系统具有简单、工作稳定可靠等优点,具有一定的实际意义。与原有的数控系统的控制电路部分相比采用eda技术的快速计时器使得数控系统具有更高的可靠性、实时性、高运算速度以及高集成度。2 数字快速计时器的设计方案及要求本文介绍的数字快速计时器设计,利用基于vhdl的eda设计工具,采用大规模可编程逻辑器件fpga,通过设计芯片来实现系统功能。快速计时器由于其计时精确,分辨率高(0.01秒),在各种竞技场所得到了广泛的应用。快速计时器的工作原理与多功能时钟基本相同,唯一不同的是,由于快速计时器的计时时钟信号,由于其分辨率为0.01 秒,所以整个快速计时器的工作时钟是在100hz 的时钟信号下完成。当快速计时器的计时小于1个小时时,显示的格式是mm-ss-xx(mm表示分钟:059;ss表示秒:059;xx表示百分之一秒:099),当快速计时器的计时大于或等于一个小时时,显示的和多功能时钟是一样的,就是hh-mm-ss(hh表示小时:099),由于快速计时器的功能和钟表有所不同,所以快速计时器的hh表示的范围不是023,而是099,这也是和多功能时钟不一样的地方。2.1 系统设计要求 数字快速计时器的计时范围是0秒到59.99秒,显示的最长时间为59分59秒。 数字快速计时器的计时精度是10 ms。 复位开关可以在任何情况下使用,即便在计时过程中,只要按一下复位开关,计时器就清零,并做好下次计时的准备。 具有启/停开关,即按一下启/停开关,启动计时器开始计时,再按一下复位开关则停止计时。2.2 系统设计方案根据系统设计要求,系统的组成框图如图1所示。图1 系统的组成框图系统设计采用自顶向下的设计方法,系统的整体组装设计主要由控制模块、时基分频模块、计时模块和显示模块四部分组成。(1)控制模块计时控制模块的作用是对计时过程进行控制。计时控制模块可用两个按钮快速计时器的启动、停止和复位。(2)计时模块 计时模块执行计时功能,计时的方法是对标准时钟脉冲计数6。由于计时范围是0秒到59分59.99秒,所以计数器可以由四个十进制计数器和两个六进制计数器构成,其中毫秒位、十毫秒位、秒位和分位采用十进制计数器,十秒位和十分位采用六进制计数器。(3)显示模块计时显示电路的作用是将计时值在led七段数码管上显示出来。计时电路产生的计时值经过bcd七段译码管后,驱动led数码管。计时显示电路的实现方案采用扫描显示,即每次只驱动一位数码管,各位数据轮流驱动对应的数码管进行显示。3 程序设计及分析3.1 时基分频模块的vhdl源程序(cb10.vhd)architecture art of cb10 issignal count: std_logic_vector(3 downto 0);beginprocess(clk) begin if rising_edge(clk) then if count=1001 then count=0000; co=1; else count=count+1; co=0; end if; end if; end process; end art;程序分析:时基分频模块的vhdl源程序(cb10.vhd)的功能是:当时钟信号clk发生变化,将启动进程语句process。如果此时有信号clk的上升沿,此时若计数值count小于9,即 count1001,计数器将进行正常计数,即执行count en=0; if sp=1 then next_state=s1; else next_stateen=1;if sp=1 then next_state=s1; else next_stateen=1; if sp=1 then next_state=s3; else next_stateen=0; if sp=1 then next_state=s3; else next_stateen=0;”语句,并使次态next_state获得s1,而当此后的第一个clk上升沿到来时,现态current_state自动转向s1状态。随着时钟信号的到来,将根据控制信号sp而转向不同的状态,同时输出相应的信号en去控制外部对象。3.3 计时模块的vhdl源程序3.3.1 十进制计数器的vhdl源程序(cdu10.vhd)entity cdu10 isport(clk: in std_logic;clr:in std_logic;en: in std_logic;cn:out std_logic;count10:out std_logic_vector(3 downto 0);end cdu10;architecture art of cdu10 issignal scount10: std_logic_vector(3 downto 0);begin count10=scount10;process(clk,clr,en)beginif(clr=1)thenscount10=0000;cn=0;elsif rising_edge(clk) thenif(en=1) thenif scount10=1001 then cn=1; scount10=0000;else cn=0;scount10=scount10+1;end if;end if;end if;end process;end art;程序分析:十进制计数器的vhdl源程序(cdu10.vhd)的功能是:当时钟信号clk、复位信号clr或时钟使能信号en中任一信号发生变化,都将启动进程语句process。此时如果clr为1,将对计数器清零,即复位,这项独立于clk的,因而称异步;如果clr为0,则看是否有时钟信号的上升沿:如果此时有clk信号,又测得en=1,即允许计数器计数,此时若计数值小于9,即 scount101001,计数器将进行正常计数,即执行scount10=scount10+1;否则当计数值scount10达到9时,输出高电平,作为十进制计数的进位溢出信号,当计数值scount10为其它值时输出低电平;但如果测得en=0使scount10保持原值,即将计数值向端口输出:count10=scount10。3.3.2 六进制计数器的vhdl源程序(cdu6.vhd)entity cdu6 isport(clk:in std_logic;clr:in std_logic;en:in std_logic;cn:out std_logic;count6:out std_logic_vector(3 downto 0);end cdu6;architecture art of cdu6 issignal scount6: std_logic_vector(3 downto 0);begin count6=scount6;process(clk,clr,en)beginif(clr=1)then scount6=0000;cn=0;elsif rising_edge(clk) then if(en=1) thenif scount6=0101 then cn=1;scount6=0000;else cn=0; scount6=scount6+1;end if;end if;end if;end process;end art;程序分析:六进制计数器的vhdl源程序(cdu10.vhd)的功能是:当时钟信号clk、复位信号clr或时钟使能信号en中任一信号发生变化,都将启动进程语句process。此时如果clr为1,将对计数器清零,即复位;如果clr为0,则看是否有时钟信号的上升沿:如果此时有clk信号,又测得en=1,即允许计数器计数,此时若计数值小于5,即 scount60101,计数器将进行正常计数,即执行scount6=scount6+1;否则当计数值scount6达到5时,输出高电平,作为十进制计数的进位溢出信号,当计数值scount6为其它值时输出低电平;但如果测得en=0使scount6保持原值,即将计数值向端口输出:count6=scount6。3.3.3 计时器的vhdl源程序(count.vhd)entity count isport(clk:in std_logic;clr:in std_logic;en:in std_logic;s_1ms:out std_logic_vector(3 downto 0);s_10ms:out std_logic_vector(3 downto 0);s_100ms:out std_logic_vector(3 downto 0);s_1s:out std_logic_vector(3 downto 0);s_10s:out std_logic_vector(3 downto 0);s_1min:out std_logic_vector(3 downto 0);s_10min:out std_logic_vector(3 downto 0);hour:out std_logic_vector(3 downto 0);end count;architecture art of count iscomponent cdu10 port(clk,clr,en:in std_logic; cn:out std_logic; count10:out std_logic_vector(3 downto 0); end component cdu10; component cdu6 port(clk,clr,en:in std_logic; cn:out std_logic; count6:out std_logic_vector(3 downto 0); end component cdu6; signal a,b,c,d,e,f,g,h: std_logic;begin u1:cdu10 port map(clk,clr,en,a,s_1ms); u2:cdu10 port map(a,clr,en,b,s_10ms); u3:cdu10 port map(b,clr,en,c,s_100ms); u4:cdu10 port map(c,clr,en,d,s_1s); u5:cdu6 port map(d,clr,en,e,s_10s); u6:cdu10 port map(e,clr,en,f,s_1min); u7:cdu6 port map(f,clr,en,g,s_10min); u8:cdu10 port map(g,clr,en,h,hour);end art;程序分析:以上程序是计数器的顶层vhdl描述,计时器执行计时功能,计时的方法是对标准时钟脉冲计数。计数器由四个十进制计数器和两个六进制计数器构成,其中毫秒位、十毫秒位、秒位和分位采用十进制计数器,十秒位和十分位采用六进制计数器。为了达到连接底层元件形成更高层次的电路设计结构,文件使用了元件例化语句。文件在实体中首先定义了计数器顶层设计文件的端口信号,然后在architecture和begin 之间利用component语句对准备调用的元件作了声明,并定义了a,b,c,d,e,f,g,h八个信号作为器件内部的连接线。最后利用端口映射语句port map()将六个十进制计数器和两个六个进制计数器连接起来构成一个完整的计数器。(详细功能见仿真图的分析)3.4 显示模块的vhdl源程序3.4.1 数据选择器的vhdl源程序(mulx.vhd)entity mulx isport(clk,clr,en: in std_logic; outbcd: out std_logic_vector(3 downto 0); s_10ms: in std_logic_vector(3 downto 0); s_100ms: in std_logic_vector(3 downto 0); s_1s: in std_logic_vector(3 downto 0); s_10s: in std_logic_vector(3 downto 0); s_1min: in std_logic_vector(3 downto 0); s_10min: in std_logic_vector(3 downto 0); hour: in std_logic_vector(3 downto 0); s_1ms: in std_logic_vector(3 downto 0); seg: out std_logic_vector(7 downto 0); end mulx;architecture art of mulx is signal count:std_logic_vector(3 downto 0); begin process(clk) beginprocess(clk) begin if clr=1 then count=1111; elsif rising_edge(clk) thenif en=1 then if count=1001 then count=0000; else countoutbcd=s_1ms; segoutbcd=s_10ms; segoutbcd=s_100ms; segoutbcd=s_1s; segoutbcd=s_10s; segoutbcd=s_1min; segoutbcd=s_10min; segoutbcd=hour; segoutbcd=s_1ms; segoutbcd=s_10ms; segoutbcd=0000; seg=00000000; end case; end if; end process;end art; 程序分析:此程序中包含两个进程,信号clk都将启动这两个进程。对于第一个进程:当信号clk发生变化,如果此时复位信号clr为高电平,count将置为“1111”;否则如果遇到信号clk的上升沿,又测得en=1,即允许计数,此时若计数值小于9,即 scount1001,计数器将进行正常计数,即执行count=count+1;否则当计数值count达到9时,输出高电平,作为十进制计数的进位溢出信号,当计数值count为其它值时输出低电平;但如果测得en=0使scount6保持原值,即将计数值向端口输出:count6=scount6。 对于第二个进程:当信号clk发生变化,此时如果遇到信号clk的上升沿,将执行case语句。根据信号count的值赋予不同的outbcd和seg的值。从而实现数据选择器的功能。3.4.2 bcd七段译码驱动器的vhdl源程序(bcd7.vhd)entity bcd7 is port(bcd:in std_logic_vector(3 downto 0); led:out std_logic_vector(6 downto 0);end bcd7;architecture art of bcd7 is begin led=1111110 when bcd=0000 else 0110000 when bcd=0001 else 1101101 when bcd=0010 else 1111001 when bcd=0011 else 0110011 when bcd=0100 else1011011 when bcd=0101 else1011111 when bcd=0110 else1110000 when bcd=0111 else1111111 when bcd=1000 else1111011 when bcd=1001 else0000000;end art; 程序分析:此程序主要由when_else结构的并行语句构成,根据信号bcd的值赋值于led。比如,bcd为“0001”,则led为“0110000”。3.5 顶层设计的vhdl源程序(mb.vhd)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mb is port(sp,clr,clk: in std_logic; co,en: out std_logic; led: out std_logic_vector(6 downto 0); outbcd:out std_logic_vector(3 downto 0); seg:out std_logic_vector(7 downto 0);end mb;architecture art of mb is component ctrl port(clk,clr,sp:in std_logic; en:out std_logic); end component; component cb10 port(clk:in std_logic; co:out std_logic); end component; component count port(clk: in std_logic; clr:in std_logic; en: in std_logic; s_1ms: out std_logic_vector(3 downto 0); s_10ms: out std_logic_vector(3 downto 0); s_100ms: out std_logic_vector(3 downto 0); s_1s: out std_logic_vector(3 downto 0); s_10s: out std_logic_vector(3 downto 0); s_1min: out std_logic_vector(3 downto 0); s_10min: out std_logic_vector(3 downto 0); hour: out std_logic_vector(3 downto 0);end component;component bcd7 port(bcd:in std_logic_vector(3 downto 0); led:out std_logic_vector(6 downto 0);end component;component mulx port(clk,clr,en: in std_logic; outbcd: out std_logic_vector(3 downto 0); s_10ms: in std_logic_vector(3 downto 0); s_100ms: in std_logic_vector(3 downto 0); s_1s: in std_logic_vector(3 downto 0); s_10s: in std_logic_vector(3 downto 0); s_1min: in std_logic_vector(3 downto 0); s_10min: in std_logic_vector(3 downto 0); hour: in std_logic_vector(3 downto 0); s_1ms: in std_logic_vector(3 downto 0); seg: out std_logic_vector(7 downto 0); end component;signal c,e:std_logic;signal ms1_s,ms10_s,ms100_s:std_logic_vector(3 downto 0);signal s1s_s,s10_s:std_logic_vector(3 downto 0);signal min1_s,min10_s:std_logic_vector(3 downto 0);signal h:std_logic_vector(3 downto 0);signal bcd_s:std_logic_vector(3 downto 0);beginu0:ctrl port map(clr,clk,sp,e);u1:cb10 port map(clk,c);u2:count port map(c,clr,e,ms1_s,ms10_s,ms100_s,s1s_s,s10_s,min1_s,min10_s,h);u3:mulx port map(clk,clr,e,bcd_s,ms10_s,ms100_s,s1s_s,s10_s,min1_s,min10_s,h,ms1_s,seg);u4:bcd7 port map(bcd_s,led);co=c;en=e;outbcd=bcd_s;end art;程序分析:以上程序是快速计时器的顶层vhdl描述。为了达到连接底层元件形成更高层次的电路设计结构,文件使用了元件例化语句。文件在实体中首先定义了计数器顶层设计文件的端口信号,然后在architecture和begin 之间利用component语句对准备调用的元件作了声明,并定义了c,e,ms1_s,ms10_s,ms100_s,s1s_s,s10_s,min1_s,min10_s,h,bcd_s十一个信号作为器件内部的连接线。最后利用端口映射语句port map()将控制器、时基分频器、计数器、数据选择器和bcd七段译码驱动器连接起来构成一个完整的计数器。(详细功能见仿真图的分析) 4 数字快速计时器的系统仿真及结果分析设计选用altera公司的fpga芯片acex1k系列的ep1k30tc144-3,在开发软件max+plus2进行输入、编译、综合、仿真,得到的仿真波形。图2 时基分频模块的仿真波形图结果分析:当每一个clk的上升沿后,count输出加1,而当count输出为9时,co输出高电平进位信号,同时count变为0。图3 控制模块的仿真波形图结果分析:(1)当复位信号clr为高电平时en为低电平;(2)当复位信号clr为低电平时信号sp高电平时en为高电平,表示快速计时器启动;当信号sp从低电平变为高电平时en变为低电平,表示快速计时器暂停;当信号sp再从低电平变为高电平时en变为高电平,表示快速计时器继续。4.3 计时电路模块的仿真4.3.1 十进制计数器的仿真图4 十进制计数器的仿真波形图结果分析:(1)当clr为高电平,en为低电平时,count10输出为0,即计数清零,并禁止计数。(2)当clr为低电平,en为高电平时,每一个clk的上升沿后,count10输出加1,而当count10输出为9时,cn输出高电平进位信号。(3)当en为低电平时,计数器保持原有的计数“7”,当en为高电平时继续计数。4.3.2 六进制计数器的仿真图5 六进制计数器的仿真波形图结果分析:(1)当clr为高电平,en为低电平时,count6输出为0,即计数清零,并禁止计数。(2)当clr为低电平,en为高电平时,每一个clk的上升沿后,count6输出加1,而当count6输出为5时,cn输出高电平进位信号。(3)当en为低电平时,计数器保持原有的计数“0”,当en为高电平时继续计数。图6 计数器的仿真波形图 结果分析:当clr为低电平,en为高电平时,每一个clk的上升沿后,s_1ms的值为“1”,一直加到“9”,再从“0”开始;当s_1ms从“9”变为“0”时,s_10ms的值加“1”。以此类推,s_100ms,s_1s,s_10s,s_1min,s_10min,hour;实现计数器的功能。4.4 显示电路模块的仿真4.4.1 数据选择器的仿真图7 数据选择器的仿真波形图结果分析:(1)当clr为高电平,en为低电平时,seg、outbcd输出为0。(2)当clr为低电平,en为高电平时,每一个clk的上升沿后,根据信号count的值赋予不同的outbcd和seg的值。比如说,count第一次为“1”,outbcd输出“1”,seg输出“fe”;count第一次为“4”,outbcd输出“7”,seg输出“f7”。4.4.2 bcd七段译码驱动器的仿真图8 bcd七段译码驱动器的仿真波形图结果分析:此仿真图相对简单,根据输入信号bcd选择led的值。比如bcd为“3”,led为“79”;bcd为“a”,led为“00”;bcd为“4”,led为“33”。4.5 数字快速计时器整个系统的仿真4.5.1 快速计时器的起始工作状态按下开始键sp,快速计时器开始计时图9 快速计时器起始工作状态仿真波形图4.5.2 快速计时器的停止工作状态,按下开始键sp,快速计时器停止计时图10 快速计时器停止工作状态仿真波形图结果分析:首先,当信号clr为低电平时,快速计时器清零;当复位信号clr为低电平时,如果sp从低电平变为高电平,快速计时器启动开始计时,使能信号从低电平变为高电平;en这时分频信号co对时钟信号clk分频;当分频信号co从低电平变为高电平时,s_1ms从“0”变为“1”,co再从低电平变为高电平时,s_1ms再加“1”,一直加到“9”;当s_1ms从“9”变为“0”时,s_10ms的值加“1”;以此类推,实现快速计时器的功能。同时计时电路产生的计时bcd七段译码管后,驱动led数码管。计时显示电路的实现方案采用扫描显示,即每次只驱动一位数码管,各位数据轮流驱动对应的数码管进行显示。当sp从低sp从低电平变为高电平时,使能信号en从高电平变为低电平;快速计时器停止计时。5 结论本系统设计用了现在eda设计手段,基于fpga采用vhdl语言编程实现数字快速计时器的设计,运用层次化设计方法,完成各电路模块的连接。实验结果表明,本系统的数字快速计时器设计很成功。本数字快速计时器可用于体育比赛,计时精度大于1/100s,计时器能显示1/100s的时间,计时器的最长计时时间为1小时,显示的最长时间

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论