FPGA频率计实验报告 - 范文中心

FPGA频率计实验报告

02/18

数字频率计

用VHDL 语言设计实现基于FPGA 的数字频率计

学校:

学院:

姓名:

学号:

实验室:

实验日期:

摘要

本文介绍了一种基于FPGA 的数字频率的实现方法。该设计采用硬件描述语言VHDL ,在软件开发平台ISE 上完成。该设计的频率计有三种闸门选择,分别是1s 、0.1s 、0.01s ,能较准确的测量频率在10Hz 到10MHz 之间的信号。使用ModelSim 仿真软件对各个模块的VHDL 程序做了仿真,对各个模块的功能进行了测试,并完成了综合布局布线,最终下载到芯片上取得了良好测试效果。

关键词:VHDL 、 频率计、 FPGA、 测量

目 录

第一章 引言 ..................................... 错误!未定义书签。

第二章 基于FPGA 的VHDL 设计流程 .................................. 3

2.1 概述 ........................................................ 3

2.2 VHDL 语言和V ERILOG HDL 介绍 ................................... 3

2.2.1 VHDL的特点 ............................................. 4

2.3 FPGA 介绍 . ................................................... 5

第三章 数字频率计的软件开发环境 ................. 错误!未定义书签。

3.1 开发环境 .................................................... 6

3.2 M ODEL S IM 介绍 ................................................. 6

3.3 ISE 介绍 . .................................................... 5

第四章 数字频率计的设计与实现 .................................... 7

4.1 任务要求 .................................................... 7

4.2 测量原理 ................................... 错误!未定义书签。

4.3 设计方案与系统需求 .......................................... 7

4.4 各模块的功能及实现 .......................................... 9

4.4.1 分频器 .................................................. 9

4.4.2 闸门选择器 ............................................. 10

4.4.3 测频控制器 ............................. 错误!未定义书签。

4.4.4 计数器 ................................. 错误!未定义书签。

4.4.5 锁存器 ................................. 错误!未定义书签。

4.4.6 显示控制系统 ........................... 错误!未定义书签。 4.5 分配引脚和下载实现 .......................... 错误!未定义书签。

4.6 误差分析 ................................... 错误!未定义书签。

第五章 实验结论及总结 ........................................... 19

参考文献..................................................................................................................... 20

致 谢 ........................................................... 21 附 录 ........................................... 错误!未定义书签。

第一章、引言

硬件描述语言(英文: Hardware Description Language ,简称: HDL )是电子系统硬件行为描述、结构描述、数据流描述的语言。利用这种语言,数字电路系统的设计可以从顶层到底层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。

以硬件描述语言(Verilog 或VHDL )所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND 、OR 、XOR 、NOT )或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA 里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip -flop )或者其他更加完整的记忆块。

在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。所谓“频率”,就是周期信号在单位时间(秒)内变化的次数,若在一定的时间间隔T 内计得某

N 周期信号的重复变化次数为N ,则该信号的频率为f 。测量频率的方法有多T

种, 其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。 本文使用的是直接测频法。

第二章、基于FPGA 的VHDL 设计流程

2.1 概述

频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。闸门时间也可以大于或小于一秒。闸门时间越长,得到的频率值就越准确,但闸门时间越长则没测一次频率的间隔就越长。闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。本文中,数字频率计是用数字显示被测信号频率的仪器,限于实验条件等,被测信号只能是方波。

数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。频率计的设计有传统方法和现代方法,传统的设计方法耗时耗功,设计强度大,且容易出错,设计的质量不一定是最好的。自然我们考虑到现代方法,即二十世纪八十年代兴起的电子设计自动化技术,英文为Electronic Design Auto,缩写为EDA 。在EDA 设计工具中,用的最广泛的是VHDL 和VERILOG ,当然还有其它的,例如sopc 。比较VHDL 和VERILOG ,在顶层设计方面VHDL 优于VERILOG ,在门级电路设计方面VERILOG 优于VHDL 。随着复杂可编程逻辑器件(CPLD )的广泛应用,以EDA 工具作为开发手段,运用VHDL 语言,将使整个系统大大简化,提高整体的性能和可靠性。本次的频率计设计主要是顶层设计,目的是设计6位十进制频率计,学习常用的数字系统设计方法。采用VDHL 编程设计实现的数字频率计,除被测信号的整形部分、键输入部分以外,其余全部在一片FPGA 芯片上实现,整个系统非常精简,而且具有灵活的现场可更改性。在不更改硬件电路的基础上,对系统进行各种改进还可以进一步提高系统的性能。该数字频率计具有高速、精确、可靠、抗干扰性强和现场可编程等优点。

2.2 VHDL语言和Verilog HDL介绍

VHDL 诞生于1982年。在1987年底,VHDL 被IEEE 和美国国防部确认为标准硬件描述语言。自IEEE 公布了VHDL 的标准版本,IEEE-1076(简称87版) 之后,各EDA 公司相继推出了自己的VHDL 设计环境,或宣布自己的设计工具可以和VHDL 接口。此后VHDL 在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。而Verilog HDL 是由GDA(Gateway Design Automation) 公司的PhilMoorby 在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby 推出它的第三个商用仿真器Verilog-XL, 获得了巨大的成功,从而使得Verilog HDL 迅速得到

推广应用。1989年CADENCE 公司收购了GDA 公司,使得VerilogHDL 成为了该公司的独家专利。1990年CADENCE 公司公开发表了Verilog HDL,并成立LVI 组织以促进Verilog HDL成为IEEE 标准,即IEEE Standard 1364-1995。由于GDA 公司本就偏重于硬件,所以不可避免地Verilog HDL就偏重于硬件一些,故Verilog HDL的底层统合做得非常好。而VHDL 的逻辑综合就较之Verilog HDL要出色一些。所以,Verilog HDL作重强调集成电路的综合,而VHDL 强调于组合逻辑的综合。

2.2.1 VHDL的特点

VHDL 是一种用普通文本形式设计数字系统的硬件描述语言,主要用于描述数字系统的结构、行为、功能和接口,可以在任何文字处理软件环境中编辑。除了含有许多具有硬件特征的语句外,其形式、描述风格及语法十分类似于计算机高级语言。VHDL 程序将一项工程设计项目(或称设计实体)分成描述外部端口信号的可视部分和描述端口信号之间逻辑关系的内部不可视部分,这种将设计项目分成内、外两个部分的概念是硬件描述语言(HDL )的基本特征。当一个设计项目定义了外部界面(端口),在其内部设计完成后,其他的设计就可以利用外部端口直接调用这个项目。VHDL 的主要特点如下:

(1)作为HDL 的第一个国际标准,VHDL 具有很强的可移植性。

(2)具有丰富的模拟仿真语句和库函数,随时可对设计进行仿真模拟,因而能将设计中的错误消除在电路系统装配之前,在设计早期就能检查设计系统功能的可行性,有很强的预测能力。

(3)VHDL 有良好的可读性,接近高级语言,容易理解。

(4)系统设计与硬件结构无关,方便了工艺的转换,也不会因工艺变化而使描述过时。 (5)支持模块化设计,可将大规模设计项目分解成若干个小项目,还可以把已有的设计项目作为一个模块调用。

(6)对于用VHDL 完成的一个确定设计,可以利用EDA 工具进行逻辑综合和优化,并能自动地把VHDL 描述转变成门电路级网表文件。

(7)设计灵活,修改方便,同时也便于设计结果的交流、保存和重用,产品开发速度快,成本低。

VHDL 是一种快速的电路设计工具,其功能涵盖了电路描述、电路合成、电路仿真等设计工作。VHDL 具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门电路级三个不同层次的设计,能够完成从上层到下层(从抽象到具体)逐层描述的结构化设计思想。

用VHDL 设计电路主要的工作过程是:

1)编辑。用文本编辑器输入设计的源文件(为了提高输入效率,可用某些专用编辑器)。

2)编译。用编译工具将文本文件编译成代码文件,并检查语法错误。

3)功能仿真(前仿真)。在编译前进行逻辑功能验证,此时的仿真没有延时,对于初步的功能检测非常方便。

4)综合。将设计的源文件用自动综合工具由语言转换为实际的电路图(门电路级网表),但此时还没有在芯片中形成真正的电路,就好像是把设计者脑海中的电路画成了原理图。

5)布局、布线。用已生成的网表文件,再根据CPLD (或FPGA )器件的容量

和结构,用自动布局布线工具进行电路设计。首先根据网表文件内容和器件结构确定逻辑门的位置,然后再根据网表提供的门连接关系,把各个门的输入输出连接起来,类似于设计PCB (印刷电路板)时的布局布线工作。最后生成一个供器件编程(或配置)的文件,同时还会在设计项目中增加一些时序信息,以便于后仿真。

6)后仿真(时序仿真)。这是与实际器件工作情况基本相同的仿真,用来确定设计在经过布局、布线之后,是否仍能满足设计要求。如果设计的电路时延满足要求,则可以进行器件编程(或配置)。

2.3 FPGA介绍

FPGA (Field -Programmable Gate Array ),即现场可编程门阵列,它是在PAL 、GAL 、CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(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 的数据吞吐能力大幅度增强。

第三章、数字频率计的软件开发环境

本章主要介绍项目中将要用到了一系列软件,包括用于VHDL 语言编写和编译的ISE 软件和用于程序仿真的仿真软件ModelSim 。

3.1 开发环境

随着可编程器件纷纷超越百万门级,设计者面临的产品性能与设计效率的挑战也越来越大。设计者必须合理选择各EDA 厂家提供的加速设计的工具软件,这样才能在较短的时间内设计出高效稳定的产品。在本次设计中,由于选择的FPGA 芯片是由Xilinx 公司生产的,所以我们主要使用ModelSim 和ISE 软件进行仿真和综合。

3.2 ModelSim介绍

Mentor 公司的ModelSim 是业界最优秀的HDL 语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL 和Verilog 混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP 核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。

ModelSim 完全支持VHDL 和Verilog 标准;采用直接编辑技术,大大提高HDL 编译和仿真速度。还可以利用ModelSim 调用设计文件进行仿真分析。在调试环境中,设计者可以通过ModelSim 的快速调试步骤以及对各种信号的监控功能(无论信号处于VHDL 层,还是处于混合语言层)使仿真的执行过程形象直观化,帮助设计者及时发现漏洞,缩短设计周期。

ModelSim 最大的特点是其强大的调试功能:先进的数据流窗口,可以迅速追踪到生产不定或者错误状态的原因;性能分析工具帮助分析性能瓶颈,加速仿真;代码覆盖率检查确保测试的完备;多种模式的波形比较功能;先进的 SignalSpy 功能,可以方便地访问VHDL 或者VHDL 和Verilog 混合设计中的底层信号;支持加密IP ;可以实现与Matlab 的Simulink 的联合仿真。

3.3 ISE介绍

ISE 的主要功能包括设计输入、综合、仿真、实现和下载,涵盖了可编程逻

辑器件开发的全过程,从功能上讲,完成CPLD/FPGA的设计流程无需借助任何第三方EDA 软件。下面简要说明各功能的作用:

设计输入: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 芯片中去。

第四章、数字频率计的设计与实现

4.1 任务要求

本实验核心任务是完成基于FPGA 利用VHDL 语言设计一个数字频率计的设计,仿真,下载实现并实际测量效果。具体要求是:频率测量范围为10Hz ~10MHz ,用6只数码管以kHz 为单位显示测量结果;有三个带锁按键开关(任何时候都只会有一个被按下) 用来选择1S 、0.1S 和0.01S 三个闸门时间中的一个, 若按下两个及以上或者不选择则随意显示;有两只LED ,一只的亮灭用来显示闸门信号高低电平,另一只当计数器溢出时做溢出指示。

4.2 测量原理

频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计数每秒内待测信号的脉冲个数,此时我们称闸门时间为1S ,闸门时间也可以大于或小于1S 。闸门时间越长,得到的频率值就准确,但闸门时间越长则每测一次频率的间隔就越长;闸门时间越短,测得频率值刷新就越快,但测得的频率精准度就受影响。

4.3 设计方案与系统需求

由电子计数器频率测量基本原理可知,测频功能实现需要脉冲形成电路、闸门、十进制电子计数器、门控电路、时基信号发生器。

图4.1 实验原理框架

从图4.1中可知,所设计的频率计需要6个模块,分别是:分频器、闸门选择器、测频控制器,计数器、锁存器以及显示模块。

核心板硬件结构如下图所示:

结合实际实验板的硬件条件,可以利用EDA 软件和VHDL 语言在EEC-FPGA 实验板上完成频率计的数字部分的设计与实现。Fpga 实验板如图4-2

所示:

图4.2 EDA实验板

从图4.1和图4.2可知,如果以此实验板做为频率计的硬件实现,可以使用50Mhz 的有源晶振作为时基信号发生器,但是测量需要的时基信号为1S 、0.1S 、0。01S ,因此需要进行分频,另外计数器的输出结果可以使用数码管显示,需要

一个1KHz 的扫描信号,也可由晶振分频得到,脉冲形成电路可以使用模拟电路,另外为了使数码管能够稳定显示,在输出之前加一个锁存器,闸门选择可以使用实验板上的拨码开关得到。至此可以确定,可以在EEC-FPGA 实验板实现的数字电路部分为分频器、计数器、锁存器、测频控制、闸门选择、数码管扫描显示控制子系统,这些模块之间的关系如图4.1所示。

放大整形电路(模拟电路):放大被测信号并将其整形为方波脉冲,该方波脉冲经过闸门后送计数器计数。

石英振荡器:产生一个频率高度稳定的信号送分频器分频。

分频器:对石英振荡器产生的信号进行分频,得到100Hz 、10Hz 和1Hz 三个基准频率;同时产一个1000Hz 的信号作为扫描显示译码模块的时钟,以产生扫描选择信号。

门控电路:产生控制信号门控电路在时间基准信号的控制下产生门控信号GATE ,门控信号有效时,闸门开通,计数器计数。当门控信号停止作用时,闸门关断。为了使计数结果能够在显示器上稳定的显示,闸门关断后门控电路要产生一个锁存命令Latch 使锁存器锁存计数结果。在计数结果锁存以后,下一次计数开始以前,门控电路还要产生一个清零信号CLEAR 将计数器清零,以便重新计数。

4.4 各模块的功能及实现

4.4.1 分频器

分频器的功能是提供标准闸门时间控制信号以精确控制计数器的开闭。由于闸门时间只有1S ,0.1S ,0.01S 三档,且在数码管显示时采用动态扫描的方法,需要产生1kHz 的扫描信号,由于本设计将下载到开发板上,其提供的标准时间是50MHz 晶振,所以要对系统的50MHz 时钟信号进行分频,以产生符合要求的各频率信号:先由系统时钟50MHz 分频出1kHz 作为数码管显示的动态扫描信号,再由1kHz 分频出100Hz 产生0.01S 的计数闸门信号脉冲,由100Hz 分频出10Hz 产生0.1S 的计数闸门信号脉冲,由10Hz 分频出1Hz 产生1S 的计数闸门信号脉冲。同时给整个系统定义系统复位。由以上分析,可分频器模块如下图所示:

这个模块实现了把50MHz 的晶振信号分成了我们需要的四个信号1Hz ,10Hz ,100Hz ,1KHz 。

因为仿真图需经过50000个周期clk_1kHz才能出现一次上升沿,无法准确显示50000次,故而仿真图略。

4.4.2 闸门选择器

该模块的功能是根据开关sw (2:0)的不同输入,实现对输入的几个闸门信号fdiv_in、fdiv_in10、fdiv_in100的手动选择,输出被选中的闸门信号fdiv_out和小数点的控制信号dp_loc(2:0)。生成的模块如下图所示:

该模块有四个输入端口,其中sw(2:0)为选择端,fdiv_in、fdiv_in10、fdiv_in100为被选时基信号输入端。当sw 为001时,1hz 的输入时基信号被选中,被赋值给输出端口fdiv_out输出,此时dp_loc为011;当sw 为010时,10hz 时基信号被选中,被赋值给输出端口fdiv_out输出,此时dp_loc为010;最后当sw 为100时,100hz 时基信号被选中,被赋值给输出端口fhz 输出,此时dp_loc为001。

仿真图如图4-8所示:

4.4.3 测频控制器

测频控制器是控制整个频率计各模块进行时序工作的控制装置,它对输入的标准时钟信号fdiv_in进行变换,产生我们所需要的三个信号闸门信号counter_en_out,锁存信号latch_en_out以及清零信号count_reset_out。其生成的模块如下图所示:

测频控制器的计数使能信号fdiv_in能产生一个周期信号,并对频率计的计数器使能端进行同步控制。当fdiv_in为高电平时,允许计数,为低电平时停止计数,并保持其所计得脉冲数。在停止计数期间,首先需要一个锁存信号latch_en_out的上升沿将计数器在前一秒的计数值锁存进24位锁存器latch_en_out中,并经过显示模块显示。锁存信号之后,必须有一清零信号count_reset_out对计数器清零,为下一秒的计数操作准备。

测频控制信号发生器的仿真工作时序如下图所示。

如果闸门信号fdiv_in的频率取100Hz ,那么信号fdiv_in的脉宽恰好为0.01S ,可以用作计数闸门信号,而选择其他闸门信号时也类似。然后根据测频的时序要求,可得出信号latch_en_out和count_reset_out的逻辑描述。由图可见,在计数完成后,即计数使能信号fdiv_in在1S 的高电平后,利用其反相值产生一个锁存信号latch_en_out,由于反相器的器件延时,锁存信号的上升沿是在计数使能信号即闸门信号fdiv_in的下降沿之后,即是计数完了才锁存的,符合我们的设计要求。而清零信号count_reset_out的上升沿的产生是在下一个fdiv_in信号上升沿来临之前,也就是说是清了零才开始计数的,不是计了一会儿数再被清零了继续计数,这也是与我们的设计要求相符合的。

4.4.4 计数器

由于要求频率计的显示为十进制六位,所示我们设计的是使能端的十进制计数器,所生成的模块如图所示:其中clr 是清零端,enc 是计数信号输入端,fx 为被测信号输入端,进位输出作为溢出标志用over 来表示,用以显示计数器计数是否溢出。

计数器的仿真图如下图所示:

从上图可知计数器符合我们设计的要求。

4.4.5 锁存器

如果计数器输出直接与译码器相连接,那么在计数过程中输出端则随输入脉冲数的增加而不断跳变,那么显示数码管则也会不断闪烁跳变,让人不能看到稳定

的输出,设锁存器后,则不再跳变,便可清晰读出计数结果。由控制模块产生的latch 信号来提供锁存脉冲。其生成的功能模块如下图所示:

这模块实现了对六位计数结果和溢出信号over_in的锁存功能。即锁存信号的上升沿来时送数,其它时候则保持不变。仿真图如下所示:

4.4.6 扫描显示控制系统

本模块通过用一个频率1KHz 的信号来扫描一个多路选择器,实现对六位已经锁存的计数结果的扫描输出,由于1KHz 相对了人眼的暂留效应已经很高了,所以显示结果不会让人感觉到闪烁。这样就可以在程序中实现对六个4位二进制数的译码。译码结果再和段选码结合,同样由1KHz 的信号来同步扫描选通。最后的输出全部通过下载前的固定引脚连接到LED 显示管上。实现最终结果的数字显示。输入端包括扫描信号1KHz ,由前小数点指示信号dp_loc(2:0)以及锁存器的

输出结果。其生成的模块图如下所示:

仿真图如下所示:

4.5 分配引脚和下载实现

全部仿真通过后,就运行ISE 的设计实现,然后分配引脚,即实现设计的输入输出端口与实际芯片的输入输出端口的对应连接。比如六段LED 管的控制信号就连接到实际电路的六个引脚。需要注意的是一些端口是固定的,不能胡乱的连接。外部信号输入只能由外部信号源接口输入,同时还要考虑内部的可配制逻辑块一切都准备就绪后就可以运行Configure Device,选择要下载的位文件(.bit )便可开始下载了。

管脚分配文件也在附录中给出,仅供参考。

4.6 误差分析

在实际测量中,输入10MHz 的方波,显示为09.9998MHz ,调低一档,若要显示999.999kHz 则需要输入1.00001MHz ,若在1Hz 档,将输入方波的频率逐渐增加,增加到约为800kHz 时,最后一位开始闪烁,随着频率的不断增加,输入频率与显示的差距逐渐增大。

下面我们来分析计数器测频的测量误差。从公式f =(4-1)可知,上述测频T

方法的测量误差,一方面决定于闸门时间T ,另一方面决定于计数器计得的数据。根据误差合成方法,从公式(4-1)可得:

∆f x ∆N ∆T =- (4-2) f x N T

公式(4-2)中第一项是数字化仪器所特有的误差,而第二项是闸门时间的相对误差,这项误差决定于石英振荡器所提供的标准频率的准确度。现分述如下。

(1) ±1误差

在测频时,主门的开启时刻与计数脉冲之间的时间关系是不相关的,所以它们在时间轴上的相对位置是随机的。这样,在相同的主门开启时间内,计数器所计得的数却不一定相同,当主门开启时间T 接近甚至等于被测信号周期T x 的整数倍N 倍时,此项误差为最大,图 4-2 画出的就是这种情况。

图 4-2 正负1误差

若主门开启时刻为T 0,而第1个计数脉冲出现在T x ,图 4-2 (a)中示出了T x >T 0>0的情况(∆T =T x -T 0) ,这时计数器计得N 个数(图中N=6);现在再来看图 4-2 (b)情况,即趋近于0,这就有两种可能的计数结果:若第1个计数脉冲和第7个计数脉冲都能通过主门,则可计得N+1=7个数;也可能这两个脉冲都没有能进入主门,则只能计得N-1=5个数。由此可知,最大的计数误差为个数。所以考虑到公式(4-1),可写成 ∆N ±11==± (4-3) N N Tf x

式中T 为闸门时间,为被测频率。从公式(4-3)可知,不管计数值N 多少,其最大误差总是±1个计数单位,故称“±1个字误差”,简称“±1误差”。而且一定时,增大闸门时间T ,可减小±1误差对测频误差的影响。当T 选定后,越低,则由±1误差产生的测频误差越大。

(2) 标准频率误差

闸门时间T 准不准,主要决定于由石英振荡器提供的标准频率的准确度,若石英振荡器的频率为,分频系数为k ,则 T =kT c =k f c

而 ∆T =-k ∆f c 2f c

所以 ∆T ∆f =-c (4-4) T f c

可见,闸门时间的准确度在数值上等于标准频率的准确度,式中负号表示由引起的闸门时间的误差为-∆T 。

(3) 结论

综上所述, 可得如下结论:

计数器直接测频的误差主要有两项:即误差和标准频率误差。一般,总误差可采用分项误差绝对值合成,即 ∆f x 1∆f =±(+c ) (4-5) f x Tf x f c

由以上公式可知:

当输入频率值为10000012HZ 时,输出频率值为9999.99kHZ, 误差为:

10000012-9999990⨯100%=0.00022% 10000012

当输入频率值为10000000Hz 时,输出频率值为09999.8Hz ,其误差为: 10000000-9999980⨯100%=0.0002%10000000

其余的相对误差计算方法一样,分析结果可见,误差都在0.0002%左右,这个数很小,因此在一般精度的系统中,就可以应用该频率计来计数或测频。

第五章 实验结论及总结

本文主要介绍了利用VHDL 语言完成基于FPGA 的数字频率计的设计与实现。详细介绍了测量原理,设计方案、各模块的设计过程及其实现的功能,并对设计中遇到的问题作了分析和处理;利用ISE 和ModelSim 对设计进行了仿真,分析,综合,并最终下载到FPGA 芯片中,实现了对频率的测量。

(1).通过ISE 综合,ModelSim 仿真,最终在EDA 实验板上实现了10Hz —10MHz 频率计的设计,其误差在0.01%数量级,能够较为精确的测量频率。

(2).当频率计值达到该档量程最大测量值时,这时输入频率值再继续增加,则会产生溢出,并且LED6会变亮表示计数器已经溢出。

(3).在测量频率过程中我们应当选择适当的档位,使得测量结果更加精确,特别是溢出信号LED 亮的时候,一定要选择更高档位来进行测量。而有时为了能更精确的显示频率,也应调低档次来读数。

通过频率计的设计试验,对频率计有了更深的认识,尤其是对频率计的工作原理以及各功能模块的实现有深入了解。此外,还熟悉了Xilinx ISE 10.1i、ModelSim 软件的用法和VHDL/Verilog的编程环境,通过本次的设计培养自己的实验动手能力。这是第一次利用VHDL 语言来实现基于FPGA 的实际工程项目,所以在实验过程中不可避免的遇到了很多问题。理论和实践没有有机的联系起来,导致出现各种错误。

参考文献

[1]. 蒋焕文,孙续. 电子测量(第二版). 中国计量出版社 (中).

[2]. Volnei A. Pedroni. VHDL数字电路设计教程. 电子工业出版社 (巴西).

[3]. 姜立东. VHDL语言程序设计及应用 (第二版). 北京邮电出版社 (中).

[4]. 汤山俊夫. 数字电路设计与制作. 科学出版社 (日).

[5]. 廖超平. EDA技术. 北京理工大学出版社 (中).

[6]. 孙航. Xilinx可编程逻辑器件的高级应用与设计技巧. 电子工业出版社 (中).

致 谢

在此,我首先向不辞辛劳,诲人不倦的老师—— 老师,表示最衷心的感谢。本实验在系统的设计和开发、代码的编写和调试过程中都得到了刘老师和皇老师的悉心指导与指正。正是老师们的谆谆教导和热心关怀使我较快的熟悉了如何使用硬件语言VHDL 来实现项目的过程,并最终顺利完成实验。同时,老师们严谨的治学态度以及对工作的一丝不苟,也使我受益匪浅,终生难忘。

特别感谢同学们在实验期间给予我的巨大帮助与支持。在此,谨向他们致以深深的敬意和诚挚的感谢!

附 录

分频器(50000分频,即出来1kHz 的脉冲)

---------------------------------------------------------------------------------- -- Engineer:

-- Create Date: 03/15/2015

---------------------------------------------------------------------------------- LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity frequency_divider_50000 is

port(

f_in : in std_logic;

f_out : out std_logic);

end frequency_divider_50000;

architecture behav of frequency_divider_50000 is

signal count : std_logic_vector(15 downto 0) := (others=>'0'); begin

process(f_in)

begin

if f_in'event and f_in = '0' then

if count = 49999 then

count '0');

else

count

end if;

end if;

end process;

f_out

end behav;

分频器(10分频):

---------------------------------------------------------------------------------- -- Engineer:

-- Create Date: 03/15/2015

---------------------------------------------------------------------------------- LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity frequency_divider_10 is

port(

f_in : in std_logic;

f_out : out std_logic);

end frequency_divider_10;

architecture behav of frequency_divider_10 is

signal count : std_logic_vector(3 downto 0) := (others=>'0'); begin

process(f_in)

begin

if f_in'event and f_in = '0' then

if count = 9 then

count '0');

else

count

end if;

end if;

end process;

f_out

end behav;

闸门选择:

---------------------------------------------------------------------------------- -- Engineer:

--

-- Create Date: 03/15/2015

---------------------------------------------------------------------------------- LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

entity gate_selector is

port(

sw : in std_logic_vector(2 downto 0); fdiv_in : in std_logic;

fdiv_in10 : in std_logic;

fdiv_in100 : in std_logic;

fdiv_out : out std_logic;

dp_loc : out std_logic_vector(2 downto 0)

);

end gate_selector;

architecture one of gate_selector is

begin

process(sw, fdiv_in, fdiv_in10, fdiv_in100)

begin

case sw is

when "001" =>

fdiv_out

dp_loc

when "010" =>

fdiv_out

dp_loc

when "100" =>

fdiv_out

dp_loc

when others =>

fdiv_out

dp_loc

end case;

end process;

end one;

测频控制器:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity control is

port(fdiv_in:in std_logic;

counter_en_out:out std_logic:='0';

counter_reset_out:out std_logic:='0';

latch_en_out:out std_logic:='0');

end control;

architecture one of control is

signal sig1,sig2:std_logic:='0';

begin

process(fdiv_in,sig1,sig2)

begin

if rising_edge(fdiv_in) then

sig1

end if;

if falling_edge(fdiv_in) then

sig2

end if;

end process;

counter_en_out

latch_en_out

counter_reset_out

计数器:

---------------------------------------------------------------------------------- -- Company:

-- Engineer:

--

-- Create Date: 16:32:10 03/18/2015

-- Design Name:

-- Module Name: count_6 - Behavioral

-- Project Name:

-- Target Devices:

-- Tool versions:

-- Description:

--

-- Dependencies:

--

-- Revision:

-- Revision 0.01 - File Created

-- Additional Comments:

--

---------------------------------------------------------------------------------- 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 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 counter_6 is

Port ( fx : in STD_LOGIC;

enc : in STD_LOGIC;

clr : in STD_LOGIC;

over_l: out STD_LOGIC;

cn1 : out STD_LOGIC_VECTOR (3 downto 0); cn2 : out STD_LOGIC_VECTOR (3 downto 0); cn3 : out STD_LOGIC_VECTOR (3 downto 0); cn4 : out STD_LOGIC_VECTOR (3 downto 0); cn5 : out STD_LOGIC_VECTOR (3 downto 0); cn6 : out STD_LOGIC_VECTOR (3 downto 0)); end counter_6;

architecture Behavioral of counter_6 is

signal a,b,c,d,e,f:std_logic_vector(3 downto 0):="0000";

begin

cn1

cn2

cn3

cn4

cn5

cn6

process(fx,clr,enc,a,b,c,d,e,f)

begin

if clr='1' then

a

b

c

d

e

f

over_l

elsif rising_edge(fx) then

if enc = '1' then

if a

a

else

a

if b

b

else

b

if c

c

else

c

if d

d

else

d

if e

e

else

e

if f

f

else

f

over_l

end if;

end if;

end if;

end if;

end if;

end if;

end if;

end if;

end process;

end Behavioral;

锁存器:

----------------------------------------------------------------------------------

-- Engineer:

--

-- Create Date: 03/15/2015

----------------------------------------------------------------------------------

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity latch is

port(num_in1,num_in2,num_in3,num_in4,num_in5,num_in6:in std_logic_vector(3 downto 0);

en,over_in:in std_logic;

num_out1,num_out2,num_out3,num_out4,num_out5,num_out6:out

std_logic_vector(3 downto 0);

over_out:out std_logic);

end latch;

architecture one of latch is

begin

process(en,num_in1,num_in2,num_in3,num_in4,num_in5,num_in6)

begin

if falling_edge(en) then

num_out1

num_out2

num_out3

num_out4

num_out5

num_out6

over_out

end if;

end process;

end one;

显示模块:

----------------------------------------------------------------------------------

-- Engineer:

-- Create Date: 03/15/2015

----------------------------------------------------------------------------------

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity display is

port(

clk : in std_logic;

dp_loc : in std_logic_vector(2 downto 0);

num_in1 : in std_logic_vector(3 downto 0);

num_in2 : in std_logic_vector(3 downto 0);

num_in3 : in std_logic_vector(3 downto 0);

num_in4 : in std_logic_vector(3 downto 0);

num_in5 : in std_logic_vector(3 downto 0);

num_in6 : in std_logic_vector(3 downto 0);

led_position_out : out std_logic_vector(5 downto 0);

led_out : out std_logic_vector(6 downto 0);

dp_out : out std_logic

);

end entity display;

architecture behav of display is

signal count : std_logic_vector(2 downto 0) := "000";

signal bcd : std_logic_vector(3 downto 0);

begin

process(clk)

begin

if rising_edge(clk) then

if count = 5 then

count

else

count

end if;

end if;

end process;

process(count, num_in1, num_in2, num_in3, num_in4, num_in5, num_in6) begin

case count is

when "000" =>

led_position_out

bcd

when "001" =>

led_position_out

bcd

when "010" =>

led_position_out

bcd

when "011" =>

led_position_out

bcd

when "100" =>

led_position_out

bcd

when "101" =>

led_position_out

when others =>

led_position_out

end case;

end process;

process(bcd)

begin

case bcd is

when "0000" => led_out led_out led_out led_out led_out led_out led_out led_out led_out led_out led_out

end process;

dp_out

end architecture behav;

管脚分配文件(.ucf ):

NET "clk" LOC = P128;

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 "f_x" LOC = P56;

NET "gate_led" LOC = P132;

NET "gate_sel[0]" LOC = P6;

NET "gate_sel[1]" LOC = P141;

NET "gate_sel[2]" LOC = P136;

NET "over_led" LOC = P122;

NET "seg[0]" LOC = P52;

NET "seg[1]" LOC = P75;

NET "seg[2]" LOC = P58;

NET "seg[3]" LOC = P76;

NET "seg[4]" LOC = P77;

NET "seg[5]" LOC = P54;

NET "seg[6]" LOC = P53;

NET "dp_out" LOC = P66;


相关内容

  • 通信工程设计
    AMI编译码程序设计 一.预备知识 1. quartus II软件的使用方法. 2. verilog语言知识. 3. 通信原理课本中关于AMI编译码部分的知识. 二.实验目的 1. 验证二次开发例程,了解用FPGA实现AMI编译码的方法. ...
  • 华为招基于FPGA工程师笔试简答题(本科)
    FPGA 大公司面试笔试数电部分,看看你会多少 已有 569 次阅读2011-12-22 08:13 |系统分类:EDA/PLD| FPGA , 笔试, 数电 1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步 ...
  • 综合电子设计题目
    题目一: 题目一:多功能计数器设计 一.任务 设计并制作一台测量正弦信号的频率.周期和相位差的多功能计数器. 二.要求 1.频率测量 a.测量范围:1Hz-10MHz:信号幅度范围:0.5Vrms-5Vrms. -6 b.测量误差≤10 . ...
  • 通信技术--CHINA通信网 软件无线电
    软件无线电 (2002-10-16) 佘其炯 软件无线电的由来 软件无线电最初是在军事通信中提出的,软件无线电作为军用技术已有30年以上的历史,但是由于不同部队用于不同目的的无线电台在工作频段.调制方式上存在差异而无法互通.如果需要互通,就 ...
  • 技术团队介绍宣传
    团队介绍 算法仿真语言: Matlab 软件开发语言:C/C++ 硬件描述语言: VHDL, Verilog HDL 嵌入式开发语言:C/C++ 硬件开发平台: DSP, FPGA, ARM, 单片机 团队在下面几个方面具有深厚的理论功底和 ...
  • 加法器实验报告
    实验三 加法器的设计与仿真 一.实验目的 熟悉quartus ⅱ仿真软件的基本操作,用逻辑图和vhdl 语言设计加法器并验证. 二.实验内容 1.熟悉quartus ⅱ软件的基本操作,了解各种设计输入方法(原理图设计.文本设计. 波形设计) ...
  • 自动售货机设计报告
    数字电子技术课程设计 --自动售货机 摘 要 自动售货机是一台机电一体化的自动化装置,在接收到货币已输入的前提下,靠触摸控制按钮输入信号使控制器启动相关位置的机械装置完成规定动作,将货物输出.当顾客按下需要买的商品所对应的按键时,数码管将显 ...
  • 论文一绪论
    第1章 绪论 1.1论文研究背景 随着现代科学技术的发展,尤其达到了制造大规模集成电路工艺水平,数字信号处理技术相应的发展空间很大.数字信号处理是一门很前沿的交叉型学科理论深厚,技术发展很迅速.广泛应用于众多领域.数字信号处理理论和技术是当 ...
  • 数字电子技术基础答案
    数字电子技术基础答案 第1章 自测题 1.1填空题 1. 100011.11 00110101.01110101 11110.01 1E.4 2. 4 3. 2n 4. 逻辑代数 卡诺图 5.A(C) FB(D) 6.FA( ...
  • 基于DDS的超声电机驱动电源
    第24卷第3期 2002年6月 压 电 与 声 光 P IEZ O EL ECTR I CS &A COU STOO PT I CS . 24N o . 3V o l June 2002 文章编号:100422474(2002) 0 ...