《基于vhdl语言的秒表综合设计--大学毕业设计论文.doc》由会员分享,可在线阅读,更多相关《基于vhdl语言的秒表综合设计--大学毕业设计论文.doc(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、设 计 报 告现代电子技术综合实验课程名称 数字式秒表设计与实现设计题目 指导老师 学 生 学 号 目录1 引言.1.1课程设计的内容及要求.2 VHDL简介.2.1硬件描述语言VHDL.2.1.1 VHDL语言的特点.2.1.2 VHDL语言的设计流程.3 秒表设计过程.3.1原理框图.3.2设计思路模块化.3.3模块的功能简述.3.3.1分频器.3.3.2计数器.3.3.3数据锁存器.3.3.4显示译码模块.3.3.5控制模块.3.3.6按键消抖模块.3.3.7顶层文件.4 模块电路仿真. 4.1 分频器 4.2计数器 4.2.1 模6计数器 4.2.2 模10计数器5 实验总结.5.1实
2、验结论.5.2心得总结.6 参考文献.7 附录(各模块源程序).1. 引言:在当今信息化社会中,集成电路和计算机应用得到高速发展,。它在人们日常生活已必不可少,大多数电子产品多是由计算机电路组成。本文目的就是基于计算机电路利用VHDL语言设计出数字秒表。秒表在很多领域充当了重要的角色,在不同的场合和条件下对于秒表的精度和功能是不同的,有些科学实验的要求甚至能达到纳秒级别。1.1课题内容要求:本课题目标是掌握VHDL开发FPGA的一般流程,重点是电子秒表的设计。该设计以VHDL作为硬件开发语言,以ISE作为软件开发平台,准确地实现了秒表计数、清零、暂停等功能,并使用ModelSim仿真软件对VH
3、DL程序实现了电路仿真,完成了综合布局布线,最终将程序下载到芯片Spartan-3A,并通过板子上相应模块验证实验的正确性。除此以外,利用课余时间学习数字频率计的硬件实现方法,即用MultiSim仿真等。 秒表设计的具体要求:计时范围是000000到595999。有两个按钮开关start/stop和split/reset,控制秒表的启动、停止、分段和复位:秒表已经被复位的情况下,按下state/stop键,秒表开始计时。在秒表正常运行的情况下,如果按下state/reset则秒表暂停计时;再次按下该键,秒表继续计时。在秒表正常运行下,如果按下split/reset,显示停止在按键时的时间,但秒
4、表仍然在计时;再次按下该键,秒表恢复正常显示。在秒表暂停计时的情况下,按下split/reset,秒表复位归零。2.VHDL简介:2.1 VHDL特点:(1)作为HDL的第一个国际标准,VHDL具有很强的可移植性。(2)具有丰富的模拟仿真语句和库函数,随时可对设计进行仿真模拟,因而能将设计中的错误消除在电路系统装配之前,在设计早期就能检查设计系统功能的可行性,有很强的预测能力。(3)VHDL有良好的可读性,接近高级语言,容易理解。(4)系统设计与硬件结构无关,方便了工艺的转换,也不会因工艺变化而使描述过时。(5)支持模块化设计,可将大规模设计项目分解成若干个小项目,还可以把已有的设计项目作为一
5、个模块调用。(6)对于用VHDL完成的一个确定设计,可以利用EDA工具进行逻辑综合和优化,并能自动地把VHDL描述转变成门电路级网表文件。(7)设计灵活,修改方便,同时也便于设计结果的交流、保存和重用,产品开发速度快,成本低。2.2 VHDL设计流程:(1文本编辑:用任何文本编辑器都可以进行,也可以用专用的HDL编辑环境。 (2)功能仿真:将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确。 (3)逻辑综合:将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式。 (4)时序仿真:需要利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。 (5)器件编程:对使用的元件可以
6、进行编程。3.秒表设计:3.1 原理框图:Seg6:0计数器晶振锁存器分频器扫描显示控制(包括扫描控制和显示译码)计数清零锁存按键开关LED显示电路按键消抖1kHzDig7:0控制电路3.2 设计模块化:由以上原理图可实现秒表设计的模块化,具体而言,可以分为6个模块:分频器:对晶体振荡器产生的时钟信号进行分频,产生时间基准信号。计数器:对时间基准脉冲进行计数,完成计时功能。注:其中包含了一个1kHz到100Hz的分频器,合并在一个模块里。数据锁存器:锁存数据,使显示保持锁定。控制器:控制计数器的运行、暂停以及复位;产生锁存器的是能信号。扫描显示的控制电路:包括扫描计数器、和7段译码器;控制8个
7、数码管以扫描方式显示计时结果。按键消抖电路:消除按键输入信号抖动的影响,输出单脉冲。每个模块调试后可通过顶层文件共同构成秒表的总电路。3.3 模块的功能简述:3.3.1 分频器:秒表设计中共需要两种分频器。一种是通过模为48000的计数器进位输出实现将晶体振荡器产生的48MHz的时钟信号转化为1KHz的时钟信号作为基准,方便下面各个模块的取用。另一种是通过模为10的计数器进位输出将上述1KHz的时钟信号转化为100Hz的时钟信号,作为计数器的时钟输入。注:实际设计中,第二种分频器被划归到计数器模块,实现与原理图的匹配。3.3.2 计数器:计数器功能是通过输入的时钟信号实现计数功能,在秒表设计里
8、,共需要4个模10计数器和2个模6计数器。具体而言,其中2个模10计数器和2个模6计数器分别级联产生2个模60计数器,实现了到秒和到分的进位。而其他的两个模10计数器则是2位模10计数。3.3.3 数据锁存器:它是一个控制端控制的组合逻辑电路,实现了暂时锁存数据的功能。3.3.4 显示译码模块:显示译码管外联部分示意图:内部原理图:功能是:从锁存器接入数据,通过扫描计数的输出来控制多路复用的数据选择端口和三八译码器的输入端口,使其数据变化相同。38译码器的输出进行位选,bcd的输出进行段选使其能在显示译码管显示完整数据。注:本实验电路板使用共阳极,即低电平有效。3.3.5 控制模块:功能是产生
9、实现秒表的暂停or开始,锁存or清零功能。具体而言产生三个输出控制信号:清零,计数,锁存。实现方法:Mealy机或者是Moore机方式,区别是有一个状态的不同。实现原理图:3.3.6 按键消抖模块:功能是消除按键输入信号的影响,输出单脉冲。方便实现两个按键对秒表的瞬时控制。3.3.7 顶层文件:实现各个模块之间的连接匹配,同时分配实际电路板的引脚。4. 模块电路仿真:4.1 分频器:4.2 计数器:4.2.1 模6计数器:4.2.2 模10计数器:5. 实验总结:5.1 实验结果:经过测试,可以由FPGA板上的key-7,key-8控制秒表实现开始暂停锁存清零的相应功能,其它功能基本符合要求。
10、另一方面,通过Modesim仿真,可以测试各程序模块,并且可以清楚看到各模块仿真结果与其功能相符合。5.2 心得总结:本次EDA实验大致经历了一个多星期,这段时间里我学到了很多东西。刚开始我对VHDL语言的一无所知而且显得无从下手,在调整心态后我开始仔细了解和掌握课件中有关于VHDL的语句,设计流程和调试方法,在对这些有一定理解的基础上,我又看了几个VHDL应用的小例子,增加对原理的熟悉度。在编调试顶层文件的程序时,各元件之间的连接定义方法和关系让我纠结了好久,最后在别人的建议下,我先画出模块连接框图,明确定义了各个输入和输出的类型和变量。在此基础上设计秒表的VHDL语言,显得条理清晰和检查纠
11、错方便。通过这次实验,我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正理解并掌握其中的原理方法,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,发现了自己的不足之处,这是不可避免的。但更重要的是我们要有自己解决问题的思路和方法,这样才能不断完善自己。希望以后能有更多的动手实践机会,在硬件实践中发现自己的不足,弥补自己的不足。最后,特别感谢老师对我的帮助,让我最终顺利完成秒表的设计实验。6. 参考文献: 1李国洪、胡辉、沈明山.EDA技术与实验.机械工业出版社,2009 2闫石数字电子技术基础(第五版)高等教育出版社,200
12、63 (美)John F.Wakerly.数字设计:原理与实践(原书第四版).北京:机械工业出版社,2007.57. 附录(各模块源程序):(1)分频器:48MHz到1KHz分频器:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_Unsigned.All;- Uncomment the following library declaration if using- arithmetic functions with Signed or Unsigned values-use IEEE.NUMERIC_STD.ALL;- U
13、ncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity fp48m_to_1k is port ( clk : in STD_LOGIC; q : out STD_LOGIC);end fp48m_to_1k;architecture Behavioral of fp48m_to_1k issignal sum:std_logic_vector(15 down
14、to 0):=(others=0);signal q1:std_logic:=0;beginprocess(clk)beginif falling_edge(clk) then if sum=47999 then sum0);else sum=sum+1;end if;end if;-q=q1;end process;q0);signal q1:std_logic:=0;beginprocess(clk)beginif falling_edge(clk) then if sum=4 then sum0);q1=not q1;else sum=sum+1;end if;end if;q=q1;e
15、nd process;end Behavioral;(2)计数器:模6计数器:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_unsigned.ALL;- Uncomment the following library declaration if using- arithmetic functions with Signed or Unsigned values-use IEEE.NUMERIC_STD.ALL;- Uncomment the following library declaration if instan
16、tiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity cnt_6 is Port ( clk : in STD_LOGIC; clr : in STD_LOGIC; en : in STD_LOGIC; co : out STD_LOGIC; sum : out STD_LOGIC_VECTOR (2 downto 0);end cnt_6;architecture Behavioral of cnt_6 issignal temp:std_logic_vec
17、tor(2 downto 0);beginprocess(clk,clr,temp)beginif clr=1 then temp=000;co=0;elsif (clk=1 and clkevent) thenif en=1 thenif temp=101 thentemp=000;else temp=temp+1;end if;end if;end if;if temp=101 and en=1 thenco=1;else co=0;end if;sum=temp;end process;end Behavioral;模10计数器:library IEEE;use IEEE.STD_LOG
18、IC_1164.ALL;use IEEE.STD_LOGIC_unsigned.ALL;- Uncomment the following library declaration if using- arithmetic functions with Signed or Unsigned values-use IEEE.NUMERIC_STD.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNI
19、SIM.VComponents.all;entity cnt_10 is Port ( clk : in STD_LOGIC; clr : in STD_LOGIC; en : in STD_LOGIC; co : out STD_LOGIC; sum : out STD_LOGIC_VECTOR (3 downto 0);end cnt_10;architecture Behavioral of cnt_10 issignal temp:std_logic_vector(3 downto 0);beginprocess(clk,clr,temp)beginif clr=1 then temp
20、=0000;co=0;elsif (clk=1 and clkevent) thenif en=1 thenif temp=1001 thentemp=0000;else temp=temp+1;end if;end if;end if;if temp=1001 and en=1 thenco=1;else co=0;end if;sumclk,q =clk_100);Inst_cnt_10a: cnt_10 PORT MAP(clk =clk_100 ,clr =clr ,en =cnt ,co =o1 ,sum =cout0 );Inst_cnt_10b: cnt_10 PORT MAP(
21、clk =clk_100 ,clr =clr ,en =o1,co =o2 ,sum =cout1 );Inst_cnt_10c: cnt_10 PORT MAP(clk =clk_100 ,clr =clr ,en =o2 ,co =o3 ,sum =cout2 );Inst_cnt_6a: cnt_6 PORT MAP(clk =clk_100 ,clr =clr ,en =o3 ,co =o4 ,sum =cout3 );Inst_cnt_10d: cnt_10 PORT MAP(clk =clk_100 ,clr =clr ,en =o4 ,co =o5 ,sum =cout4 );I
22、nst_cnt_6b: cnt_6 PORT MAP(clk =clk_100 ,clr =clr ,en =o5 ,co =coa ,sum =cout5 );end Behavioral;(3)数据锁存器:library IEEE;use IEEE.STD_LOGIC_1164.ALL;- Uncomment the following library declaration if using- arithmetic functions with Signed or Unsigned values-use IEEE.NUMERIC_STD.ALL;- Uncomment the follo
23、wing library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity latch is Port ( cnt_0 : in STD_LOGIC_VECTOR (3 downto 0); cnt_1 : in STD_LOGIC_VECTOR (3 downto 0); cnt_2 : in STD_LOGIC_VECTOR (3 downto 0); cnt_3 : in STD_LOGIC_VECTOR (
24、3 downto 0); cnt_4 : in STD_LOGIC_VECTOR (3 downto 0); cnt_5 : in STD_LOGIC_VECTOR (3 downto 0); display_in : in STD_LOGIC; cnt0 : out STD_LOGIC_VECTOR (3 downto 0); cnt1 : out STD_LOGIC_VECTOR (3 downto 0); cnt2 : out STD_LOGIC_VECTOR (3 downto 0); cnt3 : out STD_LOGIC_VECTOR (3 downto 0); cnt4 : o
25、ut STD_LOGIC_VECTOR (3 downto 0); cnt5 : out STD_LOGIC_VECTOR (3 downto 0);end latch;architecture Behavioral of latch isbeginprocess(cnt_0,cnt_1,cnt_2,cnt_3,cnt_4,cnt_5,display_in)beginif display_in=1 thencnt0=cnt_0;cnt1=cnt_1;cnt2=cnt_2;cnt3=cnt_3;cnt4=cnt_4;cnt5=cnt_5;end if;end process;end Behavi
26、oral;(4)显示译码模块:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_unsigned.ALL;- Uncomment the following library declaration if using- arithmetic functions with Signed or Unsigned values-use IEEE.NUMERIC_STD.ALL;- Uncomment the following library declaration if instantiating- any Xilinx prim
27、itives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity display is Port ( clk_1k : in STD_LOGIC; cnt0 : in STD_LOGIC_VECTOR (3 downto 0); cnt1 : in STD_LOGIC_VECTOR (3 downto 0); cnt2 : in STD_LOGIC_VECTOR (3 downto 0); cnt3 : in STD_LOGIC_VECTOR (3 downto 0); cnt4 : in STD_LOGIC_VECT
28、OR (3 downto 0); cnt5 : in STD_LOGIC_VECTOR (3 downto 0); dig_out : out STD_LOGIC_VECTOR (7 downto 0); seg_out : out STD_LOGIC_VECTOR (6 downto 0); dig_in : out std_logic_vector (2 downto 0) );end display;architecture Behavioral of display issignal bcd: std_logic_vector(3 downto 0):=1000;signal seg: std_logic_vector(6 downto 0):=1111110;signal dig: std_logic_vector(2 downto 0):=000;beginprocess(clk_1k)beginif clk_1kevent and clk_1k=1 thenif dig=7 then dig=000;elsedigdig_outdig_outdig_outdig_outdig_outdig_outdig_outdig_outbcdbcdbcdbcdbcdbcdbcdbcdbcdsegsegsegsegsegsegseg=0100000;when