数字秒表的设计与实现实验报告课件.docx
《数字秒表的设计与实现实验报告课件.docx》由会员分享,可在线阅读,更多相关《数字秒表的设计与实现实验报告课件.docx(27页珍藏版)》请在冰豆网上搜索。
![数字秒表的设计与实现实验报告课件.docx](https://file1.bdocx.com/fileroot1/2023-7/16/091630b2-f864-49da-9188-9e0a09280fba/091630b2-f864-49da-9188-9e0a09280fba1.gif)
数字秒表的设计与实现实验报告课件
电子科技大学
《数字秒表课程设计》
姓名:
xxx
学号:
学院:
指导老师:
xx
摘要
EDA技术作为电子工程领域的一门新技术,极大的提高了电子系统设计的效率和可靠性。
文中介绍了一种基于FPGA在ISE10.1软件下利用VHDL语言结合硬件电路来实现数字秒表的功能的设计方法。
采用VHDL硬件描述语言,运用ModelSim等EDA仿真工具。
该设计具有外围电路少、集成度高、可靠性强等优点。
通过数码管驱动电路动态显示计时结果。
给出部分模块的VHDL源程序和仿真结果,仿真结果表明该设计方案的正确,展示了VHDL语言的强大功能和优秀特性。
关键词:
FPGA,VHDL,EDA,数字秒表
第一章引言
数字集成电路作为当今信息时代的基石,不仅在信息处理、工业控制等生产领域得到普及应用,并且在人们的日常生活中也是随处可见,极大的改变了人们的生活方式。
面对如此巨大的市场,要求数字集成电路的设计周期尽可能短、实验成本尽可能低,最好能在实验室直接验证设计的准确性和可行性,因而出现了现场可编程逻辑门阵列FPGA。
对于芯片设计而言,FPGA的易用性不仅使得设计更加简单、快捷,并且节省了反复流片验证的巨额成本。
对于某些小批量应用的场合,甚至可以直接利用FPGA实现,无需再去订制专门的数字芯片。
文中着重介绍了一种基于FPGA利用VHDL硬件描述语言的数字秒表设计方法,在设计过程中使用基于VHDL的EDA工具ModelSim对各个模块仿真验证,并给出了完整的源程序和仿真结果。
第二章设计背景
2.1方案设计
本次试验采用如下方案:
由基本数字逻辑单元进行设计,它由振荡器产生一定频率的方波脉冲,该信号的频率为48MHz,之后由分频器对方波脉冲进行分频,分别得到实验所需的1KHz和100Hz两种频率,以达到设计电路所需的频率脉冲,100Hz脉冲作为时钟信号驱动计数器进行计数,1KHz作为扫描频率,产生计数信号,最后由一个3-8译码器译码并在数码管上显示。
本次试验不需要搭建硬件电路,是基于FPGA的数字秒表设计方法。
采用VHDL硬件描述语言进行软件设计,最后将程序下载到电路板上运行。
2.2系统总体框图
本实验所设计的数字秒表主要有分频器计数器、数据锁存器、控制器、扫描计数器、数据选择器和7段译码器,显示电路、按键消抖电路组成。
系统框图如下图所示。
图1-1
2.3-FPGA实验板
我们将在EEC-FPGA实验板上完成秒表的设计实现,实验板原理如图1-3所示。
图1-2
2.4系统功能要求
秒表的计时范围为00’00”00~59’59”99。
有两个按钮开关Start/Stop和Split/Reset,控制秒表的启动、停止、分段和复位:
在秒表已经被复位的情况下,按下“Start/Stop”键,秒表开始计时。
在秒表正常运行的情况下,如果按下“Start/Stop”键,则秒表暂停计时;再次按下该键,秒表继续计时。
在秒表正常运行的情况下,如果按下“Split/Reset”键,显示停止在按键时的时间,但秒表仍然在计时;再次按下该键,秒表恢复正常显示。
在秒表暂停计时的情况下,按下“Split/Reset”键,秒表复位归零。
2.5开发软件
本次试验所用的EDA软件包括ISE10.1和仿真采用的ModelSim。
2.5.1ISE10.1简介
ISE的主要功能包括设计输入、综合、仿真、实现和下载,涵盖了可编程逻辑器件开发的全过程,从功能上讲,完成CPLD/FPGA的设计流程无需借助任何第三方EDA软件。
ISE涵盖的功能有设计输入、综合、仿真、实现以及下载。
设计输入:
ISE提供的设计输入工具包括用于HDL代码输入和查看报告的ISE文本编辑器(TheISETextEditor),用于原理图编辑的工具ECS(TheEngineeringCaptureSystem),用于生成IPCore的CoreGenerator,用于状态机设计的StateCAD以及用于约束文件编辑的ConstraintEditor等。
综合:
ISE的综合工具不但包含了Xilinx自身提供的综合工具XST,同时还可以内嵌MentorGraphics公司的LeonardoSpectrum和Synplicity公司的Synplify,实现无缝链接。
仿真:
ISE本身自带了一个具有图形化波形编辑功能的仿真工具HDLBencher,同时又提供了使用ModelTech公司的Modelsim进行仿真的接口。
实现:
此功能包括了翻译、映射、布局布线等,还具备时序分析、管脚指定以及增量设计等高级功能。
下载:
包括BitGen,用于将布局布线后的设计文件转换为位流文件,还包括了IMPACT,功能是进行芯片配置和通信,控制将程序烧写到FPGA芯片中去。
2.5.2ModelSim简介
ModelSim是Mentor公司的产品。
在业界,它被认为是最优秀的HDL语言仿真软件。
它提供友好的仿真环境,是支持VHDL和Verilog混合仿真的仿真器。
它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核。
其个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
2.6VHDL语言简介
VHDL全名Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于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/stop
split/reset
11
10
00
01
S0(111)
S0
S1
S0
S0
S1(011)
S1
S3
S1
S2
S2(010)
S2
S1
S2
S2
S3(001)
S3
S1
S3
S0
表一状态转换关系
图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-9
3.6按键消抖电路
因为一般情况下按键在按下和松开的瞬间会出现抖动的现象,因此按键消抖电路的作用是消除按键抖动的影响以及保证每按一次键只输出一个脉冲,其宽度为一个时钟周期。
该模块部分VHDL源程序详见附录6。
图2-10是由ISE得到的设计综合图。
图2-10
第四章总体设计
各部分模块完成后,需要将各个模块组合起来完成数字秒表的整体结构。
图3-1为秒表系统的RTLSchematic
图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源程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitydiv_fre_1khz_newis
Port(clk:
inSTD_LOGIC;
out_10k:
outSTD_LOGIC;
out_1k:
outSTD_LOGIC;
out_100Hz:
outSTD_LOGIC);
enddiv_fre_1khz_new;
architectureBehavioralofdiv_fre_1khz_newis
signalcount_10k_next:
std_logic_vector(11downto0):
=(others=>'0');
signalcount_10k_curr:
std_logic_vector(11downto0):
=(others=>'0');
signalcount_1k_next:
std_logic_vector(3downto0):
=(others=>'0');
signalcount_1k_curr:
std_logic_vector(3downto0):
=(others=>'0');
signalcount_100hz_next:
std_logic_vector(3downto0):
=(others=>'0');
signalcount_100hz_curr:
std_logic_vector(3downto0):
=(others=>'0');
begin
-----------------------------------------------------------------
---------------分频得到10KHz的时钟------------------
-----------------------------------------------------------------
P1:
process(count_10k_curr)is
begin
ifcount_10k_curr=4799then
count_10k_next<=(others=>'0');
else
count_10k_next<=count_10k_curr+1;
endif;
endprocess;
fre10k:
process(clk)is
begin
ifrising_edge(clk)andclk='1'then
count_10k_curr<=count_10k_next;
endif;
endprocess;
out_10k<=count_10k_curr(11);
--out_10k<=out10k;
-------------------------------------------------------------------
------------利用的到的10KHz分频得到1KHz的时钟-----------------
-------------------------------------------------------------------
P2:
process(count_1k_curr)is
begin
ifcount_1k_curr=9then
count_1k_next<=(others=>'0');
else
count_1k_next<=count_1k_curr+1;
endif;
endprocess;
fre1k:
process(count_10k_curr(11))is
begin
ifrising_edge(count_10k_curr(11))andcount_10k_curr(11)='1'then
count_1k_curr<=count_1k_next;
endif;
endprocess;
out_1k<=count_1k_curr(3);
--------------------------------------------------------------------
------------利用的到的10KHz分频得到100Hz的时钟----------------
--------------------------------------------------------------------
P3:
process(count_100hz_curr)is
begin
ifcount_100hz_curr=9then
count_100hz_next<=(others=>'0');
else
count_100hz_next<=count_100hz_curr+1;
endif;
endprocess;
fre100hz:
process(count_1k_curr(3))is
begin
ifrising_edge(count_1k_curr(3))andcount_1k_curr(3)='1'then
count_100hz_curr<=count_100hz_next;
endif;
endprocess;
out_100Hz<=count_100hz_curr(3);
---------------------------------------------
---------------------------------------------
2模10和模6计数器VHDL源程序
2.1模10计数器
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitycounter_10is
Port(clk:
inSTD_LOGIC;
rst:
instd_logic;
carry_in:
instd_logic;
carry_out:
outstd_logic;
out10:
outSTD_LOGIC_VECTOR(3downto0));
endcounter_10;
architectureBehavioralofcounter_10is
signalcon:
STD_LOGIC_VECTOR(3downto0):
="0000";
begin
process(clk,rst)
begin
ifrst='1'then
con<=(others=>'0');
else
ifrising_edge(clk)andclk='1'then
ifcarry_in='1'then
ifcon=9then
con<=(others=>'0');
else
con<=con+1;
endif;
elsenull;
endif;
endif;
endif;
endprocess;
out10<=con;
carry_out<='1'whencarry_in='1'andcon=9else'0';
endBehavioral;
2模6计数器
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitycounter_10is
Port(clk:
inSTD_LOGIC;
rst:
instd_logic;
carry_in:
instd_logic;
carry_out:
outstd_logic;
out10:
outSTD_LOGIC_VECTOR(3downto0));
endcounter_10;
architectureBehavioralofcounter_10is
signalcon:
STD_LOGIC_VECTOR(3downto0):
="0000";
begin
process(clk,rst)
begin
ifrst='1'then
con<=(others=>'0');
else
ifrising_edge(clk)andclk='1'then
ifcarry_in='1'then
ifcon=9then
con<=(others=>'0');
else
con<=con+1;
endif;
elsenull;
endif;
endif;
endif;
endprocess;
out10<=con;
carry_out<='1'whencarry_in='1'andcon=9else'0';
endBehavioral;
3锁存器
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--library