※※※※※※※※※ ※※ 2008级学生 ※※
EDA课程设计
※ ※
※ ※※※※※※※※
EDA课程设计报告书
课题名称 姓 名
基于VHDL语言的数字秒表的设计
胡杨
学 号 0812201-40 院 系 专 业 指导教师
物理与电信工程系 电子信息工程 周来秀 讲师
2011年 6月10日
一、 设计任务及要求: 设计任务 设计一个基于VHDL语言的数字秒表 要 求 1.能够在0~59分59.99秒的时间段内计时,采用数码管显示。 2.要求秒表有停止计时键即清零键clr、暂停键stop。 3.clr键为停止计时键,按下它后数码管的示数也将都恢复为零,stop键为暂停键,按下它后会停止计时,复位后,秒表会继续以暂停前的示数为基数继续计时。 指导教师签名: 2011年 6 月9日 二、指导教师评语: 指导教师签名: 2011年6月9日 三、成绩 验收盖章 2011年6 月9日
基于VHDL语言的数字秒表的设计
胡杨
(湖南城市学院物理与电信工程系电子信息工程专业,益阳,413000)
1设计目的
(1)熟悉简单的VHDL程序。 (2)掌握相关的EDA知识。 (3)了解数字秒表的设计原理。
(4)熟悉掌握程序设计思路及运用VHDL语言控制。 (5)熟悉QuartusⅡ5.0软件的使用方法。
2设计的主要内容和要求
要求设计一个简易的数字秒表,最低能精确显示到百分之一秒,最大显示
到59分59.99秒。采用数码管作为显示屏。同时要求秒表具有暂停功能和计时暂停以及停止等秒表的基本功能
首先,熟悉设计任务,查看相关资料。然后,在理解程序的基础上自行编写代码。之后,调试程序并软件仿真。最后,在设计基础上,认真分析设计结果,撰写设计报告。
3 整体设计方案
3.1秒表系统的设计模块
秒表共有三个模块:分频模块、计时模块和显示模块。分频模块,只提供了40 MHz和22 MHz的时钟信号,而秒表设计中要用到100 Hz的时钟作为基本时钟来产生0.01秒的精确度。所以分频的任务就是从40 MHz(或22 MHz)的系统时钟信号中产生出100 Hz的时钟信号作为计时模块的基本时钟。计时模块,这部分事秒表的最重要的部分。由0.01秒到1秒进位事100进制的,而由秒到分和由分到时的进制是60进制的,秒表计时系统可以由一个100进制计数器和两
个60进制计数器连接而成,即给100进制计数器提供100 Hz的时钟信号,让它产生0.01秒的精确度,即它每隔0.01秒计数一次,所以可以把其计数输出cq连接到数码管显示上,作为0.01秒和0.1秒的计时显示,而100进制计数器的进位输出carry_out是频率为1 Hz(即周期为1秒)的另一个新的时钟信号,可以将其连接到下一个60进制计数器的时钟输入端口上,作为秒的计数精确度产生时钟,其输出是每隔1秒加1的,因此要将其输出cq显示到数码管上,作为“秒”单位的显示,
相同的,这个60进制计数器的进位输出carry_out也是一个周期为1分钟的新的时钟信号,将它作为下一个60进制计数器的时钟输入,该计数器的输出就事“分”的计数输出。最后一个模块是显示模块,该模块的功能是把三个计数器输出的七位标准逻辑矢量数据转化为能直接在数码管上显示的数据(类型)。由于三个输出数据用十进制数表示时,可能为个位数(0~9),也可能为十位数(10~99或59),而且三组数据可能不会同时显示在六位八段数码管上,因此需要用s=0、1、2、3、4、5(或BF=000001、000010、000100、001000、010000、100000)来控制第一至第六个数码管显示数据,用ena=001、010、100来控制数码管显示0.01秒、秒和分位。将要显示的数据分别用用8位BCD码表示,则前四位代表数据的十位数上的数字,后四位表示数据的个位数数字,把BCD码表示的数据的前四位显示到第六、第四、第二位数码管上,表示各位数据的十位上的数字,把后四位BCD码根据需要显示到第五、第三,第一位数码管上,表示各位数据的个位上的数字。
总体方案设计图如图3.1:
控制电路时钟输入0.01秒计数器秒钟计数器分钟计数器译码电路数码显示
图3.1总体方案设计图
3.2秒表系统各模块直接的连接
从设计的秒表的顶层实体上来看,这个秒表有一个系统时钟输入,有清零键CLR,暂停键STOP二个使能控制输入,输出则是、都是接到数码管上的。因此,我们要把系统时钟接到分频器的输入端,将分频器的输出即100 Hz标准时钟接到即使系统的输入端上。计时系统有一个100进制计数器和两个60进制计数器构成。其中,100进制计数器在最前端,其进位输出接到下一个60进制计数器的输入时钟上,而这个60进制计数器的进位数出又用来作为下一个60进制计数器的时钟输入,这二个计数器的使能控制(即清零CLR,暂停键STOP)分别都接到最顶层的秒表的使能控制输入上,它们的输出则接到数码管上,以显示出计时读数。
3.3秒表系统功能
设计的秒表有数码管作为显示,单位从低位到高位分别是0.01秒、0.1秒、1秒、10秒、1分和10分。有二个键:CLR键、STOP键,其中CLR键是清零键,若秒表正处在计时状态,按下它后秒表将停止计时,数码管的示数也将都恢复为零。STOP键是停止计时键,按下它后秒表也会停止计时,但是数码管的示数会保持当前的值不变,复位STOP键后,秒表会继续以当前数码管的示数为基数计
时。根据秒表的电路特点,用层次设计概念,利用VHDL语言描述。
4 VHDL语言的设计
4.1 60进制计数器的设计
本设计采用VHDL语言,首先完成分钟计时的设计,即完成60进制计数器的设计。 library ieee;
use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;
entity cnt60 is
port (clk:in std_logic; --声明clk是标准逻辑位类型的输入端口 clr:in std_logic; --声明clr是标准逻辑位类型的输入端口 ena:in std_logic; --声明ena是标准逻辑位类型的输入端口 cq:out std_logic_vector(6 downto 0); --为了与100进制计数器一致,也采用了7位
carry_out:out std_logic --声明carry_out是标准逻辑位类型的输出端口 ); end cnt60;
architecture behav of cnt60 is
signal cqi:integer range 0 to 59; --cqi为结构体内部信号 begin
process(clk,clr,ena) --进程开始 begin
if clr='0' then --当clr=0
cqi<=0;
elsif clk'event and clk='1' then --采取时钟信号的上升沿技术 if ena='1' then if cqi<59 then cqi<=cqi+1; else cqi<=0; end if; end if; end if;
end process; --结束进程
process(cqi) --开始进程 begin
if cqi=59 then carry_out<='0'; else
carry_out<='1'; end if; end process;
cq<=conv_std_logic_vector(cqi,7); --赋值语句
end behav;
4.2 100进制计数器的设计
本设计采用VHDL语言,其次完成秒钟计时的设计,即完成100进制计数器的设计。 library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;
entity cnt100 is
port (clk:in std_logic; --声明clk是标准逻辑位类型的输入端口 clr:in std_logic; --声明clr是标准逻辑位类型的输入端口 ena:in std_logic; --声明ena是标准逻辑位类型的输入端口 cq:out std_logic_vector(6 downto 0);
carry_out:out std_logic --声明carry_out是标准逻辑位类型的输出端口 ); end cnt100;
architecture behav of cnt100 is
signal cqi:integer range 0 to 99; --cqi为结构体内部信号 begin
process(clk,clr,ena) --进程开始 begin
if clr='0' then cqi<=0;
elsif clk'event and clk='1' then --采取时钟信号的上升沿技术 if ena='1' then if cqi<99 then cqi<=cqi+1; else cqi<=0; end if;
end if; end if;
end process; --结束进程
process(cqi) --开始进程 begin
if cqi=99 then carry_out<='0'; else
carry_out<='1'; end if;
end process; --结束进程
cq<=conv_std_logic_vector(cqi,7);
end behav;
4.3顶层文件的设计
本设计采用VHDL语言,最后完成系统秒钟的设计,即完成顶层文件的设计。 library ieee;
use ieee.std_logic_11.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;
entity miaobiao is
port(clk:in std_logic; --40 MHz时钟信号输入
clr:in std_logic; --清零信号 stop:in std_logic; --暂停计数 bf:out std_logic_vector(6 downto 0);
bm1:out std_logic_vector(6 downto 0); bm2:out std_logic_vector(6 downto 0); count:out std_logic); end miaobiao;
architecture behav of miaobiao is signal clk1,clk2:std_logic;
component cnt60 --cnt60 port (clk:in std_logic; --声明clk是标准逻辑位类型的输入端口 clr:in std_logic; --声明clr是标准逻辑位类型的输入端口 ena:in std_logic; --声明ena是标准逻辑位类型的输入端口 cq:out std_logic_vector(6 downto 0);
carry_out:out std_logic); --声明carry_out是标准逻辑位类型的输出端口
end component;
component cnt100 --cnt100 port (clk:in std_logic; clr:in std_logic; ena:in std_logic;
cq:out std_logic_vector(6 downto 0); carry_out:out std_logic); end component; begin
u1:cnt100 port map(clk,clr,stop,bm2,clk1); --0.01秒 u2:cnt100 port map(clk1,clr,stop,bm1,clk2); --秒 u3:cnt60 port map(clk2,clr,stop,bf,count); --分 end behav;
5系统仿真
在QuartusⅡ5.0软件环境下画出电路原理图,接下来就是用VHDL语言设计
的程序。设置引脚的参数,仿真波形。观察现象,如果现象不正确,则用VHDL语言修改程序,并在QuartusⅡ5.0观察现象,那一步不正确则对该段的程序进行修改,调试直到仿真完全成功为止。 仿真波形如下:
图5.1波形仿真图
图5.2波形仿真图
图5.3波形仿真图
6 使用说明
设计的秒表有数码管作为显示,单位从低位到高位分别是0.01秒、0.1秒、1秒、10秒、1分和10分。有二个键:CLR键、STOP键,其中CLR键是清零键,若秒表正处在计时状态,按下它后秒表将停止计时,数码管的示数也将都恢复为零。STOP键是停止计时键,按下它后秒表也会停止计时,但是数码管的示数会保持当前的值不变,复位STOP键后,秒表会继续以当前数码管的示数为基数计时。
7设计总结
在此次课程设计中,受到了数电中许多故有芯片的影响,在某些模块的编写过程中陷入了故有思维模式。比如12进制减法计数器,由于数电中常用的74161,74192等计数器都是采用置数端来设置起始的数值,所以在程序的编写时,也采用的置数的方式来设置初始值,这样无形中加大了操作量。其实,在VHDL语言中,可以直接的给某一个信号赋值。在12进制与60进制的衔接过程中,也产生了很多问题。如果用12进制的进位端CO直接控制60进制的清零端CR,在时间结束后2个计数器虽然会保持0状态不变,但由于最初程序本身编写的不恰当,会出现12分59秒,分钟等于10时持续时间仅为一个脉冲长度,或是12减到0以后,60进制计数器依旧计数等情况。在经过对程序的修改调试后,这一个个
问题都较为合理的解决了。
经过这次的课程设计,让我了解了语言的灵活性,加深了对团队合作的理解,熟悉了QuartusⅡ5.0等软件的应用。并在克服各种困难的过程中,锻炼了思考和解决问题的能力和查询资料的能力。在试验箱的操作中,锻炼了动手能力。这次课程设计,让我收获了很多,学到了很多。
参考文献
[1]江国强.EDA技术与应用[M].北京:电子工业出版社.2010.55-80 [2]彭介华.电子技术课程设计指导[M].北京:高等教育出版社.2003.45-70 [3]谢自美.电子线路设计、实验、测试[M].北京:电子工业出版社.2008.110-140 [4]李洋.EDA技术使用教程[M].北京:机械工业出版社.2009.79- [5]宋振辉.EDA技术与VHDL[M].北京:北京大学出版社.2009.120-150