基于FPGA的数字频率计的设计

更新时间:2024-01-27 02:39:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于FPGA的数字频率计的设计

学生专业:

学生姓名: 指导教师:

摘要

数字频率计是近代电子技术领域的重要测量工具之一,同时也是其它许多领域广泛应用的测量仪器。它在规定的基准时间内把测量的脉冲数记录下来,换算成频率并以数字形式显示出来。在许多测量方案以及测量结果中都会涉及到频率测量的相关问题,频率精确测量的重要性显而易见。

本设计在了解频率计的基本原理的基础上,基于直接测频法的测试手段,即在一定闸门时间内测量被测信号的脉冲个数;设计频率计的测量范围为1Hz-99.99MHz。将设计分为六个模块,即顶层模块,分频模块,计数模块,单位选择模块,数码管位选模块,转换模块。

采用硬件描述语言Verilog HDL编写了各个模块的代码,并且利用Quartus II软件平台进行了功能的仿真,从而完成输入被测频率,通过选择不同档位,精确输出测量值,达到了预期目标。

关键词 数字频率计;直接测频法;Verilog HDL;Quartus II

I

Abstract

Digital frequency meter modern electronic technology is one of the important measurement tools and other areas widely used measuring instrument. It stipulated in the benchmark time to measure the number of pulses recording, the conversion into frequency and displayed in digital form. In many survey scheme and measurement results involve frequency measurements of related problems, the importance of accurate measurement of frequency is obvious.

This design in understanding the basic principle of the frequency meter, on the basis of direct frequency measurement method based on the means testing, that is, in a certain gate time measurement of the measured signal pulse number; Design the frequency meter measuring range of 1 Hz-99.99 MHz. Will design is divided into six parts, a top-level module, points frequency modules, count module, the unit choose module, digital tube a chosen module, conversion module

The hardware description language Verilog HDL write each module of the code, and make use of Quartus II software platform functions of the simulation. Then measured input frequency, by choosing different rank, precise output measured values, and reach the expected goal.

Keywords Digital frequency plan;Direct frequency measurement method ;Verilog HDL;Quartus II

II

目录

摘要 ............................................................. I Abstract ........................................................ II

第1章 绪论 ...................................................... 1 1.1 课题背景和意义 .............................................. 1 1.2 国内外发展情况 .............................................. 1 第2章 频率计测量原理及Verilog HDL概述 .......................... 3 2.1 数字频率计测量原理 .......................................... 3 2.1.1 直接计数测频法 .......................................... 3 2.1.2 等精度测频法 ............................................ 5 2.1.3 全同步测频法 ............................................ 6 2.2 Verilog HDL概述 ............................................. 7 2.2.1 Verilog HDL介绍 .......................................... 7 2.2.2 Verilog HDL程序开发流程 .................................. 8 2.3 本章小结 .................................................... 8 第3章 数字频率计模块设计 ........................................ 9 3.1 数字频率计设计指标 .......................................... 9 3.2 数字频率计各个模块 ......................................... 10 3.2.1 顶层模块fre_counter ..................................... 10 3.2.2 分频模块clk_gen ........................................ 12 3.2.3 计数模块count .......................................... 14 3.2.4 单位控制模块count_4units ................................ 15 3.2.5 数码管位选模块led_sel ................................... 15 3.2.6 转换模块transform ....................................... 17 3.3 本章小结 ................................................... 18 第4章 数字频率计仿真 ........................................... 19 4.1 分频模块仿真波形 .......................................... 19 4.2 计数模块仿真波形 .......................................... 19

III

4.3 单位控制模块仿真波形 ....................................... 20 4.4 数码管位选模块 ............................................. 20 4.5 转换模块 ................................................... 21 4.6 本章小结 ................................................... 21 第5章 芯片介绍和管脚分配 ....................................... 22 5.1 FPGA芯片介绍 ............................................. 22 5.2 代码管脚分配图 ............................................. 22 5.3 顶层原理图效果图 ........................................... 23 5.4 本章小结 .................................................. 23 结论 ............................................................ 24 致谢 ............................................................ 25 参考文献 ........................................................ 26 附录1 程序源代码 ................................................ 28

IV

CONTENTS

Abstract(Chinese) .................................................. I Abstract(English) ................................................. II

Chapter 1 Introduction ............................................. 1 1.1 Background and Significance .................................... 1 1.2 Domestic and foreign development ................................ 1 Chapter 2 Principle and Verilog HDL overview ......................... 3 2.1 Measuring principle ............................................ 3 2.1.1 Direct count frequency measurement method .................... 3 2.1.2 Precision frequency measurement method ....................... 5 2.1.3 With all BuCe frequency method .............................. 6 2.2 Verilog HDL overview .......................................... 7 2.2.1 Verilog HDL introduction .................................... 7 2.2.2 Verilog HDL program development processes .................... 8 2.3 Chapter summary .............................................. 8 Chapter 3 Digital frequency plan module design ........................ 9 3.1 Digital frequency plan design index ............................... 9 3.2 Digital frequency plan each module .............................. 10 3.2.1 Fre_counter top-level module ................................ 10 3.2.2 Points clk_gen frequency modules ............................ 12 3.2.3 Count count module ....................................... 14 3.2.4 The unit control module count_4units ......................... 15 3.2.5 Digital tube a choose led_sel module .......................... 15 3.2.6 Conversion module transform ................................ 17 3.3 Chapter summary ............................................. 18 Chapter 4 Digital frequency plan simulation .......................... 19 4.1Points frequency modules simulation waveform ..................... 19

V

4.2 Count module simulation waveform .............................. 19 4.3 The unit control module simulation waveform ...................... 20 4.4 Digital tube a chosen module .................................... 20 4.5 Conversion module ........................................... 21 4.6 Chapter summary ............................................. 21 Chapter 5 Chip introduction and tube foot distribution ................. 22 5.1 Introduced FPGA chip ......................................... 22 5.2 The code to pin assignment graph ............................... 22 5.3 Top principle diagram rendering ................................. 23 5.4 Chapter summary ............................................. 23 Conclusion ....................................................... 24 Acknowledgement ................................................ 25 References ....................................................... 26 Appendix 1 program .............................................. 28

VI

第1章 绪论

1.1 课题背景和意义

随着数字电路应用越来越广泛,传统的通用数字集成电路芯片已经很难满足系统功能的要求,而且随着系统复杂程度的不断增加,所需通用集成电路的数量呈爆炸性增长,使得电路板的体积迅速膨胀,系统可靠性难以保证[1]

。此外,现代电子产品的生命周期都很短,一个电路可能要在很短的时间内作改进以满足新的功能要求,对于通用集成电路来说则意味着重新设计和重新布线。而可编程逻辑器件克服了上述缺点,它把通用集成电路通过编程集成到一块尺寸很小的硅片上,成倍缩小了电路的体积,同时由于走线短,减少了干扰,提高了系统的可靠性[2]。

频率计在电子产品开发中也是广受重视的领域。很多厂家根据各种实际应用需要开发出了很多不同性能、不同档次的各类频率计产品[3]。产品的不断更新换代也促进了相关频率测量理论和频率计开发技术的不断进步。在高校相关专业,频率理论也是非常重要的教学内容[4]。在基础实验中,利用频率测量器件进行信号频率的测量更是必备基本操作技能之一。在开发性和综合性实验中,利用各种手段进行频率计的设计和开发也是一个重要课题[5]。

1.2 国内外发展情况

电子计数器是其它数字化仪器的基础,在它的输入通道接入各种模-数变换器,再利用相应的换能器便可制成各种数字化仪器。电子计数器的优点是测量精度高、量程宽、功能多、操作简单、测量速度快、直接显示数字,而且易于实现测量过程自动化,在工业生产和科学实验中得到广泛应用[6]。

它的主要实现方法有直接式、锁相式、直接数字式和混合式四种。直接式的优点是速度快、相位噪声低,但结构复杂、杂散多,一般只应用在地面雷达中[7]。锁相式和直接数字式都同时具有容易实现产品系列化、小型化、模块化和工程化的特点,其中,锁相式更是以其容易实现相位同步的自动控

1

制且低功耗的特点成为众多业内人士的首选,应用最为广泛[8]。

频率计的发展也经历了从模拟到数字,从分立到集成、单片机(如美国Intersil公司研发的ICM7216D)、再到可编程逻辑器件(CPLD和FPGA)的漫长发展过程[9]。我国利用相检宽带测频技术设计的高精度频率计也非常具有突破性和实用性。如我国的XDU-17型高分辨频率计。在2005年我国还研制出了中国模拟测振仪,它采用通用微机,通过“东方科卡”和“DASP”、“PDB”等大型软件实现的“PC卡泰”——微机卡式自动检测分析仪器,是专门设计的集数据采集,信号处理,故障诊断,模态分析,桩基检测,噪声与声强测量,动力学修改和响应计算等多种功能于一体的独创性产品[10]。实现手段的进步使得频率计的性能、功能、性价比、可靠性等指标不断提高。目前频率计主要靠以下三个电路进行设计[11]:

(1)基于分立器件的模拟电路实现:即采用传统分立器件自下而上设计实现,这种方法在电子技术发展的早期采用较多。

(2)基于单片机的数字电路实现:即以技术及应用都非常成熟的单片机为核心控制部件加上中规模集成数字器件来实现。

(3)基于可编程逻辑器件的数字电路实现:即除了脉冲整形、键盘输入和显示等少部分电路外,频率计其余主要电路都用可编程逻辑器件来实现。

2

第2章 频率计测量原理及Verilog HDL概述

2.1 数字频率计测量原理

为了准确测量频率,人们研究出了很多方法。频率测量的准确度主要取决于所测量的频率范围和被测对象的特点。而测量所能达到的精度,既取决于基准频率源的精度,也取决于所使用的测量设备和测量方法[12]。下面介绍几种常用频率测量方法,分析各自优缺点。

2.1.1 直接计数测频法

目前广泛使用的直接测频法则适合于数字电路实现,该方法是根据频率的定义,记下单位时间内周期信号的重复次数,因此又称为电子计数器测频法[13]。其中最基本方法是直接计数测频法,它又包括以下2种主要测量方法:

1 .直接测频法

又称M法,其测频原理如图2-1所示。其基本原理是选用一个频率较低的标准频率信号作为闸门信号,而将被测较高频率信号作为填充脉冲,在确定的闸门时间T内,记录被测信号的变化周期数N,则可知被测信号的频率为:

Nfx? (2-1)

T标准闸门T被测信号脉冲

图2-1直接测频法原理

误差分析:此法测量误差主要取决于闸门时间T和计数器计数的准确度,因此总误差可用分项误差绝对值线性相加表示:

3

?1?f??fx????0? (2-2) fxf0??Tfx

1?N?1式中,?它的产生是由于测频时,?是最大量化误差的相对值,

TfxNN闸门的开启时刻与被测计数脉冲的时间关系不相关造成的,即在相同的闸门

开启时间内,计数器所得的数并不一定相同[14]。当闸门时间开启时间T接近甚至等于被测信号周期TX的整数倍时,最大量化误差为ΔN=±1个数。

?f0f0??TT为闸门时间相对误差,主要由时基电路标准频率的准确度决定[15]。

?f0f0通常,对闸门时间准确度的要求是根据所要求的测频准确度而提出

的,为了使闸门时间频率误差不对测量结果产生影响,标准频率的准确度应高于被测信号准确度至少1个数量级,即

?f0f0??1。因此,测量较高的信Tfx号频率时,如果f0一定,闸门时间T越长,测量准确度越高;反之当T选定后,fx越高,±1个计数误差对测量结果的影响越小,测量准确度越高。根据以上介绍和分析可知直接测频法比较适合于高频信号的测量[16]。

2 .直接测周期法

又称T法,其测频原理如图2-2所示。其基本原理是选被测信号作为闸门信号,而将频率较高的标准频率信号作为填充脉冲进行计数。设标准频率信号的频率为f0,在一个闸门时间计数值为N,则被测信号的频率为:

ffx?0 (2-3)

N 4

被测信号脉冲标准闸门

图2-2直接测周期法原理

综上可知,直接计数测频法(包括直接测频法和直接测周期法)的优点是原理简单、测量方便、读数直接,能够在比极宽的频率范围内进行测量[17]。缺点是由于存在对被测信号或标频信号计数的±1个数字误差,难以兼顾低频和高频实现等精度测量,所以总体来说测量精度较低。

2.1.2 等精度测频法

等精度测频法(M/T法),又叫多周期同步测频法,是在直接计数测频法基础上发展起来的,在目前的测频系统中应用比较广泛[18]。其测量原理波形如图2-3所示,测量原理框图如图2-4所示。该法同时具有M法和T法的优点,它通过测量被测信号数个周期的标频计数次数, 然后换算得出被测信号的频率,可兼顾低频与高频信号,提高了测量精度[19]。

标准时钟被测信号预置闸门实际闸门 图2-3等精度测频法原理波形

5

标准信号fcCOUNT1预置闸门DQCP实际闸门COUNT2被测信号fx

图2-4等精度测频法原理框图

测量时,首先预置闸门信号开启,此时计时器并不计数。待被测脉冲信号上升沿到来时,触发器被触发输出计数使能信号(即实际闸门)[20]。此时,count1对标准信号进行计数,count2对被测信号计数。预置闸门信号关闭时,计数器并不立即停止计数,而是等到被测信号上升沿到来时才停止计数,从而实现了实际闸门信号与被测信号的同步,消除了由于被测信号产生的最大

[21]

±1个计数误差。

2.1.3 全同步测频法

在全同步测频法中,闸门信号不仅与被测信号同步,而且与标准时钟也同步,实现三者真正的全同步,从而彻底消除了由被测信号或者标频信号计数引起的量化误差,大大提高了测量精确度。其测量原理波形如图2-5所示,测量原理系统框图如图2-6所示。

标准时钟被测信号闸门信号

图2-5全同步测频原理波形

6

标准时钟脉冲同步检测电路FPGA显示电路被测信号 图2-6全同步测频原理系统框图

被测频率与标准时钟分别送给脉冲同步检测电路与两个计数器,当脉冲 同步检测电路检测到被测频率与标准时钟相位同步时,脉冲同步检测电路发出同步信号,2个计数器开始计数,当脉冲同步检测电路再次检测到同步信号时,又发出同步信号,计数器停止计数。同时计数器的计数值锁存到锁存器,时序乘法器从锁存器中取得被测频率的计数值与标准时钟频率进行乘法运算,然后再将乘法器运算所得的值与标准时钟的计数值送给除法器,乘法器的结果为被除数,标准时钟的计数值为除数,运算所得结果就是被测信号

[22]

的频率。

由以上介绍和分析可知,经过长期的发展,数字频率计的测量方法已经比较丰富和成熟。由于直接计数测频法有着设计简单,并且它是所有测量方法的基础,有着比较成熟的理论,可参考资料也较多。所以本文采用直接计数测频法中的直接测频进行的设计。

2.2 Verilog HDL概述

2.2.1 Verilog HDL介绍

Verilog HDL是一种硬件描述语言(hardware description language),为了制作数位电路(数字电路)而用来描述ASICs和FPGAs的设计之用。Verilog的设计者想要以C程序语言(en:C programming language)为基础C程序语言(en:C programming language)为基础设计一种语言,可以使工程师比较熟悉跟容易接受。事实上,它产生与C程序语言类似的不严谨性质,并且大概与Pascal很相像。

这种语言跟传统的程序设计语言不同,在于它的程序叙述并非严格地线

7

性(循序)执行。Verilog模式包含不同模组(modules)的阶层关系。模组(modules)是输出(inputs)和输入(outputs)所定义出来的一个集合。在每个模组中有一串的电线(wires)、暂存器(registers)和子模组(submodules)的定义。并且在每个模组里面,语言叙述大部分都被群组成为各种的执行区块(blocks),用来定义该模组所产生的行为描述。在每个区块(blocks)内,使用begin和end的关键字来区隔开来,其中的叙述是循序被执行。但是同一个设计,不同的区块间的执行是平行的[23]。

2.2.2 Verilog HDL程序开发流程

1.文本编辑:用任何文本编辑器都可以进行,也可以用专用的HDL编辑器进行编辑。通常Verilog文件保存为.v文件。

2.功能仿真:将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确(也叫前仿真,对简单的设计可以跳过这一步,只在布线完成以后,进行时序仿真)。

3.逻辑综合:将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式和信号的连接关系。逻辑综合软件会生成.edf(edif)的EDA工业标准文件。

4.布局布线:将.edf文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到PLD/FPGA内。

5.时序仿真:需要利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。

6.编程下载:确认仿真无误后,将文件下载到芯片中[24]。

2.3 本章小结

本章主要的介绍了数字频率计的三种测量方法,分别为:直接测量,等精度测量,全同步测量,并且在第二部分对Verilog HDL语言进行了简单的介绍。

8

第3章 数字频率计模块设计

3.1 数字频率计设计指标

该频率计有三个输入信号fre_in,clk_50k,rstn其中clk_50k脚输入标准的50KHz方波信号,作为参考时钟fre_in为信号输入端,被测信号频率从这里送入,rstn为系统复位端,上电时该引脚需要保持一端时间低电平。该系统输出脚为a,b,c,d,e,f,g,unit,led_sel。a,b,c,d,e,f,g为数码管译码输出。unit表示当前显示数值的单位,可为1Hz,10Hz,100Hz,1kHz,10kHz。led_sel为数码管位选信号。该频率计测量范围为1Hz-99.99MHz,可根据输入信号频率自动调整显示数值的单位为合适的数值,并通过unit端口告知用户读数的单位。

本课题的数字频率计顶层RTL硬件电路图如图3-1所示。

图3-1顶层RTL硬件电路图

9

3.2 数字频率计各个模块

3.2.1 顶层模块fre_counter

顶层模块为本课题的最上层模块,由它来例化整个程序,把其它分开的小模块进行整合。其电路原理图如图3-2所示。

图3-2顶层模块原理图

根据模块实现的功能设计Verilog HDL源代码如下: module fre_counter(clk_50k,fre_in,rstn,led_sel,unit, a,b,c,d,e,f,g);

input clk_50k,fre_in,rstn; output[1:0] led_sel; output[2:0] unit; output a,b,c,d,e,f,g;

wire div_10,div_100,div_1000,div_10000,div_100000; clk_gen part_clk_gen(.rstn(rstn),.clk(clk_50k),.div_10(div_10),

.div_100(div_100),.div_1000(div_1000),.div_10000(div_10000),.div_100000(div_100000));

reg gate;

wire[3:0] count_a,count_b,count_c,count_d;

count_4units part_count(.clk(fre_in),.gate(gate),.out_a(count_a), .out_b(count_b),.out_c(count_c),.out_d(count_d)); reg[2:0] gate_sel; assign unit=gate_sel;

10

wire unit_H; reg unit_L;

always@(negedge count_a[3] or negedge gate) if(!gate) unit_L<=1'b0; else unit_L<=1'b1; assign

unit_H=((count_a==4'd0)&&(count_b==4'd0)&&(count_c==4'd0)&&(count_d==4'd0));

always@(negedge gate or negedge rstn) begin

if(!rstn) gate_sel<=3'd0;

else if(unit_L&&(gate_sel!=3'd4)) gate_sel<=gate_sel+3'd1; else if(unit_H&&(gate_sel!=3'd0)) gate_sel<=gate_sel-3'd1; else gate_sel<=gate_sel; end

always@(gate_sel or div_10 or div_100 or div_1000 or div_10000 or div_100000)

begin

case(gate_sel)

3'd0:gate=div_100000; 3'd1:gate=div_10000; 3'd2:gate=div_1000; 3'd3:gate=div_100; 3'd4:gate=div_10;

default:gate=div_100000; endcase end

wire d_n0_a,d_n0_b,d_n0_c,d_n0_d; wire a,b,c,d,e,f,g;

wire trans_ena_a,trans_ena_b,trans_ena_c,trans_ena_d;

11

wire ena_a,ena_b,ena_c,ena_d; wire clk_lock;

assign clk_lock=~gate;

transform part_tran_a(.d_n0(d_n0_a),.din(count_a),.clk_lock(clk_lock), .ena(trans_ena_a),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));

transform part_tran_b(.d_n0(d_n0_b),.din(count_b),.clk_lock(clk_lock), .ena(trans_ena_b),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));

transform part_tran_c(.d_n0(d_n0_c),.din(count_c),.clk_lock(clk_lock), .ena(trans_ena_c),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));

transform part_tran_d(.d_n0(d_n0_d),.din(count_d),.clk_lock(clk_lock), .ena(trans_ena_d),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g)); wire clk_ledc;

assign clk_ledc=div_1000;

led_sel part_led_sel(.rstn(rstn),.clk_ledc(clk_ledc),

.led_ena({ena_a,ena_b,ena_c,ena_d}),.led_count(led_sel)); assign trans_ena_a=ena_a&d_n0_a;

assign trans_ena_b=ena_b&(d_n0_b|d_n0_a);

assign trans_ena_c=(d_n0_c|d_n0_b|d_n0_a)&ena_c; assign trans_ena_d=ena_d; endmodule

以上程序把clk_gen,count_4units,transform 和 led_sel这几个模块连起来进行了整个程序的整合。

3.2.2 分频模块clk_gen

这个模块主要是对给的总频率50khz进行了5次分频,通过这5个不同的频率来完成档位的自动转换。分频模块的电路原理图如图3-3所示。

12

图3-3分频模块原理图

根据模块实现的功能设计Verilog HDL部分源代码如下: always@(posedge clk or negedge rstn) begin

if(!rstn) count1<=3'd0;

else if(count1==3'd4) count1<=3'd0;

else count1<=count1+3'd1; end

reg d1;

always@(posedge count1[2] or negedge rstn) begin

if(!rstn) d1<=1'd0; else d1<=~d1; end

assign div_10=d1; reg[2:0] count2;

always@(posedge d1 or negedge rstn) begin

if(!rstn) count2<=3'd0;

else if(count2==3'd4) count2<=3'd0; else count2<=count2+3'd1; end

其中,div_10是把输入的clk_10分频,为了得到占空比50%的方波,我先把它5分频,再2分频。count1==3'd4,是因为count1有0,1,2,3,4。这5个状态,d1用于2分频。若输入的clk信号为50khz则div_100000的高

13

电平持续时间为1S,用这个作为计数器的gate信号,计数器在1S内对fre_in脚信号的脉冲进行计数,所以输出的值单位为Hz。例如若当前是div_100000信号(高电平1S),检测到计数器溢出,说明输入频率大于9999Hz,显示的数据并不准确,于是选择div_10000(高电平0.1S),显示计数单位为10Hz,若仍然检测到溢出,就选择div_1000(高电平0.01s)。

3.2.3 计数模块count

这个模块是一个十进制计数器,计数范围为0-9,count对输入的clk进行加法计数,当计数到9及4'b1001时,下一个clk脉冲来时count值归零,这样以实现一个简单的计数功能。计数模块电路原理图如图3-4所示。

图3-4计数模块原理图

根据模块实现的功能设计Verilog HDL部分源代码如下:

always@(posedge rst or posedge clk) begin if(rst) begin

count<=4'b0000; end else if(ena) begin

if(count==4'b1001) count<=4'b0000; else count<=count+4'b0001; end else begin

count<=count;

14

end end

assign qout=count;

assign full=(count==4'b1001);

上面的代码主要实现了当ena为1时当count等于9时自动清0否则自动加1当count为9是full给一个高电平1。这样来实现一个简单的计数功能。

3.2.4 单位控制模块count_4units

本模块是显示测量频率的单位部分,当分频模块进行自动档位变化的时候,用这个模块通过unit端口告知用户读数的单位。模块能读取的单位分别为1Hz,10Hz,100Hz,1kHz,10kHz。单位控制模块的原理图如图3-5所示。

图3-5单位控制模块原理图

根据模块实现的功能设计Verilog HDL部分源代码如下:

countc_d(.clk(clk),.ena(1'b1),.rst(rst),.qout(out_d),.full(ena_c)); countc_c(.clk(clk),.ena(ena_c),.rst(rst),.qout(out_c),.full(ena_b));

countc_b(.clk(clk),.ena(ena_b&ena_c),.rst(rst),.qout(out_b),.full(ena_a)); countc_a(.clk(clk),.ena(ena_a&ena_b&ena_c),.rst(rst),.qout(out_a),.full()) 以上程序是对四个count模块进行了例化,所以单位控制模块是由4个计数器组成的。

3.2.5 数码管位选模块led_sel

本模块是为了在数码管显示的时候对数码管进行选择性的点亮,用程序代码来控制数码管的使能端口。位选模块原理图如图3-6所示。

15

图3-6位选模块原理图

根据模块实现的功能设计Verilog HDL部分源代码如下:

parameter LED_NUM=4; parameter COUNT_BIT=2; input clk_ledc,rstn;

output[LED_NUM:1] led_ena; output[COUNT_BIT:1] led_count; reg[COUNT_BIT:1] count; assign led_count=count;

always@(posedge clk_ledc or negedge rstn) begin

if(!rstn) count<=2'd0; else count<=count+2'd1; end

reg[LED_NUM:1] led_ena; always@(count) begin

case(count)

2'd0:led_ena=4'b0001; 2'd1:led_ena=4'b0010; 2'd2:led_ena=4'b0100; 2'd3:led_ena=4'b1000; default:led_ena=4'b0000; endcase end

以上程序主要是为了当clk_ledc输入时钟的时候,led_count对4个数码

16

管进行动态扫描。

3.2.6 转换模块transform

这个模块相当于一个译码模块,把测量出的结果转换成能够在数码管上显示的模式。转换模块原理图如图3-7所示。

图3-7转换模块原理图

根据模块实现的功能设计Verilog HDL部分源代码如下: always@(posedge clk_lock) locked_d<=din; reg[6:0] codecache; always@(locked_d) begin

case(locked_d)

4'd0:codecache<=7'b1111110; 4'd1:codecache<=7'b0110000; 4'd2:codecache<=7'b1101101; 4'd3:codecache<=7'b1111001; 4'd4:codecache<=7'b0110011; 4'd5:codecache<=7'b1011011; 4'd6:codecache<=7'b1011111; 4'd7:codecache<=7'b1110000; 4'd8:codecache<=7'b1111111; 4'd9:codecache<=7'b1111011; default:codecache<=7'bzzzzzzz; endcase end

17

以上程序能够使程序中的十进制数转化为数码管能显示的二进制数。这样数码管才能够正常在上面进行数值的显示。

3.3 本章小结

本章为论文的主体部分,介绍了数字频率计的6个模块分别为:顶层模块,分频模块,计数模块,单位选择模块,数码管位选模块,转换模块。并且在章节中还对部分Verilog代码进行了简单的说明。

18

第4章 数字频率计仿真

4.1 分频模块仿真波形

这个模块是把输入的50khz的时钟进行了5次不同的分频,用这个模块实现一个档位的自动转换功能。由下面的仿真波形可以看出这个程序的复位端为0复位,当rstn为1是正常工作。仿真波形图如图4-1所示。

图4-1分频模块仿真波形

4.2 计数模块仿真波形

计数模块实现的是一个简单的计数功能,本设计用到了4个计数器,ena为计数器的使能端口,当ena为1时计数器正常工作。rst为计数器的复位端口并且1为复位信号。由下图可以看出当计数器计数到9时full出现一个高电平使第二个计数器工作而第一个计数器清0开始从新计数。仿真波形如图4-2所示。

19

图4-2计数器模块仿真波形

4.3 单位控制模块仿真波形

单位控制模块是对四个计数器进行了文件的例化。gate为门控信号当gate为1时程序进行正常的工作,out_a,out_b,out_c,out_d分别为四个计数器的输出。仿真波形如图4-3所示。

图4-3单位控制模块仿真波形

4.4 数码管位选模块

数码管位选模块主要是对数码管进行选择性点亮。led_ena控制着转换模块的使能端,led_count控制着4个数码管的的使能端口。仿真波形如图4-4所示。

20

图4-4位选模块仿真波形

4.5 转换模块

转换模块接的是数码管,相当于译码部分。当ena和d_n0这两个使能端位于1时,本模块能够正常工作。当din输入时,shuchu能够进行译码。仿真波形如图4-5所示。

图4-5转换模块仿真波形

4.6 本章小结

本章主要对第三章的分频模块,计数模块,单位选择模块,数码管位选模块,转换模块这5个模块进行了Quartus II软件的功能仿真,并对仿真波形图进行了简单的说明。

21

第5章 芯片介绍和管脚分配

5.1 FPGA芯片介绍

本设计中用到的FPGA芯片为Cyclone系列的EP1C3TC144,其管脚数为 144,封装为TQFP,工作电压为1.5V,最大可用系统门数位59904,逻辑单元(LE)为 2910。芯片管脚原理图如图5-1所示。

图5-1 芯片管脚原理图

5.2 代码管脚分配图

对数字频率计的输入和输出管脚进行分配,管脚分配图如图5-2所示。

22

图5-2 管脚分配图

5.3 顶层原理图效果图

把顶层文件代码生成原理图,用原理图进行连接并且进行管脚分配之后的程序截图如图5-3所示。

图5-3 顶层原理图

5.4 本章小结

本章主要介绍了应用的主芯片管脚图,数字频率计的管脚分配图以及顶层模块原理效果图。

23

结论

频率计是工程技术人员必不可少的测量工具。频率测量也是电子测量技术中最基本最常见的测量之一,并与其他许多电参量的测量方案和测量结果都有着十分密切的关系,不少物理量的测量,如转速、振动频率等的测量都涉及到或可以转化为频率的测量。正因为频率和频率测量具有如此的重要性,因而频率计在电子产品开发中也广受重视。在生产和生活中主要测量频率的方法为直接计数测频法,等精度测频法和全同步测频法,本设计利用直接测频的方法,采用EDA的设计方法完成频率计的设计,具有设计周期短,设计效率高的特点。

本设计在了解国内外发展情况的基础上,掌握频率计的基本原理。设计频率计的测量范围为1Hz-99.99MHz。可根据输入信号频率自动调整显示数值的单位为合适的数值,并通过unit端口告知用户读数的单位。在掌握硬件描述语言(Verilog HDL)的基础上,根据设计思想对频率计进行了模块划分--频率计顶层模块,分频模块,计数模块,单位控制模块,数码管位选模块和转换模块。相应完成文件例化,自动档位变换功能,记录10以内数据的变化,根据不同功能选择不同单位精度,控制数码管点亮顺序,译码等功能。利用Verilog HDL语言编写相关模块代码。并通过Quartus II软件平台进行了程序各个模块的功能仿真。从而完成输入被测频率,通过选择不同档位,精确输出测量值,达到了预期目标。

24

致谢

感谢学校和老师对我的培养,给我这个自己动手的机会和空间。经过一段时间的编写,终于在指导老师陈晓洁的帮助下完成了毕业设计,陈老师治学严谨,理论知识深厚,在学术研究上给予我悉心的指导和耐心的帮助。从论文的选题、课题研究,直到论文的撰写许许多多方面都体现了导师的关怀。陈老师求真务实、开拓创新的学术精神,注重理论又强调实践的科研作风,诲人不倦的学者风范,高度的责任感和生活中谦逊质朴、平易近人的学者风范时时都深深感染和指引着我。在论文工作中,遇到了许许多多这样那样的问题,有的是专业上的问题,有的是论文格式上的问题,一直得到陈老师的亲切关怀和悉心指导,使我的论文可以又快又好的完成。值此论文完成之际,谨向陈老师致以最崇高的谢意!

其次我要感谢我的同学们,在我最艰难的日子里,他们给我精神上的支持。他们一直在鼓励我,让我充满信心地迎接每一个问题。

最后,衷心地感谢在百忙之中评阅论文和参加答辩的各位专家、教授!

25

参考文献

1 徐辉,王祖强,王照君.基于高速串行BCD码除法的数字频率计的设计[M]. 电子技术应用, 2002,67-70

2 徐成,刘彦,李仁发,等.一种全同步数字频率测量方法的研究[J].电子技术应用, 2004,43-50

3 侯伯亨,顾新.VHDL 硬件描述语言与数字逻辑电路设计(第3版)[M].西安: 西安电子科技大学出版社.2003,153-165

4 谭会生,张昌凡.EDA技术及应用[M].西安: 西安电子科技大学出版社. 2003,202-207

5 魏忠,蔡勇,雷红卫.嵌入式开发详解[M].电子工业出版社2003,233-237 6 周如辉.实时视频处理系统中乒乓存储控制器的设计[J].电子元器件应用,2006,66-68.

7 马忠梅.单片机的C语言应用程序设计[M].北京航空航天大学出版社.2002,247-249

8 宋万杰,罗丰,吴顺君.CPLD技术极其应用[M].西安电子科技大学出版社.2004,317-318

9 常青,陈辉煌.可编程专用集成电路及其应用与设计实践[M].国防工业出版社.2006,46-50

10 王金明,杨吉斌.数字系统设计与VHDL[M].北京:电子工业出版社,2002, 268-269

11 林明权.VHDL数字控制系统设计范例[M].电子工业出版社,2003,168-173

12 张凌.VHDL 语言在FPGA/CPLD开发中的应用[M].电子工程师,2002,281-286

13 任晓东,文博.CPLD/FPGA高级应用开发指南[M].电子工业出版社2004,368-369

14 来金梅. FPGA现状及其发展趋势[M]. 复旦大学FPGA培训教程.2005,135-137

26

15 姜雪松,张海风. 可编程逻辑器件和EDA设计技术[M], 北京:机械工业出版社, 2005,295-298

16 魏西峰. 全同步数字频率测量方法的研究[J] .现代电子技术, 2005,76-79 17 黄智伟. FPGA系统设计与实践[M].北京:电子工业出版社,2005,3-55 18 冯涛,秦永左. 数字测频方法的研究[J].长春光学精密机械学院学报,2001,38-41

19 杨守良. 基于FPGA的数字频率计的设计和实现[J].现代电子技术,2005,123-125

20 谢海鸿. 基于FPGA芯片的数字频率计设计[J].现代电子技术,2005, 45-47

21 王伟. Verilog HDL 程序设计与应用[M].北京:人民邮电出版社,2005 ,39-42

22 Pan Song. Application foreground of CPLD/FPGA in electron design[J]Electron technology apply 1997, 16—21

23 LU Shao qiang. FPGA will gradualy replace ASIC and ASSP[J] Electron production world.2009, 26—28

24 邵蓉. 基于EDA技术的数字系统的数字综合方法的探讨[J]. 抚顺石油学院学报,2003, 69-71

27

附录1 程序源代码

1. 顶层模块源代码 module fre_counter(

clk_50k, fre_in, rstn, led_sel, unit,

a,b,c,d,e,f,g ); input clk_50k,fre_in,rstn; output[1:0] led_sel; output[2:0] unit; output a,b,c,d,e,f,g;

wire div_10,div_100,div_1000,div_10000,div_100000;

clk_gen part_clk_gen(.rstn(rstn),.clk(clk_50k),.div_10(div_10),

.div_100(div_100),.div_1000(div_1000),.div_10000(div_10000),.div_100000(div_100000)); reg gate;

wire[3:0] count_a,count_b,count_c,count_d;

count_4units part_count(.clk(fre_in),.gate(gate),.out_a(count_a), .out_b(count_b),.out_c(count_c),.out_d(count_d)); reg[2:0] gate_sel; assign unit=gate_sel; wire unit_H; reg unit_L;

always@(negedge count_a[3] or negedge gate) if(!gate) unit_L<=1'b0;

28

else unit_L<=1'b1; assign

unit_H=((count_a==4'd0)&&(count_b==4'd0)&&(count_c==4'd0)&&(count_d==4'd0));

always@(negedge gate or negedge rstn) begin

if(!rstn) gate_sel<=3'd0;

else if(unit_L&&(gate_sel!=3'd4)) gate_sel<=gate_sel+3'd1; else if(unit_H&&(gate_sel!=3'd0)) gate_sel<=gate_sel-3'd1; else gate_sel<=gate_sel; end

always@(gate_sel or div_10 or div_100 or div_1000 or div_10000 or div_100000) begin

case(gate_sel)

3'd0:gate=div_100000; 3'd1:gate=div_10000; 3'd2:gate=div_1000; 3'd3:gate=div_100; 3'd4:gate=div_10;

default:gate=div_100000; endcase end

wire d_n0_a,d_n0_b,d_n0_c,d_n0_d; wire a,b,c,d,e,f,g;

wire trans_ena_a,trans_ena_b,trans_ena_c,trans_ena_d; wire ena_a,ena_b,ena_c,ena_d; wire clk_lock;

assign clk_lock=~gate;

transform part_tran_a(.d_n0(d_n0_a),.din(count_a),.clk_lock(clk_lock),

29

.ena(trans_ena_a),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));

transform part_tran_b(.d_n0(d_n0_b),.din(count_b),.clk_lock(clk_lock), .ena(trans_ena_b),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));

transform part_tran_c(.d_n0(d_n0_c),.din(count_c),.clk_lock(clk_lock), .ena(trans_ena_c),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));

transform part_tran_d(.d_n0(d_n0_d),.din(count_d),.clk_lock(clk_lock), .ena(trans_ena_d),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g)); wire clk_ledc;

assign clk_ledc=div_1000;

led_sel part_led_sel(.rstn(rstn),.clk_ledc(clk_ledc),

.led_ena({ena_a,ena_b,ena_c,ena_d}),.led_count(led_sel)); assign trans_ena_a=ena_a&d_n0_a;

assign trans_ena_b=ena_b&(d_n0_b|d_n0_a); assign trans_ena_c=(d_n0_c|d_n0_b|d_n0_a)&ena_c; assign trans_ena_d=ena_d; endmodule

2. 分频模块源代码 module clk_gen( clk, rstn, div_10, div_100, div_1000, div_10000, div_100000, ); input clk,rstn; output div_10; output div_100; output div_1000;

30

output div_10000; output div_100000; //div_10

reg[2:0] count1;

always@(posedge clk or negedge rstn) begin

if(!rstn) count1<=3'd0;

else if(count1==3'd4) count1<=3'd0;

else count1<=count1+3'd1; end

reg d1;

always@(posedge count1[2] or negedge rstn) begin

if(!rstn) d1<=1'd0; else d1<=~d1; end

assign div_10=d1; //div_100

reg[2:0] count2;

always@(posedge d1 or negedge rstn) begin

if(!rstn) count2<=3'd0;

else if(count2==3'd4) count2<=3'd0;

else count2<=count2+3'd1; end

reg d2;

always@(posedge count2[2] or negedge rstn) begin

31

if(!rstn) d2<=1'd0; else d2<=~d2; end

assign div_100=d2; //div_1000

reg[2:0] count3;

always@(posedge d2 or negedge rstn) begin

if(!rstn) count3<=3'd0;

else if(count3==3'd4) count3<=3'd0;

else count3<=count3+3'd1; end

reg d3;

always@(posedge count3[2] or negedge rstn) begin

if(!rstn) d3<=1'd0; else d3<=~d3; end

assign div_1000=d3; //div_10000 reg[2:0] count4;

always@(posedge d3 or negedge rstn) begin

if(!rstn) count4<=3'd0;

else if(count4==3'd4) count4<=3'd0;

else count4<=count4+3'd1; end

32

reg d4;

always@(posedge count4[2] or negedge rstn) begin

if(!rstn) d4<=1'd0; else d4<=~d4; end

assign div_10000=d4; //div_100000 reg[2:0] count5;

always@(posedge d4 or negedge rstn) begin

if(!rstn) count5<=3'd0;

else if(count5==3'd4) count5<=3'd0;

else count5<=count5+3'd1; end

reg d5;

always@(posedge count5[2] or negedge rstn) begin

if(!rstn) d5<=1'd0; else d5<=~d5; end

assign div_100000=d5; endmodule

3. 计数模块源代码 module count( clk, ena, rst,

33

本文来源:https://www.bwwdw.com/article/tisw.html

Top