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

8.管脚的配置:

分配引脚,即实现设计的输入输出端口与实际芯片的输入输出端口的对应连接。参考老师提供的电路板管脚(见图1),完成对引脚的分配,得到top_fan.ucf文件(见下图):

9.下载程序:

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

六、误差分析:

1. 原因:计数N不准,存在±1误差。通过仔细分析可知,在测频时,主门

的开启时刻与计数脉冲之间的时间关系是不相关的,所以它们在时间轴上的相对位置是随机的。这样,在相同的主门开启时间内,计数器所计得的数却不一定相同,当主门开启时间T接近甚至等于被测信号周期Tx的整数倍N倍时,此项误差为最大,图4 画出的就是这种情况:

图 4 正负1误差

若主门开启时刻为T0,而第1个计数脉冲出现在Tx,图 4 (a)中示出了Tx>T0>0的情况

(?T?Tx?T0),这时计数器计得N个数(图中N=6);现在再来看图 4 (b)情况,即?T趋近于0,这就有两种可能的计数结果:若第1个计数脉冲和第7个计数脉冲都能通过主门,则可计得N+1=7个数;也可能这两个脉冲都没有能进入主门,则只能计得N-1=5个数。由此可知,最大的计数误差为?N??1个数,即存在±1误差。

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

位。当T选定后,fx越低,则由±1误差产生的测频误差越大。fx一定时,增大闸门时间T,可减小±1误差对测频误差的影响。因此我们在测量频率的时候尽量选择合适的闸门可

以减小误差。

七、实验结论:

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

八、程序附录: 1.分频器:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity div_f is

port (clk : in std_logic; fp_10,fp_100,fp_1k : out std_logic); end div_f;

architecture Behavioral of div_f is signal div_10: std_logic_vector(2 downto 0):=\ signal div_100: std_logic_vector(2 downto 0):=\ signal div_1k: std_logic_vector(14 downto 0):=\ signal clk_10,clk_100,clk_1k: std_logic; begin

fen1k: process(clk) begin if rising_edge(clk) then if div_1k=24999 then div_1k<=\ clk_1k<=not clk_1k;

else div_1k<=div_1k+1; end if; end if; end process;

fen100: process(clk_1k) begin if rising_edge(clk_1k) then if div_100=5 then div_100<=\ clk_100<=not clk_100; else div_100<=div_100+1; end if; end if; end process;

fen10: process(clk_100) begin if rising_edge(clk_100) then if div_10=5 then div_10<=\ clk_10<=not clk_10; else div_10<=div_10+1; end if; end if; end process; fp_10<=clk_10; fp_100<=clk_100; fp_1k<=clk_1k; end Behavioral;

2.闸门选择:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity sele is port( s: in std_logic_vector(2 downto 0); f1 ,f10 ,f100 : in std_logic; fref : out std_logic; dp1 : out std_logic_vector(2 downto 0)); end sele;

architecture Behavioral of sele is begin process(s,f1,f10,f100) --xiaoshudian