版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告学生:学院:专业:学号:指导老师:目录TOC\o"1-4"\h\u14812一、实验名称: 320696二、实验目的: 319465三、实验任务: 322781四、实验原理: 3147791.分频器: 414111①功能 431942②实现: 4236272.闸门选择 511901①功能 57960②实现 5111063.门控电路: 628959①功能: 64425②实现 723304.计数器: 821355①功能 828446②实现 8154255.锁存器: 9913①功能 913097②实现 978716.扫面显示 93091①功能 95701②实现 966107.top顶层文件 107852①功能: 1016330②实现: 10294078.管脚的配置: 1126113六、误差分析: 13144431.原因 1327952.减小误差 133753七、实验结论: 1418533八、程序附录: 14266851.分频器: 1435172.闸门选择: 1524533.门控电路: 1678624.计数器: 1772385.锁存器: 19102166.扫面显示: 2016657.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.分频器:功能:对石英振荡器产生的信号进行分频,得到10Hz、100Hz和1KHz三个基准频率,提供标准闸门时间控制信号以精确控制计数器的开闭;同时将1KHz的信号作为扫描显示译码模块的时钟,以产生扫描选择信号。实现:分频器的功能是由于闸门时间只有1S,0.1S,0.01S三档,且在数码管显示时采用动态扫描的方法,需要产生1kHz的扫描信号,由于本设计将下载到开发板上,其提供的标准时间是48MHz,所以要对系统的48MHz时钟信号进行分频,以产生符合要求的各频率信号:先由系统时钟50MHz分频出1kHz作为数码管显示的动态扫描信号,同时产生0.01S的计数闸门信号脉冲,再由1kHz分频出100Hz产生0.1S的计数闸门信号脉冲,由100Hz分频出10Hz产生1S的计数闸门信号脉冲。由此写出分频器的VHDL程序(见程序附录1),仿真模块如图所示:到此完成了对分频器模块的设计和仿真。2.闸门选择:功能:实现对输入的几个闸门信号的手动选择,将选择的闸门信号有fref输出到下一个模块,同时输出小数点的控制信号dp1。实现:采用数字电路里所学的多路复用器原理,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.门控电路:功能:控制整个频率计各模块进行时序工作的控制装置,它对输入的标准时钟信号进行变换,产生我们所需要的三个信号闸门信号gate,锁存信号latch以及清零信号reset。实现:测量过程中,产生的上个闸门信号有着先后顺序。根据我们的测量需要,可以得出三个信号的先后为:gate、latch、reset。同时为了规避冒险,我们需要将三个信号的上升沿错开,由此采用图1所示原理进行编写VHDL程序(见程序附录3);同时对模块进行仿真,仿真模块如图所示:到此完成了对门控电路模块的设计和仿真。4.计数器:功能:在门控电路的gate的控制下对输入的信号进行计数,即完成f=N/T公式中的N的测量。实现:采用数字电路所学的十进制计数器,并对计数器采用级联的方法扩展为6位十进制计数器。由此编写其VHDL程序(见程序附录4),同时对模块进行仿真,仿真模块如图所示:到此完成了对计数器模块的设计和仿真。5.锁存器:功能:对计数器送来的六位计数结果和溢出信号ove_out进行锁存,保证显示数码管的数字不会跳动,方便读取数据。实现:采用数字电路所学的D锁存器的思想,编写能够同时对六位技术界和溢出信号进行锁存的VHDL程序(见程序附录5),编写好之后进行仿真测试,仿真模块如图所示:到此完成了对锁存器模块的设计和仿真。6.扫面显示:功能:对锁存器送来的数据进行动态扫描(即位选)、将六位计数结果分别翻译成七段数码管所能识别的数据(即段选)。实现:通过用一个频率1KHz的信号来扫描一个多路选择器,实现对六位已经锁存的计数结果的扫描输出,由于1KHz相对了人眼的暂留效应已经很高了,所以显示结果不会让人感觉到闪烁。这样就可以用一个译码器来实现对六个4位二进制数的译码。译码结果再连接到一个多路选择器的输入端,同样由1KHz的信号来同步扫描选通。实现最终结果的数字显示。六位十进制数的BCD码经7段译码输出,显示十进制数。并根据档位信号确定小数点显示的位置以实现档位的显示,最后的输出全部通过下载前的固定引脚连接到LED显示管上。由此编写VHDL程序(见程序附录6),编写好之后进行仿真测试,仿真模块如图所示:到此完成了所有模块的设计和仿真,接下来就是对所有模块的汇总连接,编写top顶层文件。完成最终的设计和仿真。7.top顶层文件功能:将所有的模块的功能进行连接,完成频率计的设计。实现:将每个模块点击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_fisport(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;beginfen1k: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;architectureBehavioralofseleisbegin 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_cunisbegin 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:inSTD_LOGIC_VECTOR(3downto0);data2:inSTD_LOGIC_VECTOR(3downto0);data3:inSTD_LOGIC_VECTOR(3downto0);data4:inSTD_LOGIC_VECTOR(3downto0);data5:inSTD_LOGIC_VECTOR(3downto0);data6:inSTD_LOGIC_VECTOR(3downto0);xs_out:outSTD_LOGIC_VECTOR(5downto0);seg:outSTD_LOGIC_VECTOR(6downto0);endshao_miao;architectureBehavioralofshao_miaois signalsel:std_logic_vector(2downto0):="000"; signaldata:std_logic_vector(3downto0); beginprocess(f1k,sel,data1,data2,data3,data4,data5,data6) begin ifrising_edge(f1k)then caseselis when"000"=>data<=data1;xs_out<="111110"; when"001"=>data<=data2;xs_out<="111101"; when"010"=>data<=data3;xs_out<="111011"; when"011"=>data<=data4;xs_out<="110111"; when"100"=>data<=data5;xs_out<="101111"; when"101"=>data<=data6;xs_out<="011111"; whenothers=>data<="1111";xs_out<="111111"; endcase; endif;endprocess;dot:process(sel,dp2) begin caseselis when"100"=> dp<=dp2(2); when"011"=> dp<=dp2(1); when"010"=> dp<=dp2(0); whenothers=> dp<='1'; endcase; endprocess;process(data)begin casedatais when"0000"=>seg<="0000001";when"0001"=>seg<="1001111";when"0010"=>seg<="0010010";when"0011"=>seg<="0000110";when"0100"=>seg<="1001100";when"0101"=>seg<="0100100";when"0110"=>seg<="0100000";when"0111"=>seg<="0001111";when"1000"=>seg<="0000000";when"1001"=>seg<="0000100"; whenothers=>seg<="1111111"; endcase;endprocess; endBehavioral;7.top程序:libraryieee;useieee.std_logic_1164.ALL;useieee.numeric_std.ALL;libraryUNISIM;useUNISIM.Vcomponents.ALL;entitytop_fanisport(ce_liang:instd_logic;clk:instd_logic;s:instd_logic_vector(2downto0);cnte_5:outstd_logic;cnte_6:outstd_logic;dot_out:outstd_logic;light_out:outstd_logic;over_out:outstd_logic;seg:outstd_logic_vector(6downto0);sel:outstd_logic_vector(5downto0));endtop_fan;architectureBEHAVIORALoftop_fanissignalcnte_1:std_logic;signalcnte_2:std_logic;signalcnte_3:std_logic;signalcnte_4:std_logic;signalcnte_7:std_logic;signalcnte_9:std_logic_vector(3downto0);signalcnte_10:std_logic_vector(3downto0);signalcnte_11:std_logic_vector(3downto0);signalcnte_12:std_logic_vector(3downto0);signalcnte_13:std_logic_vector(3downto0);signalcnte_14:std_logic_vector(3downto0);signalcnte_15:std_logic_vector(3downto0);signalcnte_16:std_logic_vector(3downto0);signalcnte_17:std_logic_vector(3downto0);signalcnte_18:std_logic_vector(3downto0);signalcnte_19:std_logic_vector(3downto0);signalcnte_20:std_logic_vector(3downto0);signalcnte_5_DUMMY:std_logic;signalcnte_6_DUMMY:std_logic;signallight_out_DUMMY:std_logic;componentcontrolport(insignal:instd_logic;gate:outstd_logic;latch:outstd_logic;reset:outstd_logic);endcomponent;componentcounter_10port(ce_signal:instd_logic;clr:instd_logic;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));endcomponent;componentdiv_fport(clk:instd_logic;fp_10:outstd_logic;fp_100:outstd_logic;fp_1k:outstd_logic);endcomponent;componentseleport(f1:instd_logic;f10:instd_logic;f100:instd_logic;s:instd_logic_vector(2downto0);fref:outstd_logic;dp1:outstd_logic_vector(2downto0));endcomponent;componentshao_miaoport(f1k:instd_logic;dp2:instd_logic_vector(2downto0);data1:instd_logic_vector(3downto0);data2:instd_logic_vector(3downto0);data3:instd_logic_vector(3downto0);data4:instd_logic_vector(3downto0);data5:instd_logic_vector(3downto0);data6:instd_logic_vector(3downto0);dp:outstd_logic;xs_out:outstd_logic_vector(5downto0);seg:outstd_logic_vector(6downto0));endcomponent;componentsuo_cunport(latch_in:instd_logic;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));endcomponent;begincnte_5<=cnte_5_DUMMY;cnte_6<=cnte_6_DUMMY;light_out<=light_out_DUMMY;Part_1:controlportmap(insignal=>cnte_4,gate=>light_out_DUMMY,latch=>cnte_6_DUMMY,reset=>cnte_5_DUMMY);Part_2:counter_10portmap(ce_signal=>ce_liang,clr=>cnte_5_DUMMY,en=>light_out_DUMMY,cn1(3downto0)=>cnte_9(3downto0),cn2(3downto0)=>cnte_10(3downto0),cn3(3downto0)=>cnte_11
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度矿产资源勘探与开采许可合同2篇
- 2024年店铺门面销售合同2篇
- 石子销售合同(2024年修订)3篇
- 2024年泥水施工队合作协议样本
- 全国股份转让系统(2024年新版)2篇
- 二零二四年高新技术产业研发基地建设合作协议
- 房屋买卖及2024年度房产市场评估合同3篇
- 2024年会议室租赁合同协议书3篇
- 2024年度软件许可合同:应用程序接口(API)使用2篇
- 2024年融资租赁与保理金融服务合同3篇
- 屋面太阳能发电系统施工方案
- 咨询公司招聘合同范本
- 2025年中国细胞与基因治疗行业深度分析、投资前景、趋势预测报告(智研咨询)
- 护理学科建设规划
- 2024年度生产设备操作安全协议
- 四方建房合同模板
- 第六单元 百分数(一) 单元测试(含答案)2024-2025学年六年级上册数学人教版
- 学生心理问题的识别与干预-班主任工作培训课件
- 城市公共交通条例
- 铁路安全专项培训试卷(一)考试
- 劳动教育导论学习通超星期末考试答案章节答案2024年
评论
0/150
提交评论