基于VerilogHDL数字频率计设计与实现.docx
- 文档编号:12131988
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:42
- 大小:547.93KB
基于VerilogHDL数字频率计设计与实现.docx
《基于VerilogHDL数字频率计设计与实现.docx》由会员分享,可在线阅读,更多相关《基于VerilogHDL数字频率计设计与实现.docx(42页珍藏版)》请在冰豆网上搜索。
基于VerilogHDL数字频率计设计与实现
河南工程学院
《EDA》课程设计
基于VerilogHDL数字频率计设计与实现
系别电气信息工程系
专业电子科学与技术
班级0941班
组员
基于VerilogHDL数字频率计设计与实现
摘要:
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
电子计数器测频有两种方式:
一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法,如周期测频法。
直接测频法适用于高频信号的频率测量,间接测频法适用于低频信号的频率测量。
本文阐述了用VerilogHDL语言设计了一个简单的数字频率计的过程
关键词:
周期;EDA;VerilogHDL;数字频率计;波形仿真
2.2方案比较…………………………………………………………………10
1引言
在电子测量领域中,频率测量的精确度是最高的,可达10—10E-13数量级。
因此,在生产过程中许多物理量,例如温度、压力、流量、液位、PH值、振动、位移、速度、加速度,乃至各种气体的百分比成分等均用传感器转换成信号频率,然后用数字频率计来测量,以提高精确度。
国际上数字频率计的分类很多。
按功能分类,测量某种单一功能的计数器。
如频率计数器,只能专门用来测量高频和微波频率;时间计数器,是以测量时间为基础的计数器,其测时分辨力和准确度很高,可达ns数量级;特种计数器,它具有特种功能,如可逆计数器、予置计数器、差值计数器、倒数计数器等,用于工业和白控技术等方面。
数字频率计按频段分类
(1)低速计数器:
最高计数频率<10MHz;
(2)中速计数器:
最高计数频率10—100MHz;(3)高速计数器:
最高计数频率>100MHz;(4)微波频率计数器:
测频范围1—80GHz或更高。
单片机自问世以来,性能不断提高和完善,其资源又能满足很多应用场合的需要,加之单片机具有集成度高、功能强、速度快、体积小、功耗低、使用方便、价格低廉等特点,因此,在工业控制、智能仪器仪表、数据采集和处理、通信系统、高级计算器、家用电器等领域的应用日益广泛,并且正在逐步取代现有的多片微机应用系统。
单片机的潜力越来越被人们所重视。
特别是当前用CMOS工艺制成的各种单片机,由于功耗低,使用的温度范围大,抗干扰能力强、能满足一些特殊要求的应用场合,更加扩大了单片机的应用范围,也进一步促使单片机性能的发展。
1.1数字频率计概述
频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。
通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。
闸门时间也可以大于或小于一秒。
闸门时间越长,得到的频率值就越准确,但闸门时间越长则没测一次频率的间隔就越长。
闸门时间越短,测的频率值刷新就越快,但测得的频率精度就受影响。
本文数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。
如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。
因此,数字频率计是一种应用很广泛的仪器电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。
数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高系统可靠性和速度。
集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路2大类。
数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。
一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。
数字集成电路作为电子技术最重要的基础产品之一,已广泛地深入到各个应用领域。
1.2频率测量的思想和方法
1.频率测量的基本思想
测量被测信号在单位时间内的脉冲个数,其数字表达式
f=N/t
其中:
F为被测信号的频率
N为脉冲的个数
T为被测信号产生N个脉冲所需的时间
频率测量方法
直接测量法:
直接测量被测信号的频率,通过计数法来对被测信号在一定时间内的脉冲个数进行计数。
直接厕灵法的结构框图如图1.2.1所示。
被测信号测量结果
放大整形
计数
分频
标准时钟
图1.2.1直接测量法的结构框图
误差来源
①技术过程中最大存在着±1个字的量化误差
②对时间t的准确把握,主要包括准时钟的时间准确性、整形电路、分频电路以及技术时间控制闸门的开关速度等因素。
直接法测量的最大相对误差可以表达为
(df/f)max=±(|1/N|+|G|)=±(|1/ft|+|G|)
其中:
N为脉冲的个数,G为标准时钟的频率稳定性,f为被测信号频率,t为被测信号产生N个脉冲所需的时间。
功能及技术指标
●频率测量范围:
10Hz~100MHz
●测量分辨率:
1Hz
●测量通道灵敏度:
50mVpp
●通道输入阻抗:
不小于100kΩ
●测量误差:
±1
●测量结果显示:
6位数码管显示
其中,被测信号可以有三种,分别是方波、三角波和正弦波;测量结果显示采用六个数码管来显示;量程为:
0~999999Hz、
2VerilogHDL简介
2.1VerilogHDL的简介
VerilogHDL是一种硬件描述语言(hardwaredescriptionlanguage),为了制作数位电路(数字电路)而用来描述ASICs和FPGAs的设计之用。
Verilog的设计者想要以C程序语言(en:
Cprogramminglanguage)为基础设计一种语言,可以使工程师比较熟悉跟容易接受。
事实上,它产生与C程序语言类似的不严谨性质,并且大概与Pascal很相像。
这种语言跟传统的程序设计语言不同,在于它的程序叙述并非严格地线性(循序)执行。
Verilog模式包含不同模组(modules)的阶层关系。
模组(modules)是输出(inputs)和输入(outputs)所定义出来的一个集合。
在每个模组中,有一串的电线(wires)、暂存器(registers)和子模组(submodules)的定义。
并且在每个模组里面,语言叙述大部分都被群组成为各种的执行区块(blocks),用来定义该模组所产生的行为描述。
在每个区块(blocks)内,使用begin和end的关键字来区隔开来,其中的叙述是循序被执行。
但是同一个设计,不同的区块间的执行是平行的。
这个语言的叙述之子集合是可合成(synthesizable)。
如果在一个电路设计的模组中仅包含可合成的叙述,那麽这个电路设计就可以被适当的软件,转换合成为电脑芯片的电路layout。
2.2方案比较
在设计过程中,小组的组员由于设计思路不同选择了两种不同的设计方案,现将两种设计方案呈述如下:
①四位数码管显示设计方案
②六位数码管显示可调量程设计方案
经过比对两种方案各有优劣,第一种方案由于简单,可操作性强;第二种方案量程大,实际意义比较大,所以经过商量,我们组决定两种设计方案都做下来。
3数字频率计设计方案及实现
方案一
要测量待测信号的频率,需要一个基准信号对其计数。
我选择了系统自带的2MHz的时钟信号,通过分频器产生0.5Hz的基准信号,然后利用此信号高电平或低电平时对输入信号的上升沿计数,结果即1s内待测信号的上升沿数,即频率。
关于量程的显示,首先用1s的基准信号对待测信号计数,得到的计数值需要进行判断。
判断过程如下:
0 10000 100000 (cnt: 计数值;led1~3: 分别对应量程x1,x10,x100;en: 选择信号,用于选择基准时钟) 通过en可以从三个分频器产生的1s,0.1s,0.01s三个中选择一个合适的时钟,通过计数模块得到计数值送到显示模块,最后的测量值为数码管显示值乘以量程代表值。 系统流程图如下: 分频1s 分频0.1s 分频0.01s 计数 选择时钟 计数 判断 显示 量程显示 待测信号 系统采用自底向上的设计方法,最底层采用VerilogHDL硬件描述语言实现,尔后生成模块,连接,调试。 三.方案实现 由流程图可以看到共分成8个模块。 clock1~3: 三个分频器,分别产生1s,0.1s,0.01s的时钟信号,以clock1为例,clk_in为系统时钟,clk为分频产生信号。 源代码如下: moduleclock1(clk_in,clk); inputclk_in;outputclk; regclk; reg[25: 0]cnt; always@(posedgeclk_in) if(cnt<24999999)cnt=cnt+1;//(50mhz/1hz=50000000,cnt<[50000000/2-1=24999999]) elsebegincnt=0;clk=! clk; end endmodule 2)count1: 计数模块,用1s时钟对待测信号计数,unknown为待测信号,cnt为计数值。 源代码如下: modulecount1(clk,unknown,cnt); inputclk,unknown; output[24: 0]cnt; reg[24: 0]temp; reg[24: 0]cnt; always@(posedgeunknown) begin if(clk) begin temp<=temp+2b’10; end else begin if(temp>0) begin cnt<=temp; end temp<=0; end end endmodule 3)judge: 判断模块,对计数值进行判断,led1~3代表量程10kHz,100kHz,1MHz,en用来选择基准信号。 源代码如下: modulejudge(cnt,led1,led2,led3,en); input[24: 0]cnt; outputled1,led2,led3; output[1: 0]en; reg[1: 0]en; regled1,led2,led3; always@ (1) begin if(cnt<10000) begin led1<=1; led2<=0; led3<=0; en<=2'b00; end elseif(cnt<100000&&cnt>10000) begin led1<=0; led2<=1; led3<=0; en<=2'b01; end else begin led1<=0; led2<=0; led3<=1; en<=2'b10; end else begin led1<=0; led2<=0; led3<=0; end end endmodule 4)select: 通过en选择基准信号,clk1~3为分频产生的时钟信号,通过en选出一个合适的clk对待测信号计数。 源代码如下: moduleselect(clk1,clk2,clk3,en,clk); inputclk1,clk2,clk3; input[1: 0]en; outputclk; regclk; always@ (1) if(en==0) begin clk<=clk1; end else begin if(en==1) begin clk<=clk2; end else begin if(en==2) begin clk<=clk3; end end end endmodule 5)count2: 计数,clr为清零信号,输入1清零,cout1~4为四个寄存器,分别存储计数值的四位数。 源代码如下: modulecount2(clk,unknown,cout1,cout2,cout3,cout4,clr); inputclk,unknown,clr; output[3: 0]cout1,cout2,cout3,cout4; reg[3: 0]num1,num2,num3,num4; reg[3: 0]cout1,cout2,cout3,cout4; always@(posedgeunknown) if(! clr) begin if(clk) begin if(num1>=9) begin num1<=0; if(num2>=9) begin num2<=0; if(num3>=9) begin num3<=0; if(num4>=9) begin num4<=0; end else num4<=num4+1; end else num3<=num3+1; end else num2<=num2+1; end else num1<=num1+1; end else begin if(num1||num2||num3||num4) begin begin cout1<=num1; cout2<=num2; cout3<=num3; cout4<=num4; end num1<=0; num2<=0; num3<=0; num4<=0; end else cout1<=0; cout2<=0; cout3<=0; cout4<=0; end end else begin cout1<=0; cout2<=0; cout3<=0; cout4<=0; end endmodule 6): data_mux数值选择模块 moduledata_mux(disp_select,A0,A1,A2,A3,Q); output[3: 0]Q; input[1: 0]disp_select; input[3: 0]A0,A1,A2,A3; reg[3: 0]Q; always@(disp_select,A3,A2,A1,A0,Q) begin case() 2'b11: Q<=A3; 2'b10: Q<=A2; 2'b01: Q<=A1; 2'b00: Q<=A0; default: Q<=4'b0; endcase end endmodule 7): dispselect位选模块 moduledispselect(clk,disp_select,Q); output[3: 0]Q; output[1: 0]disp_select; inputclk; reg[3: 0]Q; reg[1: 0]disp_select; always@(posedgeclk) begin if(disp_select<2'b11) disp_select<=disp_select+2'b1; else disp_select<=2'b0; case(disp_select) 2'b11: Q<=4'b0111; 2'b10: Q<=4'b1011; 2'b01: Q<=4'b1101; 2'b00: Q<=4'b1110; default: Q<=4'b1111; endcase end endmodule 8): dispdecoder显示模块,每位输出转换为七段数码管显示。 源代码如下: moduledispdecoder(disp_select,data_out,clk,data_in); output[6: 0]data_out; input[1: 0]disp_select; inputclk; input[3: 0]data_in; reg[6: 0]data_out; always@(clk,disp_select,data_in,data_out) begin if(clk) case(data_in) 0: data_out<=7'b1000000;//0 1: data_out<=7'b1111001;//1 2: data_out<=7'b0100100;//2 3: data_out<=7'b0110000;//3 4: data_out<=7'b0011001;//4 5: data_out<=7'b0100100;//5 6: data_out<=7'b1011111;//6 7: data_out<=7'b0001111;//7 8: data_out<=7'b1111111;//8 9: data_out<=7'b1101111;//9default: data_out<=7'b1000000;endcaseendendmodule 各模块编译无误后连线组成完整系统。 顶层电路图如下: 四.方案测试 顶层图形文件建立后,对系统进行仿真,由于仿真时对输入输出信号的频率有要求,所以先对每个模块进行仿真。 clock1模块,仿真波形如下: 由于仿真对分频有要求,因此这里只进行了低分频,仅证明程序可进行分频,此波形为10分频,输入周期为20ns,输出200ns,结果正确。 2)judge模块,取cnt[19]=0,即cnt=524288Hz∈(100k,1M),仿真波形如下: 可见led3为1,符合判断结果。 3)select模块,取en=01,即选择clk2,仿真波形如下: 由图可见,输出clk频率即为clk2频率,但是有一定延时。 4)data_mux模块,disp_select输入为11,Q取值为A3,波形正确 5)dispselect位选模块,根据输入波形扫描位码, 6)count1模块,在一个完整波形clk内对unknown计数,clk周期为2us,unknown周期为20ns,计数转换为十进制后为100,结果正确。 五、系统框图 方案二 数字频率计允许测量信号的类型有三种: 方波、三角波和正弦波,并且信号的测量通道灵敏度为50mVpp,为此,需要将被测信号放大整形成标准的TTL电平的方波型号,便于CPLD/FPGA对信号脉冲的计数。 在按键的设计中,需要考虑实际按键的消抖问题。 标准时钟为频率计测量提供精度相对比较高的时基信号,其时间的稳定性与精度将会直接影响到频率计测量的准确性。 频率计将测量的结果通过6位数码管(LED)来显示。 数字频率计中的CPLD/FPGA是频率计的核心,主要实现在一定时间内,对被测信号的脉冲个数进行计算,并且转化为相应的频率值显示在六个数码管上。 首先将系统分成七个模块来分别设计仿真。 分别有以下七个模块: 经过上述模块化划分后的结构框如图4.1所示 图4.1模块化划分后的结构 ●计数模块counter: 对包含被测信号频率信息的脉冲进行计数 ●门控模块gate_control: 根据量程,控制技术模块计数。 ●分频模块fdiv: 将标准时钟分频,得到计数以及动态显示所需的时钟。 ●寄存器模块flip_latch: 对计数模块的计数值进行寄存。 ●多路选择模块data_mux: 根据动态选择信号,选择相应的需要显示的计数值 ●动态为选择模块dispselevt: 输出动态显示中的位选信号 ●BCD译码模块dispdenoder: 将BCD码译成数码管的显示数据 计数模块counter 该模块主要完成对被测信号经过放大整形后输入到可编程逻辑器件的F_IN信号是现在一定的时间下的计数,采用六个异步BCD码十进制计数器来实现0~999999范围的计数。 计数模块的结构框图如图4.2.1所示。 图4.2.1计数模块的结构框图 根据模块实现的功能设计VerilogHDL源代码如下: modulecounter(EN,CLR,F_IN,F_OUT,Q0,Q1,Q2,Q3,Q4,Q5); output[3: 0]Q5,Q4,Q3,Q2,Q1,Q0; outputF_OUT; inputEN; inputCLR; inputF_IN; reg[3: 0]Q5,Q4,Q3,Q2,Q1,Q0; regF_OUT; regF_out0,F_out1,F_out2,F_out3,F_out4; always@(posedgeF_IN) begin if((EN==1'b1)&&(CLR==1'b0)&&(Q0! =4'b1001)) begin Q0<=Q0+4'b0001; F_OUT<=1'b0; end else begin Q0<=4'b0000; if((EN==1'b1)&&(CLR==1'b0)&&(Q1! =4'b1001)) begin Q1<=Q1+4'b0001; F_OUT<=1'b0; end else begin Q1<=4'b0000; if((EN==1'b1)&&(CLR==1'b0)&&(Q2! =4'b1001)) begin Q2<=Q2+4'b0001; F_OUT<=1'b0; end else begin Q2<=4'b0000; if((EN==1'b1)&&(CLR==1'b0)&&(Q3! =4'b1001)) begin Q3<=Q3+4'b0001; F_OUT<=1'b0; end else begin Q3<=4'b0000; if((EN==1'b1)&&(CLR==1'b0)&&(Q4! =4'b1001)) begin Q4<=Q4+4'b0001; F_OUT<=1'b0; end else begin Q4<=4'b0000; if((EN==1'b1)&&(CLR==1'b0)&&(Q5! =4'b1001)) begin Q5<=Q5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VerilogHDL 数字频率计 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)