基于VHDL语言的秒表综合设计_第1页
基于VHDL语言的秒表综合设计_第2页
基于VHDL语言的秒表综合设计_第3页
基于VHDL语言的秒表综合设计_第4页
基于VHDL语言的秒表综合设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

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)时序仿真:需要利用在布局布线中获得

6、的精确参数,用仿真软件验证电路的时序。 (5)器件编程:对使用的元件可以进行编程。3.秒表设计:3.1 原理框图:Seg6:0计数器晶振锁存器分频器扫描显示控制(包括扫描控制和显示译码)计数清零锁存按键开关LED显示电路按键消抖1kHzDig7:0控制电路3.2 设计模块化:由以上原理图可实现秒表设计的模块化,具体而言,可以分为6个模块:分频器:对晶体振荡器产生的时钟信号进行分频,产生时间基准信号。计数器:对时间基准脉冲进行计数,完成计时功能。注:其中包含了一个1kHz到100Hz的分频器,合并在一个模块里。数据锁存器:锁存数据,使显示保持锁定。控制器:控制计数器的运行、暂停以及复位;产生锁存

7、器的是能信号。扫描显示的控制电路:包括扫描计数器、和7段译码器;控制8个数码管以扫描方式显示计时结果。按键消抖电路:消除按键输入信号抖动的影响,输出单脉冲。每个模块调试后可通过顶层文件共同构成秒表的总电路。3.3 模块的功能简述:3.3.1 分频器:秒表设计中共需要两种分频器。一种是通过模为48000的计数器进位输出实现将晶体振荡器产生的48MHz的时钟信号转化为1KHz的时钟信号作为基准,方便下面各个模块的取用。另一种是通过模为10的计数器进位输出将上述1KHz的时钟信号转化为100Hz的时钟信号,作为计数器的时钟输入。注:实际设计中,第二种分频器被划归到计数器模块,实现与原理图的匹配。3.

8、3.2 计数器:计数器功能是通过输入的时钟信号实现计数功能,在秒表设计里,共需要4个模10计数器和2个模6计数器。具体而言,其中2个模10计数器和2个模6计数器分别级联产生2个模60计数器,实现了到秒和到分的进位。而其他的两个模10计数器则是2位模10计数。3.3.3 数据锁存器:它是一个控制端控制的组合逻辑电路,实现了暂时锁存数据的功能。3.3.4 显示译码模块:显示译码管外联部分示意图:内部原理图:功能是:从锁存器接入数据,通过扫描计数的输出来控制多路复用的数据选择端口和三八译码器的输入端口,使其数据变化相同。38译码器的输出进行位选,bcd的输出进行段选使其能在显示译码管显示完整数据。注

9、:本实验电路板使用共阳极,即低电平有效。3.3.5 控制模块:功能是产生实现秒表的暂停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,

10、key-8控制秒表实现开始暂停锁存清零的相应功能,其它功能基本符合要求。另一方面,通过Modesim仿真,可以测试各程序模块,并且可以清楚看到各模块仿真结果与其功能相符合。5.2 心得总结:本次EDA实验大致经历了一个多星期,这段时间里我学到了很多东西。刚开始我对VHDL语言的一无所知而且显得无从下手,在调整心态后我开始仔细了解和掌握课件中有关于VHDL的语句,设计流程和调试方法,在对这些有一定理解的基础上,我又看了几个VHDL应用的小例子,增加对原理的熟悉度。在编调试顶层文件的程序时,各元件之间的连接定义方法和关系让我纠结了好久,最后在别人的建议下,我先画出模块连接框图,明确定义了各个输入和

11、输出的类型和变量。在此基础上设计秒表的VHDL语言,显得条理清晰和检查纠错方便。通过这次实验,我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正理解并掌握其中的原理方法,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,发现了自己的不足之处,这是不可避免的。但更重要的是我们要有自己解决问题的思路和方法,这样才能不断完善自己。希望以后能有更多的动手实践机会,在硬件实践中发现自己的不足,弥补自己的不足。最后,特别感谢老师对我的帮助,让我最终顺利完成秒表的设计实验。6. 参考文献: 1李国洪、胡辉、沈明山.EDA技术与实验.机械工业

12、出版社,2009 2闫石数字电子技术基础(第五版)高等教育出版社,20063 (美)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

13、 values-use IEEE.NUMERIC_STD.ALL;- Uncomment 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 i

14、ssignal sum:std_logic_vector(15 downto 0):=(others=>'0');signal q1:std_logic:='0'beginprocess(clk)beginif falling_edge(clk) then if sum=47999 then sum<=(others=>'0');else sum<=sum+1;end if;end if;-q<=q1;end process;q<=sum(15);end Behavioral;1KHz到100Hz分频器:lib

15、rary 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 primitives in this cod

16、e.-library UNISIM;-use UNISIM.VComponents.all;entity fp1k_to_100 is port ( clk : in STD_LOGIC; q : out STD_LOGIC);end fp1k_to_100;architecture Behavioral of fp1k_to_100 issignal sum:std_logic_vector(2 downto 0):=(others=>'0');signal q1:std_logic:='0'beginprocess(clk)beginif fallin

17、g_edge(clk) then if sum=4 then sum<=(others=>'0');q1<=not q1;else sum<=sum+1;end if;end if;q<=q1;end 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

18、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 UNISIM.VComponents.all;entity cnt_6 is Port ( clk : in STD_LOGIC; clr : in STD_LOGIC; en : in STD_LOGIC; co : out

19、STD_LOGIC; sum : out STD_LOGIC_VECTOR (2 downto 0);end cnt_6;architecture Behavioral of cnt_6 issignal temp:std_logic_vector(2 downto 0);beginprocess(clk,clr,temp)beginif clr='1' then temp<="000"co<='0'elsif (clk='1' and clk'event) thenif en='1' th

20、enif 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_LOGIC_1164.ALL;use IEEE.STD_LOGIC_un

21、signed.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 UNISIM.VComponents.all;entity cnt_10

22、 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<="0000"co

23、<='0'elsif (clk='1' and clk'event) 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;sum<=temp;end process

24、;end Behavioral;计数器模块级联: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 following library declaration if instantiating- any Xilinx primitives in this code.-li

25、brary UNISIM;-use UNISIM.VComponents.all;entity jishuqi is Port ( clk : in STD_LOGIC; clr : in STD_LOGIC; cnt : in STD_LOGIC; cout0 : out STD_LOGIC_VECTOR (3 downto 0); cout1 : out STD_LOGIC_VECTOR (3 downto 0); cout2 : out STD_LOGIC_VECTOR (3 downto 0); cout3 : out STD_LOGIC_VECTOR (2 downto 0); co

26、ut4 : out STD_LOGIC_VECTOR (3 downto 0); cout5 : out STD_LOGIC_VECTOR (2 downto 0); coa : out std_logic);end jishuqi;architecture Behavioral of jishuqi isCOMPONENT fp1k_to_100PORT(clk : IN std_logic; q : OUT std_logic);END COMPONENT;COMPONENT cnt_10PORT(clk : IN std_logic;clr : IN std_logic;en : IN

27、std_logic; co : OUT std_logic;sum : OUT std_logic_vector(3 downto 0);END COMPONENT;COMPONENT cnt_6PORT(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 COMPONENT;signal clk_100, o1,o2,o3,o4,o5 : std_logic;beginInst_fp1k_to_100: fp

28、1k_to_100 PORT MAP(clk =>clk,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(clk =>clk_100 ,clr =>clr ,en =>o1,co =>o2 ,sum =>cout1 );Inst_cnt_10c: cnt_10 PORT MAP(clk =>clk_100

29、 ,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 );Inst_cnt_6b: cnt_6 PORT MAP(clk =>cl

30、k_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 following library decla

31、ration 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 (3 downto 0); cnt_4

32、 : 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 : out STD_LOGIC_VECTO

33、R (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 pr

34、ocess;end Behavioral;(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-

35、 any Xilinx primitives 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 : i

36、n STD_LOGIC_VECTOR (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):=

37、"1000"signal seg: std_logic_vector(6 downto 0):="1111110"signal dig: std_logic_vector(2 downto 0):="000"beginprocess(clk_1k)beginif clk_1k'event and clk_1k='1' thenif dig=7 then dig<="000"elsedig<=dig+1;end if;end if;end process;process(dig)b

38、egincase dig iswhen "000"=>dig_out<="11111110"when "001"=>dig_out<="11111101"when "010"=>dig_out<="11111011"when "011"=>dig_out<="11110111"when "100"=>dig_out<="11101111"

39、when "101"=>dig_out<="11011111"when "110"=>dig_out<="10111111"when others=>dig_out<="01111111"end case;end process;process(dig)begincase dig iswhen "000"=>bcd<=cnt0;when "001"=>bcd<=cnt1;when "01

40、0"=>bcd<="1010"when "011"=>bcd<=cnt2;when "100"=>bcd<=cnt3;when "101"=>bcd<="1010"when "110"=>bcd<=cnt4;when "111"=>bcd<=cnt5;when others=>bcd<="1010"end case;end process;pr

41、ocess(bcd)begincase bcd iswhen "0000"=>seg<="0000001"when "0001"=>seg<="1001111"when "0010"=>seg<="0010010"when "0011"=>seg<="0000110"when "0100"=>seg<="1001100"when &quo

42、t;0101"=>seg<="0100100"when "0110"=>seg<="0100000"when "0111"=>seg<="0001111"when "1000"=>seg<="0000000"when "1001"=>seg<="0000100"when others=>seg<="1111110"e

43、nd case;end process;seg_out<=seg;end Behavioral;(5)控制模块: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 d

44、eclaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity control is Port ( clk : in STD_LOGIC; p : in STD_LOGIC; q : in STD_LOGIC; clr : out STD_LOGIC; enc : out STD_LOGIC; enl : out STD_LOGIC);end control;architecture Behavioral of control i

45、ssignal state:std_logic_vector(1 downto 0):="00"signal n_state:std_logic_vector(1 downto 0):="00"signal key:std_logic_vector(1 downto 0);beginkey<=p & q;process(state,key)begincase state iswhen "00"=>if key="10" thenn_state<="01"elsen_st

46、ate<=state;end if;when "01"=>case key iswhen "10"=>n_state<="11"when "01"=>n_state<="10"when others=>n_state<=state;end case;when "10"=>if key="01" then n_state<="01"else n_state<=state;e

47、nd if;when others=>case key iswhen "10"=>n_state<="01"when "01"=>n_state<="00"when others=>n_state<=state;end case;end case;end process; process(clk)beginif falling_edge(clk) then state<=n_state;end if;end process; process(state)beginca

48、se state iswhen "00"=>clr<='1'enc<='1'enl<='1'when "01"=>clr<='0'enc<='1'enl<='1'when "10"=>clr<='0'enc<='1'enl<='0'when others=>clr<='0'enc<=

49、9;0'enl<='1'end case;end process;end Behavioral;(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 fo

50、llowing library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity xiaodou is Port ( clk : in STD_LOGIC; key_in : in STD_LOGIC; key_out : out STD_LOGIC);end xiaodou;architecture Behavioral of xiaodou issignal k1,k2: STD_LOGIC;signal cn

51、t : STD_LOGIC_VECTOR (1 downto 0);beginprocess(clk,key_in)beginif clk'event and clk ='0' thenif cnt =3 thenk1<='1'elsek1<='0'cnt<=cnt+1;end if;k2<=k1;end if;if key_in ='0' thencnt <="00"end if;end process;key_out <= not k1 and k2;end Behavioral;开关消抖组合: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

温馨提示

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

最新文档

评论

0/150

提交评论