EDA报告(数字频率计)
- 格式:doc
- 大小:3.09 MB
- 文档页数:31
课 程 设 计 说 明 书
课程设计名称: EDA技术课程设计
题 目:
学 生 姓 名:
专 业:
学 号:
指 导 教 师: 胡 兵
日期:2009年 6月 20 日
成绩
第 页 1 西华大学课程设计说明书
说明书1 前言
1.1序言
在电子工程,资源勘探,仪器仪表等相关应用中,频率计是工程技术人员必不可少的测量工具。频率测量也是电子测量技术中最基本最常见的测量之一。不少物理量的测量,如转速、振动频率等的测量都涉及到或可以转化为频率的测量。目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。为适应实际工作的需要,本文在简述频率测量的基本原理和方法的基础上,提供一种基于FPGA的数字频率计的设计和实现过程,本方案不但切实可行,而且具有成本低廉、小巧轻便、便于携带等特点。
1.2 设计背景
在eda(电子设计自动化)在电子设计中起着越来越重要的作用的时候,我们进行EDA课程设计,以增强我们的动手和综合能力。我们选择了数字频率计设计这个课题,因为数字频率计的应用范围很广。数字频率计在测量其他物理量如转速、振动频率等方面也获得广泛应用。数字频率计的设计方法也有多种,如模拟数字方法,单片机设计,基于fpga用verilog设计方法。由于Verilog HDL设计有诸多优点,所以我们选择了Verilogs设计方法。
1.3 数字频率计分类
国际上数字频率计的分类很多。按功能分类,因计数式频率计的测量功能很多,用途很广。所以根据仪器具有的功能,电子计数器有通用和专用之分。 (1)通用型计数器:是一种具有多种测量功能、多种用途的万能计数器。它可测量频率、周期、多周期平均值、时间间隔、累加计数、计时等;若配上相应插件,就可测相位、电压、电流、功率、电阻等电量;配上适当的传感器,还可进行长度、重量、压力、温度、速度等非电量的测量。 (2)专用计数器:指专门用来测量某种单一功能的计数器。如频率计数器,只能专门用来测量高频和微波频率;时间计数器,是以测量时间为基础的计数器,其测时分辨力和准确度很高,可达ns
第 页 2 西华大学课程设计说明书
说明书数量级;特种计数器,它具有特种功能,如可逆计数器、予置计数器、差值计数器、倒数计数器等,用于工业和白控技术等方面。数字频率计按频段分类 (1)低速计数器:最高计数频率<10MHz; (2)中速计数器:最高计数频率10—100MHz; (3)高速计数器:最高计数频率>100MHz; (4)微波频率计数器:测频范围1—80GHz或更高。
1.4 设计目标和实施计划
目标:能测量输入信号的频率,频率范围为1HZ-999999HZ,波形可以是正弦波,三角波,方波和其他任何有固定频率的信号,信号的幅值0.5-5V。
利用Quartus 软件平台上建立计数器电路的顶层电路文件并完成编译和仿真。
利用protel画出整体系统的原理图。
实施计划:1)在quartus Ⅱ软件上利用verilog hdl设计出五个模块并完成各功能模块的编译仿真。
2)在软件中用原理图方式把各功能模块连接成一个整体系统,并对其进行编译和功能仿真。
3)整体系统仿真成功后,选择相应的芯片,对其分配引脚.
4)利用设计好的芯片,在protel中完成整体系统电路图的绘制。
第 页 3 西华大学课程设计说明书
说明书2 总体方案设计
2.1方案比较
方案一:它由一个测评控制信号发生器TESTCTL,一个有时钟使能的计数器,一个锁存器reg和一个译码器encode组成。
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求TESRCTL能产生一个1s脉宽的周期信号,并对频率计的每一个计数器CNT10的ENA使能端进行同步控制。当TETEN高电平时允许计数,并保持其所计的数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1s的计数值锁存进锁存器REG中,并由外部的7段译码器译出并稳定显示。
图2.1 方案一测频法数字频率计框图 输出信号锁存器
测频计数模块 测频控制信号发生模块 被测频率信号 闸门信号 锁存信号
时钟信号 控制信号
清零信号 译 码 电 路
第 页 4 西华大学课程设计说明书
说明书方案二:本方案使用的是数字编译码集成电路和无线电收发模块,可显示呼叫床位的号码或房间号码。发送端发出信号后送入编码器,编码器输出特定的脉冲对发射机经行调制,由发射机向空间辐射无线电波。接收端在接收到信号后送由与编码器配套的解码器中,解码器将信号分别送到译码显示器去控制指示灯和声音集成电路去控制扬声器。系统总体构成包括编码发射部分、接收译码部分、译码显示部分、声音集成放大部分与电源部分共五个模块,系统组成框图如图2.2所示。
图2.2 等精度数字频率计框图
2.2 方案论证
上面两种方案都能够达到设计目的。都有其优点和缺点,下面进行论证。
方案一:测频法测量。就是用计数器计算1S内输入信号周期的个数。原理简单明了,用Verilog语言编写出来的系统精度很高,仿真时几乎没有误差。其实现电路也比较简单,仅用FPGA芯片加上外围电路,如晶振电路,复位电路,JTAG下载电路,电源电路等就可以实现系统数字频率计的功能!但如果要做成实物的话,在测量低频时频率的量化误差就会对测量精度产生严重影响,此时应该采用测周期法间接测量频率。
方案二:等精度频率计。此种方案能够保证计数器的工作时间恰好等于被测信号的 标准频率信号clk_sys
数据输出选择 清零信号 预置门控信号cl
被测频率clk_test 32b
32b 8b
第 页 5 西华大学课程设计说明书
说明书完整周期数,这保证了信号在任何频率条件下都能保持恒定精度。系统对信号进行计数后还需要运用单片机进行处理,才能得到其频率。本方案原理较第一方案要复杂一些,但是精度得到了保证。但系统的核心只有一部分能用VERILOG描述处来,数据的处理还得靠单片机来执行,所以系统整体电路较为复杂。做成实物之后的成本也会大幅上升。
2.3方案选择
由于我们我们第一次进行EDA设计,知识和经验都不丰富。第一种方案原理简单明了而且很容易实现,第二种方案原理较为复杂而且还要用到单片机,增加了设计难度,也不利于节约成本。所以,我们决定采用第一种方案即直接测频法数字频率计。
第 页 6 西华大学课程设计说明书
说明书3.单元模块电路设计
本节主要介绍系统各单元模块的具体功能、电路结构、工作原理、以及各个单元模块之间的联接关系;同时本节也会对相关电路中的参数计算、元器件选择、以及核心器件进行必要说明。
3.1各单元模块功能介绍及电路设计
本系统主要分为5个单元模块,它们分别是:分频器模块、测频控制信号发生器模块、24位锁存器模块、7段译码器模块、十进制计数器模块。各单元模块功能及相关电路的具体说明如下。
3.1.1分频器模块设计
1、分频器模块的具体功能
输入信号:CLK 实验平台上的2Hz时钟信号。
输出信号:CLKDIV2 输出1Hz标准信号。
逻辑功能:对输入信号进行二分频,提供测频控制信号发生器所需要的1Hz标准输入信号。
2、分频器模块的Verilog源代码
module div2(clk,clkdiv2);
input clk;
output clkdiv2;
reg clkdiv2;
always@(posedge clk)
clkdiv2<=~clkdiv2;
endmodule
3、分频器模块的RTL级原理图
„„
第 页 7 西华大学课程设计说明书
说明书图3.1 分频器模块RTL级原理图
3.1.2 测频控制信号发生器模块设计
1、具体功能
输入信号:CLKDIV2 1Hz标准输入信号。
输出信号:TSTEN 计数时能信号;
CLR-CNT 计数器清零信号; LOAD 锁存信号。
逻辑功能:产生1s脉宽的周期信号,并根据测频需要产生相应的计数器清零信号和锁存器锁存信号。
2、Verilog源代码
module testct1(clkdiv2,tsten,clr_cnt,load);
input clkdiv2;
output tsten,clr_cnt,load;
reg clr_cnt;
wire tsten,load;
reg div2clk;
always@(posedge clkdiv2)
div2clk<=~div2clk;
always@(clkdiv2 or div2clk)
begin
if(!clkdiv2 & !div2clk)
clr_cnt<=1;
else
clr_cnt<=0;
end
assign load=~div2clk;
assign tsten=div2clk;
endmodule
第 页 8 西华大学课程设计说明书
说明书2、RTL原理图
图3.2 测频控制信号发生器模块RTL级原理图
3.1.3 24位锁存器模块设计
1、具体功能
输入信号:LOAD锁存器锁存信号DIN0,DIN1,DIN2,DIN3,DIN4,DIN5,DIN6,DIN7, 8个十进制计数器输出的4位BCD码。
输出信号:DOUTL[27..0] 低7位输出显示的BCD码;
DOUTH[3..0] 最高位输出的BCD码。
逻辑功能:当LOAD信号上跳时,将输入的8位BCD码送到输出端,由于接收的是8个计数器的输出信号,因此输入信号是8个4位而不是1个32位。输出信号中低7位不需要译码,最高位又需要译码,所以采用两个信号分开输出。
2、Verilog源代码
modulereg2(load,din0,din1,din2,din3,din4,din5,dout0,dout1,dout2,dout3,dout4,dout5);
input load;
input[3:0]din0,din1,din2,din3,din4,din5;
output[3:0] dout0,dout1,dout2,dout3,dout4,dout5;
reg[3:0]dout0,dout1,dout2,dout3,dout4,dout5;
always@( load)
begin
dout5[3:0]<=din5[3:0];