电子科技大学现代电子综合实验频率计实验报告.docx

上传人:b****5 文档编号:5912627 上传时间:2023-01-02 格式:DOCX 页数:28 大小:358.11KB
下载 相关 举报
电子科技大学现代电子综合实验频率计实验报告.docx_第1页
第1页 / 共28页
电子科技大学现代电子综合实验频率计实验报告.docx_第2页
第2页 / 共28页
电子科技大学现代电子综合实验频率计实验报告.docx_第3页
第3页 / 共28页
电子科技大学现代电子综合实验频率计实验报告.docx_第4页
第4页 / 共28页
电子科技大学现代电子综合实验频率计实验报告.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

电子科技大学现代电子综合实验频率计实验报告.docx

《电子科技大学现代电子综合实验频率计实验报告.docx》由会员分享,可在线阅读,更多相关《电子科技大学现代电子综合实验频率计实验报告.docx(28页珍藏版)》请在冰豆网上搜索。

电子科技大学现代电子综合实验频率计实验报告.docx

电子科技大学现代电子综合实验频率计实验报告

 

实验报告

学生:

学院:

专业:

学号:

指导老师:

目录

一、实验名称:

3

二、实验目的:

3

三、实验任务:

3

四、实验原理:

3

1.分频器:

4

①功能4

②实现:

4

2.闸门选择5

①功能5

②实现5

3.门控电路:

6

①功能:

6

②实现7

4.计数器:

8

①功能8

②实现8

5.锁存器:

9

①功能9

②实现9

6.扫面显示9

①功能9

②实现9

7.top顶层文件10

①功能:

10

②实现:

10

8.管脚的配置:

11

六、误差分析:

13

1.原因13

2.减小误差13

七、实验结论:

14

八、程序附录:

14

1.分频器:

14

2.闸门选择:

15

3.门控电路:

16

4.计数器:

17

5.锁存器:

19

6.扫面显示:

20

7.top程序:

21

一、实验名称:

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

二、实验目的:

学习VHDL语言并使用它完成频率计的设计,使学生不断的加深对VHDL描述语言的掌握,以及不断总结由软件来实现硬件的特点,学会程序与芯片的对接,为以后的工作和更进一步的学习学习打好基础。

三、实验任务:

基于FPGA采用硬件描述语言VHDL,在软件开发平台ISE上设计出一个数字频率计,使用ModelSim仿真软件对VHDL程序做仿真并下载到芯片完成实际测量。

要求:

其频率测量范围为10Hz~10MHz,测量结果用6只数码管显示。

有三个带锁按键开关(任何时候都只能有一个被按下)被用来选择1S、0.1S和0.01S三个闸门时间中的一个。

有两只LED,一只用来显示闸门的开与闭,另一只当计数器溢出时做溢出指示。

四、实验原理:

频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟(本实验采用50MHz的石英振荡器作为基准时钟),对比测量其他信号的频率。

通常情况下计数每秒内待测信号的脉冲个数,此时我们称闸门时间为1S,闸门时间也可以大于或小于1S。

闸门时间越长,得到的频率值就准确,但闸门时间越长则每测一次频率的间隔就越长;闸门时间越短,测得频率值刷新就越快,但测得的频率精准度会受到影响。

频率是指周期性信号在单位时间(一秒)内变化的次数。

若在一定时间T内计得这个周期信号变化的次数为N,则其频率可表达:

f=N/T

所以将N和T分别测量出来即可得出测量频率。

因此需要的模块有:

计数器、基准时钟、门控电路,由此得出基本原理图如下所示:

工作原理:

把被测信号①(以正弦波为例)通过脉冲形成电路转变成脉冲②(实验室直接测量方波,即相当于跳过放大整形)其重复频率等于被测频率,,然后将它加到闸门的一个输入端。

闸门出门控信号④来控制开、闭时间,只有在闸门开通时间T内,被计数的脉冲⑤才能通过闸门,被送到十进制电子计数器进行计数。

考虑到测量范围和显示要求,需要对上面原理图做完善,需要添加:

分频器、数据锁存器、扫描显示的控制子系统(包括显示译码和扫描控制)、两只LED指示闸门通断和计数器溢出,由此得出如下完善之后原理图:

五、实验步骤:

先对各个模块进行设计仿真,保证每个模块的正常运行,最后将各个模块进行汇总连接,编写top顶层文件,最后对top文件进行仿真测试,测试好之后下载到芯片进行实际测量。

1.分频器:

1 功能:

对石英振荡器产生的信号进行分频,得到10Hz、100Hz和1KHz三个基准频率,提供标准闸门时间控制信号以精确控制计数器的开闭;同时将1KHz的信号作为扫描显示译码模块的时钟,以产生扫描选择信号。

2 实现:

分频器的功能是由于闸门时间只有1S,0.1S,0.01S三档,且在数码管显示时采用动态扫描的方法,需要产生1kHz的扫描信号,由于本设计将下载到开发板上,其提供的标准时间是48MHz,所以要对系统的48MHz时钟信号进行分频,以产生符合要求的各频率信号:

先由系统时钟50MHz分频出1kHz作为数码管显示的动态扫描信号,同时产生0.01S的计数闸门信号脉冲,再由1kHz分频出100Hz产生0.1S的计数闸门信号脉冲,由100Hz分频出10Hz产生1S的计数闸门信号脉冲。

由此写出分频器的VHDL程序(见程序附录1),仿真模块如图所示:

到此完成了对分频器模块的设计和仿真。

2.闸门选择:

1 功能:

实现对输入的几个闸门信号的手动选择,将选择的闸门信号有fref输出到下一个模块,同时输出小数点的控制信号dp1。

2 实现:

采用数字电路里所学的多路复用器原理,s(2:

0)为选择端,f1,f10,f100为被选时基信号输入端,通过选择端s来控制哪一个时基型号被选择输出:

当s(2:

0)为100时,f1的输入时基信号被选中,被赋值给输出端口fref输出,此时dp1

(2)有效,其余的无效,点亮对应连接的小数点;当s(2:

0)为010时,f10时基信号被选中,被赋值给输出端口fref输出,此时dp1

(1)有效,其余的无效,点亮对应连接的小数点;最后当s(2:

0)为001时,f100时基信号被选中,被赋值给输出端口fref输出,此时dp1(0)有效,其余的无效,点亮对应)连接的小数点。

由此写出闸门选择的VHDL程序(见程序附录2),仿真模块如图所示:

到此完成了对闸门选择模块的设计和仿真。

3.门控电路:

1 功能:

控制整个频率计各模块进行时序工作的控制装置,它对输入的标准时钟信号进行变换,产生我们所需要的三个信号闸门信号gate,锁存信号latch以及清零信号reset。

2 实现:

测量过程中,产生的上个闸门信号有着先后顺序。

根据我们的测量需要,可以得出三个信号的先后为:

gate、latch、reset。

同时为了规避冒险,我们需要将三个信号的上升沿错开,由此采用图1所示原理进行编写VHDL程序(见程序附录3);

同时对模块进行仿真,仿真模块如图所示:

到此完成了对门控电路模块的设计和仿真。

4.计数器:

1 功能:

在门控电路的gate的控制下对输入的信号进行计数,即完成f=N/T公式中的N的测量。

2 实现:

采用数字电路所学的十进制计数器,并对计数器采用级联的方法扩展为6位十进制计数器。

由此编写其VHDL程序(见程序附录4),同时对模块进行仿真,仿真模块如图所示:

到此完成了对计数器模块的设计和仿真。

5.锁存器:

1 功能:

对计数器送来的六位计数结果和溢出信号ove_out进行锁存,保证显示数码管的数字不会跳动,方便读取数据。

2 实现:

采用数字电路所学的D锁存器的思想,编写能够同时对六位技术界和溢出信号进行锁存的VHDL程序(见程序附录5),编写好之后进行仿真测试,仿真模块如图所示:

到此完成了对锁存器模块的设计和仿真。

6.扫面显示:

1 功能:

对锁存器送来的数据进行动态扫描(即位选)、将六位计数结果分别翻译成七段数码管所能识别的数据(即段选)。

2 实现:

通过用一个频率1KHz的信号来扫描一个多路选择器,实现对六位已经锁存的计数结果的扫描输出,由于1KHz相对了人眼的暂留效应已经很高了,所以显示结果不会让人感觉到闪烁。

这样就可以用一个译码器来实现对六个4位二进制数的译码。

译码结果再连接到一个多路选择器的输入端,同样由1KHz的信号来同步扫描选通。

实现最终结果的数字显示。

六位十进制数的BCD码经7段译码输出,显示十进制数。

并根据档位信号确定小数点显示的位置以实现档位的显示,最后的输出全部通过下载前的固定引脚连接到LED显示管上。

由此编写VHDL程序(见程序附录6),编写好之后进行仿真测试,仿真模块

如图所示:

到此完成了所有模块的设计和仿真,接下来就是对所有模块的汇总连接,编写top顶层文件。

完成最终的设计和仿真。

7.top顶层文件

1 功能:

将所有的模块的功能进行连接,完成频率计的设计。

2 实现:

将每个模块点击ISE软件右下角窗口中的“ViewHDLInstantiationTemplate”将生成的文件拷贝到新建的top文件对应位置,并对中间的连接线进行定义,最后完成top文件的编写。

仿真模块如图所示:

8.管脚的配置:

分配引脚,即实现设计的输入输出端口与实际芯片的输入输出端口的对应连接。

参考老师提供的电路板管脚(见图1),完成对引脚的分配,得到top_fan.ucf文件(见下图):

9.下载程序:

将电路板连接好之后,点击“ConfigureTargetDevice”,生成top_fan.bit文件,在将bit文件下载到电路板板中,到此完成了所有的设计。

六、误差分析:

1.原因:

计数N不准,存在±1误差。

通过仔细分析可知,在测频时,主门的开启时刻与计数脉冲之间的时间关系是不相关的,所以它们在时间轴上的相对位置是随机的。

这样,在相同的主门开启时间内,计数器所计得的数却不一定相同,当主门开启时间T接近甚至等于被测信号周期

的整数倍N倍时,此项误差为最大,图4画出的就是这种情况:

图4正负1误差

 

若主门开启时刻为

,而第1个计数脉冲出现在

,图4(a)中示出了

>

>0的情况(

),这时计数器计得N个数(图中N=6);现在再来看图4(b)情况,即

趋近于0,这就有两种可能的计数结果:

若第1个计数脉冲和第7个计数脉冲都能通过主门,则可计得N+1=7个数;也可能这两个脉冲都没有能进入主门,则只能计得N-1=5个数。

由此可知,最大的计数误差为

个数,即存在±1误差。

2.减小误差:

由上述的分析可知不管计数值N多少,其最大误差总是±1个计数单位。

当T选定后,

越低,则由±1误差产生的测频误差越大。

一定时,增大闸门时间T,可减小±1误差对测频误差的影响。

因此我们在测量频率的时候尽量选择合适的闸门可以减小误差。

七、实验结论:

本次实验利用VHDL语言完成了基于FPGA的数字频率计的设计与实现。

利用ISE和ModelSim对程序设计进行了仿真、分析、综合,并最终下载到FPGA芯片中,完成了整个频率计的设计。

通过此次频率计的设计试验,对频率计有了更深的认识,尤其是对频率计的工作原理以及各功能模块的实现有深入了解,同时深入的了解学习了VHDL语言,学会了如何利用ISE和ModelSim对编写的VHDL程序进行联合仿真;最后将编写好的程序下载到芯片中,让我学会了如何将程序与芯片进行对接,提高了自己的动手能力。

八、程序附录:

1.分频器:

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;

useIEEE.STD_LOGIC_UNSIGNED.ALL;

useIEEE.STD_LOGIC_ARITH.ALL;

entitydiv_fis

port(clk:

instd_logic;

fp_10,fp_100,fp_1k:

outstd_logic);

enddiv_f;

architectureBehavioralofdiv_fis

signaldiv_10:

std_logic_vector(2downto0):

="000";

signaldiv_100:

std_logic_vector(2downto0):

="000";

signaldiv_1k:

std_logic_vector(14downto0):

="000000000000000";

signalclk_10,clk_100,clk_1k:

std_logic;

begin

fen1k:

process(clk)

begin

ifrising_edge(clk)then

ifdiv_1k=24999then

div_1k<="000000000000000";

clk_1k<=notclk_1k;

elsediv_1k<=div_1k+1;

endif;

endif;

endprocess;

fen100:

process(clk_1k)

begin

ifrising_edge(clk_1k)then

ifdiv_100=5then

div_100<="000";

clk_100<=notclk_100;

elsediv_100<=div_100+1;

endif;

endif;

endprocess;

fen10:

process(clk_100)

begin

ifrising_edge(clk_100)then

ifdiv_10=5then

div_10<="000";

clk_10<=notclk_10;

elsediv_10<=div_10+1;

endif;

endif;

endprocess;

fp_10<=clk_10;

fp_100<=clk_100;

fp_1k<=clk_1k;

endBehavioral;

2.闸门选择:

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;

useIEEE.STD_LOGIC_UNSIGNED.ALL;

useIEEE.STD_LOGIC_ARITH.ALL;

entityseleis

port(s:

instd_logic_vector(2downto0);

f1,f10,f100:

instd_logic;

fref:

outstd_logic;

dp1:

outstd_logic_vector(2downto0));

endsele;

architectureBehavioralofseleis

begin

process(s,f1,f10,f100)--xiaoshudian

begin

casesis

when"100"=>

fref<=f1;

dp1<="011";

when"010"=>

fref<=f10;

dp1<="101";

when"001"=>

fref<=f100;

dp1<="110";

whenothers=>

fref<='0';

dp1<="111";

endcase;

endprocess;

endBehavioral;

3.门控电路:

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;

useIEEE.STD_LOGIC_UNSIGNED.ALL;

useIEEE.STD_LOGIC_ARITH.ALL;

entitycontrolis

port(insignal:

inSTD_LOGIC;

gate:

outSTD_LOGIC:

='0';

latch:

outSTD_LOGIC:

='0';

reset:

outSTD_LOGIC:

='0');

endcontrol;

architectureBehavioralofcontrolis

signalcounter_16:

std_logic_vector(3downto0):

="0000";

Begin

process(insignal)

begin

ifrising_edge(insignal)then

counter_16<=counter_16+1;

ifcounter_16<10then

gate<='1';

else

gate<='0';

endif;

ifcounter_16=11then

latch<='1';

else

latch<='0';

endif;

ifcounter_16=13then

reset<='1';

else

reset<='0';

endif;

endif;

endprocess;

endBehavioral;

4.计数器:

entitycounter_10is

port(ce_signal,clr,en:

instd_logic;

over_l:

outstd_logic;

cn1:

outstd_logic_vector(3downto0);

cn2:

outstd_logic_vector(3downto0);

cn3:

outstd_logic_vector(3downto0);

cn4:

outstd_logic_vector(3downto0);

cn5:

outstd_logic_vector(3downto0);

cn6:

outstd_logic_vector(3downto0));

endcounter_10;

architectureBehavioralofcounter_10is

signalcount1:

std_logic_vector(3downto0):

="0000";

signalcount2:

std_logic_vector(3downto0):

="0000";

signalcount3:

std_logic_vector(3downto0):

="0000";

signalcount4:

std_logic_vector(3downto0):

="0000";

signalcount5:

std_logic_vector(3downto0):

="0000";

signalcount6:

std_logic_vector(3downto0):

="0000";

begin

cn1<=count1;

cn2<=count2;

cn3<=count3;

cn4<=count4;

cn5<=count5;

cn6<=count6;

process(ce_signal,clr,en)is

begin

ifclr='1'then

count1<="0000";

count2<="0000";

count3<="0000";

count4<="0000";

count5<="0000";

count6<="0000";

over_l<='0';

elsifrising_edge(ce_signal)then

ifen='1'then

ifcount1<"1001"then

count1<=count1+1;

else

count1<="0000";

ifcount2<"1001"then

count2<=count2+1;

else

count2<="0000";

ifcount3<"1001"then

count3<=count3+1;

else

count3<="0000";

ifcount4<"1001"then

count4<=count4+1;

else

count4<="0000";

ifcount5<"1001"then

count5<=count5+1;

else

count5<="0000";

ifcount6<"1001"then

count6<=count6+1;

else

count6<="0000";

over_l<='1';

endif;

endif;

endif;

endif;

endif;

endif;

endif;

endif;

endprocess;

endBehavioral;

5.锁存器:

entitysuo_cunis

Port(latch_in,over_in:

instd_logic;

data_in1:

instd_logic_vector(3downto0);

data_in2:

instd_logic_vector(3downto0);

data_in3:

instd_logic_vector(3downto0);

data_in4:

instd_logic_vector(3downto0);

data_in5:

instd_logic_vector(3downto0);

data_in6:

instd_logic_vector(3downto0);

over_out:

outstd_logic;

data_out1:

outstd_logic_vector(3downto0);

data_out2:

outstd_logic_vector(3downto0);

data_out3:

outstd_logic_vector(3downto0);

data_out4:

outstd_logic_vector(3downto0);

data_out5:

outstd_logic_vector(3downto0);

data_out6:

outstd_logic_vector(3downto0));

endsuo_cun;

architectureBehavioralofsuo_cunis

begin

process(latch_in)

begin

ifrising_edge(latch_in)then

over_out<=notover_in;

data_out1<=data_in1;

data_out2<=data_in2;

data_out3<=data_in3;

data_out4<=data_in4;

data_out5<=data_in5;

data_out6<=data_in6;

endif;

endprocess;

endBehavioral;

6.扫面显示:

entityshao_miaois

Port(f1k:

inSTD_LOGIC;

dp2:

instd_logic_vector(2downto0);

data1:

in

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1