400 likes | 651 Views
第二篇 设计篇. 第 7 章 PIC 与 CPLD 接口协调. 在进行 PIC 系统的应用开发时,经常需要对其扩展接口进行编程。可编程器件是 PIC 单片机应用系统外围电路的常用器件,而可编程器件的设计开发通常采用基于 CPLD 的 VHDL 设计。本章主要针对 PIC 单片机的接口编程所涉及到的并行接口、串行接口等相关可编程芯片进行分析研究,初步掌握在 PIC 和 CPLD 接口编程的接口方法以及设置。 7.1 CPLD 与 PIC 功能分组 7.1.1 概述
E N D
第7章 PIC与CPLD接口协调 在进行PIC系统的应用开发时,经常需要对其扩展接口进行编程。可编程器件是PIC单片机应用系统外围电路的常用器件,而可编程器件的设计开发通常采用基于CPLD的VHDL设计。本章主要针对PIC单片机的接口编程所涉及到的并行接口、串行接口等相关可编程芯片进行分析研究,初步掌握在PIC和CPLD接口编程的接口方法以及设置。 7.1 CPLD与PIC功能分组 7.1.1 概述 CPLD是可编程器件能完成各种逻辑功能,但在自动控制方面还不能单独完成各种功能。CPLD必须与PIC一起设计系统,这就必须考虑PIC与CPLD的长短处,以最大的利用PIC和CPLD的优点来设计的系统。PIC与CPLD的优缺点如表7.1所示.
根据以上PIC与CPLD长短处考虑,在系统设计时在以下情况请考虑使用CPLD较好。1.PIC的动作速度不能满足的高速动作要求,如需计数最大50MHz信号,或需输出数MHz的信号等。2.需要追加功能时,如需要追加更多的输入输出端口,或追加正弦波信号输出功能等。3.在与其它系统接续时作接口器等,如需要接入PIC总线或需要接入专用IC等。根据以上PIC与CPLD长短处考虑,在系统设计时在以下情况请考虑使用CPLD较好。1.PIC的动作速度不能满足的高速动作要求,如需计数最大50MHz信号,或需输出数MHz的信号等。2.需要追加功能时,如需要追加更多的输入输出端口,或追加正弦波信号输出功能等。3.在与其它系统接续时作接口器等,如需要接入PIC总线或需要接入专用IC等。 表7.1 CPLD与PIC的功能比较
7.1.2 PIC与CPLD接口通信 PIC单片机广泛用于现场控制、嵌入式系统、数据采集系统等领域,不仅需要实现本地数据采集和现场控制,这其中就涉及到和外围电路的数据的传输。而外围电路可采用CPLD芯片来实现,这就要求PIC和CPLD的接口具有通信功能。 目前广泛应用的可编程芯片有并行接口芯片8255A,可编程中断控制器82C59A,可编程计数器MSM82C53/54,可编程键盘以及显示控制器件TMP82C79等。 在PIC与CPLD进行接口通信时,常见的通信方式有以下几类: 1.按照通信对象数量的不同,通信方式可分为点对点通信、一点到多点通信和多点到多点通信等3种方式。 2.按照通信终端之间的连接方式可划分为两点间直通方式和交换方式。直通方式是通信双方直接用专线连接;而交换方式是通信双方必须经过交换机才能连接起来的一种通信方式,如电话系统。 3.按照数字信号传输的顺序,在数据通信中,通信方式又有串行通信和并行通信。 7.1.3 接口通信基本电路 在接口通信电路中,经常需要对传输过程中的信息进行放大、隔离以及销存,能实现上述功能的接口芯片最简单的就是缓冲器、数据收发器和锁存器。这里主要介绍基本74 系列器件。74 血红素器件是TI(Texas Instrument,德州仪器)公司生产的中小规模TTL集成电路芯片,这是一种低成本、工业和民用产品、工作温度0~70℃,以功耗和速度分类有如下几类:
* 74 ×××-标准TTL; * 2.74L ×××-低功耗TTL; * 74S ×××-肖特基型TTL; * 74LS ×××-低功耗肖特基型TTL; * 74ALS ×××-高性能型TTL; * 74F ×××-高速型TTL。 对于相同编号(×××)、不同类型的芯片,其逻辑功能完全一样。 1.锁存器74LS373 74LS373是一种8D锁存器,具有三态输出。其逻辑电路及引脚图如图7.1所示。 图7.1 74LS373逻辑电路及引脚图
2.缓冲器74LS244 74LS244是一种三态输出的八缓冲器和线驱动器。 74LS244缓冲器主要用于三态输出的存储地址驱动器、时钟驱动器和总线定向接收器和定向发送器等。其逻辑电路及引脚图如图7.2所示。 常用的缓冲器还有74LS240/241等。
3. 数据收发器74LS245 74LS245是一种三态输出的8总线收发器。其逻辑电路图和引脚图如图7.3所示。 从图可见,该收发器有16个双向传送的数据端,即A1-A8,B1-B8,另有两个控制端-使能端,方向控制端DIR,74LS245 通常用于数据的双向传送、缓冲和驱动。
7.2 并行接口方式 在CPLD与PIC综合电路中,实现并行通信的接口就是并行接口。并行接口可设计为只作为输入/输出接口,也可设计为既作为输入又作为输出的接口。它可以用两种方法实现,一种是利用同一个接口中的两个通路,一个作输入通路,一个作输出通路;另一种使用同一个双向通路,既作为输入又作为输出。 并行通信有两个主要特点:一是同时并行传送的二进位数就是数据宽度;二是在PIC与CPLD之间采用应答式的联络信号来协调双方的数据传送操作,这种联络信号又称为握手信号。 并行通信可以分为单方向通信和双方向通信,通常分别对应于读/写和读写操作,其对应单方向并行接口和双方向接口。 单片机同外设CPLD电路交换信息,必须通过接口电路,一般在接口电路中应具有如下电路单元,这类电路也称之为可编程接口芯片。 可编程并行接口芯片种类较多,Intel公司的8255A(PPI),Motorola公司的MC6820(PIA)和Zilog公司的Z80-PIO 都属于这一类器件。 可编程接口芯片电路中应具有如下电路单元: • 输入/输出数据锁存器和缓冲器,用以解决CPU与外设之间速度不匹配的矛盾,以及起隔离和缓冲的作用; • 控制命令和状态寄存器,以存放CPU对外设的控制命令,以及外设的状态信息; • 地址译码器,用来选择接口电路中的不同端口(寄存器); • 读写控制逻辑; • 中断控制逻辑。
这里重点讲述可编程芯片8255A,8255A是一种通用的可编程并行I/O接口芯片,如果结合其他外围电路,可以采用可编程通用芯片实现外围电路的综合设计,这里可以采用VHDL进行设计CPLD。8255A通用性强,使用灵活,可用程序设置和改变芯片的工作方式,是一种典型的可编程并行接口芯片,通过8255A,PIC可直接同外设相连接,其应用最广、使用灵活。这里重点讲述可编程芯片8255A,8255A是一种通用的可编程并行I/O接口芯片,如果结合其他外围电路,可以采用可编程通用芯片实现外围电路的综合设计,这里可以采用VHDL进行设计CPLD。8255A通用性强,使用灵活,可用程序设置和改变芯片的工作方式,是一种典型的可编程并行接口芯片,通过8255A,PIC可直接同外设相连接,其应用最广、使用灵活。 PIC单片机通过外设接口芯片同外围CPLD电路交换信息时,接口芯片常常需要和外设间有一定的“联络”信号,以保证信息的正常传送。通常采用两个“联络”信号(选通信号,strobe)和RDY(就绪信号,Ready),如图7.4所示,输入时序见图7.5。 图7.4联络信号 图7.5 输入时序
作为接口芯片(主要引脚如图7.6)具备PA口、PB口和PC口,PC口比较特殊,即可用作数据口,有时其大部分引脚被分配作专用联络信号,用于控制或状态信息。作为接口芯片(主要引脚如图7.6)具备PA口、PB口和PC口,PC口比较特殊,即可用作数据口,有时其大部分引脚被分配作专用联络信号,用于控制或状态信息。 7.2.1 8255A的内部结构 可编程芯片8255A的结构框图如图7.7,主要由4部分组成。 • 数据总线缓冲器 一个三态8位双向缓冲器,用作8255A同系统数据总线相连时的缓冲器部件,CPU通过执行输入/输出指令来实现对缓冲器发生或接收数据。8255A的控制字和状态字也是通过该缓冲器传送的。 图7.6 接口芯片的主要引脚图
三个8位端口PA、PB、和PC 8255A有三个8位端口PA、PB、和PC,各端口都可由程序设定为各种不同的工作方式。 端口A(PA口)有一个8位数据输入锁存器和一个8位数据输出锁存/缓冲器; 端口B(PB口)有一个8位数据输入缓冲器和一个8位数据输入/输出、锁存/缓冲器; 端口C(PC口)有一个8位数据输入缓冲器和一个8位数据输出锁存/缓冲器。 图7.7 8255A的结构框架
通常PA口与PB口用作输入/输出的数据端口,PC口用作控制或状态信息的端口。在方式字的控制下,PC口可以分成两个4位的端口,每个端口包含一个4位锁存器,可分别同端口A和端口B配合使用,可以用作控制信号输出,或作为状态信号输入。一般PA口、PB口 作为独立的输入端口或输出端口,当端口 A 在方式 1 或方式 2、端口 B 在方式 1 时,端口 C 的某些位用于传送联络信号,以适应PIC与外设CPLD电路间的各种数据传送方式的要求,如查询传送的应答信号、中断传送的中断申请信号等。PC口常被分成两个4位端口,以配合A口和B口的工作,输入状态信号和输出控制信号。PC口未被用作联络信号的其它位可工作在方式0下。 • A组和B组的控制电路 两组控制电路根据CPU发出的方式选择控制字来控制8255A的工作方式,每个控制组都接收来自读/写控制逻辑的“命令”,接收来自内部数据总线的“控制字”,并向与其相连的端口发出适当的控制信号。 A组控制部件用来控制PA口和PC口的高4位(PC7-PC4); B组控制部件用来控制PB口和PC口的低4位(PC3-PC0)。 • 读/写控制逻辑 读/写控制逻辑用来管理数据信息、控制字和状态字的传送,它接收来自CPU地址总线的A1、A0和控制总线的有关信号 向8255A的A、B两组控制部件发送命令
7.2.2 8255A引脚功能 8255A芯片封装结构有多种,常用的有双列直插和PLCC封装,这里讲述的是采用40个引脚的双列直插式(DIP,Dual,In-line Package)封装,如图7.8所示。 其引脚信号有: • A1、A0:片内寄存器选择信号(输入) • D7-D0:与CPU侧连接的数据线(双向) • PA7-PA0:A口外设数据线(双向) • PB7-PB0:B口外设数据线(双向) • PC7-PC0:C口外设数据线(双向) • PESET:复位信号(输入) 图7.8 8255A引脚分布
PA0~7,PB0~7,PC0~7是面向外设的引脚信号。 D7~D0是 8255A的数据线,和系统数据总线相连;RESET 是复位信号引脚,当其有效时,清除所有内部寄存器,三个数据端口(A口、B口、C口)被自动设置为输入端口。CS 片选信号引脚通常低电平有效。通常译码器分配给8255A一组端口地址,若该组地址有效,CS为低电平,启动8255A与PIC之间的通信。这些都是面向PIC的引脚。 为芯片读出信号,当有效时,CPU可从8255A读取数据或状态信息。 为 芯片写入信号,当该信号有效时,CPU可往8255A写入数据或控制命令。 A1、A0为 端口选择信号,8255A内部有3个数据端口和一个控制字端口,共4个端口,A1、A0对这4个端口选择规定如下:
由CS、A1、A0、RD、WR引脚的不同组合,实现各种不同的功能。具体见表7.2。由CS、A1、A0、RD、WR引脚的不同组合,实现各种不同的功能。具体见表7.2。 7.2.3 8255A的工作方式与初始化 1.8255A的工作方式 当外部设备要向CPU传送数据或请求服务时,8255A就用INTR端的高电平CPU提出中断请求。、IBF和INTR 都为高电平时,表明数据锁存器内已写入了数据,使INTR成为高电平输出。CPU响应中断,在 控制下从8255A中读取数据时,的下降沿使INTR复位,它的上升沿又使IBF复位,使外设知道可以进行下一字节输入,如图7.9。 表7.2 功能配置组合表
方式0――简单输入/输出――查询方式;A,B,C三个端口均可。方式0――简单输入/输出――查询方式;A,B,C三个端口均可。 方式1――选通输入/输出――中断方式;A ,B,两个端口均可。 方式2――双向输入/输出――中断方式。只有A端口才有。 图7.9 方式1输入
当外设接收了由CPU送给8255A的数据后,8255A就用INTR端向CPU发出中断请求,请求CPU再输出后面的数据。INTR是当,和INTE都为高电平时,才能被置成高电平。由的上升沿清除。如图7.10。 图7.10 方式1输出
方式2的时序图如图7.11: 当8255A与CPU采用查询方式工作时,要求CPU读取C端口的内容,根据上述对PC各位的定义及对中断屏蔽情况可以很容易地知道读出的状态字中各位的含义。 图7.11 方式2的时序图
2.初始化 在使用8255A时,首先要由CPU对8255A写入控制命令字,有两种控制命令字:一个是方式选择控制字,另一个是C口按位置位/复位控制字,8255A的各种工作方式都要由控制命令字来设定,这个设置过程称为“初始化”。 方式选择控制字(D7=1)。 C口按位置/复位控制字(D7=0)。 7.3 实际用例----数字频率计 用户在电路设计时,都趋向于用尽可能少的硬件来实现,目前的设计理念是尽力把以前由硬件实现的功能部分也通过软件来解决。这是因为软件实现比硬件实现具有易修改的优点,如简单地修改几行源代码就比在印制电路板上改变几条连线要容易得多,故基于微处理器的电路往往比传统的电路设计具有更大的灵活性。 数字频率计的设计,是综合应用单片机与CPLD可编程芯片的设计。其功能是实现信号的频率、周期、占空比以及脉宽等指标的测量。 硬件主要使用PIC单片机芯片、在系统PLD 芯片、LED显示器以及其他必要的元件;软件使用了VHDL语言、单片机语言以及 MAX+PULSⅡ设计平台。
7.3.1 系统构成 数字频率计的主系统一般有以下五个部分组成,由PIC单片机完成整个测量电路的测试控制、数据处理和显示输出,CPLD芯片完成各种测试功能。键盘信号由 PIC单片机进行处理,并向LED显示电路输出测量结果。这样将单片机灵活的控制功能与 FPGA/CPLD高速高可靠性相结合,将有效的突破传统的数字电子系统中由来已久的设计瓶颈,使这些系统的性能有大幅度的提高。 • 信号整形电路:用于对待测信号进行整形,以便作为 CPLD器件的输入信号。系统采用史密特触发器实现。 • 测频电路:测频核心电路模块,由 FPGA等PLD器件担任。系统采用可编程芯片实现。 • PIC单片机电路模块:用于控制测频操作和读取测频数据,并做出相应处理。 • 键盘模块:用 5个键执行测试控制,一个是复位键,其余是命令键。 • 数码显示模块:用 7个 LED数码管显示测试结果,最高可表示百万分之一的精度。 • 单片机的选择:综合考虑选用PIC16C54,PIC16C54单片机是美国亚利桑那州Microchip公司开发的PIC 系列单片机中最低阶的8位商用单片机,采用CMOS 工艺制造,功耗低,体积小(只有 18 只引脚),价格低廉。它使用精简指令集(RISC)技术和哈佛结构的流水总线,只有33 条单字(12位字长)指令,易于掌握,便于编程。更值得称道的是它的一次性用户可编程(OTP)特性,特别适合于低成本的商品化开发生产。PIC16C54内部含有512字节(12位字长)的程序存储器(EPROM ),32字节(8位字长)的数据存储器(RAM),一个4位 I/O 口A,一个8位 I/O口B,一个8位可编程实时时钟?计数器(RTCC),还具有硬件看门狗(WDT)及程序保密位。工作频率可以选择,如选用HS(高速晶体/陶瓷振荡)方式,则可达20MHz。工作电源为 3. 5V~6V 单电源。
PIC16C54 具有相互独立的数据总线(8 位)和指令总线(12位),这种结构可以提供简洁而强大的程序设计能力,而且由于总线的分离使得取指周期和执行周期可以重叠,因而大大提高了程序的运算速度。 7.3.2 硬件控制电路设计 设计分为硬件电路设计和软件设计两大部分。 1.硬件电路设计 硬件电路设计主要由宽带检测电路和主体电路两部分。 • 宽带检测电路设计 本数字频率计的设计目标是要测量幅度大于5mV,频率范围在1Hz~8MHz的任意波形周期性脉冲(正弦波、三角波、方波等)信号的频率。根据PIC 单片机的要求,需要把这些任意波形信号都变换成统一的,满足TTL 电平要求的方波信号,然后再作为计数脉冲加到RTCC 引脚上,因而,在输入信号与RTCC 引脚之间需要一个接口电路来完成波形变换和电平转换功能。另外,由于频率计的测量范围为1Hz~8MHz,这要求接口电路必须在整个频带范围内具有平坦的输出响应特性,通常称这样的接口电路为宽带脉冲检测电路。一般而言,信号源的阻抗都很低,而且不稳定。为了减小对输入信号的影响,通常在频率计的检测电路中,前置一个输入偏置电流小的FET 或者选用具有FET 输入的运算放大器,以提高检测电路的输入阻抗。当然,完整的电路还应该具有输入保护等功能。
主体电路设计 主体电路包括PIC 单片机、时钟电路、显示电路、复位电路等,主要完成定时、计数、显示等功能。如图7.13所示。 图7.13 PIC主体电路
PIC 单片机的A 口及B 口的12条 I/O 线用来驱动显示频率的4个7段LED显示器。RTCC引脚连接到PIC 内部的RTCC寄存器,它可以对内部指令或外部脉冲计数。利用此功能进行外部测试脉冲计数(RTCC引脚需通过前面介绍的宽带检测电路与外部信号相连)。RTCC引脚的触发方式可以选择上升沿或下降沿触发设计中,选择上升沿触发方式。时钟电路中的X1为20MHz的晶体振荡器,即PIC 的振荡方式选用HS(高速晶体/陶瓷振荡)方式。PIC工作在HS方式下时,需要加上电阻R3,以防止过驱动。一般情况下可将此电阻短路。在显示电路中,将16C54口B的8条I/O线与LED 引脚直接相连,这8条I/O线作为段控制给单个LED 提供显示代码。由于需用4个LED 显示频率值,只能时分复用B口(动态扫描方式)。A口的4条 I/O线作为位控制,用来选中4个LED中的一个,通过软件控制4个LED,而快速依次点亮,并不断刷新,利用视觉的暂留效应使得4个LED 如同被持续点亮一样。由于使用软件查表的方法获得显示代码,故硬件电路中省去了译码器。连接在MCLR 引脚上的复位电路是采用标准的POR(Power2OnReset:上电复位)方式。其中,R2能防止C1通过MCLR 引脚放电,D1能在关闭电源的时候使得C1放电更迅速。 2.软件设计 软件设计部分的主程序流程图如图7.14所示。频率计开机之后主要完成自检以及一些程序流程图必要的初始化工作,然后进入一个进行频率测量及显示工作的主循环体(main-loop),在其中要执行频率显示(freq-disp)、脉冲计数及定时(count-pule)、数据格式转换等功能。
脉冲计数的实现 由于被测信号的频率可达8MHz,即要求频率计每秒钟能够检测8M 个脉冲。而用于外部脉冲计数的RTCC 每个指令周期(4个时钟周期)只能够计一个脉冲,那么在20MHz的时钟频率下,每秒钟最多只能计5M 个脉冲,即上限频率只能是5MHz。所以,要测试 5MHz 以上的信号频率则必须使用PIC 内部的预分频器(Prescaler),它的功能是将外部脉冲信号经过分频后再送给RTCC 进行计数。如果设置1:2的预分频因子(每两个脉冲计一个数)就可以处理10MHz的信号。同样是RTCC在每秒内最多计5M 个数,计数结果乘以2 就得到频率在10MHz以内测试信号的频率值。因此,在1: 2的分频比下,该频率计的内部精度即为±1Hz,而且随着分频比的提高,精度将变得越来越差。 图7.14 主程序流程图
设计将预分频因子设置为1: 2。因为到RTCC 是一个8bit 的寄存器,它最多能够计255个数。只有通过软件的办法设置一个24bit(3字节)的频率计数器(可以计数到16M),才能实现系统的要求。另外,RTCC 采用递增方式计数,当计数至FFh,在下一个计数发生后,立即自动清零,并重新开始计数,却不产生什么指示信息,因为16C54 无中断功能。也就是说只要有信号源存在,RTCC 则始终处于计数状态中,不能由软件来使之停止。因此必须在RTCC 清零时查询RTCC 以获得计数结果。 在设计中的相关程序片段如下。 … movfw RTCC;RTCC→w (工作寄存器) movwf freq+ 2;w→频率计数器freq的低字节 movlw 1;w= 1 btfssRTCC_prev,7; 测试上次最高位是否为1? (测试RTCC 是否清零) clrw;w= 0 btfsc freq+ 2,7; 测试本次最高位是否为0 ? clrw ;w= 0 addwf freq+ 1; 中间字节+w (若RTCC 清零则中间字节加1) btfsc 3,0; 检测进位标志 incf freq+ 0; 若中间字节进位则高字节加1 btfsc freq+ 0,6; 是否频率溢出 (freq > 3fffffh)? retlw 0; 退出 movfw freq+ 2; 保存本次RTCC movwfRTCC_prev…
可见,通过对RTCC 的上一次查询结果(存在RTCC-prev中)与本次查询结果(存在freq+ 2中)的 bit7 相比较就能判断 RTCC 是否已经清零(1XXXXXXX→0XXXXXXX)。因此,若在对RTCC查询的间隔期间出现128个以上的脉冲,那么这些脉冲将会丢失。这实际上给设计的频率计设置了上限频率。另外,为了编程的简便,对频率溢出的判断是通过测试频率计数器高字节(freq+0)的bit6 来完成的,一旦 bit6 变为 1 则表示脉冲计数freq> 3fffffh,而3fffffh 正好是4M- 1。综上所述,8MHz是一个既安全又便于实现的上限频率(当然,这个8MHz比平常所说的8MHz要大一些)。 数字频率计测量频率,本质上是根据单位时间内对脉冲进行计数而获得的。PIC 单片机的RTCC寄存器可以对内部指令或者对外部脉冲计数。如果利用RTCC 对内部指令进行计数,可以很容易计算出时间。但是,设计已经将RTCC 用于对外部脉冲计数,就无法再对内部指令进行计数,所以要知道计数过程所花费的时间,则只能通过其他方法来获得。 通常的微处理器都是采用复杂指令集(CISC)技术,由于执行每条指令所花费的指令周期不同,要想通过计算执行某段程序所需的时钟周期来获得时间是很困难的。而16C54是采用精简指令集(RISC)技术的单片机,它的所有33条指令中除了执行无条件跳转指令和条件满足时的条件跳转指令时需要2个指令周期外,执行其余指令都只需要1个指令周期(包括执行条件不满足时的条件跳转指令)。由于1个指令周期等于4个时钟周期,当采用20MHz的时钟频率时,一个指令周期为0. 2Ls。这样,就可以简单地通过计算某段指令条数而获得执行该段指令所需时间。设计中就是使用这种方法通过一个定时循环子程序来完成定时任务的。
设计的一个定时循环里需要完成诸如频率显示、脉冲计数等工作,其中包含了一些跳转指令。而定时循环不应该因为内部可能发生的跳转所导致的执行路径不同,使得执行的总指令周期数不同。从前边的程序片段中的如下几条语句: (每条语句的注释中<... > 内为执行该指令所需的时钟周期数)btfssRTCC_prev,7;测试上次的最高位,为1则跳过下一句< 8>,否则执行下一句< 4>。 clrw ;< 4> btfsc freq+ 2,7; 测试本次的最高位,为0则跳过下一句< 8> ,否则执行下一句< 4> clrw ;< 4> addwf freq+ 1; 中间字节+ w < 4> 从上面容易看出,无论经过哪条路径执行指令所需的总时钟周期数均为5×4= 20个。这样,每次调用同一个定时循环(其中执行的路径可能不同)总是能够执行恒定的时钟周期数。因此,可以利用这个技术进行时间测量。 设计中采用的定时循环(包含在count_pulse中)为20Ls(即400个时钟周期),要进行1s的计时则需要50 000个这样的定时循环。 • 频率显示的实现 为了只用4位LED 来显示从Hz到MHz频率值的4位有效数字,用kHz作为固定单位(不需显示出来),利用小数点的位置来表示不同大小的频率(当然,也可以用一个能够显示字母、数字的LCD 来将频率值和单位一同显示出来)。当被测频率下溢出(< 1Hz)或根本没有接信号时显示数字“0”;当被测频率上溢出(> 8MHz)时,显示字母“E”。具体如表1所示。由于只显示4位有效数字,在测量MHz量级的频率时,显示精度降低许多(内部精度仍为±1Hz)。在显示子程序中,将频率计数器的内容换算为十进制的频率值,然后按照表1示例形成4位待显数据(例如:被测频率为1Hz,显示示例为0. 001)。
每位待显数据具有“pXXXdddd”格式,若某位数字后有小数点,则该位数字的 p= 1,否则 p= 0,“dddd”是待显数字的二进制表示。待显数据的显示代码(段模式)是通过查表获得的,在这张表中包括用LED 显示0~9各个数字以及字母E 等符号所需的段模式(假设LED 为共阳极接法,故每段以“0”代表亮,“1”代表暗)。PIC 单片机使用了一个很古怪的方式来实现查表功能。段模式表的内容实际上是一连串的从子程序返回(retlw)指令,retlw 指令将一个常数值(返回值)放入PIC 工作寄存器w 中。 主要程序段如下: … movwf display_tmp; 暂存待显数据(w)- > display_tmp3 andlw 7fh; 屏蔽掉最高位3 3 all seg_table; 查表,取出待显数据的代码- > w movwf display; 显示代码(w)- > display btfsc display_tmp,7; 若待显数据最高位为03 3 3,则跳过下条指令 bcf display,7; 若有小数点,则显示代码最高位清零… seg_talbe addwf 2;w+ PC- > PC retlw c0h;“0”的段模式 retlw f9h;“1”的段模式 retlw a4h;“2”的段模式 retlw b0h;“3”的段模式 retlw 99h;“4”的段模式 retlw 92h;“5”的段模式
retlw 82h;“6”的段模式 retlw f8h;“7”的段模式 retlw 80h;“8”的段模式 retlw 90h;“9”的段模式 retlw 86h;“E”的段模式,待显数据10表示E retlw ffh;“灭”的段模式,待显数据11表示所有段均暗 retlw 00h;“亮”的段模式,待显数据12表示所有段均亮 用LED 显示数据时,必须先将工作寄存器w中的待显数据暂存入display-tmp 以保存小数点信息,然后用call指令调用seg-table查表来获得段模式,再附加上小数点信息便构成完整的显示代码。事实上,seg-table子程序所执行的第一条指令“addwf2”是修改程序计数器PC 为PC+ w,即将程序转到待显数据所对应的那条“retlw”指令去执行,它返回的值便是待显数据的段模式。另外,在动态扫描过程中,需要用一个大约1ms的延时子程序使得扫描到的那个LED 稳定地点亮一段时间,以保证其显示亮度。 7.3.3 VHDL设计 在数字频率计的外围电路除可以采用上述硬件电路外,也可采用CPLD芯片,而且CPLD的设计具有更好的灵活性。采用CPLD芯片设计的数字频率计有两大功能模块组成:1)频率计数模块,包含两个部分,选通时间控制部分,可改变选通时间;计数部分,根据选通时间的长短对被测信号正脉冲进行计数。 2)扫描显示模块,对计数的结果进行扫描显示,从而完成整个测频率的过程。
CPLD的工作原理是,将被测信号通过整形电路,产生同频率的矩形波;计数部分根据所提供的矩形波上升沿进行计数,计数时间则由选通时间控制部分决定,根据频率所处的范围来决定档位;将计数的结果给显示电路;通过扫描;在数码管上显示频率的大小。 CPLD 功能模块的设计数字频率计的两大模块都是用VHDL 语言编程实现的。下面分别介绍这两个功能模块的设计。 1.频率计数模块 频率计数模块如图7.15所示,系统使用的10MHz的外部晶振。 由10MHz晶振产生选通信号。对于不同的频率,能自动调节选通时间的长短,产生自动换档功能。res 用来复位,高电平有效;start 是开启信号,高电平有效;clk 接基准时钟,10MHz晶振的信号;irq 输入被测信号整形后的信号;one、ten、hun、tho用于频率计数,用BCD 码表示,one 是低位,tho 是高位;由于本系统量程是DC~91999MHz,超过此频率时,将会产生溢出,ov将一直产生高电平,所有计数清零。 图7.15 频率计数模块
系统具有自动换档功能,总共分为四个档位。复位后,开启电路开始对irq上的信号进行计数。此时,选用最低档,选通时间为1 s,频率范围是DC~9999Hz。当在1 s内计数超过9999,则计数清零,并送出一个溢出信号overflow,使选通部分复位,重新给定选通信号。这时,选通时间为011 s,重新计数。计数最高能达到9999,这相当于换档,测量频率范围变为10100~99199kHz。为了使频率计具有足够高的准确性,只分为四个档位。 在这四个档位里,当计数在0~9999之间,便是所测信号的频率。 选通时间控制部分 当复位和开启时,系统将有一个延时电路,由一个计数器组成,与时钟同步。 If clk’ event and clk= ‘1’ then if (res= ‘1’or overflow= ‘1’)then en< = ‘0’; cnt:= 0; else if start= ’1 then if(cnt< 10)then cnt:= cnt+ 1; en< = ‘0’; else en< = ‘1’ ; end if; end if; end if;
经过一定的延时,产生信号cn,cn 滞后于en; if clk’ event and clk= ’1’ then if res= ‘1’or overflow= ‘1’ then cn< = ‘0’; dnt:= 0; else if en= ‘1’then if(dnt< limit—cnt)then dnt:= dnt+ 1; cn< = ‘0’; else cn< = ‘1’; end if; end if; end if; end if; en 和cn 共同作用产生选通信号dn,选通时间由 limit—cnt 决定,limit—cnt 取10000000到10000,可分别产生1 s到01001 s的的选通信号。当复位或产生溢出overflow 时,重新输出选通信号,limit—cnt 值也将改变,相当于换档。
if en= ‘1’ and cn= ‘0’ then dn< = ‘1’; else dn< = ‘0’; end if; 其波形示意图如图7.16所示。 2.计数部分 选通信号给定后,开始计数;从低位one到高位tho,以十进制计数; 最高能计到9999; 计数溢出,换档重计; 当所测频率超过测量范围,则ov=‘1’,使输出始终清零。选通时间里,在 irq 上升沿开始计数: 个位one计1,到9后清零; 在one= 9时,十位ten 计1,到9后清零; 图7.16 时序图(选通时间= limit—cnt3 clk)
在one= 9,ten= 9时,百位hun 计1,到9后清零; 在one= 9,ten= 9,hun= 9时,千位tho 计1,到9后清零,有溢出,overflow 为0; 总共有四个档位,以下程序给出了各个状态变化的过程,第一档到第四档分别用状态量“00”“01”“10”“11”表示;由一个溢出overflow 正脉冲触发一次;change 用来表示显示是小数点的的状态,将在显示部分使用到。 if res= ‘1’ then state< = "000"; ov< = ‘0’; change< = "00"; else if(overflow’event and overflow= ‘1’) then case state is when "00"= > state< = "01"; change< = "01"; when "01"= > state< = "10"; change< = "10"; when "10"= > state< = "11"; change< = "11"; when others= > state< = "11"; change< = "00"; ov< = ‘1’; end case; end if;
以下是不同状态下limit—cnt的不同取值,取值小将决定下一个选通时间。以下是不同状态下limit—cnt的不同取值,取值小将决定下一个选通时间。 limit:process(state) begin case state is when "00"= > limit—cnt< = 10000000; when "01"= > limit—cnt< = 1000000; when "10"= > limit—cnt< = 100000; when others= > limit—cnt< = 10000; end case; end process limit; 到此,就基本完成了计频作用,输出one、ten、hun,接下来将其显示于四个数码管上。 3.逻辑仿真 因为计数比较多,所需仿真时间一般比较长。而且仿真图比较复杂,不便在此演示。 4.扫描显示模块 如图7.17所示,通过扫描给定数码管各段的输入,所测频率得以显示。one、ten、hun、tho 将分别在个数码管里显示,其中 tho是高位,one 是低位。用Moore状态机。图7.17 扫描显示模块为使系统同步,所使用的扫描时钟disp—clk 是由给定时钟10MHz中分频得到; 经过100分频得到100 kHz,作为扫描频率。one、ten、hun、tho 是接收从计数模块的信号,digit—out 输出8位数据,接数码管,sel 是两位,用来选择数码管,00选择最低位,
11选择最高位。对各个状态进行定义,包括四个数码管的显示状态allowed—digit—states和数码管各段的显示状态allowed—seg—states; Type allowed—seg—states is (seg—a,seg—b,seg—c,seg—d,seg—e,seg—f,seg—g,seg—dp); Type allowed—ditit—states is (digit—o,digit—t,digit—h,digit—k); signal state—seg:allowed—seg—states;signalstate—digit:allowed—ditgit—states; 从数码管的a段开始,从低位的数码管开始,循环扫描显示。采用以下程序对各个数码管进行扫描: state—digit:process(res,disp—clk) variable digit—state:allowed—digit—states; begin if res= ‘1’ then digit—state:= digit—o; else if disp—clk’event and disp—clk = ‘1’ 图7.17 扫描显示模块
then case digit—state is when digit—o= > if state-seg= seg-dp then digit-state:= digit-t; end if; ……………… when digit-k= > if state-seg= seg-dp then digit—state:= digit-o; end if; end case; end if; state-digit< = digit-state; end process state-digit; 采用以下程序对数码管各段进行扫描: if disp-clk’event and disp-clk= ‘1’then case seg-state is when seg-a= > seg-state:= seg-b; …………… when seg-dp= > seg-state:= seg—a; end case; end if; state—seg< = seg—state; end process state—segq;
下面是数据输入,数码管选择显示,其程序如下:下面是数据输入,数码管选择显示,其程序如下: selec:process(state—digit) variable dp: std—logic; variable gate: std—logic—vector(2 downto 0); begin dp:= ‘0’; case state-digit is when digit-o= > indata< = one; gate:= "00"; when digit-t= > indata< = ten; gate:= "01"; if change= "10" then dp:= ‘1’; end if; when digit-h= > indata< = hun; gate:= "10"; if change= "01" then dp:= ‘1’; end if; when digit-k= > indata< = tho; gate:= "11";
if change= "11" then dp:= ‘1’; end if; end case; dp—sel< = dp; sel< = gate; end process selec; 以下是给定输出的VHDL源程序: output:process(state-seg) variable segment: std-logic-vector(7 down2to 0); begin segment := "00000000"; case state-seg is when seg-a= > …………… when seg-g= > segment(6):= outdata(6) ; when seg -dp= > segment(7):= dp-sel; end case; digit-out< = segment; end process output;
以下是七段码译码的VHDL源程序: bcdseg:process(indata) variable temp: std-logic-vector(6 downto 0); Begin case indata is when "0000" = > temp:= "0111 …………… end case; outdata(6 downto 0)< = temp; end process bcdseg; 6.系统连接系统连接 通过以上的各模块VHDL设计,再进行系统连接。连接图如图7.18所示。 图7.18 系统连接图