+FPGA的频率计11.docx
《+FPGA的频率计11.docx》由会员分享,可在线阅读,更多相关《+FPGA的频率计11.docx(26页珍藏版)》请在冰豆网上搜索。
+FPGA的频率计11
数据采集与智能仪器
课程大作业
题目:
智能频率计的设计
班级:
电信0606
姓名:
吴从明
学号:
0120609310628
日期:
2009.4.27
目录
1.设计原理描述1
2.技术指标参数2
3.性能指标分析2
4.硬件的单元模块设计3
4.1信号整形电路3
4.2单片机主控模块4
4.3测频模块的工作原理及设计5
4.3.1等精度测频法5
4.3.2FPGA模块逻辑设计7
4.4显示模块8
4.5总体电路图11
5.软件设计12
5.1频率计的VHDL设计12
5.2单片机的汇编语言编程15
5.2.1单片机主程序15
5.2.2测频子程序17
5.2.3显示子程序18
5.2.4单片机程序清单19
6.心得体会30
1.设计原理描述
考虑到只基于单片机的频率测量计设计主要是以单片机为基础,原理简单,但由于自身精度问题,测量的范围小。
而基于FPGA和单片机结合的频率测量设计主要是以单片机作为系统的主控部件,FPGA完成对时序逻辑控制、计数功能,能较好的利用了FPGA的高精度、高速等方面的优势。
所以,本次智能仪器的大作业我采用的是单片机作为系统的主控部件,实现整个电路的测试信号控制、数据运算和控制数码管的显示输出等。
一块复杂的现场可编程门阵列芯片完成各种时序逻辑控制、计数功能。
被测信号
图1
系统组成原理框图如图1所示。
由一片FPGA完成各种测试功能,对标准频率(采用系统内部时钟)和被测信号进行计数。
单片机对整个测试系统进行控制,包括对FPGA测量过程的控制、测量结果资料的处理、键控制信号的读入与处理,最后将测量结果送LED显示。
被测信号整形部分主要对被测信号限幅、放大再经过整形后送入FPGA。
FPGA的标准测试频率为40MHz。
单片机由外接12MHz标准晶振提供时钟电路。
其核心部分为单片机和可编程芯片FPGA。
所有信号包括基准频率信号、被测信号以及自校输入信号均可在89C51单片机的控制下送入FPGA芯片中,单片机将每次测试结果读入内存RAM中,经运算处理后,以十进制的形式送到8位数码管显示电路显示。
用单片机软件查询键盘控制命令情况,实现开始功能、预置门时间控制功能等。
2.技术指标参数
采用40MHz的标准时钟参考源
测量信号波形:
正弦波、锯齿波、方波
测量信号幅度:
100mV~5V
测量的频率范围:
0Hz~100MHz
测量精度:
恒为25ns
数码管显示的频率范围:
0Hz~100MHz的整数值
3.性能指标分析
此频率计的设计采用等精度测量法,采用同步电路,消除正负1的工作时钟误差,但不可避免的引入参考时钟的误差。
从理论上分析的话,每次测量的的误差主要来源于两个方面,一个来源于标准参考时钟,若取40MHz的参考时钟源,则恒引入25ns的测量误差,第二个方面来源于程序计算,不过这个方面可以通过优化程序,使误差控制在可以接受的误差范围内。
4.硬件的单元模块设计
4.1信号整形电路
图4-1为输入信号整形电路。
放大整形电路由9018和74HC14等组成,其中9018组成放大电路将输入为FX得周期信号如正弦波、锯齿波、三角波等进行放大。
74HC14施密特触发器对放大器得输出信号进行整形,使之称为矩形脉冲。
其连接如图所示。
待测信号经过时,由D11、D22两个二极管进行限幅,以免电压过大而烧毁,信号经过9018进行放大,由74HC14对其进行整形,产生出得波形为标准方波,方便FPGA进行计数。
图4-1被测信号整形电路
4.2单片机主控模块
单片机测频控制电路如图4-2所示,由单片机完成整个测量电路的测试控制、数据处理和显示输出,FPGA完成各种测试功能。
(1)由于FPGA在对频率进行计数时,采用两组32位二进制计数器,8位数据总线的单片机分八次将64位元数据全部读出。
利用89C51的P0口读计数器输出标准频率信号和被测信号的值。
被读出的八组8位数据通过89C51的SS0,SS1,SS2地址编码选择,由P2口输出控制。
(2)CLR:
系统全清零功能。
(3)GATE:
为预置门闸,门宽可通过键盘由单片机控制,GATE=1时预置门打开;GATE=0时,预置门关闭。
(4)START:
测频计数结束状态信号,START由“1”变为“0”时计数结束。
(5)SS2,SS1,SS0:
计数字读出选通控制。
若令SS=[SS2,SS1,SS0],则当SS=0,1,2,3时可从P0口由低8位至高8位分别读出标准信号的四个8位计数值。
当SS=4,5,6,7时同样可从P0口由低8位至高8位分别读出被测信号的四个8位计数值。
(6)FS:
为标准频率信号输入,此频率来源于FPGA内部的40MHz的振荡晶体。
(7)FX:
为被测信号输入,此信号是经过限幅放大整形电路后的信号。
图4-2单片机测频控制电路
4.3测频模块的工作原理及设计
4.3.1等精度测频法
等精度测频的方法是:
采用频率准确的高频信号作为标准频率信号,保证测量的闸门时间为被测信号的整数倍,并在闸门时间内同时对标准信号脉冲和被测信号脉冲进行计数,实现整个频率测量范围内的测量精度相等,当标准信号很高,闸门时间足够长时,可实现高精度的频率测量。
等精度测频原理示意图如图3-3所示
图3-3中的门控信号是可预置的宽度为Tpr的脉冲。
COUNT1和COUNT2是两个可控计数器。
标准频率信号从COUNT1的时钟输入端CLK输入,其频率为Fs;经整形后的被测信号从COUNT2的时钟输入端CLK输入,设其实际频率为Fxe,测量频率为Fx。
当门控信号为高电平时,被测信号的上沿通过D触发器的Q端同时启动计数器COUNT1和COUNT2。
对被测信号Fx和标准频率信号Fs同时计数。
当门控信号为低电平时,随后而至的被测信号的上沿将使这两个计数器同时关闭。
设在一次
门控时间Tpr中对被测信号计数值为Nx。
对标准频率信号的计数值为Ns。
则:
Fx/Nx=Fs/Ns(标准频率和被测频率的门宽时间Tpr完全相同)
就可以得到被测信号的频率值为:
Fx=(Fs/Ns)*Nx
图3-3等精度测频原理示意图
误差分析如下:
在一次测量中,由于Fx计数的起停时间都是由该信号的上升沿触发的,在Tpr时间内对Fx的计数Nx无误差;在此时间内Fs的计数Ns最多相差一个脉冲,即|△et|≤1,则下式成立:
Fx/Nx=Fs/Ns
Fxe/Nx=Fs/(Ns+△et)
所以有:
Fx=(Fs/Ns)*Nx
Fxe=[Fs/(Ns+△et)]*Nx
根据相对误差公式有:
△Fxe/Fxe=lFxe-Fxl/Fxe
代入整理得:
△Fxe/Fxe=I△et|/Ns
又因为:
|△et|≤1
所以:
|△et|/NS≤1/Ns
即:
|﹠|=△Fxe/Fxe≤1/Ns
其中:
Ns=Tpr*Fs
由以上推导结果可得出下面结论:
(1)相对测量误差与频率无关。
(2)增大Tpr或提高Fs,可以增大Ns,减少测量误差,提高测量精度。
(3)标准频率误差为△Fs/Fs,由于晶体的稳定度很高,标准频率误差可以进行校准。
(4)等精度测频方法测量精度与预置门宽度和标准频率有关,与被测信号的频率无关。
在预置门时间和常规测频闸门时间相同而被测信号频率不同的情况下,等精度测量法的测量精度在整个测量范围内保持恒定不变,而常规的直接测频法(在低频时用测周法,高频时用测频法),其精度会随着被测信号频率的下降而下降。
4.3.2FPGA模块逻辑设计
本设计频率测量方法的主要测量控制框图如图3-4所示。
图中预置门控信号GATE是由单片机发出,GATE的时间宽度对测频精度影响较少,可以在较大的范围内选择,只要FPGA中32位计数器在计40M信号不溢出都行,但是由于单片机的数据处理能力限制,实际的时间宽度较少,一般可在10~0.1s间选择,即在高频段时,闸门时间较短;低频时闸门时间较长。
这样闸门时间宽度Tc依据被测频率的大小自动调整测频,从而实现量程的自动转换,扩大了测频的量程范围;实现了全范围等精度测量,减少了低频测量的误差。
图3-4中Count1和Count2是2个可控的32位高速计数器,
EN是他们的计数允许信号端,高电平有效。
基准频率信号从Count1的时钟输入端BCLK输入,设其频率为Fs;待测信号经前端放大、限幅和整形后,从与Count2相似的32位计数器Count2的时钟输入端CLK输入,测量频率为Fx,START为计数结束标志位,当START由高电平变为低电平时,计数结束。
XUANZE是一个可控数据选择器,当输入(SS2,SS1,SS0)=0、1、2、3时输出标准频率计数器的值,当输入(SS2,SS1,SS0)=4、5、6、7时输出被测频率计数器的计数值。
图4-4等精度频率计数框图
测量开始后,首先单片机发出一个清零信号CLR,使2个32位的计数器和D触发器置0,然后单片机再发出允许测频命令,即使预置门控信号GATE为高电平,这时D触发器要一直等到被测信号的上升沿通过时,Q端才被置1,即使
两个EN同时为1,将启动两个计算器,系统进入计算允许周期。
这时,计数器Count2和Count1分别对被测信号和标准频率信号同时计数。
当Tpr秒过后,预置门控信号被单片机置为低电平,但此时2个32位的计数器仍然没有停止计数,一直等到随后而至的被测信号的上升沿到来时,才通过D触发器将这2个计数器同时关闭。
设在某一次预置门控时间Tpr中对被测信号计数值为Nx,对标准频率信号的计数值为Nb,则根据闸门时间相等,可得出公式
(1):
Fx/Nx=Fs/Ns
则:
Fx=(Fs/Ns)*Nx
4.4显示模块
测试结果输出显示模块如图3-5所示。
8位8段LED采用共阳极接法,显示方式为静态显示,静态显示方式显示亮度较高,而且显示状态稳定。
89C51的P3.0口为数据输出线,数据经8片串入并出74164以串行方式送入LED(数据从最右端串行移入),每片74LS164驱动一只LED。
P3.1为串行移位元时钟线。
P3.3为资料封锁线。
在单片机应用系统中,显示器显示常用两种方法:
静态显示和动态扫描显示。
所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。
这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种方法单片机中CPU的开销小。
图4-5显示电路
89C51单片机串行口方式0为移位寄存器方式,外接8片74164作为8位LED显示器的静态显示接口,把89C51的RXD作为资料输出线,TXD作为移位元时钟脉冲。
74164为单向8位移位寄存器,可实现串行输入,并行输出。
其中A、B(第1、2脚)为串行数据输入端,2个引脚按逻辑与运算规律输入信号,共一个输入信号时可并接。
CLK(第8脚)为时钟输入端,可连接到串行口的TXD端。
每一个时钟信号的上升沿加到CLK端时,移位寄存器移一位,8个时钟脉冲过后,8位二进制元数字全部移入74164中。
(第9脚)为复位端,当
=0时,移位寄存器各位复0,只有当
=1时,时钟脉冲才起作用。
Q1…Q8(第3-6和10-13引脚)并行输出端分别接LED显示器的a···dp各段对应的引脚上。
在给出了8个脉冲后,最先进入74LS164的第一个数据到达了最高位,然后再来一个脉冲第一个脉冲就会从最高位移出,搞清了这一点,8片74164首尾相串,而时钟端则接在一起,这样,当输入8个脉冲时,从单片机RXD端输出的数据就进入到了第一片74164中了,而当第二个8个脉冲到来后,这个数据就进入了第二片74164,而新的数据则进入了第一片74164,这样,当第八个8个脉冲完成后,首次送出的数据被送到了最左面的74164中,其它数据依次出现在第一、二、三、四、五、六、七、八片74164中。
4.5总体电路图
5.软件设计
5.1频率计的VHDL设计
本设计采用Xilinx公司Spartan_3S200ANFPGA,应用标准化的硬件描述语言VHDL有非常丰富的数据类型,他的结构模型是层次化的,利用这些丰富的数据类型和层次化的结构模型,对复杂的数字系统进行逻辑设计,逐步完善后进行自动综合生成符合要求的、在电路结构上可实现的数字逻辑,再下载到可编程逻辑器件中,即可完成计数器的设计任务。
下面是本次设计的VHDL描述源程序:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL
entityPLGis
Port(BCLK:
inSTD_LOGIC;--标准频率时钟信号
CLK:
inSTD_LOGIC;--待测频率时钟信号
CLR:
inSTD_LOGIC;--清零和初始化信号
GATE:
inSTD_LOGIC;--预置门控制信号
SS:
inSTD_LOGIC_VECTOR(2downto0);--数据输出控制
START:
outSTD_LOGIC;--结束标志
DATA:
outSTD_LOGIC_VECTOR(7downto0));--数据输出
endPLJ;
architectureBehavioralofPLJis
SignalBJSQ:
STD_LOGIC_VECTOR(31downto0);
SignalJSQ:
STD_LOGIC_VECTOR(31downto0);
SignalEN:
STD_LOGIC;
begin
START<=EN;
DATA<=BJSQ(7downto0)whenSS="000"else
BJSQ(15downto8)whenSS="001"else
BJSQ(23downto16)whenSS="010"else
BJSQ(31downto24)whenSS="011"else
JSQ(7downto0)whenSS="100"else
JSQ(15downto8)whenSS="101"else
JSQ(23downto16)whenSS="110"else
JSQ(31downto24)whenSS="111"else
JSQ(31downto24);
BZN:
process(BCLK,CLR,EN)
begin
ifCLR='1'thenJSQ<=(others=>'0');
elsifCLK'eventandCLK='1'then
ifEN='1'then
JSQ<=JSQ+1;
endif;
endif;
endprocess;
ZN:
process(CLK,CLR,EN)
begin
ifCLR='1'thenJSQ<=(others=>'0');
elsifCLK'eventandCLK='1'then
ifEN='1'then
JSQ<=JSQ+1;
endif;
endif;
endprocess;
process(CLK,CLR)
begin
ifCLR='1'thenEN<='0';
elsifCLK'eventandCLK='1'then
EN<=GATE;
endif;
endprocess;
endBehavioral;
5.2单片机的汇编语言编程
5.2.1单片机主程序
图4-1表示单片机主程序流程图。
各种测试功能流程如下:
系统初始化后,主程序不断查询键盘,当开始键按下后,程序转到测频子程序执行测频功能。
那么读入开始键之后马上跳转到测频子程序,测频子程序先置测频控制位CLR(P1.0),将FPGA内的计数器清零,然后通过健盘将预置门的时间值读入单片机,打开预置门进行测频计数,等预置门时间到后,关断预置门,CFPGA关断预置门后将给单片机一个结束信号,单片机读到结束信号后,通过置[SS2,SS1,SS0」的八个状态,分八次将测频结果的64位数据读入单片机,计算后将结果转换为BCD码送LED显示输出。
显示子程序通过查表方式,将频率测量值以十进制的形式显示出来。
空闲状态程序始终扫描键盘,等待输入,并在LED上显示CPUREADY的字样,执行完某一功能后程序又会回到键盘扫描状态上来。
主程序流程图:
5.2.2测频子程序
测频子程序流程图:
当有键按下后,单片机转到测频子程序,执行测频功能。
单片机首先向FPGA发出一个清零信号CLR(P1.0),将FPGA内的计数器清零,然后通过键盘将预置门的时间值读入单片机,打开预置门使FPGA开始计数,此时间值就是计数时间,等预置门时间到后,关断预置门后将给单片机一个结束信号,单片机读到结束信号后,通过置[SS2,SS1,SS0」的八个状态,分八次将测频结果的64位数据读入单片机,单片机通过等精度的测频公式:
Fx=(Fs/Ns)*Nx
计算出被测信号的频率值,并将此频率值转换为相应的BCD码,为后面的显示功能作准备。
5.2.3显示子程序
显示数据由单片机的串行口P3.0送出,P3.1口提供串行移位的时钟信号,P3.3口控制数据的输出。
显示的数据存放在从30H开始的RAM单元中。
串行口设为方式0。
显示用查表的方式,将要显示的段形码顶先存入以TAB开头的码表中。
显示子程序流程图:
5.2.4单片机程序清单
ORG0000H
KEYIN:
ACALLLOAD;装入CPUREADY
ACALLDISP;调显示子程序
WW0:
ACALLD_10MS;延时去抖
JBP1.5,WW1;P1.5高电平转
MOV20H,#01H;预置门时间0.1s
ACALLKEY;调用测频子程序
ACALLDISP;调用显示子程序
JMPKEYIN
WW1:
ACALLD_10MS;延时去抖
JBP1.6,WW2;P1.6高电平转
MOV20H,#0AH;预置门时间1s
ACALLKEY;调用测频子程序
ACALLDISP;调用显示子程序
JMPKEYIN
WW2:
ACALLD_10MS;延时去抖
JBP1.7,WW0;P1.6高电平转
MOV20H,#64H;预置门时间10s
ACALLKEY;调用测频子程序
ACALLDISP;调用显示子程序
JMPKEYIN
;测频子程序
KEY:
LCALLCLEAR;调用LED熄灭子程序
MOVR0,20H;读入预置门时间值
SETBP1.0;计数器清零
CLRP1.0
SETBP1.1;开始计数
DELY:
ACALLD_100MS
DJNZR0,DELY
CLRP1.1
EEND:
MOVC,P1.2;读计数结束标志位
JCEEND
MOVA,#00H;置SEL值,读P0值,将NS的值存入70H-73H
MOVP1,A
NOP
MOVA,P0
MOV70H,A
MOVA,#01H
MOVP1,A
NOP
MOVA,P0
MOV71H,A
MOVA,#02H
MOVP1,A
NOP
MOVA,P0
MOV72H,A
MOVA,#03H
MOVP1,A
NOP
MOVA,P0
MOV73H,A
MOVA,#04H;将Nx的值存入74H-77H
MOVP1,A
NOP
MOVA,P0
MOV74H,A
MOVA,#05H
MOVP1,A
NOP
MOVA,P0
MOV75H,A
MOVA,#06H
MOVP1,A
NOP
MOVA,P0
MOV76H,A
MOVA,#07H
MOVP1,A
NOP
MOVA,P0
MOV77H,A
MOVR0,#00H;40MHZ标准频率转换16进制2625A00H
MOVR1,#5AH
MOVR2,#62H
MOVR3,#02H
MOVR4,74H;将NX值存入R7-R4
MOVR5,75H
MOVR6,76H
MOVR7,77H
ACALLMUL_SUB;调用四字节乘四字节子程序
ACALLNDIV;调用八字节除以四字节子程序
ACALLBIN_BCD;调用二进制转BCD子程序
ACALLEXTD;调用字节展开子程序
RET
;显示子程序
DISP:
SETBP3.3;开显示控制
MOVR7,#08H;设置显示个数
MOVR0,#30H;置显示缓冲区指针
MOVSCON,#00H;设串行口方式
SEND:
MOVA,@R0
ADDA,#0DH;设置偏移值
MOVCA,@A+PC
MOVSBUF,A;启动发送
WAIT:
JNBTI,WAIT;判断一帧数据是否发送完毕
CLRTI
INCR0
DJNZR7,SEND;判断数据是否发送完毕
CLRP3.3;关显示控制
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,;0,1,2,3,4
DB92H,82H,0F8H,80H,98H,;5,6,7,8,9
DB88H,83H,0C6H,0A1H,86H,8EH,;A,B,C,D,E,F
DB7FH,0FFH,0C6H,8CH,0C1H,;.,全灭,C,P,U
DB0CEH,86H,88H,0A1H,91H;R,E,A,D,Y
;字装入程序
LOAD:
MOVR7,#08H
MOVR0,#30H
MOVA,#13H;CPUREADY
LD:
MOV@R0,A
INCR0
INCA
DJNZR7,LD
RET
;LED熄灭子程序
CLEAR:
MOVR7,#08H
MOVR0,#30H
MOVA,#12H;显示熄灭
ABCL:
MOV@R0,A
INCR0
DJNZR7,ABCL
RET
D_10MS:
MOVR7,#14H;延时10MS子程序
LOOP1:
MOVR6,#0F9H
LOOP2:
DJNZR6,LOOP2
DJNZR7,LOOP1
RET
D_100MS:
MOVR7,#0C8H;延时100MS子程序
DL1:
MOVR6,#0F9H
DL2:
DJNZR6,DL1
DJNZR7,DL2
RET
;四字节乘四字节子程序FS*NX
MUL