VHDL 课程设计报告——基于FPGA的数字频率计姓名:学号:班级:目录1 设计原理 (1)2功能设计 (1)3系统总体框图 (1)4各功能块设计说明 (2)5实验结果 (14)6结论分析 (15)一、设计原理频计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。
通常情况下计算每秒内待测信号的脉冲个数,即闸门时间为1 s。
闸门时间可以根据需要取值,大于或小于1 s都可以。
闸门时间越长,得到的频率值就越准确,但闸门时间越长,则每测一次频率的间隔就越长。
闸门时间越短,测得的频率值刷新就越快,但测得的频率精度就受影响。
一般取1 s作为闸门时间,此测量方法称为直接测频法。
由于闸门时间通常不是待测信号的整数倍,这种方法的计数值也会产生最大为±1个脉冲误差。
进一步分析测量准确度:设待测信号脉冲周期为Tx,频率为Fx,当测量时间为T=1s时,测量相对误差为Tx/T=Tx=1/Fx。
由此可知直接测频法的测量准确度与信号的频率有关:当待测信号频率较高时,测量准确度也较高,反之测量准确度也较低。
二、功能设计1、测量范围:1HZ--------99MHZ,测量精度±1HZ。
2、测量结果高4位与低4位进行分页显示。
当超过9999HZ时,系统亮灯提示超出低4位显示范围,可通过按键进行高低4位结果的显示切换。
高4位显示时,伴有小数点位的点亮,提示已成功切换到高4位。
3、测量所测信号的占空比。
能够快速测出输入待测信号的占空比,并且通过按键,切换到占空比显示状态。
4、内置自测信号由内部时钟产生三个特定时钟,以供自身测试功能是否正常。
三、系统总体框图系统总框图四、各功能块设计说明1、时钟发生器通过对50MHZ的晶振时钟进行50M的分频,等到一个1HZ信号。
再通过此信号,通过2分频,得到一个0.5HZ的信号,从而得到高电平为1秒的闸门控制信号en来控制计数器的计数时间.再通过对en求反,等到锁存信号load.而清零信号clr则通过en与1HZ信号共同产生.同时对50MHZ信号进行500分频,一个两位的std_logic_vector(1 downto 0)信号在分频信号的驱动下不断加‘1’,等到“00”、“01”、“10”、“11”四种片选信号,对应4个数码管,从而驱动数码管的动态扫描显示。
时钟发生器的代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clock isport(clk0:in std_logic;load,en,clr:out std_logic;pian:buffer std_logic_vector(1 downto 0));end entity clock;architecture run of clock issignal en1,en2,en3:std_logic;beginonehz:process(clk0) --产生1HZ信号variable cnt:integer range 0 to 50000000;variable x:std_logic;beginif(clk0'event and clk0='1') thenif(cnt<24999999) thencnt:=cnt+1;else cnt:=0; x:=not x;end if;en1<=x;end if;end process onehz;zreo5hz:process(en1) --产生0.5HZ信号beginif(en1'event and en1='1') thenen2<=not en2;end if;en<=en2;end process;locks:process(en2) --对en信号进行取反,得到锁存信号load beginload<=not en2;end process;clr1:process(en1,en2) --由en信号与1HZ信号共同产生清零信号clrbeginif(en1='0'and en2='0') thenclr<='1';else clr<='0';end if;end process;onekhz:process(clk0) --对50MHZ信号进行500分频variable cnt1:integer range 0 to 50000000;variable x1:std_logic;beginif(clk0'event and clk0='1') thenif(cnt1<500) thencnt1:=cnt1+1;else cnt1:=0; x1:=not x1;end if;en3<=x1;end if;end process;pianx:process(en3) --由500分频信号得到片选信号beginif(en3'event and en3='1') thenpian<=pian+1;end if;end process;end architecture run;2、信号输入器通过对50MHZ信号进行不同的2的n次方分频,得到781250HZ,195313HZ,24HZ这三个内部自测信号,以检测频率计是够正常。
通过按键key1,key2,key3来选择三个中的一个信号输入以对频率计进行自检。
而信号输入器的默认情况是输入外部待测信号。
由于使用if---elsif语句,三个按键中,优先级最高的是key1,然后是key2,最后是key3。
信号输入器的代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity fenpin isport(cin,k1,k2,k3,p:in std_logic;clkout,pp:out std_logic);end entity fenpin;architecture run3 of fenpin issignal temp:std_logic_vector(50 downto 0);beginc:process(cin) --对50Mhz进行2的n次方分频beginif(cin'event and cin='1') thentemp<=temp+1;end if;end process;d:process(p,k1,k2,k3)beginif(k1='0') thenclkout<=temp(20); --得到24HZ信号elsif(k2='0') thenclkout<=temp(7); --得到195313HZ信号elsif(k3='0') thenclkout<=temp(5); --得到781250HZ信号else clkout<=p; --默认情况下检测外部信号end if;end process;pp<=temp(20); --向外输出一个24HZ的频率,可供自身测试使用end architecture run3;3、计数器根据在时基有效时间内的计数值进行判断,计数器可以直接定义成8个std_logic_vector(3 downto 0)的32位信号,在待测时钟上升沿到来的时候,使用语句“计数器<=计数器+1;”,当信号的值小于“1001”时,信号就不断自增;当信号大于或等于“1001”时,就归零。
由于if语句的特性,使得到一个二进制显示的十进制计数器,对于后续的显示代码转换也是十分的方便。
当高4位不全为零时,产生一个信号来点亮板上的led灯,告诉使用者待测频率已经超过9999hz,需要翻页才能看到结果的高4位数据。
同时通过一个按键key5,产生一个高低4位传送切换信号。
当key5信号为0时,送低4位到译码显示电路;当key5信号为1时,送高四位到译码显示电路。
默认情况下是送低4位到译码显示电路。
这样就可以通过按键来实现高低四位的换页显示了。
Key5也同时控制着小数点的显示与否,若小数点点亮,则表示切换到高位成功,否则,仍然显示低位。
计数器代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity counter isport(clkin,clr0,do,k:in std_logic;biao,dian:out std_logic;d1,d2,d3,d4:out std_logic_vector(3 downto 0));end entity counter;architecture run1 of counter isbegina:process(clkin)variable a1,a2,a3,a4,a5,a6,a7,a8:std_logic_vector(3 downto 0);beginif(clkin'event and clkin='1') then --1 32位宽的信号进行加1计算,得到频率值if(do='1') then --11 最低位if(a1<"1001") thena1:=a1+1;else a1:="0000";if(a2<"1001") thena2:=a2+1;else a2:="0000";if(a3<"1001") thena3:=a3+1;else a3:="0000";if(a4<"1001") thena4:=a4+1;else a4:="0000";if(a5<"1001") thena5:=a5+1;else a5:="0000";if(a6<"1001") thena6:=a6+1;else a6:="0000";if(a7<"1001") thena7:=a7+1;else a7:="0000";if(a8<"1001") then --最高位a8:=a8+1;else a8:="0000";end if;end if;end if;end if;end if;end if;end if;end if;end if; --11if(clr0='1') then --12 清零信号有效时,对32位宽信号进行清零,为下一次计数做好准备a1:="0000";a2:="0000";a3:="0000";a4:="0000";a5:="0000";a6:="0000";a7:="0000";a8:="0000";end if; --12end if; --1if(a5/="0000") or (a6/="0000") or (a7/="0000")or (a8/="0000")then --2biao<='1'; --待测信号是否超出9999HZ的判断,从而产生高位翻页提醒信号elsebiao<='0';end if; --2if(k='0') then --3 高低4位翻页切换信号的产生与执行d4<=a8;d3<=a7;d2<=a6;d1<=a5;dian<='0';elsed4<=a4;d3<=a3;d2<=a2;d1<=a1;dian<='1';end if; --3end process;end architecture run1;4、占空比测量电路以50MHZ信号作为计数的频率基准。