数字秒表的设计与实现实验报告.doc

上传人:wux****ua 文档编号:7913821 上传时间:2020-03-25 格式:DOC 页数:24 大小:2.43MB
返回 下载 相关 举报
数字秒表的设计与实现实验报告.doc_第1页
第1页 / 共24页
数字秒表的设计与实现实验报告.doc_第2页
第2页 / 共24页
数字秒表的设计与实现实验报告.doc_第3页
第3页 / 共24页
点击查看更多>>
资源描述
电 子 科 技 大 学数字秒表课程设计姓 名: xxx学 号: 学 院: 指导老师:xx摘要EDA技术作为电子工程领域的一门新技术,极大的提高了电子系统设计的效率和可靠性。文中介绍了一种基于FPGA在ISE10.1软件下利用VHDL语言结合硬件电路来实现数字秒表的功能的设计方法。采用VHDL硬件描述语言, 运用ModelSim等EDA仿真工具。该设计具有外围电路少、集成度高、可靠性强等优点。 通过数码管驱动电路动态显示计时结果。给出部分模块的VHDL源程序和仿真结果,仿真结果表明该设计方案的正确,展示了VHDL语言的强大功能和优秀特性。关键词:FPGA, VHDL, EDA, 数字秒表目录第一章 引言4第二章 设计背景52.1 方案设计52.2 系统总体框图52.3 -FPGA实验板52.4 系统功能要求62.5 开发软件62.5.1 ISE10.1简介62.5.2 ModelSim简介62.6 VHDL语言简介7第三章 模块设计83.1 分频器83.2 计数器83.3 数据锁存器93.4 控制器93.5 扫描控制电路103.6 按键消抖电路11第四章 总体设计12第五章 结论13附录14第一章 引言数字集成电路作为当今信息时代的基石,不仅在信息处理、工业控制等生产领域得到普及应用,并且在人们的日常生活中也是随处可见, 极大的改变了人们的生活方式。面对如此巨大的市场, 要求数字集成电路的设计周期尽可能短、 实验成本尽可能低, 最好能在实验室直接验证设计的准确性和可行性, 因而出现了现场可编程逻辑门阵列FPGA。 对于芯片设计而言, FPGA的易用性不仅使得设计更加简单、快捷, 并且节省了反复流片验证的巨额成本。 对于某些小批量应用的场合, 甚至可以直接利用FPGA实现, 无需再去订制专门的数字芯片。文中着重介绍了一种基于FPGA利用VHDL硬件描述语言的数字秒表设计方法, 在设计过程中使用基于VHDL的EDA工具ModelSim对各个模块仿真验证, 并给出了完整的源程序和仿真结果。第二章 设计背景2.1 方案设计本次试验采用如下方案:由基本数字逻辑单元进行设计,它由振荡器产生一定频率的方波脉冲,该信号的频率为48MHz,之后由分频器对方波脉冲进行分频,分别得到实验所需的1KHz和100Hz两种频率,以达到设计电路所需的频率脉冲,100Hz脉冲作为时钟信号驱动计数器进行计数,1KHz作为扫描频率,产生计数信号,最后由一个3-8译码器译码并在数码管上显示。本次试验不需要搭建硬件电路,是基于FPGA的数字秒表设计方法。 采用VHDL硬件描述语言进行软件设计,最后将程序下载到电路板上运行。2.2 系统总体框图本实验所设计的数字秒表主要有分频器计数器、数据锁存器、控制器、扫描计数器、数据选择器和7段译码器,显示电路、按键消抖电路组成。系统框图如下图所示。图 1-12.3 -FPGA实验板我们将在EEC-FPGA实验板上完成秒表的设计实现,实验板原理如图1-3所示。 图 1-22.4 系统功能要求秒表的计时范围为0000”00 5959”99。有两个按钮开关Start/Stop和Split/Reset,控制秒表的启动、停止、分段和复位:在秒表已经被复位的情况下,按下“Start/Stop”键,秒表开始计时。在秒表正常运行的情况下,如果按下“Start/Stop”键,则秒表暂停计时;再次按下该键,秒表继续计时。在秒表正常运行的情况下,如果按下“Split/Reset”键,显示停止在按键时的时间,但秒表仍然在计时;再次按下该键,秒表恢复正常显示。在秒表暂停计时的情况下,按下“Split/Reset”键,秒表复位归零。2.5 开发软件本次试验所用的EDA软件包括ISE10.1和仿真采用的ModelSim。2.5.1 ISE10.1简介ISE的主要功能包括设计输入、综合、仿真、实现和下载,涵盖了可编程逻辑器件开发的全过程,从功能上讲,完成CPLD/FPGA的设计流程无需借助任何第三方EDA软件。ISE涵盖的功能有设计输入、综合、仿真、实现以及下载。设计输入:ISE提供的设计输入工具包括用于HDL代码输入和查看报告的ISE文本编辑器(The ISE Text Editor),用于原理图编辑的工具ECS(The Engineering Capture System),用于生成IP Core的Core Generator,用于状态机设计的StateCAD以及用于约束文件编辑的Constraint Editor等。综合:ISE的综合工具不但包含了Xilinx自身提供的综合工具XST,同时还可以内嵌Mentor Graphics公司的Leonardo Spectrum和Synplicity公司的Synplify,实现无缝链接。 仿真:ISE本身自带了一个具有图形化波形编辑功能的仿真工具HDL Bencher,同时又提供了使用Model Tech公司的Modelsim进行仿真的接口。 实现:此功能包括了翻译、映射、布局布线等,还具备时序分析、管脚指定以及增量设计等高级功能。 下载:包括BitGen,用于将布局布线后的设计文件转换为位流文件,还包括了IMPACT,功能是进行芯片配置和通信,控制将程序烧写到FPGA芯片中去。2.5.2 ModelSim简介ModelSim是Mentor公司的产品。在业界,它被认为是最优秀的HDL语言仿真软件。它提供友好的仿真环境,是支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核。其个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。2.6 VHDL语言简介VHDL全名Very-High-Speed Integrated Circuit HardwareDescription Language,诞生于1982年。VHDL翻译成中文就是超高速集成电路硬件描述语言。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部和内部,即设计实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。现在,VHDL和VERILOG作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。第三章 模块设计3.1 分频器对晶体振荡器产生的48MHz时钟信号进行分频,产生100Hz的时间基准信号。本实验先将晶体震荡的频率分频得到10KHz的信号,再从10KHz信号得到1KHzde扫描频率,最后再产生计数的基准频率。该模块的源代码详见附录1,图2-1为由ISE得到的设计综合图,图2-2为由ModelSim所得到的仿真图。图 2-1 图 2-2由图2-2的分频器仿真图可以发现,本程序依次得到了10KHz、1KHz、100Hz三种不同的频率.3.2 计数器对时间基准脉冲进行计数,完成计时功能。需要从0.01s开始计数,因此需要一个100Hz的时钟产生计数脉冲。完成电子秒表的功能一共需要4个模10计数器和2个模6计数器。下面以以模6计数器为例,其VHDL源程序详见附录2。图2-3为由ISE得到的设计综合图,图2-4为由ModelSim所得到的仿真图。 图2-3 图2-4由图2-4可以发现,当计数器从0计数到5的时候,又从0开始,实现了模6计数的功能。3.3 数据锁存器锁存数据使显示保持暂停。锁存器该模块部分VHDL源程序详见附录3,图2-5为由ModelSim所得到的仿真图。 图2-5由图2-5可以发现,当锁存使能为1时,锁存器的输入和输出一致,接着使锁存使能变为0,给不同的输入信号,锁存输出保持上一次的值不变,即是在锁存使能有效时将当前输入送给输出。3.4 控制器控制计数器的运行、停止以及复位。产生锁存器的使能信号,计数使能信号以及计数清零信号,其状态图如图2-6 图2由图2-6可知,系统要求控制器有三个输出,分别是计数清零、计数使能和正常显示(锁存使能),输入为时钟和两个按键信号。其状态转换关系如表一,其VHDL源程序详见附录4。图2-7为由ISE得到的设计综合图,图2-8为由ModelSim所得到的仿真图。信号状态start/stopsplit/reset11100001S0(111)S0S1S0S0S1(011)S1S3S1S2S2(010)S2S1S2S2S3(001)S3S1S3S0 表一 状态转换关系 图2-7 图2-8由图2-8可以发现,当start_stop为1,split_reset为0时,在时钟上升沿到来的时候输出状态由”011”变为”001”,接着当start_stop为0,split_reset为1时,在时钟上升沿到来的时候输出状态由”001”变为”111”,接着当start_stop为0,split_reset为0时,在时钟上升沿到来的时候输出状态保持”111”。可以分析得出,该控制电路的状态变化符合要求。3.5 扫描控制电路包括扫描计数器、数据选择器和7段译码器,控制8个数码管以扫描方式显示计时结果,该模块部分VHDL源程序详见附录5。图2-9为实验板上的显示电路以及扫描控制及显示译码的电路框图。 图2-93.6 按键消抖电路因为一般情况下按键在按下和松开的瞬间会出现抖动的现象,因此按键消抖电路的作用是消除按键抖动的影响以及保证每按一次键 只输出一个脉冲,其宽度为一个时钟周期。该模块部分VHDL源程序详见附录6。图2-10是由ISE得到的设计综合图。 图2-10第四章 总体设计各部分模块完成后,需要将各个模块组合起来完成数字秒表的整体结构。图3-1为秒表系统的 RTL Schematic 图3-1由图3-1可知,秒表系统的输入只有三个,分别是晶体震荡的时钟信号,两个按键start/stop和splite/reset,系统的输出为段选信号和片选信号。片选信号来自扫描时种下的计数器输出通过3-8译码器得到,从而来控制数码管轮流显示,由于扫描频率使用的是1KHz的时钟,因此人眼不能分辨,故而显示效果为8个数码管同时亮,段选信号来自计数器输出,还有一个OP_EN信号是由计数器产生的进为输出,在该系统中无用,故设置为open。设计输入完成后,进行整体的编译和逻辑仿真,然后进行转换、延时仿真生成配置文件,最后下载至FPGA器件,完成结果功能配置,实现其硬件功能。第五章 结论 该系统运用先进的EDA软件和VHDL,并借助FPGA实现数字秒表的设计,充分体现了现代数字电路设计系统芯片化,芯片化设计的思想突破了传统电子系统的设计模式,使系统开发速度快、成本低、系统性能大幅度地提升。本文所介绍数字秒表设计方法, 采用了当下最流行的EDA设计手段。并借助FPGA实现数字秒表的设计,充分体现了现代数字电路设计系统芯片化,芯片化设计的思想突破了传统电子系统的设计模式,使系统开发速度快、成本低、系统性能大幅度地提升。通过实验验证,本文设计的数字秒表计时准确、 性能稳定, 可以很容易嵌入其他复杂的数字系统,充当计时模块。利用EDA设计工具,结合基于FPGA的可编程实验板, 轻松实现电子芯片的设计, 现场观察实验结果,大大缩短了产品的设计周期和调试周期,提高了设计的可靠性和成功率, 体现了逻辑器件在数字设计中优越性。参考文献1 基于FPGA的数字秒表的设计_杨远成2 一种基于FPGA的数字秒表设计方法_王永维3 电子技术综合实验资料-秒表4 电子技术综合实验资料-ISE开发流程5 电子技术综合实验资料-modelsim仿真流程附录1 分频器VHDL源程序library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity div_fre_1khz_new is Port ( clk : in STD_LOGIC; out_10k:out STD_LOGIC; out_1k : out STD_LOGIC; out_100Hz: out STD_LOGIC);end div_fre_1khz_new;architecture Behavioral of div_fre_1khz_new is signal count_10k_next:std_logic_vector(11 downto 0):=(others=0); signal count_10k_curr:std_logic_vector(11 downto 0):=(others=0); signal count_1k_next:std_logic_vector(3 downto 0):=(others=0); signal count_1k_curr:std_logic_vector(3 downto 0):=(others=0); signal count_100hz_next:std_logic_vector(3 downto 0):=(others=0); signal count_100hz_curr:std_logic_vector(3 downto 0):=(others=0);begin-分频得到10KHz的时钟-P1:process(count_10k_curr) isbeginif count_10k_curr = 4799 thencount_10k_next 0);elsecount_10k_next = count_10k_curr + 1;end if;end process;fre10k:process(clk) isbeginif rising_edge(clk) and clk=1 thencount_10k_curr = count_10k_next;end if;end process;out_10k=count_10k_curr(11);-out_10k =out10k;-利用的到的10KHz分频得到1KHz的时钟-P2:process(count_1k_curr) isbeginif count_1k_curr=9 thencount_1k_next0);elsecount_1k_next=count_1k_curr+1;end if;end process;fre1k:process(count_10k_curr(11) isbeginif rising_edge(count_10k_curr(11) and count_10k_curr(11)=1 thencount_1k_curr=count_1k_next;end if;end process;out_1k=count_1k_curr(3);-利用的到的10KHz分频得到100Hz的时钟-P3:process(count_100hz_curr) isbeginif count_100hz_curr=9 thencount_100hz_next0);elsecount_100hz_next=count_100hz_curr+1;end if;end process;fre100hz:process(count_1k_curr(3) isbeginif rising_edge(count_1k_curr(3) and count_1k_curr(3)=1 thencount_100hz_curr=count_100hz_next;end if;end process;out_100Hz=count_100hz_curr(3);-2 模10和模6计数器VHDL源程序2.1 模10计数器library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity counter_10 isPort ( clk : in STD_LOGIC; rst : in std_logic; carry_in:in std_logic; carry_out:out std_logic; out10 : out STD_LOGIC_VECTOR (3 downto 0);end counter_10;architecture Behavioral of counter_10 issignal con:STD_LOGIC_VECTOR (3 downto 0):=0000;beginprocess(clk,rst)begin if rst = 1 thencon0);elseifrising_edge(clk) and clk=1 thenif carry_in = 1 thenif con=9 thencon0);elsecon=con+1;end if;else null;end if;end if;end if;end process;out10=con;carry_out=1 when carry_in=1 and con=9 else 0;end Behavioral;2 模6计数器library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity counter_10 isPort ( clk : in STD_LOGIC; rst : in std_logic; carry_in:in std_logic; carry_out:out std_logic; out10 : out STD_LOGIC_VECTOR (3 downto 0);end counter_10;architecture Behavioral of counter_10 issignal con:STD_LOGIC_VECTOR (3 downto 0):=0000;beginprocess(clk,rst)begin if rst = 1 thencon0);elseifrising_edge(clk) and clk=1 thenif carry_in = 1 thenif con=9 thencon0);elsecon=con+1;end if;else null;end if;end if;end if;end process;out10=con;carry_out=1 when carry_in=1 and con=9 else 0;end Behavioral;3 锁存器library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity latch isPort ( en : in STD_LOGIC; count_in1 : in STD_LOGIC_VECTOR (3 downto 0); count_in2 : in STD_LOGIC_VECTOR (3 downto 0); count_in3 : in STD_LOGIC_VECTOR (3 downto 0); count_in4 : in STD_LOGIC_VECTOR (3 downto 0); count_in5 : in STD_LOGIC_VECTOR (3 downto 0); count_in6 : in STD_LOGIC_VECTOR (3 downto 0); count_out1 : out STD_LOGIC_VECTOR (3 downto 0); count_out2 : out STD_LOGIC_VECTOR (3 downto 0); count_out3 : out STD_LOGIC_VECTOR (3 downto 0); count_out4 : out STD_LOGIC_VECTOR (3 downto 0); count_out5 : out STD_LOGIC_VECTOR (3 downto 0); count_out6 : out STD_LOGIC_VECTOR (3 downto 0);end latch;architecture Behavioral of latch isbeginprocess(en,count_in1,count_in2,count_in3,count_in4,count_in5,count_in6)beginif en=1 thencount_out1=count_in1;count_out2=count_in2;count_out3=count_in3;count_out4=count_in4;count_out5=count_in5;count_out6=count_in6;end if;end process;end Behavioral;4 控制器library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity control isport( start_stop:in STD_LOGIC; split_rest:in STD_LOGIC;clk_1KHz :in STD_LOGIC; clean: out STD_LOGIC; En:out STD_LOGIC; count_dis:out STD_LOGIC);end control;architecture Behavioral of control issignal state:STD_LOGIC_VECTOR(2 DOWNTO 0):=111;signal SR:STD_LOGIC_VECTOR(1 DOWNTO 0);beginSR statestatestatestatestatestatestatestatestatestate=010;end case;elsestate=111;end if;end if;end process;clean=state(2);En=state(1);count_dis=state(0);end Behavioral;5 扫描显示控制电路library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity display is Port ( clk : in STD_LOGIC; hs_1 : in STD_LOGIC_VECTOR (3 downto 0); hs_2 : in STD_LOGIC_VECTOR (3 downto 0); s_1 : in STD_LOGIC_VECTOR (3 downto 0); s_2 : in STD_LOGIC_VECTOR (3 downto 0); m_1 : in STD_LOGIC_VECTOR (3 downto 0); m_2 : in STD_LOGIC_VECTOR (3 downto 0); shumaguan : out STD_LOGIC_VECTOR (7 downto 0); duanSel : out STD_LOGIC_VECTOR (6 downto 0);- dpsel :out STD_LOGIC;end display;architecture Behavioral of display issignal count:STD_LOGIC_VECTOR(2 downto 0):=000;signal BCD:STD_LOGIC_VECTOR (3 downto 0);signal sig:STD_LOGIC_VECTOR (7 downto 0);-signal dp:STD_LOGIC:=1;-控制小数点的亮与灭begin-完成计数功能-cnt:process(clk) isbeginif rising_edge(clk) and clk=1 thenif count=111 thencount=000;elsecountBCDBCDBCDBCDBCDBCDBCDBCDBCDduanSelduanSelduanselduanselduanselduanselduanselduanselduanselduanselduanselduansel=1111110;end case;-if count=011 or count=110 then-dp=0;-end if;end process;-dpselsigsigsigsigsigsigsigsigsig=11111111;end case;end process;shumaguan=sig;end Behavioral;6 按键消抖电路library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following library declaration if instantiating- any Xilinx primitives in this code.-library UNISIM;-use UNISIM.VComponents.all;entity key_debounce is Port ( clk : in STD_LOGIC; key_in : in STD_LOGIC; key_out : out STD_LOGIC);end key_debounce;architecture Behavioral of key_debounce issignal cnt:std_logic_vector(2 downto 0);signal k1,k2:std_logic;beginP1:process(key_in,clk)beginif key_in=1 thencnt=000;elsif falling_edge(clk) thenif cnt/=7 thencnt=cnt+1;end if;end if;end process;P2:process(clk)beginif falling_edge(clk) then if cnt/=7 thenk1=0;elsek1=1;end if;k2=k1;end if;end process;P3:key_out=(not k1) and k2;end Behavioral;
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!