1、基于VerilogHDL的数字频率计设计课程设计基于Verilog HDL的数字频率计设计及仿真实现摘 要: 在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。本文阐述了用Verilog HDL语言设计了
2、一个简单的数字频率计的过程关键词:周期;EDA;Verilog HDL;数字频率计;波形仿真1 引 言 在电子测量领域中,频率测量的精确度是最高的,可达1010E-13数量级。因此,在生产过程中许多物理量,例如温度、压力、流量、液位、PH值、振动、位移、速度、加速度,乃至各种气体的百分比成分等均用传感器转换成信号频率,然后用数字频率计来测量,以提高精确度。 国际上数字频率计的分类很多。按功能分类,测量某种单一功能的计数器。如频率计数器,只能专门用来测量高频和微波频率;时间计数器,是以测量时间为基础的计数器,其测时分辨力和准确度很高,可达ns数量级;特种计数器,它具有特种功能,如可逆计数器、予置
3、计数器、差值计数器、倒数计数器等,用于工业和白控技术等方面。数字频率计按频段分类 (1)低速计数器:最高计数频率10MHz; (2)中速计数器:最高计数频率10100MHz; (3)高速计数器:最高计数频率100MHz; (4)微波频率计数器:测频范围180GHz或更高。单片机自问世以来,性能不断提高和完善,其资源又能满足很多应用场合的需要,加之单片机具有集成度高、功能强、速度快、体积小、功耗低、使用方便、价格低廉等特点,因此,在工业控制、智能仪器仪表、数据采集和处理、通信系统、高级计算器、家用电器等领域的应用日益广泛,并且正在逐步取代现有的多片微机应用系统。单片机的潜力越来越被人们所重视。特
4、别是当前用CMOS工艺制成的各种单片机,由于功耗低,使用的温度范围大,抗干扰能力强、能满足一些特殊要求的应用场合,更加扩大了单片机的应用范围,也进一步促使单片机性能的发展。1.1 数字频率计概述 频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。闸门时间也可以大于或小于一秒。闸门时间越长,得到的频率值就越准确,但闸门时间越长则没测一次频率的间隔就越长。闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。本文数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变
5、化的信号。如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高系统可靠性和速度。集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路2大类。数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。数字集成电路作为电子技术最重要的基础产品之一,
6、已广泛地深入到各个应用领域 1.2 频率测量的思想和方法1频率测量的基本思想测量被测信号在单位时间内的脉冲个数,其数字表达式f = N / t 其中: F为被测信号的频率 N为脉冲的个数 T为被测信号产生N个脉冲所需的时间2频率测量方法 直接测量法:直接测量被测信号的频率,通过计数法来对被测信号在一定时间内的脉冲个数进行计数。直接厕灵法的结构框图如图1.2.1所示。被测信号 测量结果图1.2.1 直接测量法的结构框图3误差来源 技术过程中最大存在着1个字的量化误差 对时间t的准确把握,主要包括准时钟的时间准确性、整形电路、分频电路以及技术时间控制闸门的开关速度等因素。直接法测量的最大相对误差可
7、以表达为( df/f )max=( |1/N| + |G| )=( |1/ft| + |G| ) 其中: N为脉冲的个数,G为标准时钟的频率稳定性,f为被测信号频率,t为被测信号产生N个脉冲所需的时间。4功能及技术指标 频率测量范围: 10Hz 100MHz 测量分辨率: 1Hz 测量通道灵敏度: 50mVpp 通道输入阻抗:不小于100k 测量误差:1 测量结果显示:6位数码管显示该数字频率计的操作面板如图1.2.4所示图1.2.4 简易数字频率计的操作面板其中,被测信号可以有三种,分别是方波、三角波和正弦波;测量结果显示采用六个数码管来显示;量程分为三个,分别为:0999999Hz、099
8、99.99kHz、099.9999MHz2 Verilog HDL简介2.1 Verilog HDL的简介 Verilog HDL是一种硬件描述语言(hardware description language),为了制作数位电路(数字电路)而用来描述ASICs和FPGAs的设计之用。Verilog 的设计者想要以 C 程序语言(en:C programming language)为基础设计一种语言,可以使工程师比较熟悉跟容易接受。事实上,它产生与 C 程序语言类似的不严谨性质,并且大概与Pascal很相像。 这种语言跟传统的程序设计语言不同,在于它的程序叙述并非严格地线性(循序)执行。Veri
9、log 模式包含不同模组(modules)的阶层关系。模组(modules)是输出(inputs)和输入(outputs)所定义出来的一个集合。在每个模组中,有一串的电线(wires)、暂存器(registers)和子模组(submodules)的定义。并且在每个模组里面,语言叙述大部分都被群组成为各种的执行区块(blocks),用来定义该模组所产生的行为描述。在每个区块(blocks)内,使用 begin 和 end 的关键字来区隔开来,其中的叙述是循序被执行。但是同一个设计,不同的区块间的执行是平行的。 这个语言的叙述之子集合是可合成(synthesizable)。如果在一个电路设计的模组
10、中仅包含可合成的叙述,那麽这个电路设计就可以被适当的软件,转换合成为电脑芯片的电路layout。3 数字频率计系统框图3.1数字频率计系统框图设计如图3.1.1所示的数字频率计系统电路框图图3.1.1 所示的数字频率计系统电路框图3.2数字频率计系统部件简介1. 放大整形 数字频率计允许测量信号的类型有三种:方波、三角波和正弦波,并且信号的测量通道灵敏度为 50mVpp,为此,需要将被测信号放大整形成标准的TTL电平的方波型号,便于CPLD/FPGA对信号脉冲的计数。 2. SW1、SW2、SW3按键SW1、SW2、SW3这三个按键用来在测量的时候,用户根据被测信号的大致频率范围选择不同的适合
11、被测信号的量程。在按键的设计中,需要考虑实际按键的消抖问题3. 标准时钟 标准时钟为频率计测量提供精度相对比较高的时基信号,其时间的稳定性与精度将会直接影响到频率计测量的准确性。4. LED显示模块 频率计将测量的结果通过6位数码管(LED)来显示。4 基于Verilog HDL数字频率计程序设计4.1数字频率计系统模块划分结构数字频率计中的CPLD/FPGA是频率计的核心,主要实现在一定时间内,对被测信号的脉冲个数进行计算,并且转化为相应的频率值显示在六个数码管上。首先将系统分成七个模块来分别设计仿真。分别有以下七个模块:经过上述模块化划分后的结构框如图4.1所示图4.1 模块化划分后的结构
12、 计数模块counter:对包含被测信号频率信息的脉冲进行计数 门控模块gate_control:根据量程,控制技术模块计数。 分频模块fdiv:将标准时钟分频,得到计数以及动态显示所需的时钟。 寄存器模块flip_latch:对计数模块的计数值进行寄存。 多路选择模块data_mux:根据动态选择信号,选择相应的需要显示的计数值 动态为选择模块dispselevt:输出动态显示中的位选信号 BCD译码模块dispdenoder:将BCD码译成数码管的显示数据4.2计数模块counter该模块主要完成对被测信号经过放大整形后输入到可编程逻辑器件的F_IN信号是现在一定的时间下的计数,采用六个异
13、步BCD码十进制计数器来实现 0999999范围的计数。计数模块的结构框图如图4.2.1所示。图4.2.1 计数模块的结构框图根据模块实现的功能设计Verilog HDL源代码如下:module counter(EN,CLR,F_IN,F_OUT,Q0,Q1,Q2,Q3,Q4,Q5);output 3:0 Q5,Q4,Q3,Q2,Q1,Q0;output F_OUT;input EN;input CLR;input F_IN;reg 3:0 Q5,Q4,Q3,Q2,Q1,Q0;reg F_OUT;reg F_out0,F_out1,F_out2,F_out3,F_out4;always (po
14、sedge F_IN)begin if(EN = 1b1)&(CLR = 1b0)&(Q0 != 4b1001) begin Q0 = Q0 + 4b0001; F_OUT = 1b0; end else begin Q0 = 4b0000; if(EN = 1b1)&(CLR = 1b0)&(Q1 != 4b1001) begin Q1 = Q1 + 4b0001; F_OUT = 1b0; end else begin Q1 = 4b0000; if(EN = 1b1)&(CLR = 1b0)&(Q2 != 4b1001) begin Q2 = Q2 + 4b0001; F_OUT = 1
15、b0; end else begin Q2 = 4b0000; if(EN = 1b1)&(CLR = 1b0)&(Q3 != 4b1001) begin Q3 = Q3 + 4b0001; F_OUT = 1b0; end else begin Q3 = 4b0000; if(EN = 1b1)&(CLR = 1b0)&(Q4 != 4b1001) begin Q4 = Q4 + 4b0001; F_OUT = 1b0; end else begin Q4 = 4b0000; if(EN = 1b1)&(CLR = 1b0)&(Q5 != 4b1001) begin Q5 = Q5 + 4b
16、0001; F_OUT = 1b0; end else begin Q5 = 4b0000; F_OUT = 1b1; end end end end end endendEndmodule该模块定义输入端口如下: EN:异步BCD码十进制计数器的全局使能信号 CLR:异步BCD码十进制计数器复位信号 F_IN:被测信号经过放大与整形处理后的信号该模块定义输出端口如下: F_OUT:超出技术范围0999999的输出信号,用来指示提醒用户选择更大的量程。 Q0:计数器的最低位输出 Q1:计数器的第5位输出 Q2:计数器的第4位输出 Q3:计数器的第3位输出 Q4:计数器的第2位输出 Q5:计数器
17、的第1位输出在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.2.2所示。图4.2.2 计数模块counter的仿真波形4.3门控模块gate_control 门控模块实现检测外界量程的选择,并且根据量程输出控制6位BCD码十进制计算器的计数时钟,以及在测量完一次信号频率后,计数器计数值清零。计数器的清零要与后级寄存器的锁存时刻做很好的时序配合。应该实在计数器测量完一次信号频率后,首先将数据锁存到寄存器,然后再将计数器值清零,这样可以惊醒下一次测量。门控模块的结构框图如图4.3.1所示图4.3.1 门控模块结构框图 根据模块实现的功能设计Verilog HDL源代码
18、如下:module gate_control( SW0,SW1,SW2, f1hz,f10hz,f100hz, Latch_EN, Counter_Clr, Counter_EN, dp_s1hz,dp_s10hz,dp_s100hz); output Latch_EN;output Counter_Clr;output Counter_EN;output dp_s1hz,dp_s10hz,dp_s100hz;input SW0,SW1,SW2;input f1hz,f10hz,f100hz;reg dp_s1hz,dp_s10hz,dp_s100hz;reg fref;reg wire_1;
19、reg wire_2;/初始化输入以及中间量initialbegin fref = 1b0; wire_1 = 1b0; wire_2 = 1b0;end/根据不同的外界量程选择,选择相应的计数基时钟always (SW0 or SW1 or SW2 or f1hz or f10hz or f100hz)begin if(SW2 = 1b1) begin fref = f100hz; dp_s1hz,dp_s10hz,dp_s100hz = 3b001; end else if(SW1 = 1b1) begin fref = f10hz; dp_s1hz,dp_s10hz,dp_s100hz
20、= 3b010; end else if(SW0 = 1b1) begin fref = f1hz; dp_s1hz,dp_s10hz,dp_s100hz = 3b100; endend/根据不同的计数基时钟,提供输出相应的计数器计数值的清除脉冲与锁存器锁存脉冲always (posedge fref)begin wire_1 = ! wire_1;endalways (negedge fref)begin wire_2 = wire_1;endassign Counter_EN = wire_1;assign Latch_EN = (! Counter_EN) & wire_2;assign
21、 Counter_Clr = (! Counter_EN) & (! Latch_EN) | (! wire_2);endmodule 该模块定义输入端如下: SW0、SW1、SW2:量程选择开关 flhz:1Hz的标准时钟输入 fl0hz:10Hz的标准时钟输入 fl00hz:100Hz的标准时钟输入该模块定义输入端口如下: Latch_EN:用来是能寄存器所存数据 Counter_Clr:用于计数器的清零 Counter_EN:用于使能计数器开始计数 dp_s1hz:选择999999Hz量程时,用于控制显示中的小数点位置 dp_s10hz:选择9999.99Hz量程时,用于控制显示中的小数
22、点位置 dp_s100hz:选择99.9999Hz量程时,用于控制显示中的小数点位置在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.3.2所示。图4.3.2 门控模块的仿真波形4.4分频模块fdiv分频模块在系统全局时钟的驱动下,经过分频得到系统中所需要的多种频率成分的时钟信号。分频模块的结构框图如图4.4.1所示。图4.4.1 分频模块结构框图根据模块实现的功能设计Verilog HDL源代码如下:module fdiv(clk,f1hz,f10hz,f100hz,f1khz);output f1hz,f10hz,f100hz,f1khz;input clk;r
23、eg f1hz,f10hz,f100hz,f1khz;integer cnt1=0,cnt2=0,cnt3=0,cnt4=0;always (posedge clk)begin /if(cnt19999) /实际系统分频值 if(cnt1 2) /仿真时的分频值 begin f1khz = 1b0;cnt1 = cnt1 + 1; end else begin f1khz = 1b1; cnt1 = 0; endendalways (posedge f1khz)begin /if(cnt29) /实际系统分频值 if(cnt2 2) /仿真时的分频值 begin f100hz = 1b0; c
24、nt2 = cnt2 + 1; end else begin f100hz = 1b1; cnt2 = 0; endendalways (posedge f100hz)begin /if(cnt39) /实际系统分频值 if(cnt3 2) /仿真时的分频值 begin f10hz = 1b0; cnt3 = cnt3 + 1; end else begin f10hz = 1b1; cnt3 = 0; endendalways (posedge f10hz)begin /if(cnt49) /实际系统分频值 if(cnt4 2) /仿真时的分频值 begin f1hz = 1b0; cnt4
25、 = cnt4 + 1; end else begin f1hz = 1b1; cnt4 = 0; endendendmodule该模块定义输入端口如下: Clk:全局系统时钟信号该模块定义输出端口如下: F1hz:输出1Hz的时钟信号 F10hz:输出1Hz的时钟信号 F1khz:输出1Hz的时钟信号在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.4.2所示。图4.4.2 分频模块的仿真波形4.5 寄存器模块flip_latch寄存器模块实现每一个测量频率时,计数器计算值的暂时存储。寄存器模块的结构框图如图4.5.1所示。图4.5.1 寄存器模块根据模块实现的功
26、能设计Verilog HDL源代码如下:module flip_latch(clk,A0,A1,A2,A3,A4,A5,Q0,Q1,Q2,Q3,Q4,Q5);output 3:0 Q0,Q1,Q2,Q3,Q4,Q5;input clk;input 3:0 A0,A1,A2,A3,A4,A5;reg 3:0 Q0,Q1,Q2,Q3,Q4,Q5;always (posedge clk)begin Q0 = A0; Q1 = A1; Q2 = A2; Q3 = A3; Q4 = A4; Q5 = A5;endEndmodule该模块定义输入端口如下: clk:所存数据信号输入,当clk的上升沿到来时
27、,寄存器将输入端信号锁存进寄存器,并且改变输出。 A0,A1,A2,A3,A4,A5:寄存器的数据输入端该模块定义输出端口如下: Q0,Q1,Q2,Q3,Q4,Q5:寄存器的数据输出端。在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.5.2所示。图4.5.2 寄存器模块的仿真波形4.6 多路选择模块data_mux多路选择模块实现测量频率值的分时显示,即动态显示。经过多路选择器模块来分时地传输数据。多路选择模块的结构如图4.6.1所示。图4.6.1 多路选择模块结构框图根据模块实现的功能设计Verilog HDL源代码如下:module data_mux(disp
28、_select,A0,A1,A2,A3,A4,A5,Q);output 3:0 Q;input 2:0disp_select;input 3:0 A0,A1,A2,A3,A4,A5;reg 3:0 Q;always (disp_select,A5,A4,A3,A2,A1,A0,Q)begin case(disp_select) 3b000: Q = A5; 3b001: Q = A4; 3b010: Q = A3; 3b011: Q = A2; 3b100: Q = A1; 3b101: Q = A0; default: Q = 4b0; endcaseendEndmodule该模块定义输入端
29、口如下: disp_select:选择信号输入 A0,A1,A2,A3,A4,A5:多路选择模块的数据输入端口该模块定义输出端口如下: 多路选择模块的数据输出端口。在Altera公司的软件工具QuartusII中编译和波形仿真得到波形如图4.6.2所示。图4.6.2 多路选择模块的仿真波形4.7 动态位选模块dispselect动态位选模块用来驱动数码动态地显示频率测量数据,分时地选择各个数码管进行显示 动态位选的结构框图4.7.1所示。图4.7.1 动态位选模块的结构框图根据模块实现的功能设计Verilog HDL源代码如下:module dispselect(clk,disp_select,Q);output 5:0 Q;output 2:0 disp_select;input clk;reg 5:0 Q;reg 2:0 disp_select;always (posedge clk)begin if(disp_select 3b101)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1