实验六数字频率计的设计.docx
《实验六数字频率计的设计.docx》由会员分享,可在线阅读,更多相关《实验六数字频率计的设计.docx(16页珍藏版)》请在冰豆网上搜索。
![实验六数字频率计的设计.docx](https://file1.bdocx.com/fileroot1/2023-4/17/c928250a-dd7e-4eb1-95c5-90e45fab123b/c928250a-dd7e-4eb1-95c5-90e45fab123b1.gif)
实验六数字频率计的设计
南昌大学实验报告
学生姓名:
学号:
专业班级:
实验类型:
□验证□综合▉设计□创新实验日期:
12.14__实验成绩:
实验五数字频率计的设计
一、实验目的
1.了解直接测频的方法和原理。
2.掌握如何在FPGA内部设计多种功能模块。
3.掌握VHDL在测量模块设计方面的技巧。
二、实验原理
所谓频率就是周期性信号在单位时间(1s)内变化的次数。
若在一定时间间隔T(也称闸门时间)内测得这个周期性信号的重复变化次数为N,则其频率可表示为
f=N/T
由上面的表示式可以看到,若时间间隔T取1s,则f=N。
由于闸门的起始和结束的时刻对于信号来说是随机的,将会有一个脉冲周期的量化误差。
进一步分析测量准确度:
设待测信号脉冲周期为Tx,频率为Fx,当测量时间为T=1s时,测量准确度为δ=Tx/T=1/Fx。
由此可知这种直接测频法的测量准确度与被测信号的频率有关,当待测信号频率较高时,测量准确度也较高,反之测量准确度较低。
因此,这种直接测频法只适合测量频率较高的信号,不能满足在整个测量频段内的测量精度保持不变的要求。
若要得到在整个测量频段内的测量精度保持不变的要求,应该考虑待精度频率测量等其它方法。
等精度频率测频的实现方法,可以用图17-1所示的框图来实现。
图17-1等精度测频实现框图
本实验采用直接测频法进行频率测量。
闸门时间固定为1s,闸门信号是一个0.5Hz的方波,在闸门有效(高电平)期间,对输入的脉冲进行计数,在闸门信号的下降沿时刻,所存当前的计数值,并且清零所有的频率计数器。
显示的内容是闸门下降沿时锁存的值。
因为闸门时间我们设定为1s,所以这种频率计仅能测出频率大于或者等于1Hz的情况,且频率越高,精度也越高。
实际应用中,频率计的闸门时间是个可变量,当频率小于1Hz时,闸门时间就要适当放大。
采用一个标准的时钟,在单位时间内如:
0.1秒对被测信号的脉冲进行计数,即为信号的频率。
在设计频率计的时候,八个七段码管最多可以显示99,999,999Hz,因此在设计时候用八个4位二进制码(BCD码)来表示,另外还必须有同样的八个4位二进制码来对输入的频率进行计数,在闸门下降沿的时候,将后者的值锁存到寄存器中。
其信号的时序关系如下图17-2所示:
图17-3控制信号时序关系
三、实验内容
本实验要完成的任务就是设计一个频率计,系统时钟选择核心板上的50M的时钟,闸门时间为1s(通过对系统时钟进行分频得到),在闸门为高电平期间,对输入的频率进行计数,当闸门变低的时候,记录当前的频率值,并将频率计数器清零,频率的显示每过2秒刷新一次。
外部CLR清零信号可以使当前寄存值清零。
其实现框图如下图17-3所示:
在本实验中,用到的模块有数字信号源模块、按钮开关模块、50M系统时钟源模块、数码管显示模块等。
其中数码管、数字信号源、按钮开关与FPGA的连接电路和管脚连接这里不在赘述。
50M系统时钟源的模块位于EP2C35核心板的中上方通过一个贴片的50M有源晶体来产生50MHZ的时钟信号,其与FPGA的管脚连接如表17-1所示。
表17-150M系统时钟与FPGA的管脚连接表
信号名称
对应FPGA管脚名
说明
系统时钟源
A13(GCLK9)
50MHZ系统时钟
四、实验步骤
1、打开QUARTUSII软件,新建一个工程。
2、建完工程之后,再新建一个VHDLFile,打开VHDL编辑器对话框。
3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,本实验共分为5个模块,每一个模块源程序完成一定的功能。
其具体的功能如下表17-2:
表17-2示例程序功能表
文件名称
完成功能
P1
产生1HZ的闸门信号和1KHZ的显示扫描信号
P2
在时钟的作用下生成测频的控制信号
P3
十进制计数器,用32位来显示8个4位BCD数
P4
32位的锁存器,在锁存控制信号的作用下,将计数的值锁存
P5
显示译码,将锁存的数据显示出来
实验程序如下所示:
-------------------------------------
--Title:
源程序p1
--Author:
参考自网上
--Data:
2012-12-8
-----------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYp1IS
PORT(clk50m:
INSTD_LOGIC;--50M系统时钟输入
clk1kHZ:
OUTSTD_LOGIC;--1KHZ显示扫描时钟输出
clk1HZ:
OUTSTD_LOGIC);--1HZ闸门信号产生
ENDp1;
ARCHITECTUREbehaveOFp1IS
BEGIN
PROCESS(clk50m)--产生显示扫描时钟1KHZ
variablecnttemp:
INTEGERRANGE0TO99999;
BEGIN
IFclk50m='1'ANDclk50m'eventTHEN
IFcnttemp=99999THENcnttemp:
=0;
ELSE
IFcnttemp<50000THENclk1khz<='1';
ELSEclk1khz<='0';
ENDIF;
cnttemp:
=cnttemp+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clk50m)--产生显示扫描时钟1KHZ
variablecnt:
INTEGERRANGE0TO49999999;
BEGIN
IFclk50m='1'ANDclk50m'eventTHEN
IFcnt=49999999THENcnt:
=0;
ELSE
IFcnt<25000000THENclk1hz<='1';
ELSEclk1hz<='0';
ENDIF;
cnt:
=cnt+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave;
-------------------------------------------------
--Title:
p2源程序
--Author:
参考自网上
--Data:
2012-12-8
-----------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYp2IS
PORT(CLK1hz:
INSTD_LOGIC;--1Hz测频控制时钟
EN:
OUTSTD_LOGIC;--计数器时钟使能
CLR1:
OUTSTD_LOGIC;--计数器清零
LOAD:
OUTSTD_LOGIC);--输出锁存信号
ENDp2;
ARCHITECTUREbehaveOFp2IS
SIGNALDIV2CLK:
STD_LOGIC;
SIGNALCLR:
STD_LOGIC;
BEGIN
PROCESS(CLK1hz)IS
BEGIN
IFCLK1hz'EVENTANDCLK1hz='1'--1HZ时钟二分频
THENDIV2CLK<=NOTDIV2CLK;
ENDIF;
ENDPROCESS;
PROCESS(CLK1hz,DIV2CLK)
BEGIN
IFCLK1hz='0'ANDDIV2CLK='0'THEN--产生计数器清零信号
CLR<='1';
ELSECLR<='0';
ENDIF;
ENDPROCESS;
LOAD<=notdiv2clk;EN<=DIV2CLK;CLR1<=CLR;
ENDbehave;
------------------------------------
--Title:
p3
--Author:
wanjianwei
--Data:
2012-12-8------------------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
useieee.std_logic_unsigned.all;
ENTITYp3IS
PORT(
CLK:
INSTD_LOGIC;--待测输入信号
EN:
INSTD_LOGIC;--计数器时钟使能
CLR1:
INSTD_LOGIC;--计数器清零
DIN:
OUTSTD_LOGIC_VECTOR(31DOWNTO0)--输出32位十进制BCD数
);
ENDP3;
ARCHITECTUREBEHAVEOFP3IS
BEGIN
PROCESS(CLK,EN)
VARIABLEDIN1:
STD_LOGIC_VECTOR(31DOWNTO0);--32位计数中间变量
BEGIN
IF(CLR1='1')THEN--若内部清零信号为1,则中间变量清零。
DIN1:
=(OTHERS=>'0');
elsIF(CLK'EVENTANDCLK='1')THEN--实现32位十进制BCD计数
IF(EN='1')THEN
IF(DIN1(3DOWNTO0)="1001")THEN
DIN1(3DOWNTO0):
="0000";
IF(DIN1(7DOWNTO4)="1001")THEN
DIN1(7DOWNTO4):
="0000";
IF(DIN1(11DOWNTO8)="1001")THEN
DIN1(11DOWNTO8):
="0000";
IF(DIN1(15DOWNTO12)="1001")THEN
DIN1(15DOWNTO12):
="0000";
IF(DIN1(19DOWNTO16)="1001")THEN
DIN1(19DOWNTO16):
="0000";
IF(DIN1(23DOWNTO20)="1001")THEN
DIN1(23DOWNTO20):
="0000";
IF(DIN1(27DOWNTO24)="1001")THEN
DIN1(27DOWNTO24):
="0000";
DIN1(31DOWNTO28):
=DIN1(31DOWNTO28)+1;
ELSIF(DIN1(31DOWNTO24)="10011001")THEN
DIN1(31DOWNTO24):
=(OTHERS=>'0');
ELSE
DIN1(27DOWNTO24):
=DIN1(27DOWNTO24)+1;
ENDIF;
ELSE
DIN1(23DOWNTO20):
=DIN1(23DOWNTO20)+1;
ENDIF;
ELSE
DIN1(19DOWNTO16):
=DIN1(19DOWNTO16)+1;
ENDIF;
ELSE
DIN1(15DOWNTO12):
=DIN1(15DOWNTO12)+1;
ENDIF;
ELSE
DIN1(11DOWNTO8):
=DIN1(11DOWNTO8)+1;
ENDIF;
ELSE
DIN1(7DOWNTO4):
=DIN1(7DOWNTO4)+1;
ENDIF;
ELSE
DIN1(3DOWNTO0):
=DIN1(3DOWNTO0)+1;
ENDIF;
ENDIF;
ENDIF;
DIN<=DIN1;--将中间变量值赋给输出结果变量DIN
ENDPROCESS;
ENDBEHAVE;
------------------------------------------
--Title:
P4
--Author:
参考自网上
--Data:
2012-12-8
------------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYp4IS
PORT(
CLR:
INSTD_LOGIC;--外部清零信号
DIN:
INSTD_LOGIC_VECTOR(31DOWNTO0);--输入32位十进制BCD数
LOAD:
INSTD_LOGIC;--输出锁存信号
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));--输出32位十进制BCD结果
ENDENTITYp4;
ARCHITECTUREbehaveOFP4IS
BEGIN
PROCESS(LOAD,DIN)IS
BEGIN
IFLOAD'EVENTANDLOAD='1'
THENDOUT<=DIN;
ENDIF;
IF(CLR='0')THEN
DOUT<=(OTHERS=>'0');
ENDIF;
ENDPROCESS;
ENDBEHAVE;
--------------------------------------------
--Title:
P5
--Author:
参考自网上
--Data:
2012-12-8
---------------------------------------------------------------------------------------------------------------------
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYP5IS
PORT(CLK1KHZ:
INSTD_LOGIC;--输入1KHZ扫描频率
DOUT:
INSTD_LOGIC_VECTOR(31DOWNTO0);--输入待显示32位十进制BCD数
LOUT7:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--七段显示译码管
SEL:
OUTSTD_LOGIC_VECTOR(2DOWNTO0)--数码管选通信号
);
ENDP5;
ARCHITECTUREBEHAVEOFP5IS
SIGNALS:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALLOUT4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK1KHZ)
BEGIN
IF(CLK1KHZ'EVENTANDCLK1KHZ='1')THEN--实现数码管动态选通
IF(S="111")THEN
S<="000";
ELSES<=S+1;
ENDIF;
ENDIF;
SEL<=S;
ENDPROCESS;
PROCESS(S)
BEGIN
CASESIS
WHEN"000"=>LOUT4<=DOUT(31DOWNTO28);
WHEN"001"=>LOUT4<=DOUT(27DOWNTO24);
WHEN"010"=>LOUT4<=DOUT(23DOWNTO20);
WHEN"011"=>LOUT4<=DOUT(19DOWNTO16);
WHEN"100"=>LOUT4<=DOUT(15DOWNTO12);
WHEN"101"=>LOUT4<=DOUT(11DOWNTO8);
WHEN"110"=>LOUT4<=DOUT(7DOWNTO4);
WHEN"111"=>LOUT4<=DOUT(3DOWNTO0);
WHENOTHERS=>LOUT4<="XXXX";
ENDCASE;
CASELOUT4IS--七段译码显示
WHEN"0000"=>LOUT7<="0111111";
WHEN"0001"=>LOUT7<="0000110";
WHEN"0010"=>LOUT7<="1011011";
WHEN"0011"=>LOUT7<="1001111";
WHEN"0100"=>LOUT7<="1100110";
WHEN"0101"=>LOUT7<="1101101";
WHEN"0110"=>LOUT7<="1111101";
WHEN"0111"=>LOUT7<="0000111";
WHEN"1000"=>LOUT7<="1111111";
WHEN"1001"=>LOUT7<="1101111";
WHENOTHERS=>LOUT7<="0000000";
ENDCASE;
ENDPROCESS;
ENDBEHAVE;
4、编写完VHDL程序后,保存在wanexp17文件夹下。
5、将自己编写的VHDL程序进行编译并生成模块符号文件,并对程序的错误进行修改,最终所有程序通过编译并生成模块符号文件,5个模块如下所示:
6、新建一个图形编辑文件,将已生成的模块符号文件放入其中,并根据要求如下所示接起来。
7、将自己编辑好的的程序进行编译仿真,最终通过编译,接好管脚。
9、用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。
观察实验结果是否与自己的编程思想一致。
五、实验结果与现象
当设计文件加载到目标器件后,从输入数字时钟源模块的输入端输入一个频率大于1Hz的时钟信号,这时在数码管上显示这个时钟信号的频率值。
如果使按下按钮开关s1,数码管上显示的值便被清零,改变数字信号源的时钟,数码管上显示的值与标值相差不大如输入10Khz,显示的是10.012Khz。
六、仿真结果分析
1、当从50Mhz的系统时钟分出1Hz频率的信号clk1hz时,在clk1hz时钟的作用下生成测频的控制信号计数使能信号EN、内部清零信号CLR1及锁存信号LOAD波形如下所示:
真值表如下所示:
Clk1hz
1
0
1
0
en
1
1
0
0
load
0
0
1
1
Clr1
0
0
0
0
与设计之初所设想的控制信号时序关系一致
2、验证频率测评控制信号是否有效,波形如下所示:
图中黑带与蓝带部分均为信号频率太高而无法在有限界面上显示
由图中可知,当EN=1时,计数中间变量din开始计数,而当EN=0时,计数停止,当clr1=1时,计数中间值清零。
与实验预期一样。
七、实验心得体会。
本实验采用直接测频法进行频率测量。
这种直接测频法的测量准确度与被测信号的频率有关,当待测信号频率较高时,测量准确度也较高,反之测量准确度较低。
因此,这种直接测频法只适合测量频率较高的信号,不能满足在整个测量频段内的测量精度保持不变的要求。
若要得到在整个测量频段内的测量精度保持不变的要求,应该考虑待精度频率测量等其它方法。