基于FPGA的数字频率计设计报告_基于fpga的数字频率计
基于FPGA的数字频率计设计报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“基于fpga的数字频率计”。
电子技术综合试验实验报告
班级:测控一班
学号:2907101002
姓名:李大帅 指导老师:李颖
基于FPGA的数字频率计设计报告
一、系统整体设计
设计要求:
1、被测输入信号:方波
2、测试频率范围为:10Hz~100MHz3、量程分为三档:第一档:闸门时间为1S时,最大读数为999.999KHz
第二档:闸门时间为0.1S时,最大读数为9999.99KHz
第三档:闸门时间为0.01S时,最大读数为99999.9KHz。
4、显示工作方式:a、用六位BCD七段数码管显示读数。
b、采用记忆显示方法
c、实现对高位无意义零的消隐。
系统设计原理:
所谓“频率”,就是周期性信号在单位时间(1秒)内变化的次数。若在一定的时间间隔T内计数,计得某周期性信号的重复变化次数为N,则该信号的频率可表达为:f = N / T.基于这一原理我们可以使用单位时间内对被测信号进行计数的方法求得对该信号的频率测量,具体实现过程简述如下: 首先,将被测信号①(方波)加到闸门的输入端。由一个高稳定的石英振荡器和一系列数字分频器组成了时基信号发生器,它输出时间基准(或频率基准)信号③去控制门控电路形成门控信号④,门控信号的作用时间T是非常准确的(由石英振荡器决定)。门控信号控制闸门的开与闭,只有在闸门开通的时间内,方波脉冲②才能通过闸门成为被计数的脉冲⑤由计数器计数。
闸门开通的时间称为闸门时间,其长度等于门控信号作用时间T。比如,时间基准信号的重复周期为1S,加到闸门的门控信号作用时间T亦准确地等于1S,即闸门的开通时间——“闸门时间”为1S。在这一段时间内,若计数器计得N=100000个数,根据公式f = N / T,那么被测频率就是100000Hz。如果计数式频率计的显示器单位为“KHz”,则显示100.000KHz,即小数点定位在第三位。不难设想,若将闸门时间设为T=0.1S,则计数值为10000,这时,显示器的小数点只要根据闸门时间T的改变也随之自动往右移动一位(自动定位),那么,显示的结果为100.00Khz。在计数式数字频率计中,通过选择不同的闸门时间,可以改变频率计的测量范围和测量精度。
系统单元模块划分: 1)分频器,将产生用于计数控制的时钟分别为1HZ,10HZ,100HZ脉冲和1KHZ的用于七段显示数码管扫描显示的扫描信号。
2)闸门选择器,用于选择不同的闸门时间以及产生后续的小数点的显示位置。3)门控电路,产生用于计数的使能控制信号,清零信号以及锁存器锁存信号。4)计数器,用于对输入的待测信号进行脉冲计数,计数输出。
5)锁存器,用于对计数器输出数据的锁存,便于后续译码显示电路的对数据进行记忆显示,同时避免计数器清零信号对数据产生影响。
6)译码显示,用于产生使七段显示数码管的扫描数字显示,小数点显示的输出信号,同时对高位的无意义零进行消隐。
二、单元电路设计
1、分频器:
该电路将产生四个不同频率的信号输出,因为电路板上给出了一个48MHZ的晶振,所以我们只需要对48MHZ的信号进行适当分频即可得到我们所需的四个不同频率的信号输出,我们设计一个输入为48MHZ,有四个输出端分别为1HZ,10HZ和100HZ,1KHZ的分频器,原程序如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity fenpinqi is Port(clk : in STD_LOGIC;clkout1 : out STD_LOGIC;clkout10 : out STD_LOGIC;clkout100 : out STD_LOGIC;clkout1K : out STD_LOGIC);end fenpinqi;
architecture Behavioral of fenpinqi is signal cnt1:integer range 1 to 24000000;signal cnt10:integer range 1 to 2400000;signal cnt100:integer range 1 to 240000;signal cnt1K:integer range 1 to 24000;signal c1:std_logic;signal c2:std_logic;signal c3:std_logic;signal c4:std_logic;begin proce(clk)is begin if clk'event and clk='1' then if cnt1
--对cnt1进行计数,当cnt1未计满后对其进行加1 cnt1
--cnt1计满后对其进行赋一,并且令c1进行翻转,然后将c1的值赋给clkout1
c1
if cnt10
cnt10
end if;end if;end proce;
proce(clk)is begin
if clk'event and clk='1' then
--方法同上
if cnt100
cnt100
elsif cnt100=240000 then
c3
cnt100
end if;end if;end proce;
proce(clk)is begin
if clk'event and clk='1' then
--方法同上
if cnt1K
cnt1K
elsif cnt1=24000 then
c4
cnt1K
end if;end if;end proce;clkout1
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY tbb_vhd IS END tbb_vhd;ARCHITECTURE behavior OF tbb_vhd IS COMPONENT fenpinqi 4
BEGIN
END;uut: fenpinqi PORT MAP(clk => clk, clkout1 => clkout1, clkout10 => clkout10, clkout100 => clkout100, clkout1K => clkout1K);PORT(clk : IN std_logic;
clkout1 : OUT std_logic;clkout10 : OUT std_logic;clkout100 : OUT std_logic;clkout1K : OUT std_logic);END COMPONENT;SIGNAL clk : std_logic := '0';SIGNAL clkout1 : std_logic;SIGNAL clkout10 : std_logic;SIGNAL clkout100 : std_logic;SIGNAL clkout1K : std_logic;tb : PROCESS BEGIN
clk
有上图可知分频器工作正常,产生的个信号也没有毛刺,结果十分理想。
2、闸门选择器:
在这个模块中我们有四个输出端和六个输入端,其中四个输出端中有一个是频率输出端,是通过三个闸门选择开关输入和三个输入频率决定的,另外三个输出端则是用来后面的小数点控制的,而六个输入端中的三个是上面分频器的三个输出1HZ,10HZ和100HZ,另外三个是电路板上的拨动开关,用来选择闸门,控制输出。其原程序和分析如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity SELE is Port(SE1 : in STD_LOGIC;
SE10 : in STD_LOGIC;SE100 : in STD_LOGIC;F1HZ : IN STD_LOGIC;F10HZ : IN STD_LOGIC;F100HZ :IN STD_LOGIC;FREF : out STD_LOGIC;DP1 : out STD_LOGIC;DP2 : out STD_LOGIC;DP3 : out STD_LOGIC);end SELE;architecture Behavioral of SELE is begin PROCESS(SE1,SE10,SE100)IS BEGIN IF SE1='1' AND SE10='0' AND SE100='0' THEN
FREF
DP1
DP2
FREF
--第二档,输出为10HZ,dp2有效
DP1
DP2
FREF
--第三档,输出为100HZ,dp3有效
DP1
DP2
仿真文件编写如下:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY TTB_vhd IS END TTB_vhd;ARCHITECTURE behavior OF TTB_vhd IS COMPONENT SELE
PORT(SE1 : IN std_logic;
SE10 : IN std_logic;
SE100 : IN std_logic;
F1HZ : IN std_logic;
F10HZ : IN std_logic;
F100HZ : IN std_logic;
FREF : OUT std_logic;
DP1 : OUT std_logic;
DP2 : OUT std_logic;DP3 : OUT std_logic);END COMPONENT;SIGNAL SE1 : std_logic := '1';SIGNAL SE10 : std_logic := '0';SIGNAL SE100 : std_logic := '0';SIGNAL F1HZ : std_logic := '0';SIGNAL F10HZ : std_logic := '0';SIGNAL F100HZ : std_logic := '0';SIGNAL FREF : std_logic;SIGNAL DP1 : std_logic;SIGNAL DP2 : std_logic;SIGNAL DP3 : std_logic;BEGIN uut: SELE PORT MAP(SE1 => SE1,SE10 => SE10,SE100 => SE100,F1HZ => F1HZ,F10HZ => F10HZ,F100HZ => F100HZ,FREF => FREF,DP1 => DP1,DP2 => DP2, DP3 => DP3);
tb : PROCESS BEGIN
F1HZ
wait for 100 ns;
F1HZ
有仿真结果可知闸门选择器工作正常,能够准确输出我们所需的信号。
3、门控信号:
在此模块中有一个输入端和两个输出端,输入端为上面的闸门选择器输出的频率,两个输出端分别为计数器是能控制信号(锁存器控制信号),和计数器清零信号。具体源程序即分析如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CONTROLS is Port(FREF : in STD_LOGIC;GAT : out STD_LOGIC;CLR : out STD_LOGIC);end CONTROLS;
architecture Behavioral of CONTROLS is SIGNAL G1: STD_LOGIC:='0';begin
PROCESS(FREF)IS
BEGIN IF FREF'EVENT AND FREF='1' THEN G1
END IF;END PROCESS;PROCESS(FREF,G1)IS
BEGIN IF FREF='0' AND G1='0' THEN CLR
--清零信号高电平有效 ELSE CLR
end Behavioral;源文件编写完成后保存编译并生成图形文件符号如图:
仿真文件代码如下:
LIBRARY ieee;8
USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY TBCON_vhd IS END TBCON_vhd;ARCHITECTURE behavior OF TBCON_vhd IS
BEGIN
END;tb : PROCESS BEGIN
FREF
FREF => FREF, GAT => GAT, CLR => CLR);COMPONENT CONTROLS PORT(FREF : IN std_logic;
GAT : OUT std_logic;CLR : OUT std_logic);END COMPONENT;SIGNAL FREF : std_logic := '0';SIGNAL GAT : std_logic;SIGNAL CLR : std_logic;END PROCESS;对上面的文件进行仿真,结果如下:
由上图的仿真结果可知,控制电路工作正常,输出信号稳定,很理想。同时我们也可以看出来该模块对分频器的时钟输出的稳定性依赖十分严重,一旦分频器输出时钟有毛刺,该控制信号将会完全的无效,这也是为什么我知道上面的分频器设计不是最优的方案,却还是采用了上述方法的原因。
4、计数器:
该模块实现的功能是对输入信号脉冲的计数,并正确的输出结果和溢出。使用上面的门控信号产生的gat信号控制计数器的使能端,以实现计数器的定时计数。该模块是使用六个十进制计数器同步并联而成的,首先我们设计用于并联的十进制计数器,原程序如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;9
entity CNT10 is Port(CLK : in STD_LOGIC;CLR : in STD_LOGIC;
ENA : in STD_LOGIC;CQ : out STD_LOGIC_VECTOR(3 downto 0);CO : out STD_LOGIC);end CNT10;
architecture Behavioral of CNT10 is SIGNAL CQI: STD_LOGIC_VECTOR(3 DOWNTO 0):=“0000”;
--定义中间信号CQI,用于数据输出的循环计数
begin
PROCESS(CLK,CLR)IS
end Behavioral;
BEGIN IF CLR='1' THEN CQI
--当CLR清零信号有效时使输出为0000,无效时进行下述操作--对时钟进行计数 ELSIF CLK'EVENT AND CLK='1' THEN
IF ENA='1' THEN
--判断使能信号,有效则进行计数,否则不作处理
--数据0~9循环,计满后重新回到0 IF CQI=“1001” THEN CQI
--进位信号,最高位的仅为信号作为计数的溢出信号
--当且仅当使能有效且计数为9时产生进位信号,进位信号1有效,同步并联时连高位的使能端
文件编写完成后保存编译生成图形文件符号,如上图:
创建图形文件cnt6并按照下图进行连接,保存后编译生成图形文件符号如图:
仿真文件代码如下:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY TBCNT10_vhd IS END TBCNT10_vhd;ARCHITECTURE behavior OF TBCNT10_vhd IS
COMPONENT CNT10 PORT(CLK : IN std_logic;
CLR : IN std_logic;ENA : IN std_logic;CQ : OUT std_logic_vector(3 downto 0);CO : OUT std_logic);END COMPONENT;SIGNAL CLK : std_logic := '0';SIGNAL CLR : std_logic := '0';SIGNAL ENA : std_logic := '1';SIGNAL CQ : std_logic_vector(3 downto 0);SIGNAL CO : std_logic;BEGIN
END;tb : PROCESS BEGIN
CLK
CLK => CLK, CLR => CLR, ENA => ENA, CQ => CQ, CO => CO);END PROCESS;仿真结果如图:
如仿真结果我们可以看出,该模块运行正常,计数稳定,结果十分理想。
5、锁存器:
由于前面的计数器的输出为六组四位二进制数和一个溢出信号,所以我们使用的锁存器也使用六个四位锁存器和一个一位锁存器。锁存器使用下降沿锁存,即当计数器的使能信号变为无效的一瞬间我们令锁存器将数据锁存。四位锁存器的原代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity LATCH4 is Port(CLK : in STD_LOGIC;DIN : in STD_LOGIC_VECTOR(3 downto 0);QOU : out STD_LOGIC_VECTOR(3 downto 0));end LATCH4;architecture Behavioral of LATCH4 is begin
PROCESS(CLK,DIN)IS
BEGIN
IF CLK'EVENT AND CLK='0' THEN--当时钟信号下降沿时,实现锁存
QOU
END IF;END PROCESS;end Behavioral;上述文件编写完成后保存编译生成图形文件符号如图: 再编写一位锁存器,源程序代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity LATCH1 is Port(CLK : in STD_LOGIC;DIN : in STD_LOGIC_VECTOR;QOU : out STD_LOGIC_VECTOR);end LATCH1;architecture Behavioral of LATCH1 is begin
PROCESS(CLK,DIN)IS
BEGIN
IF CLK'EVENT AND CLK='0' THEN--当时钟信号下降沿时,实现锁存
QOU
END IF;END PROCESS;end Behavioral;
文件编写完成后保存编译生成图形文件符号,如图:
锁存完成后有六组四位二进制数和一个一位二进制数,所以我们队总线进行了合并,即将六组四位数合并成一个二十四位数,合并程序如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ADVOCATES is Port(S0 : in STD_LOGIC_VECTOR(3 downto 0);S1 : in STD_LOGIC_VECTOR(3 downto 0);S2 : in STD_LOGIC_VECTOR(3 downto 0);S3 : in STD_LOGIC_VECTOR(3 downto 0);S4 : in STD_LOGIC_VECTOR(3 downto 0);S5 : in STD_LOGIC_VECTOR(3 downto 0);S6 : out STD_LOGIC_VECTOR(23 downto 0));
end ADVOCATES;
architecture Behavioral of ADVOCATES is
begin S6(23 DOWNTO 20)
文件编写完成后保存编译生成图形文件符号,如图:
创建该模块的顶层图形文件LAT.sch将上述个文件按照如图所示连接,保存编译生成图形文件符号如图:
该模块的输入输出简单,无需仿真。
6、译码显示:
该模块实现的是对锁存器锁存的数据进行处理并显示输出,以及小数点的不同闸门的输出显示,以及电路板上七段显示译码管的扫描信号输出。其中对锁存数据的处理包括溢出有效时的数据消除,和对高位无意义零的自动消隐。首先我们编写小数点控制的源文件代码:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity POINTCON is Port(SE1 : in STD_LOGIC;SE10 : in STD_LOGIC;SE100 : in STD_LOGIC;SEL : in STD_LOGIC_VECTOR(2 downto 0);DP : out STD_LOGIC);end POINTCON;
architecture Behavioral of POINTCON is begin
PROCESS(SE1,SE10,SE100,SEL)IS
BEGIN
IF SE1='1' AND SE10='0' AND SE100='0' AND SEL=“011” THEN DP
--当为第一档时,令第四位的数码管的小数点点亮,其他的不亮
ELSIF SE1='0' AND SE10='1' AND SE100='0' AND SEL=“010” THEN DP
--第二档时,第三位的数码管小数点点亮
ELSIF SE1='0' AND SE10='0' AND SE100='1' AND SEL=“001” THEN DP
--第三档时,第二位的小数点点亮--不符合上述三档时,小数点全部消隐 ELSE DP
再编写用于数码管扫描显示的的位选信号生成文件,其代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CTRLS is Port(CLK : in STD_LOGIC;SEL : out STD_LOGIC_VECTOR(2 downto 0));end CTRLS;
architecture Behavioral of CTRLS is SIGNAL CNT: STD_LOGIC_VECTOR(2 DOWNTO 0):=“000”;begin PROCESS(CLK)IS 14
BEGIN IF CLK'EVENT AND CLK='1' THEN
--接入1KHZ的时钟信号,使CNT进行循环计数,从000到101
IF CNT=”101” THEN CNT
ELSE CNT
end Behavioral;文件编写完成后保存编译生成图形文件符号如图:
再编写使高位无意义零自动消隐功能的的文件,源程序代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DSELE is Port(DP1: IN STD_LOGIC;DP2: IN STD_LOGIC;DIN : in STD_LOGIC_VECTOR(23 downto 0);QOU : out STD_LOGIC_VECTOR(23 downto 0));end DSELE;architecture Behavioral of DSELE is begin PROCESS(DP1,DP2,DIN)IS
BEGIN
IF DP1='0' AND DP2='1' THEN
IF DIN(23 DOWNTO 20)=“0000” THEN
QOU(23 DOWNTO 20)
QOU(19 DOWNTO 0)
END IF;
IF DIN(23 DOWNTO 20)=“0000” AND DIN(19 DOWNTO 16)=“0000” THEN
QOU(23 DOWNTO 20)
QOU(19 DOWNTO 16)
QOU(15 DOWNTO 0)
END IF;
END IF;
IF DP1='1' AND DP2='0' THEN
IF DIN(23 DOWNTO 20)=“0000” THEN
QOU(23 DOWNTO 20)
QOU(19 DOWNTO 0)
END IF;
IF DIN(23 DOWNTO 20)=“0000” AND DIN(19 DOWNTO 16)=“0000” THEN
QOU(23 DOWNTO 20)
THEN
QOU(23 DOWNTO 20)
QOU(15 DOWNTO 0)
QOU(23 DOWNTO 20)
IF DIN(23 DOWNTO 20)=“0000” THEN QOU(23 DOWNTO 20)
QOU(23 DOWNTO 20)
QOU(23 DOWNTO 20)
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DISPLAY1 is 16
Port(SEL : in STD_LOGIC_VECTOR(2 downto 0);
OVERIN : IN STD_LOGIC;
DATAIN : in STD_LOGIC_VECTOR(23 downto 0);SEG : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END DISPLAY1;
architecture Behavioral of DISPLAY1 is SIGNAL DATA: STD_LOGIC_VECTOR(3 DOWNTO 0):=“0000”;BEGIN PROCESS(SEL,OVERIN)IS
BEGIN
CASE SEL IS
--对位选信号进行判断,对应每一位分别提取数据中的不同位置的数据赋给中间信号DATA
WHEN “000”=>DATA
WHEN “001”=>DATA
WHEN “010”=>DATA
WHEN “011”=>DATA
WHEN “100”=>DATA
WHEN “101”=>DATA
WHEN OTHERS=>DATA
END CASE;
CASE DATA IS
--对中间信号DATA进行译码,SEG为数码管的数据显示输出,从而使不同位置上有不同的数字显示
WHEN “0000”=>SEG
WHEN “0001”=>SEG
WHEN “0010”=>SEG
WHEN “0011”=>SEG
WHEN “0100”=>SEG
WHEN “0101”=>SEG
WHEN “0110”=>SEG
WHEN “0111”=>SEG
WHEN “1000”=>SEG
WHEN “1001”=>SEG
WHEN OTHERS=>SEG
END CASE;
if OVERIN='1' THEN
--判断溢出,若溢出则令输出全部不显示
SEG
建立该模块的顶层图形文件DISPLAY.sch,按照下图连接各元件,保存编译生成图形文件符号如下图:17
该模块的输入数据量太大难以仿真,故这里只对其中的扫描信号生成文件进行仿真,仿真文件代码如下:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY TBCTRLS_vhd IS END TBCTRLS_vhd;ARCHITECTURE behavior OF TBCTRLS_vhd IS
BEGIN
END;uut: CTRLS PORT MAP(CLK => CLK, SEL => SEL);COMPONENT CTRLS PORT(CLK : IN std_logic;
SEL : OUT std_logic_vector(2 downto 0));END COMPONENT;SIGNAL CLK : std_logic := '0';SIGNAL SEL : std_logic_vector(2 downto 0);tb : PROCESS BEGIN
CLK
有仿真结果我们可以看出程序运行正常,逻辑上没有任何问题。至此所有的单元电路全部完成。
三、设计实现
1、顶层文件:
创建图形文件FRYALL.sch,按照下图连接各模块生成的图形文件符号,完成后保存编译。
2、管脚分配:
由系统的顶层文件可以看到该系统的输入端共有5个,输出端有11个,管脚分配文件FRYALL.ucf如下:
NET “CLKIN” LOC = T8;NET “DCLK” LOC = C16;NET “DP” LOC = C11;NET “NECT” LOC = D7;NET “SE1” LOC = L6;NET “SE10” LOC = N5;NET “SE100” LOC = L7;NET “SEG” LOC = B14;NET “SEG” LOC = A13;NET “SEG” LOC = C13;NET “SEG” LOC = C12;NET “SEG” LOC = A12;NET “SEG” LOC = B12;NET “SEG” LOC = A11;NET “SEL” LOC = F8;NET “SEL” LOC = D8;NET “SEL” LOC = E7;193、下载过程:
光标移至【Generate Programing File】后单击鼠标右键,然后单击【Properties】在打开的对话框的左侧栏选中【Configuration Options】将右侧的Unused IOB Pins这一项改为Pull Up,单击OK。在界面的左下角双击【 Generate Programing File】,软件将自动对整个系统进行编译并生成可执行文件FRYALL.bit。将弹出的对话框关掉,双击【 Generate Prom, ACE,or JTAG File】在弹出的对话框中点击Finish,在随后出现的对话框中选择FRYALL.bit,然后点击打开,在随后的对话框中点击Bypa。右键单击左边图标选择Program,在随后的对话框中单击OK,文件将自动下载到开发板上,成功后,接入函数发生器进行测试。
四、测试结果及结论
经过了前三步,最后我们将所完成的工程下载到了板子上,连接好函数发生器,并设定好了函数发生器的输出信号电平(5Vpp),就可以进行使用了。
最后结果显示程序工作正常,读数清晰稳定,完全符合开始时的要求。
误差分析:
我将函数发生器的频率调节到999,999HZ时,频率计不显示,即产生了计数溢出,然后我进行了进一步的调节,将函数发生器的频率调节到999,997时读书显示为999.999,单位为KHZ。由此可知相对误差为±0.0002%,误差很小。所以本次实验圆满成功。
通过对数字频率计的设计实现,我深入的学习了ise软件的使用,VHDL语言的编写规范,语法结构等。在本次试验中我回顾了在《数字电路》课程中学过的关于数字电路的设计的部分,了解了VHDL和Verilog语言的区别与联系,以及它们的优缺点,以及它们主要针对的设计对象。我觉得我通过本次试验学会了很多。