EDA简易数字频率计设计.docx

上传人:b****3 文档编号:6048278 上传时间:2023-05-09 格式:DOCX 页数:26 大小:265.40KB
下载 相关 举报
EDA简易数字频率计设计.docx_第1页
第1页 / 共26页
EDA简易数字频率计设计.docx_第2页
第2页 / 共26页
EDA简易数字频率计设计.docx_第3页
第3页 / 共26页
EDA简易数字频率计设计.docx_第4页
第4页 / 共26页
EDA简易数字频率计设计.docx_第5页
第5页 / 共26页
EDA简易数字频率计设计.docx_第6页
第6页 / 共26页
EDA简易数字频率计设计.docx_第7页
第7页 / 共26页
EDA简易数字频率计设计.docx_第8页
第8页 / 共26页
EDA简易数字频率计设计.docx_第9页
第9页 / 共26页
EDA简易数字频率计设计.docx_第10页
第10页 / 共26页
EDA简易数字频率计设计.docx_第11页
第11页 / 共26页
EDA简易数字频率计设计.docx_第12页
第12页 / 共26页
EDA简易数字频率计设计.docx_第13页
第13页 / 共26页
EDA简易数字频率计设计.docx_第14页
第14页 / 共26页
EDA简易数字频率计设计.docx_第15页
第15页 / 共26页
EDA简易数字频率计设计.docx_第16页
第16页 / 共26页
EDA简易数字频率计设计.docx_第17页
第17页 / 共26页
EDA简易数字频率计设计.docx_第18页
第18页 / 共26页
EDA简易数字频率计设计.docx_第19页
第19页 / 共26页
EDA简易数字频率计设计.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

EDA简易数字频率计设计.docx

《EDA简易数字频率计设计.docx》由会员分享,可在线阅读,更多相关《EDA简易数字频率计设计.docx(26页珍藏版)》请在冰点文库上搜索。

EDA简易数字频率计设计.docx

EDA简易数字频率计设计

唐山学院

EDA课程设计

 

题目简易数字频率计设计

系(部)信息工程系

班级12自动化

姓名陈帅

学号24

指导教师郭耀华

 

2014年12月21日至12月26日共1周

2014年12月26日

 

 

.5

5

7

8

9

1引言

数字频率计是通讯设备、计算机、电子产品等生产领域不可缺少的测量仪器。

由于硬件设计的器件增加,使设计更加复杂,可靠性变差,延迟增加,测量误差变大。

通过使用EDA技术对系统功能进行描述,运用VHDL语言,使系统简化,提高整体的性能和可靠性。

采用VHDL编程设计的数字频率计,除了被测信号的整形部分,键输入和数码显示以外,其他都在一片FPGA上实现,从而让整个系统非常精简,让其具有灵活的现场更改性,在不改变硬件电路的基础上,进一步改进提高系统的性能,使数字频率计具有高速,精确度高,可靠性强,抗干扰等优点,为数字系统进一步的集成创造了条件。

传统的硬件设计采用自下至上(bottom_up)的设计方法。

这种设计方法在系统设计的后期进行仿真和调试,一旦考虑不周,系统设计存在较大缺陷,就有可能要重新设计系统,使设计周期大大增加。

现代硬件设计利用电子设计自动化(EDA)技术,采用并行工程和自上至下(top_down)的设计方法,从系统设计入手,在顶层进行功能方框图的划分和结构设计,在方框图一级进行仿真和纠错,并用vhdl等硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,其对应的物理实现是专用集成电路(ASIC)。

Vhdl即超高速集成电路硬件描述语言,主要用于描述数字系统的结构、行为、功能和接口。

vhdl对设计的描述具有相对独立性,因此设计者可以不懂硬件结构,降低了硬件电路设计难度。

以4位十进制数字频率计的设计来说明vhdl语言在现代硬件设计中的应用。

信号频率计的测量有测频法和周期测量法。

本文采用测频法,即直接计算每秒钟内信号脉冲的个数。

 

2实验

简易数字频率计设计原理

设计内容:

(1)设计四位十进制的简易数字频率计,对1HZ-10MHZ的方波信号进行测量;

(2)测量的方波频率值要在4位数码管上进行显示;

(3)根据不同的待测方波信号,频率计分为4个量程进行测量,四个量程分别为乘

1乘10,乘100,乘1000量程。

(4)此频率计要设有一个整体复位控制;

基本原理

数字频率计的主要功能是测量周期信号的频率。

频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。

频率是单位时间(1秒)内方波信号发生周期变化的次数。

在给定的1秒时间内对方波信号波形计数,并将所计数值显示出来,就能读取被测信号的频率。

数字频率计首先必须获得相对稳定与准确的时间,然后通过计数器计算这一段时间间隔内的方波脉冲个数并显示出来。

这就是数字频率计的基本原理。

脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式为f=N/T,其中f为被测信号的频率,N为计数器所累计的脉冲个数,T为产生N个脉冲所需的时间。

本设计要求基准时钟的频率为1HZ,所以需要分频设计产生脉宽为1秒的脉冲。

再利用这个脉宽为1秒的脉冲计数,计数器所记录的结果,就是被测信号的频率。

因为待测方波信号的频率在1HZ-10MHZ,所以仅用四位7段数码管无法完全正确显示,所以需要选择恰当的量程来显示待测风波信号的频率,当量程选择不当或者频率超出10MHZ时,用一个LED灯点亮来警告测量有错误。

原理框图

本设计要求用基准时钟信号(f=1HZ)的控制完成对1HZ-10MHZ的方波信号进行测量,使得所测量的方波频率值在4位7段数码管上进行显示,并根据不同的待测方波信号,将频率计分为4个量程进行测量,四个量程分别为乘1,乘10,乘100,乘1000量程,量程的选择分为手动和自动两种。

当手动选择量程时,自动量程显示为零,手动量程部分依手动所选量程而定;当手动选择信号不工作时,频率计自动选择比较合适的量程进行显示,手动量程部分显示为零。

而且此频率计具有记忆功能,在测量过程中不刷新数据,等数据测量过程结束后才显示测量值,显示测量的频率值,并保存到下一次测量结束。

数字频率计还有一个整体的异步清零端,随时可以进行清零操作。

此外,数字频率计还有一个不能正确显示待测方波信号频率时的警告灯。

数字频率计通过测频控制发生器将基准信号转换成所需要的控制信号clk1和en,待测信号计数器在en的控制下对待测信号进行测量并通过锁存器在clk1的控制下按要求进行显示,数字频率计包括测频控制发生器ctr、待测信号计数器counter、锁存器regist三个功能模块,其原理框图如图所示。

b

测频控制发生器

待测信号计数器

 

锁存器

d(27:

0)

sel(3:

0)

a(3:

0)

clk

rst

rst

clk

clk1

en

clkin

rst

clkin

en

b

a(3:

0)

rst

clk1

d(27:

0)

sel(3:

0)

zd(3:

0)

zd(3:

0)

sd(3:

0)

sd(3:

0)

q1(3:

0)

q1(3:

0)

q2(3:

0)

q2(3:

0)

q3(3:

0)

q3(3:

0)

q4(3:

0)

q4(3:

0)

其中a是手动选择量程输入端,sd代表手动量程的显示,rst是整体异步清零输入端,clk是频率为1HZ的基准时钟,clkin是待测的方波信号,b是显示是否超出了频率计的测量范围,zd是在手动选择量程不工作时频率计进行的自动选择合适的量程显示,q1—q4是四位数值从高位到低位的显示结果。

 

各模块程序及仿真

此设计运用元件例化的方法进行功能的实现,所以各个模块即使相互独立又是彼此联系的,三个模块共同完成方波信号的测量。

测频控制发生器ctr模块的设计

本设计要求为该模块ctr提供的基准信号频率为1HZ,所以要做一个2分频器控制产生一个脉宽为1秒的周期信号en和一个锁存信号clk1。

rst为高电平时进行整体异步清零。

当en处于高电平的时候对输入的待测方波信号进行计数测量,当en处于低电平的时候停止计数,并保持所计数值。

当clk1是上升沿的时候将所保持的数值输出显示。

此测频控制发生器的程序如下:

libraryieee;

usectris

port(clk,rst:

instd_logic;

clk1,en:

bufferstd_logic);

endctr;

architecturebhvofctris

begin

process(clk,rst)

variablec:

integerrange0to2begin

ifrst='1'then

en<='0';

elsifclk'eventandclk='1'then

c:

=c+1;

ifc=1then

c:

=0;

en<=noten;

endif;

endif;

clk1<=not(clkoren);

endprocess;

endbhv;

此测频控制发生器的仿真结果如图所示。

 

此模块如果仿真12M分频器很困难,为了看到仿真效果,改成20倍分频器,得到了此仿真结果。

如果按程序下载,在硬件上能很清楚的看到由6MHZ的基准信号得到了脉宽为1秒的控制信号en和控制输出信号clk1,rst实现了整体异步清零的功能。

待测信号计数器counter模块的设计

该模块通过ctr模块所产生的脉宽为1秒的en信号来对待测信号进行计数。

用28位二进制数d进行对待测信号的计数,同时用sel表示自动量程根据所得数值d变化,sel为“0001”时代表乘1,sel为“0010”时代表乘10,sel为“0100”时代表乘100,sel为“1000”时代表乘1000。

如果测量选择量程太小或者待测方波信号频率超出10MHZ,均无法正确显示测量结果,则将b置高电平进行警告。

此待测信号计数器的程序如下:

libraryieee;

usecounteris

port(en,clkin,rst:

instd_logic;

a:

instd_logic_vector(3downto0);

sel:

outstd_logic_vector(3downto0);

d:

outstd_logic_vector(27downto0);

b:

outstd_logic);

endcounter;

architecturebhvofcounteris

signaldd:

std_logic_vector(27downto0);

begin

process(rst,en,clkin)

begin

ifrst='1'then

dd<=(others=>'0');

b<='0';

elsifen='1'then

ifclkin'eventandclkin='1'then

ifdd(27downto0)="00"then

dd<=(others=>'0');b<='1';

elsifdd(23downto0)="001"then

dd<=dd+"011";

elsifdd(19downto0)="0011001"then

dd<=dd+"0100111";

elsifdd(15downto0)="001"then

dd<=dd+"011";

elsifdd(11downto0)=""then

dd<=dd+"0";

elsifdd(7downto0)=""then

dd<=dd+"01100111";

elsifdd(3downto0)="1001"then

dd<=dd+"0111";

else

dd<=dd+'1';

endif;

endif;

ifdd(27downto24)>"0000"then

sel<="1000";

elsifdd(23downto20)>"0000"then

sel<="0100";

elsifdd(19downto16)>"0000"then

sel<="0010";

else

sel<="0001";

endif;

else

dd<=(others=>'0');

endif;

ifdd(27downto24)>"0000"then

ifa="1000"then

b<='0';

elsifa="0000"then

b<='0';

else

b<='1';

endif;

elsifdd(23downto20)>"0000"then

ifa="1000"then

b<='0';

elsifa="0100"then

b<='0';

elsifa="0000"then

b<='0';

else

b<='1';

endif;

elsifdd(19downto16)>"0000"then

ifa="1000"then

b<='0';

elsifa="0100"then

b<='0';

elsifa="0010"then

b<='0';

elsifa="0000"then

b<='0';

else

b<='1';

endif;

else

b<='0';

endif;

endprocess;

process(en)

begin

ifen'eventanden='0'then

d<=dd;

endif;

endprocess;

endbhv;

此待测信号计数器的仿真结果如图3所示。

 

 

该模块实现了在en为高电平时对输入的待测信号clkin进行测量,当en为低电平时停止测量并将所计数值输出,即在1秒内待测信号的脉冲数,也就是待测信号的频率值。

sel为根据所计数值自动合理选择的量程,此时sel为“0001”,代表乘1HZ的量程,即所测方波信号的频率在9999HZ之内。

锁存器regist模块的设计

该模块用于实现记忆显示,在测量过程中不刷新新的数据,直到测量过程结束后,锁存显示测量结果,并且保存到下一次测量结束。

其功能是对四位BCD码进行锁存并且转换成为对应的4组七段码,用于驱动数码管。

其中rst为高电平时对锁存器进行异步清零。

rst为低电平时正常工作。

输入信号a对锁存器进行控制即手动选择量程,当a为“0001”时,代表选择乘1档,自动量程显示为零,手动量程显示乘1HZ,只输出计数所得值d的低四位并显示在四个十进制数码管上;当a为“0010”时,代表选择乘10档,自动量程显示为零,手动量程显示乘10HZ,只输出计数所得值d的次低四位并显示在四个十进制数码管上;当a为“0100”时,代表选择乘100档,自动量程部分清零,手动量程显示乘100HZ,只输出计数所得值d的次高四位并显示在四个十进制数码管上;当a为“1000”时,代表选择乘1000档,自动量程部分清零,手动量程显示乘1000HZ,只输出计数所得值d的高四位并显示在四个十进制数码管上。

当a为“0000”时,代表不进行手动选择,则手动量程显示为零,自动量程部分根据所计数值进行合理选择。

sel为“0001”代表所测得的频率值在0—9999HZ之内,则自动量程显示乘1HZ,输出所测数值的有效部分并显示在四个十进制数码管上;sel为“0010”代表所测得的频率值在10000—99999HZ之内,则自动量程显示乘10HZ,输出所测数值的有效部分的高四位并显示在四个十进制数码管上;sel为“0100”代表所测得的频率值在100000—999999HZ之内,则自动量程显示乘100HZ,输出所测数值的有效部分的高四位并显示在四个十进制数码管上;sel为“1000”代表所测得的频率值在1000000—9999999HZ之内,则自动量程显示乘1000HZ,输出所测数值的有效部分的高四位并显示在四个十进制数码管上。

此锁存与译码器的程序如下:

libraryieee;

useregistis

port(clk1,rst:

instd_logic;

d:

instd_logic_vector(27downto0);

sel,a:

instd_logic_vector(3downto0);

zd,sd:

outstd_logic_vector(3downto0);

q1,q2,q3,q4:

outstd_logic_vector(3downto0));

endregist;

architecturebhvofregistis

begin

process(rst,clk1)

begin

ifrst='1'then

q1<=(others=>'0');

q2<="0000";

q3<="0000";

q4<="0000";

zd<="0000";

elsif(clk1'eventandclk1='1')then

if(a="0000")then

ifsel="1000"then

q1<=d(27downto24);

q2<=d(23downto20);

q3<=d(19downto16);

q4<=d(15downto12);

zd<="1000";

sd<="0000";

elsifsel="0100"then

q1<=d(23downto20);

q2<=d(19downto16);

q3<=d(15downto12);

q4<=d(11downto8);

zd<="0100";

sd<="0000";

elsifsel="0010"then

q1<=d(19downto16);

q2<=d(15downto12);

q3<=d(11downto8);

q4<=d(7downto4);

zd<="0010";

sd<="0000";

elsifsel="0001"then

q1<=d(15downto12);

q2<=d(11downto8);

q3<=d(7downto4);

q4<=d(3downto0);

zd<="0001";

sd<="0000";

endif;

elsif(a="0001")then

q1<=d(15downto12);

q2<=d(11downto8);

q3<=d(7downto4);

q4<=d(3downto0);

zd<="0000";

sd<="0001";

elsif(a="0010")then

q1<=d(19downto16);

q2<=d(15downto12);

q3<=d(11downto8);

q4<=d(7downto4);

zd<="0000";

sd<="0010";

elsif(a="0100")then

q1<=d(23downto20);

q2<=d(19downto16);

q3<=d(15downto12);

q4<=d(11downto8);

zd<="0000";

sd<="0100";

elsif(a="1000")then

q1<=d(27downto24);

q2<=d(23downto20);

q3<=d(19downto16);

q4<=d(15downto12);

zd<="0000";

sd<="1000";

endif;

endif;

endprocess;

endbhv;

 

此锁存与译码器的仿真结果如图所示。

 

 

 

该模块的仿真为了将各个功能都清晰的显示出来将sel进行了提前设置,并不是根据所测频率值进行的自动选择。

Sel是输入信号,前提我们已经知道sel和a不能同时工作,所以为了使用a,将sel人为的提前设成“0000”了,不过如此提前将sel的值进行设定并不影响整体的功能。

此仿真图中a为“0001”代表乘1量程,只显示所计数值d的低四位,即十六进制的“0”“3”“6”“8”“9”,此时手动量程sd显示为“0001”,自动量程zd显示“0000”代表不工作。

顶层模块的设计

该模块用元件调用(元件例化语句)实现本设计要求的整体功能。

顶层文件的作用是将三个底层文件联系到一起,共同实现该简易数字频率计数器的功能。

此处定义了en0,d0,sel0,clko等四个信号进行底层文件之间以及底层与顶层之间的连接。

此模块的程序如下所示:

libraryieee;

usepinis

port(rst,clk,clkin:

instd_logic;

q1,q2,q3,q4:

outstd_logic_vector(3downto0);

sd,zd:

outstd_logic_vector(3downto0);

a:

instd_logic_vector(3downto0);

b:

outstd_logic);

endpin;

architecturebhvofpinis

componentctr

port(clk,rst:

instd_logic;

clk1,en:

bufferstd_logic);

endcomponent;

componentcounter

port(en,clkin,rst:

instd_logic;

a:

instd_logic_vector(3downto0);

sel:

outstd_logic_vector(3downto0);

d:

outstd_logic_vector(27downto0);

b:

outstd_logic);

endcomponent;

componentregist

port(clk1,rst:

instd_logic;

d:

instd_logic_vector(27downto0);

sel,a:

instd_logic_vector(3downto0);

zd,sd:

outstd_logic_vector(3downto0);

q1,q2,q3,q4:

outstd_logic_vector(3downto0));

endcomponent;

signalclk0:

std_logic;

signalen0:

std_logic;

signald0:

std_logic_vector(27downto0);

signalsel0:

std_logic_vector(3downto0);

begin

U1:

ctrportmap(clk,rst,clk0,en0);

U2:

counterportmap(en0,clkin,rst,a,sel0,d0,b);

U3:

registportmap(clk0,rst,d0,sel0,a,zd,sd,q1,q2,q3,q4);

endbhv;

此模块的仿真结果如图所示:

 

由于顶层模块调用ctr模块,所以仿真时遇到类似的问题,我们改用12倍分频器来仿真,则在6个基准信号周期时间内对待测信号计数,所以得到的数值除以6就是待测信号与基准信号的频率倍数关系。

所以整体功能仿真结果显示,基准信号周期为200ns,即频率为5MHZ,所以此待测信号的频率为50MHZ。

当a为“0001”时,代表选择乘1HZ的量程,即显示低四位,此时,手动量程显示为“0001”表示乘1HZ量程,自动量程显示为“0000”表示不工作。

当a为“0010”时,代表选择乘10HZ的量程,即显示次低四位,此时,手动量程显示为“0010”表示乘10HZ量程,自动量程显示为“0000”表示不工作。

当rst为高电平时,输出均为0,则进行了整体异步清零。

封装图

 

 

引脚锁定

硬件下载前,进行引脚锁定,各引脚锁定情况如图6所示。

 

 

 

引脚锁定完成后,再次对设计文件进行编译。

重新编译完成后,将配置文件下载到系统的目标芯片上,下载适配后,按动键1到键4进行手动选择量程,查看各个部分是否能够完成其功能。

可以按键8进行异步清零。

最右边四个数码管从左向右是从高位到低位的显示的频率。

最左边数码管显示手动选择的量程数值,左边第二个是自动默认选择的量程数值。

硬件电路简捷,体积小,所有电路都在一块芯片里,因此性能稳定。

 

3总结

通过这学期学的《EDA技术》,再加上这几天边查资料边请教老师,终于理清了头绪,完成了此次课程设计。

刚开始拿到本次程序设计题的时候确实有点儿兴奋,心想着

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2