#基于VHDL语言的数据采集系统

#基于VHDL语言的数据采集系统
#基于VHDL语言的数据采集系统

用VHDL语言设计数据采集系统

摘要

随着计算机技术的发展和普及,数字设备正越来越多地取代模拟设备,将模拟信号

转换成数字信号以及将数字信号转换成模拟信号就成了重要环节。本系统以多路数据的

采集及监测为例,介绍了可编程逻辑器件在模数转换、数模转换及数据监控及处理中的

设计方法。实现数据采集的方法有很多,如单片机、CPLD、C语言等,但相比各种方法,运用VHDL硬件描述语言开发的数据采集系统具有具有设计方便高效、体积小、功耗低、可靠性高、易于修改、设计周期短等特点。VHDL硬件描述语言采用自顶而下的设计方法

可以对模型进行及时修改,以改进系统或子系统的功能,更正设计错误,从而提高目标

系统的工作速度,减小面积耗用,降低功耗和成本等。本文介绍了基于Altera公司的

集成开发环境MaxplusII,使用VHDL设计开发数据采集系统的基本方法。

[关键词] VHDL ADC0809 DAC0832 EDA 数据采集;

Abstract

With the development of computer technology and popularization, Digital devices are increasingly replacing analog equipment,and converted the analog signals into digital signals, as well as digital signal into analog signal will become an important link.for example,this syestem depend on one multi-channel data acquisition and monitoring,introduce a programmable logic device in the analog-digital conversion, digital-analog conversion and data monitoring with handling methods in the design. There are many ways to collect data, such as SCM, CPLD, C language,and so on. But compared with various methods,using the VHDL hardware description language to design the data acquisition system is the best. Because of its facilitate ,efficient, small size, low power consumption, high reliability, easy to modify, and shorter design cycle characteristics. VHDL hardware description language using the top-down design method ,that can be the model for timely changes to improve the system or subsystem functions, design error correction, so as to enhance the work of the target system’s speed, reducing the area of cons umption, and lower the power consumption costs. In this paper,we introduce a integrated development environment which based on Altera's MaxplusII,and the basic method to develop a data acquisition system design by using VHDL language. [Key words]:VHDL EDA ADC0809 DAC0832 Data Acquisition

目录

前言 (1)

1 EDA技术及开发环境 (3)

1.1 EDA技术 (3)

1.2 VHDL (4)

1.3 EDA技术的开发环境-MAXPLUSII (5)

2 数据采集系统的研究分析及设计思路 (6)

2.1数据采集系统的研究和分析 (7)

2.2数据采集系统的设计思路 (7)

3 数据采集系统模块的相关介绍和分析 (8)

3.1 数据输入模块 (8)

3.1.1数据输入单元设计 (8)

3.1.2 ADC0809接线图 (9)

3.1.3模块功能实现 (10)

3.2 数据采集系统各模块分析 (11)

3.2.1 A/D转换控制模块ADZHKZ的设计 (18)

3.2.2数据运算和处理模块SJYSCL (17)

3.2.3 D/A转换控制模块DAZHKZ (22)

3.2.4键盘输入和数据显示控制模块JPXSKZ (25)

3.2.5数码显示模块DISP的设计 (25)

3.3数据输出模块 (25)

3.3.1 DAC0832芯片介绍 (25)

3.3.2 DACO832接线图 (26)

4 仿真结果 (27)

5 硬件连接实物图 (30)

6 结论 (31)

致谢 (33)

参考文献 (33)

附录 (32)

前言

随着计算机技术的发展和普及,数字设备正越来越多地取代模拟设备,在生产过程控制和科学

研究等广泛的领域中,计算机测控技术正发挥着越来越重要的作用。然而,外部世界的大部分信息

是以连续变化的物理量形式出现的,例如温度、压力、位移、速度等。要将这些信息送入计算机进

行处理,就必须先将这些连续的物理量离散化,并进行量化编码,从而变成数字量,这个过程就是

数据采集。它是计算机在监测、管理和控制一个系统的过程中,取得原始数据的主要手段。数据采

集系统是计算机智能仪器和外界物理世界联系的桥梁,是获取信息的重要途径。数据采集技术是信

息科学的重要组成部分,已广泛使用于国民经济和国防建设的各个领域,并且随着科学技术的发展,

尤其是计算机技术的发展和普及,数据采集技术将有广阔的发展前景。

实现数据采集系统的控制方法很多,可以用标准逻辑器件、可编程序控制器PLC、单片机等方

案来实现。但是这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能

修改及系统调试的困难。但是EDA利用VHDL语言来设计实现该系统,将更加直观,少了汇编语言的复杂、烦琐,其自顶而下的设计方法可以对模型进行及时修改,以改进系统或子系统的功能,更正设计错误,从而提高目标系统的工作速度,减小面积耗用,降低功耗和成本等。同时,避免了传统的数字电子系统设计中电路设计复杂、调试十分困难、对错误的查找和修改的不便等问题。基于CPLD /FPGA设计的数字电子系统,具有体积小、功耗低、可靠性高、易于修改、设计周期短等特点,用CPLD/FPGA代替中小规模逻辑器件构成数字系统是发展方向。随着电子技术的发展,在今后的电子产品的研发中,EDA技术具有更好的开发手段和性价比,具有广泛的市场使用前景。

本次设计系统以一路数据的采集及监测为例,介绍了可编程逻辑器件在模数转换,数模转换,数据监控和处理的设计方法。本系统主要是由五大部分组成:数据输入单元、数据处理单元、数据输出单元。其中包括七个功能模块:模数转换模块ADC0809、AD转换控制模块、数据运算和处理模块、DA转换控制模块、键盘显示控制模块、数码管显示模块、数模转换模块DAC0832。系统主要实现以下功能:首先对ADC0809的某路通道的数值进行AD转换为十二位的电压BCD码显示,再对此值和十二位预置电压进行差值运算,然后将所得用十二位BCD码显示的差值分三段分别转化为数码管显示形式,最后数码管循环显示输入电压、差值、采集个数。在数据处理完之后,将数据输出给DAC0832,再将数字信号转换为模拟量输出,输出值和数码管显示的差值电压相同。

1. EDA技术及开发环境

1.1 EDA技术

EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作[1]。

20世纪70年代,可编程逻辑技术及其器件问世,计算机作为一种运算工具已在科研领域得到广泛使用。电子线路的CAD(计算机辅助设计)是EDA发展的初级阶段,是高级EDA系统的重要组成部分。它利用计算机的图形编辑、分析和存储等能力,协助工程师设计电子系统的电路图、印制电路板和集成电路板图。 20世纪80年代,集成电路设计进入了CMOS时代。复杂课编程逻辑器件已进入商业使用,相应的辅助设计软件也已投入使用。而在80年代末,出现了FPGA,CAE、CAD技术的使用更为广泛,他们在PCB 设计方面的原理图输入、自动布局布线及PCB分析以及逻辑设计、逻辑仿真、布尔方程综合和化简等方面担任了重要角色。20世纪90年代,随着硬件描述语言的标准化得到

进一步的确立,电子设计自动化技术的使用和发展,促进了EDA技术的形成。各EDA公司致力于推出兼容各种硬件实现方案和支持标准硬件描述语言的EDA工具的研究,有效的将EDA技术推向了成熟。进入21世纪后,EDA技术得到了更大的发展和使用。

EDA技术将计算机软件、硬件、微电子技术交叉运用的现代化电子学科,它将CAD (计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)集于一体并深入发展。EDA技术就是以计算机为工作平台、以EDA软件工具为开发环境、以硬件描述语言为设计语言、以ASIC(Application Specific Integrate Circuits)为实现载体的电子产品自动化设计过程。在EDA软件平台上,根据原理图或硬件描述语言HDL完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真、目标芯片的适配编译、逻辑映射和编程下载等工作。设计者的工作仅限于利用软件的方式来完成对系统硬件功能的描述,在EDA 工具的帮助下,使用相应的CPLD/FPGA(Complex Programmable Logic Devices/Field Programmable Gate Array)器件,就可以得到最后的设计结果。尽管目标系统是硬件,但整个设计和修改过程如同完成软件设计一样方便和高效。此外,从使用的广度和深度来说,由于电子信息领域的全面数字化,基于EDA的数字系统的设计技术具有更大的使用市场和更紧迫的需求性。

随着电子技术的发展,使用系统向小型化,快速化,大容量,重量轻的方向发展。数字系统的设计已从芯片组合化设计走向单片系统的设计。电子设计自动化是以计算机科学和微电子技术发展为先导,汇集了计算机图形学,拓扑逻辑学,微电子工艺和结构学和计算数学等多种计算机使用学科最新成果的先进技术,它是在先进的计算机平台上开发出来的一整套实现电子系统或电子产品自动化设计的技术,是当代电子设计技术的主流。其特点如下:

(1)采用硬件描述语言作为设计输入。用VHDL对数字电子系统进行抽象的行为和功能描述以及具体的内部线路结构描述,从而可以在电子设计的各个阶段,各个层次进行计算机模拟验证,保证设计的正确性,可以大大降低设计成本,缩短设计周期。

(2)库的引入。在各类库的引入下,使EDA工具能够完成各种自动设计过程

(3)设计文档的管理。

(4)强大的系统建模、电路仿真功能。EDA仿真测试技术只需通过计算机,就能对所设计电子系统从各个不同层次的系统性能特点完成一系列准确的测试和仿真操作,这极大地提高了大规模系统电子设计的自动化程度。

(5)开发技术的标准化、规范化以及IP核的可重用性。EDA软件平台支持任何标准化的设计语言,它的设计成果是通用性的,IP核具有规范的接口协议。良好的可移植性和可测试性,为高效高质的系统开发提供了可靠的保证。

(6)适用于高效率大规模系统设计的自顶向下设计方案,能将所有设计环节纳入统一的自顶向下的设计方案中。

(7)全方位的利用计算机自动设计、仿真和测试技术。EDA不但在整个设计流程上充分利用计算机的自动设计能力,在各个层次上利用计算机完成不同内容的仿真模拟,而且在系统板设计结束后仍可利计算机对硬件系统进行完整的测试(边界扫描技术)。

(8)对设计者的硬件知识和硬件经验要求低。EDA技术的标准化HDL设计语言和设计平台对具体硬件的无关性,使设计者能更大程度地将自己的才智和创造力集中在设计项目性能的提高和成本的降低上,而将更具体的硬件实现工作让专门部门来完成。

(9)纯硬件系统的高可靠性。

1.2 VHDL

VHDL语言是随着集成电路系统化和高度集成化的发展而逐步发展起来的,是一种用于数字系统设计和测试的硬件描述语言。对于小规模的数字集成电路,通常可以用传统的设计输入方法(如原理图输入)来完成,并进行模拟仿真。但纯原理图输入方式对于大型、复杂的系统,由于种种条件和环境的制约,其工作效率较低,而且容易出错,暴露出多种弊端。在信息技术高速发展的今天,对集成电路提出了高集成度、系统化、微尺寸、微功耗的要求,因此,高密度可编程逻辑器件和VHDL便应运而生[2]。

VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格和句法十分类似于一般的计算机高级语言。使用VHDL进行工程设计的优点是多方面的,具体如下:

(1)和其他硬件描述语言相比,VHDL有更强大的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件的结构,从逻辑行为上描述和设计大规模电子系统的重要保证。

(2)VHDL最初是作为一种仿真标准格式出现的,因此VHDL既是一种硬件电路描述和设计语言,也是一种标准的网表格式,还是一种仿真语言。它具有丰富的仿真语句和库函数,设计者可以在系统设计的早期随时对设计进行仿真模拟,查验所设计系统的功能特性,从而对整个工程设计的结构和功能可行性作出判断。

(3)VHDL的行为描述能力和程序结构决定了它具有支持大规模设计和分解已有设计的再利用功能,满足了大规模系统设计要有多个开发组共同进行工作来实现的这种市场需求。VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有力的支持。

(4)对于VHDL完成的一个确定设计,可以利用EDA工具进行逻辑综合和优化,并自动将VHDL描述转化成门级网表,生成一个更有效、更高速的电路系统;此外,设计还可以容易地从综合优化后的电路获得设计信息,返回去更新修改VHDL设计描述,使之更为完善。这种方式突破了门级设计的瓶颈,极大地减少了电路设计的时间和可能发生的错误,降低了开发成本。

(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。正因为VHDL的硬件描述和具体的工艺技术和硬件结构无关,VHDL设计程序的硬件实现目标器件有广阔的选择范围,其中包括各个系列的CPLD、FPGA及各种门阵列实现目标。

(6)由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变原程序的条件下,只需改变端口类型参量或函数,就能轻易地改变设计的规模和结构。

1.3 EDA技术的开发环境-MAXPLUSII

Max+plusII(或写成Maxplus2,或MP2) 是Altera公司推出的的第三代PLD开发系统(Altera第四代PLD开发系统被称为:QuartusII,主要用于设计新器件和大规模CPLD/FPGA).使用MAX+PLUSII的设计者不需精通器件内部的复杂结构。设计者可以用自己熟悉的设计工具(如原理图输入或硬件描述语言)建立设计,MAXPLUSII把这些设计转自动换成最终所需的格式。其设计速度非常快。对于一般几千门的电路设计,使用MAXPLUSII,从设计输入到器件编程完毕,用户拿到设计好的逻辑电路,大约只需几小时。设计处理一般在数分钟内内完成。特别是在原理图输入等方面,MAXPLUSII被公认为是最易使用,人机界面最友善的PLD开发软件,特别适合初学者使用。MAXPLUSII软件是一款高效的、非常灵活的数字电路开发设计软件,它提供了多种输入方法供设计者选用,利用合适的输入方法设计完数字系统之后,设计者可利用逻辑综合工具进行逻辑综合,并可以用仿真器进行软件仿真,使设计者能够尽早发现设计中的错误,缩短设计周期。

首先我们可以先看一看用FPGA/CPLD开发工具进行电路设计的一般流程:

1.设计输入。在传统设计中,设计人员是使用传统的原理图输入方法来开始设计的。自90年代初, Verilog、VHDL、AHDL等硬件描述语言的输入方法在大规模设计中得到了广泛使用。

2.前仿真(功能仿真)。设计的电路必须在布局布线前验证电路功能是否有效。(ASCI 设计中,这一步骤称为第一次Sign-off)PLD设计中,有时跳过这一步。

3.设计编译。设计输入之后就有一个从高层次系统行为设计向门级逻辑电路设转化翻译过程,即把设计输入的某种或某几种数据格式(网表)转化为软件可识别的某种数据格式(网表)。

4.优化。对于上述综合生成的网表,根据布尔方程功能等效的原则,用更小更快的综合结果代替一些复杂的单元,并和指定的库映射生成新的网表,这是减小电路规模的一条必由之路。

5.布局布线。在PLD设计中,3-5步可以用PLD厂家提供的开发软件(如 Maxplus2)

自动一次完成。

6.后仿真(时序仿真)需要利用在布局布线中获得的精确参数再次验证电路的时序。(ASCI设计中,这一步骤称为第二次Sign—off)。

7.生产。布线和后仿真完成之后,就可以开始ASCI或PLD芯片的投产。

同样,使用Maxplus2基本上也是有以上几个步骤,但可简化为:

(1)设计输入

(2)设计编译

(3)设计仿真

(4)下载

2.数据采集系统的研究分析及设计思路2.1数据采集系统的研究和分析

数据采集技术(Data Acquisition)是信息科学的一个重要分支,它研究信息数据的采集、存贮、处理以及控制等作业。在智能仪器、信号处理以及工业自动控制等领域,都存在着数据的测量和控制问题。将外部世界存在的温度、压力、流量、位移以及角度等模拟量(Analog Signal)转换为数字信号(Digital Signal), 在收集到计算机并进一步予以显示、处理、传输和记录这一过程,即称为“数据采集”[3]。相应的系统即为数据采集系统(Data Acquisition System,简称DAS)。数据采集是计算机在监测、管理和控制一个系统的过程中,取得原始数据的主要手段。数据采集系统是计算机智能仪器和外界物理世界联系的桥梁,是获取信息的重要途径。数据采集技术是信息科学的重要组成部分,已广泛使用于国民经济和国防建设的各个领域,并且随着科学技术的发展,尤其是计算机技术的发展和普及,数据采集技术将有广阔的发展前景[4]。

传统的数据采集系统,通常采用单片机或DSP作为控制模块,控制ADC,存储器和其他外围电路的工作。随着数据采集对速度性能的要求越来越高,传统的采集系统的弊端越来越明显。单片机的时钟频率较低且用软件实现数据采集,使得采集速度和效率降低,软件运行时间在整个采样时间中占很大的比例。而EDA技术的FPGA (现场可编程门阵列)有单片机无法比拟的优势:FPGA时钟频率高,内部延时小,全部控制逻辑由硬件完成,速度快、效率高。随着复杂可编程逻辑器件的广泛使用,以EDA工具作为开发手段,运用VHDL语言来设计将使整个系统大大简化,从而提高整体的性能和可靠性。因此利用VHDL硬件描述语言来设计数据采集系统是一个比较合理的方案。这个系统的设计对以后工作及生活具有相当的意义,它不仅在工业控制中使用广泛,而且还可以用来解决生活中的一些小问题。在电子系统非常广泛使用领域内,到处可见到对信号进行

模数/数模转换的数字电路。在ABS 系统(汽车防抱制动系统)、计算机技术、GPRS 环抱系统、工业自动控制系统等系统中,数据采集系统都有着举足轻重的作用[5]。数字技术及计算机技术的发展使得系统的设计更理想化,以实现更多的功能。同时,还进一步提高了系统的可靠性和工作效率。 2.2数据采集系统的设计思路

系统主要实现以下功能:数据采集控制系统是对生产过程或科学实验中各种物理量进行实时采集、测试和反馈控制的闭环系统。它在工业控制、军事电子设备医学监护等许多领域发挥着重要作用。

本设计要求用一个CPLD/FPGA 、模数转换器ADC 和数模转换器DAC 构成了一个数据采集系统,并用CPLD/FPGA 实现数据采集中对A/D 转换、数据运算、D/A 转换以及有关据显示的控制。系统的组成框图如图2.1所示,其功能如下:

(1)、系统按一定速率采集输入电压U1,经ADC0809转换为8位数字量DATA; (2)、输入数据和通过预置按键输入数据采集控制器内的标准数据相减,求得带极性位的差值±U(数字量);差值之绝对值送至DAC0832转换为U ,它和特定的极性判别电路共同输出±U 。

(3) 数据采集和处理均在数据采集系统控制器的管理下有序进行。工作速率由时钟信号CLK 的速率决定。

图2.1 系统组成框图

编译和仿真时要选择合适的芯片,不同的芯片其速度等级是不一样的。选择速度等级高的芯片,仿真时延就小,这样便于分析时序波形。否则,将给时序分析带来一些不必要的麻烦。编译结束时,要注意认真分析芯片资源的利用情况,这其中主要包括芯片管脚和逻辑单元的利用率.如果没有充

CPLD/FPGA 数据采集控制器

DAC0832

ADC0809

U1

DOUT

U

开关和控制键

F

8.

8

8

CLK

ADDA ALE CE START EOC DA TA

分利用资源就要重新选择芯片,争取实现性价比的最大化。

所以大致流程是先进行主程序的输入/输出模块,数据处理及监控模块的设计。然后对各程序进行修改、编译、仿真,并对出现问题的程序进行程序修改和调试。

3.数据采集系统模块的相关介绍和分析3.1 数据输入模块

3.1.1数据输入单元设计

数据输入单元的设计是通过ADC0809的常规使用来实现的,其具体的实现如图3.1所示。其中ADC0809的CLOCK信号是由外部输入的。此信号的输入没有固定的要求,只要足够高就可以了,通常信号频率为640KHZ、750KHZ等。ADC0809的START信号也是由外部接入的,但是此信号的频率不宜过高,要小于1KHZ。将ADC0809的输出作为FPGA 的输入。

ADC0809是一种比较典型的8位8通道逐次逼近式A/D转换器CMOS工艺,可实现8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存用译码电路,其转换时间为100μs左右,采用双排28引脚封装。ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A /D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。其引脚说明如下:IN0~IN7:8路模拟量输入通道

ADDA~ADDC:地址线用于选择模拟量输入通道

ALE:地址锁存允许信号

START:转换启动信号

D0~D7:数据输出线

OE: 输出允许信号,低电平允许转换结果输出

CLOCK:时钟信号输入引脚,通常使用500KHz

EOC:转换结束信号,为0代表正在转换,1代表转换结束

Vcc:+5V电压

3.1.2 ADC0809接线图

此电路图主要实现将八路输入模拟信号转换为数字信号,为数据处理及监控模块提供输入信号。

图3.1 ADC0809接线图

3.1.3模块功能实现

此系统是用ADC0809对模拟信号进行采样,转换为数字信号,由可编程逻辑器件读

入,再送到DAC0832,将数字信号转换为模拟信号。用可编程逻辑器件实现对ADC0809

的控制,由于采用查询信号EOC 的方式,所以可达到ADC0809的最高速度(注:ADC0809和DAC0832都不能对负电压进行操作)。主要包括分频模块和ADC 控制模块。总体框图

如图3.2所示:图中OE 为输出允许信号,高电平允许转换结果输出 ;EOC 为转换结束信号,为0代表正在转换,1代表转换结束;DIN[7..0]为八路模拟量输入通道;DOUT[7..0]为转换后的八路数字信号输出通道。

图3.2 总体框图 3.2数据采集系统各模块分析

3.2.1 A/D 转换控制模块ADZHKZ 的设计

ADC0809模数转换的控制:

ADC0809是CMOS 的8位A/D 转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。ADC0809的分辨率为8位,转换时间约100 μs ,含锁存控制的8路多路开关,输出由三态缓冲器控制,单5 V 电源供电。图3.3是ADC0809的管脚及

CLK START OE

IN0

IN1 IN2 IN3 IN4 IN5 IN6 IN7 ADDA ADDB

ADDC ALE GND V OC

D0 D1 D2 D3 D4 D5 D6 D7 EOC REF+ REF-

+5V

17 D0 14 D1 15 D2 8 D3 18 D4

19 D5

20 D6

21 D7 7 D25

12 V CC 16 13

A0 25 A1 24 A2 23

ADCALE 22

26

27 28 1 2 3 4 5 R48 10K R47 10K

+5V

ALE

ADCALE ADCOE

ADC0809N

主要控制信号时序图。

图3.3 ADC0809的管脚及主要控制信号的时序图

对于ADC0809模数转换的控制程序段的VHDL 设计,根据ADC0809的A/D 转换控制要求,我们可用一个状态机来实现,其状态转换如图3.4所示。

图3.4 ADC0809工作时的状态转换图

转换后数据的BCD 码转换处理:

表3.1是在ADC0809的基准电压(Vref)为5.12 V 时,模拟输入电压和输出电压的对应关系其中最

小电压准位是5/28=5/256=0.2 V 。

这样,当由ADC0809的D[7..0]收到的数据信号是10000110(即86H)时,则对照表3.1时,高4位1000

是2.56 V ,而低4位0110是0.12 V ,所以最后的电压输出结果是2.56 V+0.12 V=2.68 V 。

表3.1 ADC0809模拟输入电压和输出电压的对应关系

进 制 参考电压(Vref )为5V

2NI 1NI 0NI ADDA

BDDA

CDDA

ELA

0D

1D

2D

3D

7D

--FER

5D

3NI

4NI

5NI

6NI

7NI

TRAST

COE

4D

EO

KLC

CCV

+FER

6D

DNG

ADC0809

ST0

ST1

ST2

ST3

ST6

ST5

ST4

ALE<=’0’START<=’0LOCK<=’0’ CEN<=’0’

ALE<=’1’START<=’0’ OE<=’0’ LOCK<=’0’ CEN<=’0’

ALE<=’0’START<=’0’ OE<=’0’LOCK<=’1’ CEN<=’0’

EOC=’0’

EOC=’1

ALE<=’0’START<=’0’ OE<=’1’LOCK<=’0’ CEN<=’1’

ALE<=’0’START<=’1’OE<=’0’LOCK<=’0’ CEN<=’0’

ALE<=’0’START<=’0’ OE<=’0’LOCK<=’0’ CEN<=’0’

ALE<=’0’START<=’0’OE<=’0’LOCK<=’0’ CEN<=’0’

16 2 高4位电压

低4位电压 0 0000 0.00

0.00 1 0001 0.32 0.02 2 0010 0.64 0.04 3 0011 0.96 0.06 4 0100 1.28 0.08 5 0101 1.60 0.10 6 0110 1.92 0.12 7 0111 2.24 0.14 8 1000 2.56 0.16 9 1001 2.88 0.18 A 1010 3.20 0.20 B 1011 3.52 0.22 C 1100 3.84 0.24 D 1101 4.16 0.26 E 1110 4.48 0.28 F 1111 4.80

0.30

图3.5 BCD 加法示意图

为了方便后续的电压数据显示,我们应将输出电压表示成12位的BCD 码形式。如上述的2.56 V 是0010 0101 0110,0.12 V 是0000 0001 0010,所以相加的结果2.68 V 是0010 0110 1000,因此必须设计一个12位的BCD 码加法程序。

图3.5是2.56+0.18=2.74的二进制的BCD 加法示意图。从图中可以看出,二进制BCD 码相加时,由最低位4位加起,且每4位相加的结果超过10时需作进位操作。 A/D 转换控制模块ADZHKZ 的VHDL 源程序:

进位

1

0010 0101 0110

+ 0000 0001 1000 0010 0111 0100

图3.6 A/D转换控制模块符号编辑文件

--ADZHKZ.VHD

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ADZHKZ IS

PORT(D: IN STD_LOGIC_VECTOR(7 DOWNTO 0);

--0809的8位转换数据输出

RST: IN STD_LOGIC; --复位信号

CLK: IN STD_LOGIC; --转换工作时钟信号

EOC: IN STD_LOGIC; --0809的转换结束控制信号

ALE: OUT STD_LOGIC; --0809的通道选择地址锁存信号

START: OUT STD_LOGIC; --0809的转换启动控制信号

OE: OUT STD_LOGIC; --0809的输出使能控制信号

ADDA: OUT STD_LOGIC; --0809的通道选择控制信号

BCDOUT: OUT STD_LOGIC_VECTOR(11 DOWNTO 0);

--来自0809的数据经BCD转换后的输出

);

END ENTITY ADZHKZ;

ARCHITECTURE ART OF ADZHKZ IS

TYPE STATES IS (ST0,ST1,ST2,ST3,ST4,ST5,ST6);

SIGNAL CURRENT_STATE,NEXT_STATE: STATES;

SIGNAL REGL: STD_LOGIC_VECTOR(7 DOWNTO 0);

SIGNAL LOCK0,LOCK1: STD_LOGIC; --转换后数据输出锁存时钟信号 SIGNAL VALUE: STD_LOGIC_VECTOR(11 DOWNTO 0);

SIGNAL CEN: STD_LOGIC;

SIGNAL ALE0: STD_LOGIC;

SIGNAL START0: STD_LOGIC;

SIGNAL OE0: STD_LOGIC;

BEGIN

--A/D转换控制模块

STATESYSTEM: BLOCK IS

BEGIN

ADDA<='1';

--状态转换控制

PRO: PROCESS(CURRENT_STATE,EOC) IS

BEGIN

CASE CURRENT_STATE IS

WHEN ST0=>ALE0<='0'; START0<='0'; OE0<='0';

LOCK0<='0'; NEXT_STATE<=ST1; CEN<='0';

WHEN ST1=>ALE0<='1'; START0<='0'; OE0<='0'; LOCK0<='0'; NEXT_STATE<=ST2; CEN<='0';

WHEN ST2=>ALE0<='0'; START0<='1'; OE0<='0'; LOCK0<='0'; NEXT_STATE<=ST3; CEN<='0';

WHEN ST3=>ALE0<='0'; START0<='0'; OE0<='0';

LOCK0<='0'; CEN<='0';

IF EOC='1' THEN --测试EOC的下降沿

NEXT_STATE<=ST3;

ELSE

NEXT_STATE<=ST4;

END IF;

WHEN ST4=>ALE0<='0'; START0<='0'; OE0<='0';

LOCK0<='0'; CEN<='0';

IF EOC='0' THEN

NEXT_STATE<=ST4;

--测试EOC的上升沿,=1表明转换结束

ELSE

NEXT_STATE<=ST5;

END IF;

WHEN ST5=>ALE0<='0'; START0<='0'; OE0<='1'; LOCK0<='0'; NEXT_STATE<=ST6; CEN<='1';

WHEN ST6=>ALE0<='0'; START0<='0'; OE0<='1'; LOCK0<='1'; NEXT_STATE<=ST0; CEN<='0';

WHEN OTHERS=>ALE0<='0'; START0<='0'; OE0<='0'; LOCK0<='0'; NEXT_STATE<=ST0; CEN<='0';

END CASE;

END PROCESS;

PROCESS(RST, CLK) IS

BEGIN

IF RST='1' THEN

CURRENT_STATE<=ST0

ELSIF RISING_EDGE(CLK) THEN

CURRENT_STATE<=NEXT_STATE; --在时钟上升沿,转换至下一状态 END IF;

END PROCESS;

--用于给输出信号去毛刺

PROCESS(CLK) IS

BEGIN

IF RISING_EDGE(CLK) THEN

ALE<=ALE0; START<=START0; OE<=OE0; LOCK1<=LOCK0;

END IF;

END PROCESS;

--数据锁存进程

PROCESS(LOCK1) IS

BEGIN

IF RISING_EDGE(LOCK1) THEN

REGL<=D; --在LOCK1的上升沿,将转换好的数据锁入

END IF;

END PROCESS;

END BLOCK STATESYSTEM;

--A/D转换数据的BCD码转换模块

CONVERSION: BLOCK IS

SIGNAL V: STD_LOGIC_VECTOR(7 DOWNTO 0);

SIGNAL HB,LB: STD_LOGIC_VECTOR(11 DOWNTO 0);

SIGNAL C30,C74,C118: STD_LOGIC;

SIGNAL TEMPA,TEMPB,TEMPC: STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN

PROCESS(REGL) IS

BEGIN

V<=REGL;

--将A/D转换后数据的高4位通过查表的方式用12位BCD码表示 CASE V(7 DOWNTO 4) IS --FOR A/D CONVERSION DATA HIGHT BYTE

WHEN "1111" =>HB<="010*********"; --4.80

WHEN "1110" =>HB<="010*********"; --4.48

WHEN "1101" =>HB<="010*********"; --4.16

WHEN "1100" =>HB<="001110000100"; --3.84

WHEN "1011" =>HB<="001101010010"; --3.52

WHEN "1010" =>HB<="001100100000"; --3.20

WHEN "1001" =>HB<="001010001000"; --2.88

WHEN "1000" =>HB<="001001010110"; --2.56

WHEN "0111" =>HB<="001000100100"; --2.24

WHEN "0110" =>HB<="000110010010"; --1.92

WHEN "0101" =>HB<="000101100000"; --1.60

WHEN "0100" =>HB<="000100101000"; --1.28

WHEN "0011" =>HB<="000010010110"; --0.96

WHEN "0010" =>HB<="000001100100"; --0.64 WHEN "0001" =>HB<="000000110010"; --0.32

WHEN OTHERS =>HB<="000000000000"; --0.00

END CASE;

--将A/D转换后数据的低4位用12位BCD码表示

CASE V(3 DOWNTO 0) IS --FOR A/D CONVERSION DATA LOW BYTE WHEN "1111" =>LB<="000000110000"; --0.30 WHEN "1110" =>LB<="000000101000"; --0.28

WHEN "1101" =>LB<="000000100110"; --0.26

WHEN "1100" =>LB<="000000100100"; --0.24

WHEN "1011" =>LB<="000000100010"; --0.22 WHEN "1010" =>LB<="000000100000"; --0.20

WHEN "1001" =>LB<="000000011000"; --0.18

WHEN "1000" =>LB<="000000010110"; --0.16

WHEN "0111" =>LB<="000000010100"; --0.14

WHEN "0110" =>LB<="000000010010"; --0.12

WHEN "0101" =>LB<="000000010000"; --0.10

WHEN "0100" =>LB<="000000001000"; --0.08

WHEN "0011" =>LB<="000000000110"; --0.06

WHEN "0010" =>LB<="000000000100"; --0.04

WHEN "0001" =>LB<="000000000010"; --0.02

WHEN OTHERS =>LB<="000000000000"; --0.00

END CASE;

END PROCESS;

--将A/D转换后数据的高、低4位的12位BCD码进行加法操作处理

PROCESS(HB,LB,CEN) IS

VARIABLE TEMP1,TEMP2,TEMP3: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

IF RISING_EDGE(CEN) THEN

TEMP1: =HB(3 DOWNTO 0)+LB(3 DOWNTO 0);

IF TEMP1>"1001" THEN

TEMP1: =TEMP1+"0110";

TEMP2: =HB(7 DOWNTO 4)+LB(7 DOWNTO 4)+'1';

IF TEMP2>"1001" THEN

TEMP2: =TEMP2+"0110";

TEMP3: =HB(11 DOWNTO 8)+LB(11 DOWNTO 8)+'1';

IF TEMP3>"1001" THEN

TEMP3: =TEMP3+"0110";

END IF;

ELSE

TEMP3: =HB(11 DOWNTO 8)+LB(11 DOWNTO 8);

IF TEMP3>"1001" THEN

TEMP3: =TEMP3+"0110";

END IF;

END IF;

ELSE

TEMP2: =HB(7 DOWNTO 4)+LB(7 DOWNTO 4);

IF TEMP2>"1001" THEN

TEMP2: =TEMP2+"0110";

TEMP3: =HB(11 DOWNTO 8)+LB(11 DOWNTO 8)+'1';

IF TEMP3>"1001" THEN

TEMP3: =TEMP3+"0110";

END IF;

ELSE

TEMP3: =HB(11 DOWNTO 8)+LB(11 DOWNTO 8);

IF TEMP3>"1001" THEN

TEMP3: =TEMP3+"0110";

END IF;

END IF;

END IF;

END IF;

VALUE<=TEMP3&TEMP2&TEMP1;

END PROCESS;

--将经过BCD码转换处理后的数据输出

BCDOUT<=VALUE;

END BLOCK CONVERSION;

END ARCHITECTURE ART;

3.2.2数据运算和处理模块SJYSCL

数据运算和处理模块实现的功能是将A/D转换控制模块ADZHKZ输出的12位BCD码和预置的12位电压值进行差值运算,输出差值电压。数据运算和处理模块SJYSCL的VHDL源程序:

图3.7 数据运算和处理模块符号编辑文件

--SJYSCL.VHD

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY SJYSCL IS

PORT(CLK: IN STD_LOGIC;

DABC: IN STD_LOGIC_VECTOR(11 DOWNTO 0);

DTA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);

DTB: IN STD_LOGIC_VECTOR(3 DOWNTO 0);

DTC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);

QABC: OUT STD_LOGIC_VECTOR(11 DOWNTO 0));

END ENTITY SJYSCL;

ARCHITECTURE ART OF SJYSCL IS

SIGNAL DA,DB,DC: STD_LOGIC_VECTOR(3 DOWNTO 0);

--DA IS THE HIGHEST BIT,DC THE LAST ONE

SIGNAL DDA,DDB,DDC: STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

DA<=DABC(11 DOWNTO 8);

DB<=DABC(7 DOWNTO 4);

DC<=DABC(3 DOWNTO 0);

DDA<=DTA(3 DOWNTO 0);

DDB<=DTB(3 DOWNTO 0);

DDC<=DTC(3 DOWNTO 0);

PROCESS IS

VARIABLETEMPA,TEMPB,TEMPC: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

WAIT UNTIL CLK='1' ;

IF DA>DDA THEN

IF DB>DDB THEN

IF DC>=DDC THEN

TEMPC: =DC-DDC;

TEMPB: =DB-DDB;

TEMPA: =DA-DDA;

ELSE

TEMPC: ="1010"-DDC+DC;

IF TEMPC>"1001" THEN

TEMPC: =TEMPC+"0110";

END IF;

TEMPB: =DB-'1'-DDB;

TEMPA: =DA-DDA;

END IF;

ELSIF DB=DDB THEN

IF DC>=DDC THEN

TEMPC: =DC-DDC;

TEMPB: =DB-DDB;

TEMPA: =DA-DDA;

ELSE

TEMPC: ="1010"-DDC+DC;

IF TEMPC>"1001" THEN

TEMPC: =TEMPC+"0110" ; END IF;

TEMPB: ="1010"-DDB-'1'+DB; IF TEMPB>"1001" THEN TEMPC: =DC-DDC;

TEMPB: =DB-DDB;

TEMPA: =DA-DDA;

ELSE

TEMPC: ="1010"-DDC+DC;

IF TEMPC>"1001" THEN

TEMPC: =TEMPC+"0110";

END IF;

TEMPB: =DB-'1'-DDB;

TEMPA: =DA-DDA;

END IF;

ELSIF DB=DDB THEN

IF DC>=DDC THEN

TEMPC: =DC-DDC;

TEMPB: =DB-DDB;

TEMPA: =DA-DDA;

ELSE

TEMPC: ="1010"-DDC+DC;

IF TEMPC>"1001" THEN

TEMPC: =TEMPC+"0110" ; END IF;

TEMPB: ="1010"-DDB-'1'+DB; IF TEMPB>"1001" THEN TEMPB: =TEMPB+"0110";

END IF;

TEMPA: =DA-'1'-DDA;

END IF;

相关主题
相关文档
最新文档