找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3957|回复: 0
打印 上一主题 下一主题
收起左侧

EDA,FPGA设计,有谁可以帮忙吧这个程序改成1602显示

[复制链接]
跳转到指定楼层
#
ID:115394 发表于 2017-6-14 16:24 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
200黑币
现代电子技术综合实验
秒表
         
                              时间:2013年6月6日  
摘 要
随着电子信息产业的不断发展,基于FPGA的应用技术发展迅速,在某些领域FPGA正逐步代替dsp、arm、单片机等微处理器。本文设计一个基于FPGA技术的数字秒表。首先,我们把晶振产生的50MHZ时钟信号送入FPGA芯片内,经FPGA内分频模块处理产生1KHZ时钟信号。秒表的功能模块由VHDL语言编写,在Xilinx的ISE环境下调试,并在Modelsim上完成仿真,在最后把产生的信号送入LED显示电路里进行显示。本文从电子秒表的具体设计触发,详细阐述了基于FPGA的数字秒表的设计方案,设计了各模块的代码,并对硬件电路进行了仿真。
关键词:FPGA,VHDL,电子秒表
第一章  引言
随着电子信息产业的发展,数字系统的规模越来越大,更多采用自顶而下的模块化设计方法,这就要求技术人员对于基本的模块有着深入的理解。随着FPGA技术的发展和成熟,用FPGA来做为一个电路系统的控制电路逐渐显示出其无与伦比的优越性。因此本文采用FPGA来做为电路的控制系统,采用模块化的设计方法设计一个能显示从00-00-00到59-59-99,并且具备秒表所有功能的小型数字系统。
第二章  基于FPGAVHDL设计流程2.1  概述
数字秒表是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。秒表的设计有传统方法和现代方法,传统的设计方法耗时耗功,设计强度大,且容易出错,设计的质量不一定是最好的。自然我们考虑到现代方法,即二十世纪八十年代兴起的电子设计自动化技术,英文为Electronic Design Auto,缩写为EDA。在EDA设计工具中,用的最广泛的是VHDL和VERILOG,当然还有其它的。比较VHDL和VERILOG,在顶层设计方面VHDL优于VERILOG,在门级电路设计方面VERILOG优于VHDL。随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言,将使整个系统大大简化,提高整体的性能和可靠性。
2.2  VHDL语言介绍
VHDL(Very-high-speed IntegratedCircuit Hardware Description Language)诞生于1982年。1987年底,VHDL被IEEE(The Institute ofElectrical and Electronics Engineers)和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本(IEEE-1076)之后,各EDA公司相继推出了自己的VHDL设计环境,并宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。现在,VHDL和VERILOG作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL和VERILOG语言将承担起--几乎全部的数字系统设计任务。
2.2.1  VHDL的特点
VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式,描述风格以及句法十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称为设计实体(可以是一个元件、一个电路模块或一个系统)分成外部(又称为可视部分,即端口)和内部(又称为不可视部分),即设计实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其它的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。应用VHDL进行工程设计的优点是多方面的,具体如下:
1、与其它的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。就目前流行的EDA工具和VHDL综合器而言,将基于抽象的行为描述风格的VHDL程序综合成为具体的FPGA和CPLD等目标器件的网表文件已不成问题,只是在综合与优化效率上略有差异。
2、VHDL最初是作为一种仿真标准格式出现的,因此VHDL既是一种硬件电路描述和设计语言,也是一种标准的网表格式,还是一种仿真语言。其丰富的仿真语句和库函数,使得在任何大系统的设计早期(即尚未完成),就能用于查验设计系统的功能可行性,随时可对设计进行仿真模拟。即在远离门级的高层次上进行模拟,使设计者对整个工程设计的结构和功能的可行性做出决策。
3、VHDL语句的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计的再利用功能,符合市场所需求的,大规模系统高效、高速的完成必须由多人甚至多个开发组共同并行工作才能实现的特点。VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有力的支持。
4、对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动地把VHDL描述设计转变成为门级网表。这种方式突破了门级电路设计的瓶颈,极大地减少了电路设计的时间和可能发生的错误,降低了开发成本。应用EDA工具的逻辑优化功能,可以自动地把一个综合后的设计变成一个更高效、更高速的电路系统。反过来,设计者还可以容易地从综合和优化后的电路获得设计信息,返回去更新修改VHDL设计描述,使之更为完善。
5、VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。正因为VHDL硬件描述与具体的工艺技术和硬件结构无关,VHDL设计程序的硬件实现目标器件有广阔的选择范围,其中包括各系列的CPLD、FPGA及各种门阵列实现目标。
6、由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需要改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
2.2.2  基于VHDL的自顶向下设计方2.2.2.1  自顶向下设计的步骤
1、设计说明:用自然语言表达系统项目的功能特点和技术参数等。
2、建立VHDL行为模型,即将设计说明已转化为VHDL行为模型。建立模型是为了通过VHDL仿真器对整个系统进行系统行为仿真和性能评估。
3、VHDL行为仿真。这一阶段可以利用VHDL仿真器对顶层系统的行为模型进行仿真测试,检查模拟结果,继而进行修改和完善。
4、VHDL-RTL级建模。即将VHDL的行为模型表达为VHDL行为代码。
5、前端功能仿真。即对VHDL-RTL级模型进行仿真,简称功能仿真。
6、逻辑综合。使用逻辑综合工具将VHDL行为代码描述转化为结构化的门级电路。
7、测试向量生成。
8、功能仿真。
9、结构综合。
10、门级时序仿真。
11、硬件测试。
2.2.2.2  Top-down设计方法的优点
1、完全符合设计人员的设计思路;从功能描述开始,到最后的物理实现。
2、功能设计可完全独立于物理实现;采用Top-Down设计方法,功能输入采用国际标准的HDL输入方法,HDL可不含有任何器件的物理信息,因此工程师可以有更多的空间去集中精力进行功能描述。设计师可以在设计过程的最后阶段任意选择或更改物理器件,不会在设计一开始就受到最终所采用器件的约束。
3、设计可再利用;设计结果完全可以以一种知识产权(IP-IntellectualProperty)的方式作为设计师或设计单位的设计成果,应用于不同的产品设计中,做到成果的再利用。
4、易于设计的更改;设计工程师可在极短的时间内修改设计,对各种FPGA/CPLD结构进行设计结果规模(门消耗)和速度(时序)的比较,选择最优方案。
5、设计和处理大规模复杂电路;目前的FPGA/CPLD器件正向高集成度、深亚微米工艺发展。为设计系统的小型化,低功耗、高可靠性等提供了集成的手段。
6、设计周期缩短,生产率大大提高,产品上市时间提前,性能明显提高,产品竞争力加强。据统计,采用Top-Down设计方法的生产率可达到传统设计方法2到4倍。
2.3  FPGA开发介绍2.3.1  FPGA简介
现场可编程门阵列(FPGA)器件是八十年代中期出现的新产品,它的应用大大地方便了IC的设计,因而随着数字技术日益广泛的应用,以FPGA为代表的ASIC器件得到了迅速的普及和发展,器件集成度和速度都在高速增长。
传统的电路设计过程是:先画原理图、把原理图绘制成印制电路板图、再制版、安装、调试。有了FPGA,我们只需要在计算机上绘出原理图,再运行相应的软件,就可把所设计的逻辑电路在FPGA中实现。所有步骤均可自动完成。电子设计工程师自己设计专用集成电路成为了一件很容易的事情。
FPGA作为专用集成电路(ASIC)概念上的一个新型范畴和门类,以其高度灵活的用户现场编程方式,现场定义高容量数字单片系统的能力,能够重复定义、反复改写的新颖功能,为复杂数字系统设计、研制以及产品开发提供了有效的技术手段。电子应用设计工程师应用FPGA技术不仅可避免通常ASIC单片系统设计周期长,前期投资风险大的弱点,而且克服了过去板级通用数字电路应用设计的落后,繁琐和不可靠性。
目前FPGA的两个重要发展与突破是,大多数厂商在其高端器件上都提供了片上的处理器(如CPU、DSP)等硬核(Hard Core)或固化核(Fixed Core)。比如Xilinx的Virtex II Pro芯片可以提供Power PC,而Altera的Stratix、Excalibur等系列芯片可以提供Nios、DSP和Arm等模块。在FPGA上集成微处理器,使SOPC设计更加便利与强大。另一个发展是在不同器件商推出的高端芯片上大都集成了高速串行收发器,一般能够达到3Gb/s以上的数据处理能力,在Xilinx、Altera、Lattice都有相应的器件型号提供该功能。这些新功能使FPGA的数据吞吐能力大幅度增强。
2.3.2  FPGA设计流程
对于目标器件为FPGA和CPLD的HDL设计,其工程设计的基本流程如图 2-1所示。现具体说明如下。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
图 2-1 EDA设计流程
1、文本编辑
用任何文本编辑器都可以进行,通常VHDL文件保存为vhd文件,Verilog文件保存为v文件。
2、使用编译工具编译源文件
HDL的编译器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的编译器。
3、逻辑综合
将源文件调入逻辑综合软件进行综合。综合的目的是在于将设计的源文件由语言转换为实际的电路。但是此时还没有在芯片中形成真正的电路。这一步的最终目的是生成门电路级的网表(Netlist)。
4、布局、布线
将第3步生成的网表文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到CPLD/FPGA内。这一步的目的是生成用于下载(编程Programming)的编程文件。在这一步,将用到第3步生成的网表,并根据CPLD/FPGA厂商的器件容量,结构等进行布局、布线。这就好像在设计PCB时的布局布线一样。先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位。然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来。最后,生成一个供编程的文件。这一步同时还会加一些时序信息(Timing)到你的设计项目中去,以便于你做后仿真。
5、后仿真
利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。(也叫布局布线仿真或时序仿真)。这一步主要是为了确定你的设计在经过布局布线之后,是不是还满足你的设计要求。
6、编程,下载
如果前几步都没有发生错误,并且符合设计要求,这一步就可以将由适配器等产生的配置或下载文件通过编程器或下载电缆下载到目标芯片中。
7、硬件测试
硬件测试的目的是为了在更真实的环境中检验HDL设计的运行情况,特别是对于HDL程序设计上不是十分规范,语义上含有一定歧义的程序。


第三章  数字秒表的软件开发环境
本章主要介绍项目中将要用到了一系列软件,包括用于VHDL语言编写和编译的ISE软件和用于程序仿真的仿真软件ModelSim。
3.1  开发环境
随着可编程器件纷纷超越百万门级,设计者面临的产品性能与设计效率的挑战也越来越大。设计者必须合理选择各EDA厂家提供的加速设计的工具软件,这样才能在较短的时间内设计出高效稳定的产品。在本次设计中,由于选择的FPGA芯片是由Xilinx公司生产的,所以我们主要使用ModelSim和ISE软件进行仿真和综合。
3.2 ModelSim介绍
ModelSim支持PC和UNIX平台,是单一内核支持VHDL和Verilog混合仿真的HDL语言仿真器。ModelSim不仅可以完成设计的功能验证,也可实现逻辑综合后的门级仿真以及布局布线后的功能与时序验证。
ModelSim完全支持VHDL和Verilog标准;采用直接编辑技术,大大提高HDL编译和仿真速度。还可以利用ModelSim调用设计文件进行仿真分析。在调试环境中,设计者可以通过ModelSim的快速调试步骤以及对各种信号的监控功能(无论信号处于VHDL层,还是处于混合语言层)使仿真的执行过程形象直观化,帮助设计者及时发现漏洞,缩短设计周期。
ModelSim最大的特点是其强大的调试功能:先进的数据流窗口,可以迅速追踪到生产不定或者错误状态的原因;性能分析工具帮助分析性能瓶颈,加速仿真;代码覆盖率检查确保测试的完备;多种模式的波形比较功能;先进的 SignalSpy功能,可以方便地访问VHDL或者VHDL和Verilog混合设计中的底层信号;支持加密IP;可以实现与Matlab的Simulink的联合仿真。
3.2.1  ISE环境中ModelSim的使用
ModelSim是一个独立的仿真工具,它在工作的时候并不需要其他软件的协助,在Xilinx公司的ISE集成开发环境中给ModelSim仿真软件预留了接口,通过这个接口可以从ISE集成环境中直接启动ModelSim工具进行仿真。这个过程通常会给初学者一个错觉,以为ISE集成环境和ModelSim工具是联合工作的,其实ISE并没有集成ModelSim工具,只是预留了软件接口。为了说明ModelSim的用户接口,将使用从ISE集成开发环境中直接启动ModelSim仿真工具的方法。使用此种方法启动ModelSim工具需要具备3个条件:第一,启动ISE集成开发环境并建立了一个FPGA/CPLD的工程项目;第二,添加设计源代码并且编译通过;第三,使用ISE中的TestFixture或者TestBenchWaveform工具为当前的设计提供一个测试模板(Testbench),并且在测试模板中添加设计激励。只有上述条件具备之后才可以从ISE的当前资源操作窗中直接启动ModelSim工具并运行仿真,以下使用ISE自带的一个例子加以说明。
在ISE中直接启动ModelSim
1、在Windows操作系统中选择[开始]/[程序]/[Xilinx ISE 6]/[Project Navigator]命令,启动ISE集成开发环境。
2、在ISE主窗口中选择[File]/[Open Example]命令,弹出[Open Example]对话框,如图所示,然后在[Select an ExampleProject]栏目中选择“goldcode-ver-217”,在[Destination Directory]中选择项目存放的目录,单击OK按钮打开例子程序。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
图3-1 打开例子程序
3、在资源管理窗口(Source in Project)中的模块视图(Model View)中选中的测试文件“testbench.tf”,在相应的当前资源操作窗口(Process for CurrentSource)中将会出现与Modelsim仿真器相关的行为仿真(Simulate BehavioralVerilog Model),翻译后仿真(Simulate Post-Map Verilog Model)和布局布线后仿真(Simulate Post-Place& Route Verilog Model)等4个不同的操作选项,如图所示:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
图 3-2 Modelsim 仿真
4、双击[Simulate BehavioralModel]操作选项,将启动Modelsim仿真器。
5、在Modelsim主窗口中选择[View]/[All]命令,将显示所有的窗口。
在当前资源操作窗口中选择任意一个操作选项都可以启动相应阶段的仿真操作,如果相应阶段的仿真文件不存在,那么集成环境将自动生成仿真文件。例如,当双击资源操作窗口中的[Simulate Post-Place& Route Verilog Model]操作选项时将启动时序仿真,而这一仿真过程所需要的布局布线后仿真文件以及时序标注文件都还没有产生,那么ISE集成开发环境将自动开始对这个工程进行编译,综合,翻译,映射和布局布线等操作,得到布局布线后仿真文件以及时序标注文件,然后再启动ModelSim仿真器进行时序仿真。
3.3  ISE介绍
本节主要介绍在XILINX的ISE集成软件环境中,如何用VHDL和原理图的方式进行设计输入,如何用ModelSim仿真工具对设计进行功能仿真和时序仿真,如何实现设计。
3.3.1  建立项目工程
建立新的项目工程,选择【File】,再选择【New Project】,如图就可以了。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
图 3-3 ISE建立新工程
选择使用的可编程器件类型device family-器件族名device-器件型号package-封装speed grade-速度top-level module type-顶层文件类型synthesis tool-综合工具simulator-仿真工具generated simulationlanguage-生成的仿真模型语言。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
图 3-4 选择器件
然后一路NEXT,最后点击完成。刚生成的工程是没有类型的,需要自己加入。方法是在 sources in project中右击,选择add sources,选择你写的文件加入即可。如果要新写程序,用同样的方法,选择new sources即可,会弹出如下对话框,让你选择New Sources的类型。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
图 3-5 选择NewSources的类型
选择vhdl module,写上文件名,在下一页可以写上输入输出口,也可以不写。一路NEXT到完成就可以。这样就可以开始写代码或继续下一步综合了。要打开或编辑新建的文件,直接在sources in project窗口中双击该文件即可。
3.3.2  行为仿真
1、在工程项窗口Project Window的源文件中选中计数器(counter.vhd)。
2、选择Project/New Source。
3、在新的对话框中选择新文件类型为Test Bench Waveform。
4、键入文件名为counter_tbw。
5、点击Next,在其他工程项中你可以将你的testbench波形与其他源文件关联。
6、一直Next直到Finish,此时HDL Bencher 程序自动启动并等候你输入所需的时序需求,你现在可以指定仿真所需的时间参数、时钟高电平时间和时钟低电平时间一起定义了设计操作必须达到的时钟周期,输入建立时间定义了输入在什么时候必须有效,输出有效延时,定义了有效时钟沿到达后多久必须输出有效数据。
默认的初始化时间设置如下:
时钟高电平时间:  Clock high time: 50 ns 。
时钟低电平时间:  Clock low time: 50 ns 。
输入建立时间:   Input setup time: 10 ns 。
输出有效时间: Output valid delay: 10 ns 。
7、点击OK,接受默认的时间设定。Testbench waveform窗口如下。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
图 3-6 Testbench Waveform
在HDL Bencher 的波形中,初始化计数器输入如下:
在每个单元的蓝色区域输入激励。
a、在CLK第1周期下点击RESET单元直到该单元变为。
b、在CLK第2周期下点击RESET单元直到该单元变为低。
c、在CLK第3周期下点击CE单元直到该单元变为高。
d、在CLK第2周期下点击DIR单元直到该单元变为高。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
图 3-7 激励输入
e、将你的testbench文件存盘,选择File/Save Waveform或点击工具栏的存盘图标,接下来HDL Bencher会提示你设置你希望仿真的时钟周期数。
f、在End the testbench __cycles after the last input assignment对话框中输入8,默认值为1。
g、点击OK.退出HDL Bencher新的testbench波形源文件counter_tbw.tbw自动加入到该工程项中。
8、生成预期的输出响应:
我们进行行为仿真以验证计数器模块的功能。
a、在Sources in Project窗口中选择counter_tbw.tbw文件。
b、在Processes for CurrentSource窗口中点击+ 符号展开ModelSim仿真器的层次结构找到并双击Simulate BehavioralVHDL Model,此时ModelSim仿真器自动启动。
c、对于第一次运行ModelSim的用户会显示一个对话框需要在其中做以下处理:选中Do not show thisdialog again选项,点击Run ModelSim此对话框在你重新安装或重新配置ModelSim之前将不再显示你的仿真结果现在显示在ModelSim的波形窗口(wave window)。
d、点击Zoom / Zoom Full;点击Zoom / Zoom in。
e、拖动波形窗口下端的滚动条至窗口的最左端。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg
图 3-8 仿真图
3.3.3  建立顶层原理图3.3.3.1  生成原理图符号
1、在Sources in Project窗口中选中计数器模块counter.vhd。
2、在Processes for CurrentSource窗口中,点击设计输入实用程序(Design Entry Utilities)之前的“+”符号然后双击创建原理图符号(Create SchematicSymbol)经过以上步骤,名称为“counter”的图形化元件被放入到工程项库中。
3.3.3.2  创建顶层原理图
1、在工程项导航器(Project Navigator)菜单中,选择Project/New Source。
2、选择原理图(Schematic)为源类型。
3、输入原理图名为“top”。
4、先点击“Next”再点击“Finish”,此时原理图编辑器(ECS)自动启动并在其原理图窗口中打开一张空图。
3.3.3.3  例化VHDL模块
1、在菜单中选择Add / Symbol或者在工具栏中点击(Add Symbol)图标。
2、从元件符号列表(在屏幕右侧)中选择计数器counter,注意不要在类别(Categories)窗口中作任何选择。
3、点击左键可将计数器counter放置在光标所在的位置出现。
4、按ESC键退出添加符号(Add Symbol)模式。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
图3-9 例化VHDL模块
3.3.3.4  原理图连线
1、首先激活划线功能通过在菜单中选择Add/Wire或者在工具栏中点击 (Add Wire)图标。
2、添加一根悬空线和延展连线,在计数器模块的某一管脚单击鼠标,然后将连线拉伸到需要的长度。再在连线端点处双击鼠标,给计数器模块的每一管脚添加连线。
3、添加两个元件符号之间的连线,在一个计数器模块的管脚处单击鼠标,在另一个计数器模块的对应管脚处双击鼠标。连接好线后按ESC键退出添加连线(Add/Wire)模式。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg
图3-10 原理图连线
3.3.3.5  添加输入输出管脚标记
1、在菜单中选择Add/ (I/O Marker)或在工具栏中点击(Add I/O Marker)图标,连接好的图如下。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
图3-11 添加输入输出管脚
2、连接步骤:首先为clock,reset,ce,load,dir1和dir2添加输入标记,同时为总线din1(3:0)和din2(3:0)添加输入标记。在工具栏右边的参数单选框中选择输入(Input);将鼠标移动到输入信号线的端点,此时光标处显示出输入标记的图形;点击鼠标左键,输入标记会将网络名或总线名包含在标记图形的内部。
3、按如下步骤为count总线添加双向信号标记。在工具栏右边的参数单选框中选择双向(Bidirectional);将鼠标移动到输出信号线的端点,此时光标处显示出双向信号标记的图形;点击鼠标左键。
4、在菜单中选择File/Save,保存原理图,退出原理图编辑器(ECS)。
3.3.4  综合3.3.4.1  Synthesize综合
当你编写程序后,并把顶层原理图连接好以后,就可以综合了。选中你的顶层文件,双击Synthesize-SynplifyPro。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
图3-12 综合
如果出现上图的小勾,表示综合没有问题。你可以双击View RTL Schematic来查看综合后的RTL原理图。
3.3.4.2  定义输入输出管脚约束
选中顶层文件,双击下图中的Assign Package Pins,该操作会提示系统将生成一个.ucf文件,选择是,系统将自动启动Xilinx Pace。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg
图3-13 分配引脚
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg
图3-14 Xilinx Pace
现在就可以在LOC栏写上管脚名,定义I/O电平类型,输出电流大小等,需要注意的是一些I/O是有特殊用处的,不能胡乱分配。定义完后保存退出。
3.3.5  布局布线
双击Implement Design,会依次执行Translate,Map,Place&Route。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg
图3-15 设计实现
3.3.6  下载及硬件仿真
选中顶层文件,双击运行Generate ProgrammingFile,运行后生成相应的(.Bit)下载文件。该文件将下载到芯片中实现设计。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg
图3-16 生成下载文件
再双击上图Configure Device。运行后跳出下载界面,选择主从下载文式(Slave Serial Mode),点击完成。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg
图3-17 下载方式
右键点击元件,点击Program,选择相应的BIT文件开始下载。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg
图3-18 下载位文件
成功下载后就可以在FPGA板子上运行和测试了。
第四章  数字秒表的设计与实现
一、  项目任务与设计思路
1、实验项目
数字秒表的设计
2、实验指标
晶振输入信号:50MHZ时钟信号
计时范围范围为:00:00:00到59:59:99
按钮开关:start/stop,split/reset
     在秒表已经被复位的情况下,按下start/stop键,秒表开始计时。在秒表正常运行的情况下,如果按下start/stop键,则秒表暂停计时;再次按下该键,秒表继续计时。在秒表正常运行情况下,如果按下split/reset键,显示停止在按键时间,但秒表仍然计时,再次按下该键,秒表恢复正常显示。在秒表暂停计时情况下,按下split/reset键,秒表复位归零。
显示工作方式:用六位BCD七段数码管显示读数。
3、实验思路
根据实验指标,将电路设计分成6个模块:分频器,计数器,锁存器,扫描显示控制,按键消陡,控制电路
二、  基于VHDL方法的设计方案
1、系统需求和解决方案计划
在项目开始设计时,首先要确定系统的需求并发展出一个针对这些需求的计划。
晶振   本设计所用为 50MHz的晶振信号。
分频器
  对晶体振荡器产生的时钟信号进行分频,产生时间基准信号。本设计中将50MHz的信号分频成1KHz的基准频率
计数器
  对时间基准脉冲进行计数,完成计时功能。本设计中采用六进制与十进制计数器级联的形式。
数据锁存器
  锁存数据使显示保持暂停
控制器
  控制计数器的运行、停止以及复位、产生锁存器的使能信号。本设计中为一个moore机,可以让状态编码为相应的输出以方便程序编写。
扫描显示的控制电路
    包括扫描计数器、数据选择器、3*8译码器和7段译码器,控制8个数码管
以扫描方式显示计时结果。本设计中一个八进制的计数器产生的扫描信号同时
完成从锁存器送来的信号的选择以及LED数码管的选择。
按键消抖电路
    消除按键输入信号抖动的影响,输出单脉冲。本设计中采用软件延时的消抖方法。
2、设计方框图
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image040.jpg
四、系统电路设计
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image042.jpg
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image044.jpg
五、系统单元模块设计
1、分频器模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image046.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity fre_div is
    port(clk_50MHz:instd_logic;
    clk_1KHz:outstd_logic
    );
end fre_div;
architecture Behavioral of fre_div is
    signal counter:std_logic_vector(15downto 0);
   
begin
    process(clk_50MHz)
    begin
       ifrising_edge(clk_50MHz) then
           ifcounter=49999 then
              counter<=(others=>'0');
           else
              counter<=counter+1;
           end if;
       end if;   
    end process;
   
    --clk_1KHz <=counter(15);
    clk_1KHz <='1' when counter=49999 else '0';
end Behavioral;
2、计数器模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image048.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity jishuqi is
port( count_en:  in std_logic;
       count_clr:  in std_logic;
       clk:          in std_logic;
        D, D0,D1,D3,D4,D6,D7 : outstd_logic_vector(3 downto 0)
       );
end jishuqi;
architecture Behavioral of jishuqi is
    COMPONENTm10jishu
    PORT(
       clk : INstd_logic;
       count_en : INstd_logic;
       count_clr :IN std_logic;         
       carry_out :OUT std_logic;
       data : OUTstd_logic_vector(3 downto 0)
       );
    END COMPONENT;
    COMPONENTm6jishu
    PORT(
       clk : INstd_logic;
       count_en : INstd_logic;
       count_clr :IN std_logic;         
       carry_out :OUT std_logic;
       data : OUTstd_logic_vector(3 downto 0)
       );
    END COMPONENT;
signal c0,c1,c2,c3,c4,c5 : std_logic;  
begin
    Inst_m10jishu0:m10jishu PORT MAP(
       clk =>clk,
       count_en=> count_en,
       count_clr=> count_clr,
       carry_out=> c0,
       data => D
    );
      
    Inst_m10jishu1:m10jishu PORT MAP(
       clk =>clk,
       count_en=> c0,
       count_clr=> count_clr,
       carry_out=> c1,
       data => D0
    );
      
    Inst_m10jishu2:m10jishu PORT MAP(
       clk =>clk,
       count_en=> c1,
       count_clr=> count_clr,
       carry_out=> c2,
       data => D1
    );
      
    Inst_m10jishu3:m10jishu PORT MAP(
       clk => clk,
       count_en=> c2,
       count_clr=> count_clr,
       carry_out=> c3,
       data => D3
    );
      
    Inst_m6jishu1:m6jishu PORT MAP(
       clk =>clk,
       count_en=> c3,
       count_clr=> count_clr,
       carry_out=> c4,
       data => D4
    );
      
    Inst_m10jishu4:m10jishu PORT MAP(
       clk =>clk,
       count_en=> c4,
       count_clr=> count_clr,
       carry_out=> c5,
       data => D6
    );
      
    Inst_m6jishu2:m6jishu PORT MAP(
       clk =>clk,
       count_en=> c5,
       count_clr=> count_clr,
       carry_out=> open,
       data => D7
    );
end Behavioral;
2.1模十计数器模块:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image050.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entity m10jishu is
port(clk:       in std_logic;
     count_en: in std_logic;
      count_clr: in std_logic;
      carry_out: out std_logic;
      data:      out std_logic_vector(3 downto 0)
    );
end m10jishu;
architecture Behavioral ofm10jishu is
signal c_state,n_state:std_logic_vector(3 downto 0):="0000";
begin
label_1:process(count_en,c_state)
  begin
    if count_en ='1'  then
       ifc_state="1001" then
         n_state<="0000";
       --carry_out <= '1' ;
       else n_state<=c_state+1;
         -- carry_out <='0';
       end if;
    else n_state<=c_state;
    end if;
   
  end process;
label_2:process(clk,count_clr)
begin
  if count_clr='1' then
     c_state<="0000";
  elsif rising_edge(clk) then
     c_state<=n_state;
    end if;
end process;
carry_out <= '1'  when c_state="1001" andcount_en='1' else '0';
data <= c_state;
end Behavioral;
2.2模六计数器:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image052.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity m6jishu is
port(clk:       in std_logic;
     count_en:  in std_logic;
     count_clr: in std_logic;
     carry_out: out std_logic;
     data:      out std_logic_vector(3downto 0)
    );
end m6jishu;
architecture Behavioral of m6jishu is
signal c_state,n_state: std_logic_vector(3 downto 0):="0000";
begin
label_1:process(count_en,c_state)
  begin
    if count_en='1'  then
      if c_state="0101" then
            n_state <= "0000";
           -- carry_out <= '1';
        else n_state<=c_state+1;
           --carry_out <= '0';
       end if;
    else n_state<=c_state;
    end if;
  end process;
label_2:process(clk,count_clr)
begin
  if count_clr='1' then
     c_state<="0000";
  elsif rising_edge(clk) then
     c_state<=n_state;
    end if;
    end process;
   
carry_out <= '1'  whenc_state="0101" and count_en='1' else '0';
data <= c_state;
end Behavioral;
3、扫描显示控制电路
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image054.jpg
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image056.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity smxs_control is
port( clk_1KHz : in std_logic;
       Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7: in std_logic_vector(3 downto 0);  
       DIG: out std_logic_vector(7 downto 0);
       SEG: out std_logic_vector(6 downto 0)
       );
end smxs_control;
architecture Behavioral of smxs_control is
    COMPONENTsaomiaojishu
    PORT(
       clk: IN std_logic;         
       data: OUT std_logic_vector(2 downto 0)
       );
    ENDCOMPONENT;
   
    COMPONENTyima38
    PORT(
       S: IN std_logic_vector(2 downto 0);         
       DIG: OUT std_logic_vector(7 downto 0)
       );
    ENDCOMPONENT;
    COMPONENTdselect
    PORT(
       Q0: IN std_logic_vector(3 downto 0);
       Q1: IN std_logic_vector(3 downto 0);
       Q2: IN std_logic_vector(3 downto 0);
       Q3: IN std_logic_vector(3 downto 0);
       Q4: IN std_logic_vector(3 downto 0);
       Q5: IN std_logic_vector(3 downto 0);
       Q6: IN std_logic_vector(3 downto 0);
       Q7: IN std_logic_vector(3 downto 0);
       S: IN std_logic_vector(2 downto 0);         
       BCD: OUT std_logic_vector(3 downto 0)
       );
    ENDCOMPONENT;
    COMPONENTyima7
    PORT(
       BCD: IN std_logic_vector(3 downto 0);         
       SEG: OUT std_logic_vector(6 downto 0)
       );
    ENDCOMPONENT;
   
signal s :        std_logic_vector(2downto 0);
signal bcd :   std_logic_vector(3 downto 0);         
begin
    Inst_saomiaojishu:saomiaojishu PORT MAP(
       clk=> clk_1KHz,
       data=> s
    );
    Inst_yima38:yima38 PORT MAP(
       S=> s,
       DIG=> DIG
    );
   
    Inst_dselect:dselect PORT MAP(
       Q0=> Q0,
       Q1=> Q1,
       Q2=> Q2,
       Q3=> Q3,
       Q4=> Q4,
       Q5=> Q5,
       Q6=> Q6,
       Q7=> Q7,
       S=> s,
       BCD=> bcd
    );
    Inst_yima7:yima7 PORT MAP(
       BCD=> bcd,
       SEG=> SEG
    );
end Behavioral;
3.1扫描计数模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image058.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entity saomiaojishu is
port(clk:       in std_logic;
      data:      out std_logic_vector(2 downto 0)
    );
end saomiaojishu;
architecture Behavioral ofsaomiaojishu is
    signal c_state,n_state: std_logic_vector(2 downto0):="000";
begin
label_1:process(c_state)
begin
   if c_state="111" then
       n_state <= "000";
    else n_state<=c_state+1;
    end if;
end process;
label_2:process(clk)
begin
    if rising_edge(clk) then
       c_state<=n_state;
    end if;
end process;
data <= c_state;
end Behavioral;
3.2数据选择模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image060.jpg
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitydselect is
port(Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7 : instd_logic_vector(3 downto 0);
       S : in std_logic_vector(2 downto 0) ;
       BCD : out std_logic_vector(3 downto0)  
       );
enddselect;
architectureBehavioral of dselect is
begin
process(Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7,S)
    begin
       if S = "000" then
       BCD <= Q0;
       elsif S = "001" then
       BCD <= Q1;
       elsif S = "010" then
       BCD <= Q2;
       elsif S = "011" then
       BCD <= Q3;
       elsif S = "100" then
       BCD <= Q4;
       elsif S = "101" then
       BCD <= Q5;
       elsif S = "110" then
       BCD <= Q6;
       elsif S = "111" then
       BCD <= Q7;
       else BCD <= "0000";
       end if;
endprocess;
endBehavioral;
3.33*8译码模块         
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image062.jpg
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
        
entityyima38 is
  port( S:in std_logic_vector(2 downto 0) ;
        DIG:out std_logic_vector(7 downto 0)
        );
endyima38;
architectureBehavioral of yima38 is
begin
   WITH S SELECT
   DIG <= "11111110" when"000",
        "11111101" when "001",
        "11111011" when "010",
        "11110111" when "011",
        "11101111" when "100",
        "11011111" when "101",
        "10111111" when "110",
        "01111111" when "111",
        "11111111" when others;
endBehavioral;
3.4、七段译码器模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image064.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity yima7 is
port( BCD : in std_logic_vector(3 downto0);
       SEG: out std_logic_vector(6 downto 0)   
       );
end yima7;
architecture Behavioral of yima7 is
begin
    process(BCD)
    begin
    caseBCD is      
       when "0000"  => SEG <= "0000001";
       when"0001" => SEG <= "1001111" ;
       when"0010" => SEG <= "0010010" ;
       when"0011" => SEG <= "0000110" ;
       when"0100" => SEG <= "1001100" ;
       when"0101" => SEG <= "0100100" ;
       when"0110" => SEG <= "0100000" ;
       when"0111" => SEG <= "0001111" ;
       when"1000" => SEG <= "0000000" ;
       when"1001" => SEG <= "0000100" ;      
       when"1111" => SEG <= "1111110" ;      
       whenothers => SEG <= "1111111" ;
    endcase;
    endprocess;
end Behavioral;
4、按键消抖模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image066.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;-- Uncomment the followinglibrary declaration if using
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 is
  signal k1,k2 :STD_LOGIC;
  signal cnt   : STD_LOGIC_VECTOR(1 downto 0);
  
begin
   process(clk,key_in)
  begin
      if clk'event andclk = '0' then
       if cnt = 3 then
           k1 <='1';
        else
          k1 <= '0';
          cnt <= cnt+ 1;  
        end if;
          k2 <= k1;
     end if;      
      if key_in = '0'then
         cnt <="00";  
      end if;
   end process;
   key_out <= not k1and k2;  
end Behavioral;
4、锁存器模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image068.jpg
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitylatch is
port( D0,D1,D2,D3,D4,D5,D6,D7: in std_logic_vector(3 downto 0);
      latch_en : in std_logic;
      Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7 : outstd_logic_vector(3 downto 0)      
   );
endlatch;
architectureBehavioral of latch is
begin
lable:process(D0,D1,D2,D3,D4,D5,D6,D7,latch_en)
  begin
    if latch_en = '1' then
       Q0<= D0;
        Q1<= D1;
       Q2<= D2;
       Q3<= D3;
       Q4<= D4;
       Q5<= D5;
       Q6<= D6;
       Q7<= D7;
    endif;
   end process;     
endBehavioral;
5、控制电路模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image070.jpg
libraryIEEE;
use IEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitycontrol is
port(clk : in std_logic;
    start : in std_logic;
      reset : in std_logic;
      count_clr : out std_logic;
      count_en : out std_logic;
    latch_en : out std_logic
    );
endcontrol;
architectureBehavioral of control is
signalsr: std_logic_vector(1 downto 0);
signalccl:std_logic_vector(2 downto 0):="111";
signalccl_out : std_logic_vector(2 downto 0) ;
begin
sr<= start & reset;
lable_1:process(sr,ccl)
   begin
    case ccl is
        when "111" =>        
           if sr="10" then ccl_out <= "011";
           else ccl_out <= "111";
           end if;
        when "011" =>
           if sr="01" then ccl_out <= "010";
           elsif sr="10" then ccl_out <= "001";
           else ccl_out <= "011";
           end if;
        when "001" =>
           if sr="01" then ccl_out <= "111";
           elsif sr="10" then ccl_out <= "011";
           else ccl_out <= "001";
           end if;
        when "010" =>
           if sr="01" then ccl_out <= "011";
           else ccl_out <= "010";
           end if;   
        when others => ccl_out <="111";
    end case;
end process;
  lable_2: process(clk)
begin      
        if rising_edge(clk) then
          ccl <= ccl_out;
        end if;   
end process;
count_clr<= ccl(2);
count_en  <= ccl(1);
latch_en  <= ccl(0);  
endBehavioral;
6、数字秒表顶层连接模块
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image071.jpg
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitymiaobiao_top is
port(key1,key2 : in std_logic;
     clk_50MHz : in std_logic;
     DIG : out std_logic_vector(7 downto 0);
     SEG : out std_logic_vector(6 downto 0)
     );
end miaobiao_top;
architectureBehavioral of miaobiao_top is
signalk1,k2,CLK,clr,cen,len : std_logic;
signaldd0,dd1,dd3,dd4,dd6,dd7 : std_logic_vector(3 downto 0);
signalqq1,qq2,qq3,qq4,qq5,qq6,qq7,qq0 : std_logic_vector(3 downto 0);
COMPONENT key_debounce1
PORT(
     clk : IN std_logic;
     key_in : IN std_logic;         
     key_out : OUT std_logic
     );
END COMPONENT;
COMPONENT key_debounce
PORT(
     clk : IN std_logic;
     key_in : IN std_logic;         
     key_out : OUT std_logic
     );
END COMPONENT;
COMPONENT control
PORT(
     clk : IN std_logic;
     start : IN std_logic;
     reset : IN std_logic;         
     count_clr : OUT std_logic;
     count_en : OUT std_logic;
     latch_en : OUT std_logic
     );
END COMPONENT;
COMPONENT fre_div
PORT(
     clk_50MHz : IN std_logic;         
     clk_1KHz : OUT std_logic
     );
END COMPONENT;
COMPONENT jishuqi
PORT(
     count_en : IN std_logic;
     count_clr : IN std_logic;
     clk : IN std_logic;         
     D : OUT std_logic_vector(3 downto 0);
     D0 : OUT std_logic_vector(3 downto 0);
     D1 : OUT std_logic_vector(3 downto 0);
     D3 : OUT std_logic_vector(3 downto 0);
     D4 : OUT std_logic_vector(3 downto 0);
     D6 : OUT std_logic_vector(3 downto 0);
     D7 : OUT std_logic_vector(3 downto 0)
     );
END COMPONENT;
COMPONENT latch
PORT(
     D0 :IN std_logic_vector(3 downto 0);
     D1 : IN std_logic_vector(3 downto 0);
     D2 : IN std_logic_vector(3 downto 0);
     D3 : IN std_logic_vector(3 downto 0);
     D4 : IN std_logic_vector(3 downto 0);
     D5 : IN std_logic_vector(3 downto 0);
     D6 : IN std_logic_vector(3 downto 0);
     D7 : IN std_logic_vector(3 downto 0);
     latch_en : IN std_logic;         
     Q0 : OUT std_logic_vector(3 downto 0);
     Q1 : OUT std_logic_vector(3 downto 0);
     Q2 : OUT std_logic_vector(3 downto 0);
     Q3 : OUT std_logic_vector(3 downto 0);
     Q4 : OUT std_logic_vector(3 downto 0);
     Q5 : OUT std_logic_vector(3 downto 0);
     Q6 : OUT std_logic_vector(3 downto 0);
     Q7 : OUT std_logic_vector(3 downto 0)
     );
END COMPONENT;
COMPONENT smxs_control
PORT(
     clk_1KHz : IN std_logic;
     Q0 : IN std_logic_vector(3 downto 0);
     Q1 : IN std_logic_vector(3 downto 0);
     Q2 : IN std_logic_vector(3 downto 0);
     Q3 : IN std_logic_vector(3 downto 0);
     Q4 : IN std_logic_vector(3 downto 0);
     Q5 : IN std_logic_vector(3 downto 0);
     Q6 : IN std_logic_vector(3 downto 0);
     Q7 : IN std_logic_vector(3 downto 0);         
     DIG : OUT std_logic_vector(7 downto 0);
     SEG : OUT std_logic_vector(6 downto 0)
     );
END COMPONENT;
begin
Inst_key_debounce1: key_debounce PORT MAP(
     clk => CLK,
     key_in => key1,
     key_out=> k1
);
Inst_key_debounce2: key_debounce PORT MAP(
     clk => CLK,
     key_in => key2,
     key_out => k2
);
Inst_control: control PORT MAP(
     clk => CLK ,
     start => k1,
     reset => k2,
     count_clr => clr,
     count_en => cen,
     latch_en => len
);
     Inst_fre_div: fre_div PORT MAP(
     clk_50MHz => clk_50MHz,
     clk_1KHz => CLK
);
Inst_jishuqi: jishuqi PORT MAP(
     count_en => cen,
     count_clr => clr,
     clk => CLK,
     D => open,
     D0 => dd0,
     D1 => dd1,
     D3 => dd3,
     D4 => dd4,
     D6 => dd6,
     D7 => dd7
);
     Inst_latch: latch PORT MAP(
     D0 => dd0,
     D1 => dd1,
     D2 => "1111",
     D3 => dd3,
     D4 => dd4,
     D5 => "1111",
     D6 => dd6,
     D7 => dd7,
     latch_en => len,
     Q0 => qq0,
     Q1 => qq1,
     Q2 => qq2,
     Q3 => qq3,
     Q4 => qq4,
     Q5 => qq5,
     Q6 => qq6,
     Q7 => qq7
);
Inst_smxs_control: smxs_control PORT MAP(
     clk_1KHz => CLK,
     Q0 => qq0,
     Q1 => qq1,
     Q2 => qq2,
     Q3 => qq3,
     Q4 => qq4,
     Q5 => qq5,
     Q6 => qq6,
     Q7 => qq7,
     DIG => DIG,
     SEG => SEG
);
endBehavioral;
三、  系统硬件实现与调试
管脚分配:
NET "DIG[0]" LOC =P81;
NET "DIG[1]" LOC =P85;
NET "DIG[2]" LOC =P83;
NET "DIG[3]" LOC =P82;
NET "DIG[4]" LOC =P43;
NET "DIG[5]" LOC =P74;
NET "DIG[6]" LOC =P59;
NET "DIG[7]" LOC =P51;
NET "clk_50MHz" LOC= P128;
NET "key1" LOC =P47;
NET "key2" LOC = P48;
NET "SEG[0]" LOC =P53;
NET "SEG[1]" LOC =P54;
NET "SEG[2]" LOC =P77;
NET "SEG[3]" LOC =P76;
NET "SEG[4]" LOC =P58;
NET "SEG[5]" LOC =P75;
NET "SEG[6]" LOC =P52;
第五章  实验总结及心得体会
1、这次实验是利用VHDL语言完成基于FPGA的数字秒表的设计与实现。通过实验掌握了设计方案以及各模块的设计过程及其实现的功能,及对设计中遇到的问题分析和解决方法;学会了利用ISE和ModelSim对设计进行了仿真,分析,综合还熟悉了Xilinx ISE 和ModelSim软件的用法和VHDL 的编程环境,,并最终下载到Spartan3E系列芯片中,实现了对数字秒表的测量。
2、通过《电子技术综合实验》课程的学习,我第一次接触到VHDL语言,并学会了用VHDL语言设计简单的电路模块。使我对系统设计原理、主要性能参数的选择原则、单元电路和系统电路设计方法及仿真技术、测试方案拟定及调测技术有了初步了解;初步掌握电子技术中应用开发的一般流程,初步建立起有关系统设计的基本概念,掌握其基本设计方法,为将来走出校园从事电子技术应用和研究工作打下基础

FPGA秒表实验报告.docx

1.63 MB, 下载次数: 3

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表