目录 内容摘要 一、概述 二、实验目的 三、实验原理 四、设计方案 五、设计方法论证 (1)将每个模块生成电路元件,利用电路连接图的方式 (2)利用元件例化的方法 六、设计过程 (1)计时、控制模块 1)分频器的设计 2)计数器的设计 (2)显示模块 1)扫描电路 2)七段译码 (3)报警器电路 (4)元件例化 七、波形仿真 八、设备验证 (1)引脚分配 (2)程序下载 (3)设备验证 九、设计心得及体会
内容摘要在科技高度发展的今天,集成电路和计算机应用得到了高速发展。尤其是计算机应用的发展。它在人们日常生活已逐渐崭露头角。大多数电子产品多是由计算机电路组成, 如:手机、mp3等。而且将来的不久他们的身影将会更频繁的出现在我们身边。各种家用电器多会实现微电脑技术。电脑各部分在工作时多是一时间为基准的。 本报告就是基于计算机电路的时钟脉冲信号、状态控制等原理,运用EDA技术及VHDL语言设计出的数字秒表。秒表在很多领域充当一个重要的角色。在各种比赛中对秒表的精确度要求很高,尤其是一些科学实验,他们对时间精确度达到了几纳秒级别。 利用VHDL语言设计基于计算机电路中时钟脉冲原理的数字秒表。该数字秒表能对0秒~59分59.99秒范围进行计时,显示最长时间是59分59秒,超过该时间能够进行报警。计时精度达到10ms。设计了复位开关和启停开关。复位开关可以在任何情况下使用,使用以后计时器清零,并做好下一次计时的准备。
一、概述EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子通用软件包,它根据硬件描述语言VHDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。随着科技发展,在现代生活中,计数器应用越来越广泛。EDA技术的应用引起电子产品即系统开发的革命性变革,在Quartus II环境下采用VHDL语言实现,论述了基于VHDL语言在FPGA芯片的数字设计思想与实现过程。本设计是以VHDL语言为基础的数字秒表。在数字秒表的程序中应用了四个10进制计数器和两个6进制计数器,以及报警器、选择器和显示译码器等。 电子设计自动化技术EDA的发展给电子系统的设计带来了革命性变化,EDA软件设计工具,硬件描述语言,可编程逻辑器件(PLD)使得EDA技术的应用走向普及。VHDL语言是EDA的关键技术之一,它采用自顶向下的设计方法,完成系统的整体设计。 二、实验目的通过本次课设,加深对EDA技术设计的理解,学会用QuartusⅡ工具软件设计基本电路,熟练掌握VHDL语言,为以后工作使用打下坚实的基础。 三、实验原理秒表工作原理和多少数字电子钟大致一样,不同的是秒表为0.01秒,整个秒表的时钟信号输入为50MHZ。所以,需要对时钟信号进行分频 假设该秒表应用场合小于1小时,秒表的显示格式为mm-ss-xx(mm表示分钟:0~59;ss表示秒:0~59;xx表示百分之一秒:0~99)。 利用试验箱产生的CLK冲激作为时钟信号的基准信号,通过显示和计时模块在试验箱的LED显示。 四、设计方案 本系统设计采用自顶向下的设计方案,系统的整体组装设计原理图如图1所示,它主要由控制模块、分频模块,计时模块、显示模块和报警模块五部分组成。各模块分别完成计时过程的控制功能、计时功能与显示功能。
计时控制模块主要是对计时过程进行控制。计时控制模块可以由两个按钮开关来完成秒表的启动,停止和复位。 计时模块实现的是计时功能,及时的方法是对标准时钟脉冲计数。由于秒表的计时范围是0秒~59分59.99秒,所以计数器可以由四个十进制计数器和两个六进制计数器构成,其中毫秒位,秒位和分位采用十进制计数器来实现,十秒位和十分位采用六进制计数器。 计时显示模块是将计时值在LED七段数码管显示出来。 当计时达60分钟后,蜂鸣器鸣响10声 最终底层文件生成设计实体可采用两种方式 五、设计方法论证
(1)将每个模块生成电路元件,利用电路连接图的方式如图2所示 图2 电路原理图 (2)利用元件例化的方法
六、设计过程
(1)计时、控制模块1)分频器的设计: 由于本设计中需要用到精确的100Hz计时脉冲,因此分频器的设计显得尤为重要。考虑到实验箱上输出频率的限制及所产生及时脉冲的精度要求,采用由50MHz的时钟脉冲经过分频器产生100Hz的计时脉冲。计时控制模块的作用是将按键信号转变为计时器的控制信号。计时控制模块可用两个按钮来完成秒表的启动、停止和复位,即启动/暂停键和清零键,由它们产生计数允许/保持和清零信号。K为启动/暂停键输入信号,K=0时表示按下,K=1时表示松开。 分频器的设计程序源代码如下: ibrary ieee; use ieee.std_logic_1164.all; entity div is port(clr,clk: in std_logic; q: buffer std_logic); end div; architecture a of div is signal count:integer range 0 to 499999; --设置定时范围 begin process(clr,clk) begin if (clk'event and clk='1') then --当计时脉冲上升沿出发 if clr='1' then --清零开关使能端 count<=0; elsif count=499999 then count<=0; q<= not q; else count<=count+1; end if; end if; end process; end a; 生成的电路元件图如图3所示 图3 2)计数器的设计: 本实验需要六进制计数器和十进制计数器配合使用。计时方法和计算机一样是对标准时钟脉冲计数。计时模块是由四个十进制计数器和两个六进制计数器构成的。其中毫秒位、十毫秒位、秒位和分位采用十进制计数器,十秒位和十分位采用六进制计数器。 library ieee; --六进制计数器 use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count6 is port (clk,start,clr : in std_logic; cout : out std_logic; daout : out std_logic_vector(3 downto 0));--定义输出数据范围 end count6; architecture two of count6 is signal q0 : std_logic_vector(3 downto 0); signal q1 : std_logic; begin process(clk,clr) begin if clr='1' then q0<="0000"; elsif ( clk'event and clk='1') then --当上升沿来时动作 if start='1' then if q0="0101" then q0<="0000";q1<='1';--限制计数范围 else q0<=q0+1;q1<='0'; --进行计数 end if; end if; end if; end process; daout<= q0; cout<=q1; end two;
生成的电路元件图如图4所示 图4
library ieee; --十进制计数器 use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count10 is port (clk,start,clr : in std_logic; cout : out std_logic; daout : out std_logic_vector(3 downto 0)); end count10; architecture one of count10 is signal q0 : std_logic_vector(3 downto 0); signal q1 : std_logic; begin process(clk,clr) begin if clr='1' then q0<="0000"; elsif ( clk'event and clk='1') then --判断上升沿动作 if start='1' then if q0="1001" then q0<="0000";q1<='1'; --计数范围限制在10 else q0<=q0+1;q1<='0'; --计数 end if; end if; end if; end process; daout<= q0; cout<=q1; end one;
生成的电路元件图如图5所示 图5 (2)显示模块计时显示电路的作用是将计时值在LED数码管上显示出来。计时电路产生的值经过BCD七段译码后,驱动LED数码管。计时显示电路的实现方案采用扫描显示。其中包括选择器和七段译码器。选择器中包含了对数码管的片选信号、位选信号及小数点的设置。 1)扫描电路数码管动态扫描就是以一定的频率依次点亮多个数码管的段位,只要频率足够大,人眼无法识别出,就会形成多个数码管同时亮的现象。段选信号负责选择哪个数码管亮,位选信号负责控制该数码管上亮的位置。
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity seltime is port(clr,clk: in bit; dain0,dain1,dain2,dain3,dain4,dain5,dain6: in std_logic_vector(3 downto 0); --定义数据 sel: out std_logic_vector(3 downto 0);--段选信号 daout: out std_logic_vector(3 downto 0));--位选信号 end seltime; architecture a of seltime is signal temp:integer range 0 to 6; begin process(clk) --根据时钟脉冲进行动作 begin if (clr='1') then --清零使能端 daout<="0000"; sel<="0000"; temp<=0; --当清零信号产生后将LED归零 elsif (clk='1'and clk'event) then --当时钟上升沿时执行 if temp=6 then temp<=0; else temp<=temp + 1; end if; case temp is --控制LED when 0=>sel<="0000";daout<=dain0; when 1=>sel<="0001";daout<=dain1; when 2=>sel<="0010";daout<=dain2; when 3=>sel<="0011";daout<=dain3; when 4=>sel<="0100";daout<=dain4; when 5=>sel<="0101";daout<=dain5; when 6=>sel<="0110";daout<=dain6; end case; end if; end process; end a; 生成的电路元件图如图6所示 图6 2)七段译码数码管是共阴极触发亮度,七段数码管由八位数据控制,数码管首先从上到右,到下到左,到中间,最后到小数点分别标记为a、b、c、d、e、f、g、dp八段其中小数点位DP为最高位,a段为最低位,要想显示什么字符只需要使对应的段发光即可。 library ieee; use ieee.std_logic_1164.all; entity deled is port(num:in std_logic_vector(3 downto 0); led:out std_logic_vector(6 downto 0)); end deled ; architecture a of deled is begin process(num) begin case num is when"0000"=>led<="0111111";--显示0 when"0001"=>led<="0000110";--显示1 when"0010"=>led<="1011011";--显示2 when"0011"=>led<="1001111";--显示3 when"0100"=>led<="1100110";--显示4 when"0101"=>led<="1101101";--显示5 when"0110"=>led<="1111101";--显示6 when"0111"=>led<="0100111";--显示7 when"1000"=>led<="1111111";--显示8 when"1001"=>led<="1101111";--显示9 when others=>led<="0000000";--其他情况下为0 end case; end process; end a; 生成的电路元件图如图7所示 图7
(3)报警器电路报警模块的设计是利用蜂鸣器的发声原理。当计数器计满59分钟后会产生进位信号,在蜂鸣器的一端输入高电平时蜂鸣器发生,产生报警声。 源代码: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity alarm is port(clk,I:in std_logic; q:out std_logic --报警输出 ); end alarm; architecture ar of alarm is signal n:integer range 0 to 9; signal q0:std_logic; begin process(clk) begin if clk'event and clk='1' then if i='0' then q0<='0'; n<=0; elsif n<=9 and i='1' then --计数满60分后报警输出,重新计数 q0<=not q0; n<=n+1; else q0<='0'; end if; end if; end process; q<=q0; end ar; 生成的电路元件图如图8所示 图8 (4)元件例化元件例化是用含有完整程序结构的VHDL表述来构成自顶而下层次化设计的一种重要手段。将已经设计完成的底层文件调用构建成一个完整的电路文件。将要引用的文件放入例化文件目录下。 library ieee; use ieee.std_logic_1164.all; entity mb_top is port ( stop,start,clk:in std_logic; a,b,c,d,e,f,g,speaker:out std_logic; sel:out std_logic_vector(3 downto 0); vga:out std_logic_vector(3 downto 0));--选择电路上的数码管 end mb_top; architecture a of mb_top is component div --分频器 port(clr,clk: in std_logic; q: buffer std_logic); end component; component count10 --10进制计数器 port( clr,start,clk:in std_logic; cout:out std_logic; daout:buffer std_logic_vector(3 downto 0)); end component; component count6 --6进制计数器 port( clr,start,clk:in std_logic; cout:out std_logic; daout:buffer std_logic_vector(3 downto 0)); end component; component seltime --数据选择器 port( clr,clk:in std_logic; dain0:in std_logic_vector(3 downto 0); dain1:in std_logic_vector(3 downto 0); dain2:in std_logic_vector(3 downto 0); dain3:in std_logic_vector(3 downto 0); dain4:in std_logic_vector(3 downto 0); dain5:in std_logic_vector(3 downto 0); sel:out std_logic_vector(3 downto 0); daout:out std_logic_vector(3 downto 0)); end component; component deled port( num:in std_logic_vector(3 downto 0); led:out std_logic_vector(6 downto 0)); end component; component alarm --报警电路 port( clk,i,clr:in std_logic; q:out std_logic); end component; signal div_q,b_cout,s_cout,m_cout,sm_cout,f_cout,sf_cout:std_logic; signal b_daout,s_daout,m_daout,sm_daout,f_daout,sf_daout,seltime_daout:std_logic_vector(3 downto 0); signal ledout:std_logic_vector(6 downto 0); begin vga<="1011"; --写入vga调用电路板上的数码管 a<=ledout(0);b<=ledout(1);c<=ledout(2);d<=ledout(3); e<=ledout(4);f<=ledout(5);g<=ledout(6); u1:div port map(stop,clk,div_q); --元件位置 u2:count10 port map(stop,start,div_q,b_cout,b_daout); u3:count10 port map(stop,start,b_cout,s_cout,s_daout); u4:count10 port map(stop,start,s_cout,m_cout,m_daout); u5:count6 port map(stop,start,m_cout,sm_cout,sm_daout); u6:count10 port map(stop,start,sm_cout,f_cout,f_daout); u7:count6 port map(stop,start,f_cout,sf_cout,sf_daout); u8:seltime port map(stop,div_q,b_daout,s_daout,m_daout,sm_daout,f_daout,sf_daout,sel,seltime_daout); u9:deled port map(seltime_daout,ledout); u10:alarm port map(div_q,sf_cout,speaker); end a; 七、波形仿真
八、设备验证(1)引脚分配图9引脚分配图 (2)程序下载图10下载图
(3)设备验证图11 实验结果图 九、设计心得及体会通过此次课程设计,让我对EDA这门技术有了更深的体会,并更好的学会了使用QuartusⅡ软件进行硬件设计。 在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足。通过与同学探讨和请教老师,终于把问题都解决了,并加深了对数字时钟原理和设计思路的了解。同时我也掌握了做课程设计的一般流程,为以后的电子设计这块积累了一定的经验,为以后从事相关工作有一些帮助。最终解决了问题,攥写成报告。 通过对设计对实现和对报告对撰写,深深体会到了VHDL语言和EDA技术的一些技巧和设计思想,在完成设计的过程中,应该具有很清晰地思路,才可以使电路更完美和简便,要敢想敢做但是不应该有投机取巧的心理。在完成每一步的时候都有意想不到的收获也有可能导致错误,所以在设计对过程中要集中精神。在写报告的过程中,更加凸显了细心二字。不可自认为完美,必须按照格式要求来撰写自己的报告,所以必须做到足够的精确。 利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计版图的整个过程的计算机上自动处理完成。在进行设计时并不束缚设计者的想象力,这使得自学、扩展也可以很容易实现。在设计中充分的认识到EDA课程对硬件设计的重要性,若把本门课程学好、学精,对硬件设计将有很大对帮助。以后若有机会我将会利用更多时间来学习EDA技术、更加深入的学习EDA技术。EDA技术以其独有的优点和应用范围有着非常好的发展前景,是近几年电子工业的发展趋向,中国的EDA行业发展十分迅速,有着很大的潜力。所以我们学好这门课程是十分必要的,我们不应该仅仅拘泥于一门课程的学习,要结合各学科的连接点,把我们的知识串联起来。为我们的未来做好知识储备。 以上就我关于这次课程设计的想法,在以后,我会用更多的时间去了解EDA。并且提高自己的知识水平。
以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
秒表实验报告.docx
(1.94 MB, 下载次数: 28)
|