毕业设计(论文)基于51单片机的4位数字频率计设计_第1页
毕业设计(论文)基于51单片机的4位数字频率计设计_第2页
毕业设计(论文)基于51单片机的4位数字频率计设计_第3页
毕业设计(论文)基于51单片机的4位数字频率计设计_第4页
毕业设计(论文)基于51单片机的4位数字频率计设计_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数字频率计实验报告摘要在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。数字式频率计的测量原理有两类:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量,本设计中使用的就是直接

2、测频法,即用计数器在计算1s内输入信号周期的个数。 数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。随着现场可编程单片机的广泛应用,运用单片机控制,将使整个系统大大简化,提高了系统的整体性能和可靠性。关键词:频率测量;单片机;数据处理目录摘要1目录2一 系统概述31.系统组成32.信号处理方法3二 器件简介61.主控制器at89s526(1)msc-51芯片资源简介6(2)单片机的引脚7(3)89s51单机的电源线8(4)89s51单片机的外接晶体引脚8(5)89s51单片机的控制线8(6)89s51单片机复位方

3、式92.数码管显示器简介10(1)数码管的分类10(2)数码管的驱动方式10(3)数码管参数11(4)数码管应用11(5)数码管使用的电流与电压12(6)恒流驱动与非恒流驱动对数码管的影响12(7)怎样测量数码管引脚123.元件设计软件cpld13(1)cpld简介13(2)cpld器件特点13三 系统设计141.硬件设计14(1)信号予处理电路14(2)单片机系统14(3)数据显示电路15(4)vhdl实现74ls160功能152.系统软件设计18(1)数据处理过程18(2)系统软件框图19(3)浮点数学运算程序19(4)实测结果和误差分析20四 参考文献22附件1:程序清单23一 系统概述

4、1.系统组成频率计由单片机89c51 、信号予处理电路、串行通信电路、测量数据显示电路和系统软件所组成,其中信号予处理电路包含待测信号放大、波形变换、波形整形和分频电路。系统硬件框图如图1 所示。信号予处理电路中的放大器实现对待测信号的放大,降低对待测信号的幅度要求;波形变换和波形整形电路实现把正弦波样的正负交替的信号波形变换成可被单片机接受的ttl/ cmos 兼容信号;分频电路用于扩展单片机的频率测量范围并实现单片机频率测量和周期测量使用统一的输入信号。图1 系统硬件框图系统软件包括测量初始化模块、显示模块、信号频率测量模块、量程自动转换模块、信号周期测量模块、定时器中断服务模块、浮点数格

5、式化模块、浮点数算术运算模块、浮点数到bcd 码转换模块。系统软件框图如图2 所示。2.信号处理方法本频率计的设计以at89c51 单片机为核心,利用它内部的定时/ 计数器完成待测信号周期/ 频率的测量。单片机at89c51 内部具有2 个16 位定时/计数器,定时/ 计数器的工作可以由编程来实现定时、计数和产生计数溢出中断要求的功能。在构成为定时器时,每个机器周期加1 (使用12mhz 时钟时,每1us 加1) ,这样以机器周期为基准可以用来测量时间间隔。在构成为计数器时,在相应的外部引脚发生从1 到0 的跳变时计数器加1 ,这样在计数闸门的控制下可以用来测量待测信号的频率。外部输入每个机器

6、周期被采样一次,这样检测一次从1 到0 的跳变至少需要2 个机器周期(24 个振荡周期) ,所以最大计数速率为时钟频率的1/ 24 (使用12mhz 时钟时,最大计数速率为500 khz) 。定时/计数器的工作由相应的运行控制位tr 控制,当tr置1 ,定时/ 计数器开始计数;当tr 清0 ,停止计数。设计综合考虑了频率测量精度和测量反应时间的要求。例如当要求频率测量结果为3 位有效数字,这时如果待测信号的频率为1hz ,则计数闸门宽度必须大于1000s。为了兼顾频率测量精度和测量反应时间的要求,把测量工作分为两种方法。当待测信号的频率大于100hz 时,定时/ 计数器构成为计数器,以机器周期

7、为基准,由软件产生计数闸门,这时要满足频率测量结果为3 位有效数字,则计数闸门宽度大于1s 即可。当待测信号的频率小于100hz 时,定时/ 计数器构成为定时器,由频率计的予处理电路把待测信号变成方波,方波宽度等于待测信号的周期。用方波作计数闸门,当待测信号的频率等于100hz ,使用12mhz 时钟时的最小计数值为10000 ,完全满足测量精度的要求。图2 系统软件框图1. 3 频率计的量程自动切换在使用计数方法实现频率测量时,这时外部的待测信号为定时/ 计数器的计数源,利用软件延时程序实现计数闸门。频率计的工作过程为:首先定时/计数器的计数寄存器清0 ,运行控制位tr 置1 ,启动定时/

8、计数器;然后运行软件延时程序,同时定时/计数器对外部的待测信号进行计数,延时结束时tr 清0 ,停止计数;最后从计数寄存器读出测量数据,在完成数据处理后,由显示电路显示测量结果。在使用定时方法实现频率测量时,这时外部的待测信号通过频率计的予处理电路变成宽度等于待测信号周期的方波,该方波同样加至定时/ 计数器的输入脚。这时频率计的工作过程为:首先定时/ 计数器的计数寄存器清0 ,然后检测方波高电平是否加至定时/ 计数器的输入脚;当判定高电平加至定时/计数器的输入脚,运行控制位tr 置1 ,启动定时/计数器对单片机的机器周期的计数,同时检测方波高电平是否结束;当判定高电平结束时tr 清0 ,停止计

9、数,然后从计数寄存器读出测量数据,在完成数据处理后,由显示电路显示测量结果。测量结果的显示格式采用科学计数法,即有效数字乘以10 为底的幂。这里设计的频率计用5 位数码管显示测量结果:前3 位为测量结果的有效数字;第4 位为指数的符号;第5 位为指数的值。采用这种显示格式既保证了测量结果的显示精度,又保证了测量结果的显示范围(0. 100hz - 9. 99mhz) 。量程自动转换的过程由频率计测量量程的高端开始。由于只显示3 位有效数字,在测量量程的高端计数闸门不需要太宽, 例如在10. 0 khz -9919 khz 频率范围,计数闸门宽度为10ms 即可。频率计每个工作循环开始时使用计数

10、方法实现频率测量,并使计数闸门宽度为最窄,完成测量后判断测量结果是否具有3 位有效数字,如果成立,将结果送去显示,本工作循环结束;否则将计数闸门宽度扩大10 倍,继续进行测量判断,直到计数闸门宽度达到1s ,这时对应的频率测量范围为100hz - 999hz。如果测量结果仍不具有3 位有效数字,频率计则使用定时方法实现频率测量。定时方法测量的是待测信号的周期,这种方法只设一种量程,测量结果通过浮点数运算模块将信号周期转换成对应的频率值,再将结果送去显示。这样无论采用何种方式,只要完成一次测量即可,频率计自动开始下一个测量循环,因此该频率计具有连续测量的功能,同时实现量程的自动转换。二 器件简介

11、1.主控制器at89s52 at89c51简介at89c51是一种带4k字节闪烁可编程可擦除只读存储器(fperomflash programmable and erasable read only memory)的低电压,高性能cmos 8位微处理器,俗称单片机。at89c2051是一种带2k字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的at89c51是一种高效微控制器,at89c2051是

12、它的一种精简版本。at89c单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示 主要特性:与mcs-51 兼容 4k字节可编程闪烁存储器 寿命:1000写/擦循环数据保留时间:10年全静态工作:0hz-24mhz三级程序存储器锁定1288位内部ram32可编程i/o线两个16位定时器/计数器5个中断源 可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路 管脚说明:vcc:供电电压。gnd:接地。p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数

13、据/地址的第八位。在fiash编程时,p0 口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。 p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于

14、内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。p3口也可作为at89c51的一些特殊功能口,如下表所示:口管脚 备选功能p3.0 rxd(串行输入口)p

15、3.1 txd(串行输出口)p3.2 /int0(外部中断0)p3.3 /int1(外部中断1)p3.4 t0(记时器0外部输入)p3.5 t1(记时器1外部输入)p3.6 /wr(外部数据存储器写选通)p3.7 /rd(外部数据存储器读选通)p3口同时为闪烁编程和编程校验接收一些控制信号。rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的

16、脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行movx,movc指令是ale才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。/psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。/ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea

17、端保持高电平时,此间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。xtal2:来自反向振荡器的输出。振荡器特性:xtal1和xtal2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,xtal2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 芯片擦除:整个perom阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ale管脚处于低电平10ms 来完成。

18、在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,at89c51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,cpu停止工作。但ram,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存ram的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 串口通讯单片机的结构和特殊寄存器,这是你编写软件的关键。至于串口通信需要用到那些特殊功能寄存器呢,它们是scon,tcon,tmod,scon等,各代表什么含义呢?sbuf 数据缓冲寄存器这是一个可以直接寻址的串行口专用寄存器。有朋友这样问

19、起过“为何在串行口收发中,都只是使用到同一个寄存器sbuf?而不是收发各用一个寄存器。”实际上sbuf 包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址99h。cpu 在读sbuf 时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作sbuf寄存器的方法则很简单,只要把这个99h 地址用关键字sfr定义为一个变量就可以对其进行读写操作了,如sfr

20、sbuf = 0x99;当然你也可以用其它的名称。通常在标准的reg51.h 或at89x51.h 等头文件中已对其做了定义,只要用#include 引用就可以了。scon 串行口控制寄存器通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。scon 就是51 芯片的串行口控制寄存器。它的寻址地址是98h,是一个可以位寻址的寄存器,作用就是监视和控制51 芯片串行口的工作状态。51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用scon 寄存器。它的各个位的具体定义如下:sm0 sm1 sm2 ren tb8 rb8 ti rism0、sm1 为串行口工作模

21、式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。sm0 sm1 模式 功能 波特率0 0 0 同步移位寄存器 fosc/120 1 1 8位uart 可变1 0 2 9位uart fosc/32 或fosc/641 1 3 9位uart 可变在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的fosc 代表振荡器的频率,也就是晶振的频率。uart 为(universal asynchronous receiver)的英文缩写。sm2 在模式2、模式3 中为多处理机通信使能位。在模式0 中要求该位为0。rem 为允许接收位,rem 置

22、1 时串口允许接收,置0 时禁止接收。rem 是由软件置位或清零。如果在一个电路中接收和发送引脚p3.0,p3.1 都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入rem=0 来禁止接收,在子程序结束处加入rem=1 再次打开串口接收。大家也可以用上面的实际源码加入rem=0 来进行实验。tb8 发送数据位8,在模式2 和3 是要发送的第9 位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。rb8 接收数据位8,在模式2 和3 是已接

23、收数据的第9 位。该位可能是奇偶位,地址/数据标识位。在模式0 中,rb8 为保留位没有被使用。在模式1 中,当sm2=0,rb8 是已接收数据的停止位。ti 发送中断标识位。在模式0,发送完第8 位数据时,由硬件置位。其它模式中则是在发送停止位之初,由硬件置位。ti 置位后,申请中断,cpu 响应中断后,发送下一帧数据。在任何模式下,ti 都必须由软件来清除,也就是说在数据写入到sbuf 后,硬件发送数据,中断响应(如中断打开),这时ti=1,表明发送已完成,ti 不会由硬件清除,所以这时必须用软件对其清零。ri 接收中断标识位。在模式0,接收第8 位结束时,由硬件置位。其它模式中则是在接收

24、停止位的半中间,由硬件置位。ri=1,申请中断,要求cpu 取走数据。但在模式1 中,sm2=1时,当未收到有效的停止位,则不会对ri 置位。同样ri 也必须要靠软件清除。常用的串口模式1 是传输10 个位的,1 位起始位为0,8 位数据位,低位在先,1 位停止位为1。它的波特率是可变的,其速率是取决于定时器1 或定时器2 的定时值(溢出速率)。at89c51 和at89c2051 等51 系列芯片只有两个定时器,定时器0 和定时器1,而定时器2是89c52 系列芯片才有的。波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每

25、秒内可以传输的波特位数。有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600 会被误认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600 个二进位,而一个字节要8 个二进位,如用串口模式1 来传输那么加上起始位和停止位,每个数据字节就要占用10 个二进位,9600 波特率用模式1 传输时,每秒传输的字节数是960010960 字节。51 芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12m 的晶振来计算,那么它的波特率可以达到1m。模式2 的波特率是固定在fosc/64 或fosc/32,具体用那一种就取决于pcon 寄存器中的smod位,如smod

26、为0,波特率为focs/64,smod 为1,波特率为focs/32。模式1 和模式3 的波特率是可变的,取决于定时器1 或2(52 芯片)的溢出速率。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。波特率(2smod32)定时器1 溢出速率上式中如设置了pcon 寄存器中的smod 位为1 时就可以把波特率提升2 倍。通常会使用定时器1 工作在定时器工作模式2 下,这时定时值中的tl1 做为计数,th1 做为自动重装值 ,这个定时模式下,定时器溢出后,th1 的值会自动装载到tl1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2

27、下定时器1 溢出速率的计算公式如下:溢出速率(计数速率)/(256th1)上式中的“计数速率”与所使用的晶体振荡器频率有关,在51 芯片中定时器启动后会在每一个机器周期使定时寄存器th 的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51 芯片的计数速率为晶体振荡器频率的1/12,一个12m 的晶振用在51 芯片上,那么51 的计数速率就为1m。通常用11.0592m 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600 的波特率,晶振为11.0592m 和12m,定时器1 为模式2,smod 设为1,分别看看那所要求的th1 为何值。代入公式:11.

28、0592m9600(232)(11.0592m/12)/(256-th1)th125012m9600(232)(12m/12)/(256-th1)th1249.49上面的计算可以看出使用12m 晶体的时候计算出来的th1 不为整数,而th1 的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592m 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。dac0832芯片:dac0832是8分辨率的d/a转换集成芯片。与微处理器完全兼容。这个da芯片以其价格

29、低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。d/a转换器由8位输入锁存器、8位dac寄存器、8位d/a转换电路及转换控制电路构成。 dac0832的主要特性参数如下:* 分辨率为8位;* 电流稳定时间1us;* 可单缓冲、双缓冲或直接数字输入;* 只需在满量程下调整其线性度;* 单一电源供电(+5v+15v);* 低功耗,200mw。 dac0832结构:* d0d7:8位数据输入线,ttl电平,有效时间应大于90ns(否则锁存器的数据会出错);* ile:数据锁存允许控制信号输入线,高电平有效;* cs:片选信号输入线(选通数据锁存器),低电平有效;* wr1:数据

30、锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ile、cs、wr1的逻辑组合产生le1,当le1为高电平时,数据锁存器状态随输入数据线变换,le1的负跳变时将输入数据锁存;* xfer:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;* wr2:dac寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由wr1、xfer的逻辑组合产生le2,当le2为高电平时,dac寄存器的输出随寄存器的输入而变化,le2的负跳变时将数据锁存器的内容打入dac寄存器并开始d/a转换。* iout1:电流输出端1,其值随dac寄存器的内容线性变化;* iout2:电流输出端

31、2,其值与iout1值之和为一常数;* rfb:反馈信号输入线,改变rfb端外接电阻值可调整转换满量程精度;* vcc:电源输入端,vcc的范围为+5v+15v;* vref:基准电压输入线,vref的范围为-10v+10v;* agnd:模拟信号地* dgnd:数字信号地 dac0832的工作方式:根据对dac0832的数据锁存器和dac寄存器的不同的控制方式,dac0832有三种工作方式:直通方式、单缓冲方式和双缓冲方式。二、系统总体设计 考虑到测量方便,将数字频率计划分为四档:1099hz、100999hz、10009999hz、1000099999hz。这样可以保证每一档三位有效数字,

32、而且第三位有效数字误差在2以内时即可达到精度要求。三个输入信号:待测信号、标准时钟脉冲信号和复位脉冲信号。设计细化要求:频率计能根据输入待测信号频率自动选择量程,并在超过最大量程时显示过量程,当复位脉冲到来时,系统复位,重新开始计数显示频率。基于上述要求,可以将系统基本划分为四个模块,分别为分频、计数、锁存和控制,并可以确定基本的连接和反馈,如上图所示。三、系统及模块设计与说明如左图所示为数字频率计测量频率的原理图。已知给定标准时钟脉冲高电平时间,将此高电平信号作为计数器闸门电平,通过计数器得到时间内待测脉冲的个数n,则有。由图示可以看出,一个闸门电平时间内计数的最大误差为n1,为保证误差要求

33、取n100。经计算,四档的闸门电平时间分别为10s、1s、0.1s和0.01s。仅对计数器计数值n进行简单的移位即可得到结果。产生闸门电平的工作由分频器完成。分频器采用计数分频的方法,产生计数闸门电平和一系列控制脉冲,并接受计数器和控制器的反馈。控制器主要用来判断计数器计数是否有效,从而控制档位转换,锁存器打开、关闭和设定值。计数器在分频器和控制器的作用下对输入待测信号计数,并把计数值输出,在计数溢出时向控制器和分频器发送溢出脉冲。锁存器用来储存有效计数值,以稳定输出。四、系统及模块具体实现与说明系统总体结构图见附图1,下面对每一个模块的具体功能、引脚分配和verilog hdl语言编程实现进

34、行详细说明。在分模块介绍之前先说明两个重要的寄存器状态stat1.0和latch_stat1.0。stat1.0用来保存当前档位信息,stat1.0等于0则为第一档,等于1则为第二档,依此类推,共可标记四档,它位于控制模块中,也是输出,这样其他模块可以通过访问它得到当前档位信息,而控制模块可以修改它从而调整档位(注:在系统总图中由于所有与stat1.0相连的线路均为对应顺序连接,故没有才用max+plus ii中默认的总线连接,而是采用单根线)。latch_stat1.0用来保存锁存器状态信息,latch_stat1.00时,锁存器在clk作用下打开关闭。latch_stat1.01时,锁存器

35、强制置零,clk无效。latch_stat1.0 2时,锁存器强制置1ffff,clk无效。它也在控制器中,这样可以通过对其改变数值达到控制锁存器锁存、复位和显示过量程的功能。计数器counter计数器设计图见附图1右上部分,由四个十进制计数器级联。四个输入端口:时钟脉冲clk、使能端en、清零端clrn、档位状态端stat1.0。五个输出端口:四个四位十进制bcd码输出out13.0out43.0、过量程溢出of。功能表见下:表格 1十进制计数器功能表clkenclrnstat1.0out41ofhl0,1,23位加一计数of等于第三位进位hl34位加一计数of等于第四位进位ll计数保持ll

36、lhll输入输出每个十进制计数器用verilog hdl语言编程实现。源程序如下:分频器分频器是本系统最重要的功能部件之一,由它产生闸门电平和控制器、计数器的控制脉冲。它有四个输入:标准时钟脉冲输入clk1024、溢出处理触发trigger、复位触发reset和档位状态stat1.0。三个输出:计数闸门电平fgate、控制器工作脉冲ftrigger、计数器控制器清零脉冲fclr。其组成图见附图2右上部分。分频器采用计数分频的办法,即使用一内部寄存器,在时钟脉冲上升沿加一计数,当计到一定值时就改变fgate的状态,从而达到分频的目的。由于输入标准时钟脉冲为1024hz,要得到0.1s的fgate

37、计数值相当小,约为20,误差很大,故在实际设计中把第四档闸门电平时间调整为0.1s,这样第三、四档公用一个闸门电平,同时在计数和锁存时要做相应的移位,因为测量第四档频率时有4位有效数字。要得到10s、1s、0.1s三个fgate,分别要计数到10240、1024和103。从组成图中也可以看出分频器由这三种计数器并联组成,通过3个4选1选择器(一个74ls153和一个4_1mux),由stat1.0选择使用的fgate、fclr和ftrigger。输出fgate送计数器en作为计数器使能闸门电平。ftrigger送控制器trigger作为控制器工作脉冲。fclr送计数器clrn作为每次计数开始前

38、的清零信号,送控制器clr作为控制器内部触发信号。这三个信号的时序图如下:由图可以看出fgate由高变低,即计数结束时,ftrigger信号才产生,这时控制器开始工作,判断计数是否有效,然后发出一系列指令直到fclr信号到来,计数器清零,准备进入下一次计数。采用这样的像cpu时钟一样的信号的原因,一方面,处理计数数据只用了很短的时间,两次测量之间时间很短,加快了频率计的响应速度;另一方面,解决了异步时序逻辑的竞争,使系统工作在异步时序状态下,既保持了很高的响应速度,又有很高的稳定性。为了解决在第一档向第二档转换时等待时间过长的问题,分频器由trigger端口接收一个计数器的溢出脉冲,当计数器溢

39、出时,在脉冲上升沿将内部计数器置为fgate结束高电平的最后一个计数器值。这样,由于控制器此时溢出已被置位,马上就能进入一次换档处理,保证了换档的快速。另外,reset信号上升沿到来时,计数器被置为零,这样就可以马上重新开始计数,实现了复位的效果。分频器单元freqcer_10240的源程序如下(其他两个单元仅计数值不相同,其他均一样,故不列在此,见附录):锁存器锁存器有八个输入:时钟脉冲clk,置位端set,复位端reset,4个4bit十进制bcd输入in13.0in43.0,档位状态stat1.0。五个输出:5个5bit十进制bcd输出。组成图见附图2左上部分。由一桥接器bridge和4

40、个latch_4_16、1个latch_4_1锁存器组成。桥接器bridge主要是为了数据对齐。因为3、4两档使用同一个分频器,故测量第四档时有4位有效数字,通过桥接器转换后就能保证数据有效数字最高位与锁存器第五位对齐。其具体结构见附图2下半部分。输入输出对应表如下:282004-7-1表格 2 桥接器功能表stat 0,1,2stat 3out5 in3 in4out4 in2 in3out3 in1 in2out20 in1表格 3 latch_4_16功能表输入输出clksetresetout00= in01010f000f锁存器单元latch_4_1和latch_4_16均为4bit锁

41、存器,其唯一不同在于置位时,latch_4_16锁存器内容置为f,另一个置1。下面将latch_4_16的功能表(见左)和源程序列出,同样将另一锁存器源程序收于附录。module latch_4_16(clk, set, reset, in, out);input clk, set, reset;input3:0 in;output3:0 out;reg3:0 out;always (posedge clk or posedge set or posedge reset)beginif(set) out = 4b1111;else if(reset)out = 0;elseout = in;e

42、ndendmodule控制器控制器controler是整个系统最复杂也是最关键的部件,附图1左上部分是控制器组成。它由一个控制器核心模块control_core和寄存器ofregister组成。输入输出clkclrof10ofregister由clk端接受计数器溢出脉冲在其上升沿置1,当控制器核心开始换档工作时,通过clr清除ofregister。其功能表见右。control_core模块是控制器的核心,有六个输入端口:时序脉冲clk、清零脉冲clr、复位脉冲reset、溢出检测输入of、计数器输出第3、4位in33.0和in43.0。输出端口四个:锁存器工作脉冲latch_clk、ofreg

43、ister清零脉冲clrof、锁存器状态latch_stat1.0和当前档位状态stat1.0。另外还有寄存器stat_reg1.0,用在转换档位时临时保存档位。count寄存器,用来标志当前工作脉冲序号。flag寄存器,用来标志当前计数置溢出或不够。reset_reg寄存器,用来标志复位周期。下面根据时序图简要介绍一下工作过程。由上述介绍我们知道有三种情况能到达状态:计数结束、计数中溢出和复位。这个时候就需要检测。reset信号在上升沿将reset_reg置为1,并进行复位操作,即状态寄存器分别置值。在时刻第工作脉冲到来时,首先检测是不是复位周期,是则跳过,不作任何动作。不是,则检测of端口

44、是否为1,为1则有溢出,要进行换档,flag标志置1,并发出ofregister清零信号clrof,没有溢出,则检测计数器最高两位,两位均为0,则说明档位不够,要调低档位,flag标志置2,如果不均为0,则该计数值有效,flag置为0;当脉冲到来时,检测是否是复位周期,是则跳过,不是则继续。如果flag1,有溢出,向上换档,如果当前档位为3,则保持,并且将锁存器置位(显示1ffff),否则向上调一挡;如果flag2,档位不够,当当前档位为0时,保持,否则向下调一挡。flag0,计数有效,发出锁存器时钟脉冲latch_clk,将当前计数值打入锁存器。当脉冲到来时,清除中间状态寄存器。当脉冲到来时

45、,在其下降沿将stat_reg的内容打入stat,在下一次高电平到来之前实现档位转换。具体源程序如下:另外,由stat决定小数点位置的电路point也应该在控制器中,系统图上将其单独画了出来,具体实现见附图1右下角。五、误差分析及改进经过下载测试,实际的测量误差在12档时,误差在14数量级,在34档时,误差相对大一些,一般4,这是由于计数分频时计数值为近似值造成的系统误差。另外,在高档位向低档位转换时,会产生第一次测量不准的现象,尤其是在第一档上特别明显。经过分析,我发现这是我的这种分频器结构所特有的。因为三个分频器是并行独立计数分频,因此无法保证换档时各个分频器状态同步,解决方案是改进分频器

46、,采用统一结构。具体程序见附录。实验中采用的cpu式的指令周期结构是不错的,保证了系统的稳定性和快速响应,但是由于刚刚接触,设计的时候逻辑、时序设计不够简洁,很多地方还有待改进。六、实验总结这次实验是相当成功的一次实验,我不仅在实验中学会了verilog这种硬件描述语言以及基本的fpga设计思想和方法。更重要的是在通过设计实现自己的想法的过程中,通过和老师、同学的有效交流,不断的分析各种情况,解决遇到的实际问题,大大特提高了自己分析问题和解决问题的能力,收获非常的大。三 系统设计 2.系统软件设计(1)数据处理过程在频率计开始工作,或者完成一次频率测量,系统软件都进行测量初始化。测量初始化模块

47、设置堆栈指针(sp) 、工作寄存器、中断控制和定时/ 计数器的工作方式。定时/ 计数器的工作首先被设置为计数器方式,即用来测量信号频率。在对定时/ 计数器的计数寄存器清0 后,置运行控制位tr 为1 ,启动对待测信号的计数。计数闸门由软件延时程序实现,从计数闸门的最小值开始,也就是从测量频率的高量程开始。计数闸门结束时tr 清0 ,停止计数。计数寄存器中的值通过16 进制数到10 进制数转换程序转换为10 进制数。对10 进制数的最高位进行判别,若该位不为0 ,满足测量数据有效位数的要求,测量值和量程信息一起送到显示模块;若该位为0 ,将计数闸门的宽度扩大10 倍,重新对待测信号的计数,直到满

48、足测量数据有效位数的要求。当上述测量判断过程直到计数闸门宽度达到1s ,这时对应的频率测量范围为100hz - 999hz ,如果测量结果仍不具有3 位有效数字,频率计则使用定时方法测量待测信号的周期。定时/ 计数器的工作这时被设置为定时器方式,在对定时/ 计数器的计数寄存器清0 后,判断待测信号的上跳沿是否到来。待测信号的上跳沿到来后,置运行控制位tr 为1 ,以单片机工作周期为单位,启动对待测信号的周期测量。然后判断待测信号的下跳沿是否到来,待测信号的下跳沿到来后,运行控制位tr 清0 ,停止计数。16 位定时/ 计数器的最高计数值为65535 ,这样在待测信号的频率较低时,定时/ 计数器将发生溢出。当产生定时/ 计数器将溢出,程序进入定时器中断服务程序,中断服务程序对溢出次数进行计数。待测信号的周期由3 个字节组成:定时/ 计数器溢出次数、定时/ 计数器的高8 位和低8 位。信号的频率f 与信号的周期t 之间的关系

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论