摘 要
本论文介绍了基于FPGA的多通道采样系统的设计。用FPGA设计一个多通道采样控制器,利用VHDL语言设计有限状态机来实现对AD7892的控制。由于FPGA器件的特性是可以实现高速工作,为此模拟信号选用音频信号。由于音频信号的频率是20Hz-20KHz,这样就对AD转换的速率有很高的要求.因为FPGA的功能很强大,所以我们把系统的许多功能都集成到FPGA器件中,例如AD通道选择部分,串并输出控制模块,这样使得整个系统的外围电路简单、系统的稳定性强。FPGA的配置模式选用被动串行模式,这样就增强了系统的可扩展性。输出模式可选择性使得系统的应用相当广泛,串行输出可以用于通信信号的采集,方便调制后发射到远程接受端,远程接收端对采集的数据进行解调;而并行输出模式则可以通过高速存储器将采集的信号放到微机或者其他的处理器上,根据采集的数据进行相应的控制。此系统的缺点是由于FPGA器件配置是基于SRAM查找表单元,编程的信息是保持在SRAM中,但SRAM在掉电后编程信息立即丢失,所以每次系统上电都需要重新配置芯片,这对在野外作业的工作人员很不方便,解决的方法是专用的配置器件来配置FPGA,在每次系统上电的时候会自动把编程信息配置到FPGA芯片中。但设计中没有采用到这种配置方案主要是考虑到专用配置器件的价格问题。
本文开始介绍了多通道系统的组成部分,然后分别介绍了各个组成部分的原理和设计方法,其中重点介绍了FPGA软件设计部分。还对当前十分流行的基于FPGA的设计技术作了简单的阐述,最后对系统的调试和应用作了简短的说明。
引言
FPGA(Field-Programmable Gate Array 现场可编程门阵列)是近年来广泛应用的超大规模、超高速的可编程逻辑器件,由于其具有高集成度(单片集成的系统门数达上千万门)、高速(200MHz以上)、在线系统可编程等优点,为数字系统的设计带来了突破性变革,大大推动了数字系统设计的单片化、自动化,提高了单片数字系统的设计周期、设计灵活性和可靠性。在超高速信号处理和实时测控方面有非常广泛的应用。
硬件描述语言HDL是一种用形式化方法描述数字电路和系统的语言。VHDL是硬件描述语言的几种代表性语言的一种。VHDL(Very High Speed Integrated Circuit Hardware Description Language 即超高速集成电路硬件描述语言)主要用于描述数字系统的结构、行为、功能和接口,与其它的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。用VHDL设计的程序,通过综合工具产生网表文件,下载到目标器件,从而生成硬件电路。VHDL还是一种仿真语言,包括行为仿真、功能仿真和时序仿真,给系统设计各个阶段的可行性做出了决策。
目前,这种高层次(high-level-design)的方法已被广泛采用。据统计,目前在美国硅谷约有90%以上的ASIC和FPGA采用硬件描述语言进行设计。
数据采集在现代工业生产以及科学研究中的重要地位日益突出,并且实时高速数据采集的要求也不断提高,在信号测量、图像处理,音频信号处理等一些高速、高精度的测量中,都需要进行高速数据采集。本次设计就是用FPGA实现采样系统,来实现音频信号的数据采集。
1 FPGA和VHDL概述
1.1 FPGA发展历程
当今社会是数字化的社会,是数字集成电路广泛应用的社会。数字集成电路本身在不断地进行更新换代。它由早期的电子管、晶体管、小中规模集成电路、发展到超大规模集成电路(VLSIC,几万门以上)以及许多具有特定功能的专用集成电路。但是,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。系统设计师们更愿意自己设计专用集成电路(ASIC)芯片,而且希望ASIC的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件(FPLD),其中应用最广泛的当属现场可编程门阵列(FPGA)和复杂可编程逻辑器件(CPLD)。
早期的可编程逻辑器件只有可编程只读存储器(PROM)、紫外线可擦除只读存储器(EPROM)和电可擦除只读存储器(EEPROM)三种。由于结构的限制,它们只能完成简单的数字逻辑功能。其后,出现了一类结构上较复杂的可编程芯片,即可编程逻辑器件(PLD),它能够完成各种数字逻辑功能。典型的PLD由一个“与”门和一个“或”门阵列组成,而任意一个组合逻辑都可以用“与一或”表达式来描述,所以, PLD能以乘积和的形式完成大量的组合逻辑功能。
这一阶段的产品主要有PAL(可编程阵列逻辑)和GAL(通用阵列逻辑)。PAL由一个可编程的“与”平面和一个固定的“或”平面构成,或门的输出可以通过触发器有选择地被置为寄存状态。PAL器件是现场可编程的,它的实现工艺有反熔丝技术、EPROM技术和EEPROM技术。还有一类结构更为灵活的逻辑器件是可编程逻辑阵列(PLA),它也由一个“与”平面和一个“或”平面构成,但是这两个平面的连接关系是可编程的。PLA器件既有现场可编程的,也有掩膜可编程的。在PAL的基础上,又发展了一种通用阵列逻辑GAL (Generic Array Logic),如GAL16V8,GAL22V10 等。它采用了EEPROM工艺,实现了电可擦除、电可改写,其输出结构是可编程的逻辑宏单元,因而它的设计具有很强的灵活性,至今仍有许多人使用。这些早期的PLD器件的一个共同特点是可以实现速度特性较好的逻辑功能,但其过于简单的结构也使它们只能实现规模较小的电路。
为了弥补这一缺陷,20世纪80年代中期。Altera和Xilinx分别推出了类似于PAL结构的扩展型 CPLD(Complex Programmab1e Logic Device)和与标准门阵列类似的FPGA(Field Programmable Gate Array),它们都具有体系结构和逻辑单元灵活、集成度高以及适用范围广等特点。这两种器件兼容了PLD和通用门阵列的优点,可实现较大规模的电路,编程也很灵活。与门阵列等其它ASIC(Application Specific IC)相比,它们又具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检验等优点,因此被广泛应用于产品的原型设计和产品生产(一般在10,000件以下)之中。几乎所有应用门阵列、PLD和中小规模通用数字集成电路的场合均可应用FPGA和CPLD器件。
FPGA(现场可编程门阵列)与 CPLD(复杂可编程逻辑器件)都是可编程逻辑器件,它们是在PAL,GAL等逻辑器件的基础之上发展起来的。同以往的PAL,GAL等相比较,FPGA的规模比较大,它可以替代几十甚至几千块通用IC芯片。这样的FPGA实际上就是一个子系统部件。这种芯片受到世界范围内电子工程设计人员的广泛关注和普遍欢迎。
尽管FPGA和其它类型PLD的结构各有其特点和长处,但概括起来,它们是由三大部分组成的:
一个二维的逻辑块阵列,构成了PLD器件的逻辑组成核心;
输入/输出块;
连线资源:由各种长度的连线线段组成,其中也有一些可编程的连接开关,它们用于逻辑块之间、逻辑块与输入/输出块之间的连接。
FPGA芯片都是特殊的ASIC芯片,它们除了具有ASIC的特点之外,还具有以下几个优点:
(1)随着VLSI(Very Large Scale IC,超大规模集成电路)工艺的不断提高单一芯片内部可以容纳上百万个晶体管,FPGA芯片的规模也越来越大,其单片逻辑门数已达到上百万门,它所能实现的功能也越来越强,同时也可以实现系统集成。
(2)FPGA芯片在出厂之前都做过百分之百的测试,不需要设计人员承担投资的风险和费用,设计人员只需在自己的实验室里就可以通过相关的软硬件环境来完成芯片的最终功能设计。所以,FPGA的资金投入小,节省了许多潜在的花费。
(3)用户可以反复地编程、擦除、使用或者在外围电路不动的情况下用不同软件就可实现不同的功能。
所以,用FPGA 试制样片,能以最快的速度占领市场。FPGA软件包中有各种输入工具和仿真工具,及版图设计工具和编程器等全线产品,电路设计人员在很短的时间内就可完成电路的输入、编译、优化、仿真,直至最后芯片的制作。当电路有少量改动时,更能显示出FPGA的优势。电路设计人员使用FPGA进行电路设计时,不需要具备专门的IC(集成电路)深层次的知识, FPGA软件易学易用,可以使设计人员更能集中精力进行电路设计,快速将产品推向市场。
1.2 VHDL语言介绍
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。应用VHDL进行工程设计的优点是多方面的。
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统设计,高速的完成必须有多人甚至多个开发组共同并行工作才能实现的工程。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。
2 多通道采样系统的组成
本系统硬件电路包括FPGA设计的多通道采样控制器和相应的通道选择电路,A/D转换电路,由于采样音频信号,所以需要设计音频的放大和滤波电路。系统组成部分如图2.1所示:
图2.1 多通道系统的组成
3 总体方案设计与论证
3.1 方案设计
3.1.1方案一
用FPGA实现一个3位8进制的计数器,记数脉冲是FPGA锁存AD转换数据的锁存信号,计数器的输出作为数据开关CD4051的地址。利用进程的并行操作来实现AD574来实现AD转换,这个方案的优点是节省了FPGA芯片的资源,但数字电路较为复杂,而且AD574的转换速率最高达到50KHz,不能达到8通道的高速音频采集。
3.1.2方案二
用FPGA实现一个3位8进制的计数器,记数脉冲是FPGA锁存AD转换数据的锁存信号,计数器的输出作为数据开关CD4051的地址。用有限状态机来实现对AD7892的控制,用外部RAM实现采样数据的存储,这样电路实现比较简单,而且AD7892的采样速率可以达到500KHz,可以实现8个通道同时8路音频信号采集。但需要外接RAM芯片,成本比较高,而且外部RAM的读写速度达不到高速数据采集的要求。
3.1.3方案三
用FPGA实现一个3位8进制的计数器,记数脉冲是FPGA锁存AD转换数据的锁存信号,计数器的输出作为数据开关CD4051的地址。用有限状态机来实现对AD7892的控制,这样电路实现比较简单,而且AD7892的采样速率可以达到500KHz,可以实现8个通道同时8路音频信号采集。同时采用FIFO模块,让数字数据先存到队列中,一边往队列中写数据,一边从队列中读数据,这样就对数字数据起了一个高速缓存的作用,更加快了整个系统的运行速度。
3.2 方案比较
为获得更佳的系统功能,使系统资源能得到充分地利用,我们采用第三种方案。主要是因为状态机容易构成性能良好的同步时序逻辑模块,为了消除电路中的毛刺现象,在状态机设计中有很多种设计方案可供选择。FIFO队列的读写操作只需要一个周期就可以完成,起到高速缓存的作用,这样更加快了整个系统的运行速度,解决了采样和存储的“瓶颈问题”,更加有效地利用FPGA芯片的资源。
4 单元电路的设计
由图2.1可以看出,系统可以分为4个大部分,分别是音频放大、滤波部分,FPGA控制部分,AD采样电路,FPGA硬件电路的设计。其中以FPGA控制部分为主体部分,它涉及到AD采样控制,通道选择控制,串并输出模式选择模块,延时模块以及FIFO模块介绍。这些模块的实现是系统实现的关键。下面分别对系统的这些单元电路做详细的阐述。
4.1 音频放大、滤波部分
人的耳朵可以辨别到的声音频率范围是:20Hz-20KHz,所以对音频放大部分的放大器有带宽要求,要求放大器是宽频带的。所以本次设计选用专门用于音频放大的高速低噪声运放NE5532作为放大部分的放大器。滤波部分是一个有源带通滤波器,滤掉电路的20Hz以下的低频和20KHz以上的高频干扰。
4.1.1音频放大部分
音源采用普通CD输出的音频信号,它产生输出的信号的幅度约有300mV左右,根据设计AD7892的输入电压是±10V,选择放大器的放大倍数在10-30之间,通过一个精密可调电阻来调节放大倍数。音频放大芯片NE5532特性是双运放、宽频带、低噪声、转换速率大、电源范围广。
NE5532的管脚结构及其功能:
(1脚)输出信号 (2脚)反相端输入
(3脚)同相端输入 (4脚)负电源
(5脚)同相端输入 (6脚)反相端输入
(7脚)输出信号 (8脚)正电源
NE5532技术参数
参数名称 单位 数据值
输入失调电压 mV ±0.5
温漂 μV/℃ 5
增益带宽积 MHz 10
转换速率 V/us 9
谐波失真 % 0.001
工作电流 mA 8
工作电压 V ±3-±22
设计中因为采用反相端输入音频信号,为了在输出端得到正向的音频信号,所以放大部分采用两级放大,前级放大10倍,后级放大通过可调电阻设计在1-3倍,这样得到的正向音频信号就方便了AD采样。
4.1.2有源滤波器的设计
在一个实际的电子系统中,输入信号往往因受干扰等原因而含有一些不必要的成份,应设法将干扰衰减到足够小的程度。在其他一些情况,我们需要的信号和干扰信号混在一起,如果这两个信号在频率成分上有较大的差别,就可以用滤波的方法将所需要的信号滤出。为了解决上述问题,可采用滤波电路。滤波器包括电抗性元件L、C构成的无源滤波器、由集成运算放大器组成的有源滤波器、以及晶体滤波器等。本次设计需要的通带频率范围是20Hz-20KHz,如果用有源带通滤波器来实现,考虑到该带通滤波器的上下截止频率之比20000/20=1000,大于一个倍频程,为一个宽带滤波器,所以采用一个低通滤波器和一个高通滤波器级联来实现带通滤波。
(1)设计步骤
有源滤波器的设计,就是根据所给定的指标要求,确定滤波器的阶数n,选择具体的电路形式,算出电路中各元件的具体数值,安装电路和调试,使设计的滤波器满足指标要求,具体步骤如下:
①根据阻带衰减速率要求,确定滤波器的阶数n。
②选择具体的电路形式。
③根据电路的传递函数和附录中表1归一化滤波器传递函数的分母多项式,建立起系数的方程组。
④解方程组求出电路中元件的具体数值。
⑤将设计好的电路,在EWB上进行仿真。
⑥按照所设计的电路,将元件安装在实验板上。
⑦安装电路并进行调试,使电路的性能满足指标要求。
(2)对安装好的电路按以下方法进行调整和测试
① 仔细检查安装好的电路,确定元件与导线连接无误后,接通电源。
② 在电路的输入端输入Ui=10mv的正弦信号,慢慢改变输入信号的频率(注意保持Ui的值不变),用示波器观察波形的变化,在滤波器的截止频率附近,观察电路是否具有滤波特性,若没有滤波特性,应检查电路,找出故障原因并排除之。
③ 若电路具有滤波特性,可进一步进行调试。对于低通和高通滤波器应观测其截止频率是否满足设计要求,若不满足设计要求,应根据有关的公式,确定应调整哪一个元件才能使截止频率既能达到设计要求又不会对其它的指标参数产生影响。然后观测电压放大倍数是否满足设计要求,若达不到要求,应根据相关的公式调整有关的元件,使其达到设计要求。最后设计的有源带通滤波器在EWB上的仿真图如图4.1所示:
图4.1 有源带通滤波器的仿真图
有源带通滤波电路分成两个部分,高通部分和低通部分,图4.2是20HZ的高通滤波器,图4.3是20KHZ的低通滤波器。
图4.2 低通滤波器电路图
图4.3 高通滤波器电路图
音频信号经过音频放大电路放大后就进入了上图的电路。经过20HZ-20KHZ的带通滤波电路进行滤波。
4.2 AD采样电路
由于人的耳朵能识别的音频的频率范围是20Hz-20KHz,根据奈魁斯特(NYQUIST)采样定理知道,要使采样后的数字信号能恢复成模拟信号,采样的频率必须是模拟信号的频率的两倍,即本次采样系统的采样频率最低要设计在40KHz,而一般CD格式的音频信号的采样频率是44.1KHz,由于是8路通道的采样,所以AD芯片的最低采样频率应该是44.1KHz8=352.8KHz,所以选择采样频率为500KHz的AD7892。这样我们每个通道的采样频率就是500KHz/8=62.5KHz。
4.2.1芯片介绍
AD7892是美国ANALOG DEVICE公司生产的具有采样保护功能的逐次逼近式12位高速ADC,根据输入模拟信号范围的不同可分为AD7892-1,AD7892-2,AD7892-3三种类型。其中,AD7892-1输入信号范围为±10V或者±5V(可设置),AD7892-2输入信号范围为0~+2.5V,这两种的采样转换速率均为500kSPS,AD7892-3的输入信号范围为±2.5V,采样转换速率为600kSPS,AD7892-1和AD7892-3的输入信号过压保护电压分别为±17V和±7V。本次设计选用的是AD7892AN-1,因为其采样速率已符合8路的音频采集速率。
AD7892模数转换器具有如下特点:
①单电源工作(+5V);
②内含采样保持放大器;
③具有高速串、并行接口。
AD7892的内部框图如图4.5所示,它内含模拟信号换算电路、采样保持电路、A/D转换的基准电源(+2.5V)、时钟电路、12位逐次逼近式ADC电路和控制电路,转换的结果可以并行输出,也可以串行输出,非常容易和微处理器或DSP(数字信号处理器)接口。AD7892共有两种封装,一种是24脚双列直插式DIP封装,另一种为贴面式SOIC封装,AD7892的引脚排列如图4.4所示。各个引脚的功能说明如表4.1所列。
图4.4 AD7892引脚排列图
图4.5 AD7892功能框图
表4.1 AD7892的管脚名称及功能说明
名称 |
管脚 |
类型 |
功能说明 |
VDD |
1 |
电源 |
电源:±5V±5% |
STANDBY |
2 |
I |
低电平时为睡眠状态(功耗5mW),高电平时正常工作,一般应用时接高电平 |
VIN2 |
3 |
I |
模拟输入2,对AD7892-2和AD7892-3,应悬空或接AGND。对AD7892-1来说,此引脚决定输入信号(VIN1)的范围,当VIN2接AGND时,VIN1的范围为±10V,接VIN1时,输入信号范围为±5V |
VIN1 |
4 |
I |
模拟信号输入脚1,其输入范围同上。 |
REFOUT/REFIN |
5 |
I/O |
内部ADC基准,2.5V输出,也可通过该引脚输入一个A/D转换的外部基准(2.5V),如果用内部基准,此引脚悬空,对外作为基准时应对AGND接一个 0.1μF的瓷片电容 |
AGND |
6 |
|
模拟地 |
MODE |
7 |
I |
低电平时为串行输出,高电平时为并行输出 |
DB11~DB0 |
8~13 |
O/I |
A/D转换的12位并行输出,可与TTL电平兼容,为三态输出,DB0为低位,DB11为高位,当串行工作时,15脚(SDATA)为串行数据输出脚,16位的前四位为0,后12位为A/D的结果。 |
DGND |
14 |
|
数字地,与外电路的数字地相连 |
RD |
21 |
I |
和CS配合读,使数据输出 |
CS |
22 |
I |
片选,低电平有效,可以一直有效 |
EOC |
23 |
O |
转换结束信号,转换结束时,此引脚输出100ns的低电平脉冲 |
CONVST |
24 |
I |
启动转换输入端,当此引脚由低变高时,使采样保持器保持开始转换,应加一个大于25ns的负脉冲来启动转换 |
(1) AD7892的并行输出时序
当MODE引脚接高电平时,AD7892为并行输出方式,其时序如图4.6所示。CONVST信号t1应大于35ns,在上升沿,采样保护器进入保持状态,并开始A/D转换,转换时间tCONV为1.47μs(AD7892-3)或1.6μs(AD7892-1,AD7892-2),转换结束后EOC脚输出t260ns的负脉冲以进行中断或数据锁存,并在EOC下降沿开始下次采样,也就是转换一结束就开始下次采样,采样时间tACQ要大于等于200ns(AD7892-3)或400ns(AD7892-1,AD7892-2),当转换结束后(EOC的下降沿),只要CS和RD有效,经过t6=40ns的时间,即可在DB0~DB11上获得转换后的12位数据,CS和一般的片选信号相同,可一直有效,外加RD的时间t5亦应大于35ns。下次采样和本次的输出可同时进行,所以最小的一次采样转换输出时间对于AD7892-3来说为1.47+0.2=1.67μs(600kSPS),而对于AD7892-1和AD7892-2来说为1.6+0.4=2μs (即500kSPS),图6中t9200ns,t75ns,t3、t4、t8可为零(此时t9=tACQ)。
图4.6 AD7892的并行输出时序
(2) 转换后的二进制代码
由于三种类型的模拟输入范围不相同,因而其转换输出的二进代码码也不相同,表3所列为AD7892-1和AD7892-3的输入输出代码。
表4.2 AD7892-1,AD7892-3理想的输入输出表
输 入 |
输出(12位) |
+FSR/2+1/2LSB |
100…000→100…001 |
-FSR/2+3/2LSB |
100…001→100…101 |
… |
… |
AGND-1/2LSB |
111…111→000…000 |
AGND+1/2LSB |
000…000→000…001 |
… |
… |
+FSR/2-5/2LSB |
011…101→011…110 |
+FSR/2-3/2LSB |
011…110→011…111 |
对于AD7892-1和AD7892-3,FSR为满度范围,如输入为±10V,则FSR=20V,输入为±5V,FSR=10V,输入为±2.5V,FSR=5V.模拟信号从-FSR/2→GND→+FSR/2变化,输出则从100…000→111…111→000…000→011…111变化。而对于AD7892-2,在输入从0→+2.5V变化时,输出则从全0→全1。
4.2.2芯片应用
如图4.7所示为AD7892应用于采样系统。目的是把音频输入模拟信号转换为12位数字信号,该电路采用的是AD7892AN-1的并行输出模式,其采集速度设计为500kSPS。
在此应用中,将IN2接到AGND,IN1接音频输入信号,其输入范围为±10V,音频信号经过放大、滤波和AD7892的输出信号为100…000~111…111,即从2048→4095,在D11反相后,在状态机的第5个状态锁存器锁存的数据为000…000→011…111,即从0→2047。由P/S选择相应的输出模式输出。
图4.7 AD7892采样系统
电路中的CONV,EOC,CS,RD控制信号均由有限状态机提供,D[0]到D[11]数字信号是经过AD采样后的数字信号。
4.3 FPGA控制部分
4.3.1通道选择模块
通道选择部分是一个二进制模8的计数器,计数器的时钟是AD数字信号的锁存信号,每次锁存数据后,计数器就会一次进行加一操作,CD4051选择下一个通道的音频信号进行采集。在MAX+PlusⅡ中用VHDL语言设计图形如下图4.8所示:
图4.8 通道选择部分
通过CNT[0]到CNT[2]来选择相应的通道,CD4051的输出就是最后要进行AD采样的音频信号。例如:若CNT[0]CNT[1]CNT[2]=“000”,则选择第一通道音频信号进行AD采样。这个部分实现的重点是对数字锁存信号记数,计数器的输出作为CD4051的通道选择地址。
通道选择部分的主体程序如下:
二进制模8计数器
signal q:std_logic_vector(2 downto 0); begin counter:process(clk) begin if(clk'event and clk='1') then if q="111" then q<="000"; else q<=q+1; end if; end if; cnt<=q; process;
通道选择模块的仿真图如图4.9所示:
图4.9 通道模块仿真图
4.3.2AD7892控制部分
这个部分的主要工作是对AD7892的控制,使得AD7892可以工作。对AD7892的控制部分主要是通过一个有限状态机来实现的,通过对AD7892的工作时序观察,用有限状态机对AD的控制信号做出描述,从而让AD芯片能工作起来,这就是有限状态机的主题任务,当然还有一些其他的功能,将在后序的部分介绍,这里先对有限状态机作个阐述。
(1)有限状态机的介绍
AD采样的控制部分主要是设计一个有限状态机来实现,利用VHDL设计的使用逻辑系统中,有许多是可以利用有限状态机的设计方案来描述和实现的,无论与基于VHDL的其他设计方案相比,还是与完成相似功能的CPU相比,状态机都有其难以超越的优越性,它主要表现在以下几个方面:
有限状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点。状态机的工作方式是根据控制信号按照预先设定的状态进行顺序运行的,状态机是纯硬件数字系统中的顺序控制电路,因此状态机在其运行方式上类似于控制灵活和方便的CPU,而在运行速度和工作可靠方面都优于CPU。
由于状态机的结果模式相对简单,设计方案相对固定,特别是可以定义符号化枚举类型的状态,这一切都为VHDL综合器尽可能发挥其强大的优化功能提供了有利条件。而且,性能良好的综合器都具备许多可控或自动的专门用于优化状态机的功能。
状态机容易构成性能良好的同步时序逻辑模块,这对于对付大规模逻辑电路设计中令人深感棘手的竞争冒险现象无疑是一个上佳的选择。为了消除电路中的毛刺现象,在状态机设计中有很多种设计方案可供选择。
与VHDL的其他描述方式相比,状态机的VHDL表述丰富多样、程序层次分明,结构清晰,易懂易读;在排错、修改和模块移植方面也有其独特的特点。
在高速运算和控制方面,状态机就更有其巨大的优势。由于在VHDL中,一个状态机可以由多个进程构成,一个结构体可以包括多个状态机,而一个单独的状态机(或多个并行进程的状态机)以顺序方式所能完成的运算和控制方面的工作与一个CPU的功能类似。因此,一个设计实体的功能便类似于一个含有并行运行的CPU的高性能微处理器的功能。事实上,多CPU的微处理早已在通信、工控和军事等领域有了十分广泛的应用。
就可靠性而言,状态机的优势也是十分明显的。CPU本身的结构特点与执行软件指令的工作方式决定了任何CPU都不可能获得圆满的容错保障,这已是不争的事实了。因此,用于要求高可靠性的特殊环境中的电子系统中,如果以CPU作为主控部件,应是一项错误的决策。然而,在状态机系统就不同了,首先它是由纯硬件电路构成,不存在CPU运行软件过程中固有的缺陷;其次是由于状态机的设计中能使用各种完整的容错技术;再次是当状态机进入非法状态并从中跳出,进入正常状态所耗的时间十分短暂,通常只有2、3个时钟周期,约十个ns,尚不足对系统的运行构成损害;而CPU通过复位方式从非法运行方式中恢复过来,耗时达到十ms,这对于高速高可靠系统显然是无法容忍,特别是本次设计的采集音频信号,十ms的就会丢失很多的模拟数据,这样就会让音频信号的不完整,所以采用有限状态机是一个很好的选择。
(2)有限状态机的设计
根据AD7892的时序图设计的状态转换图如图4.10所示:
图4.10 AD采样的状态转移图
(由于FPGA芯片时钟定在20MHZ,故一个周期是0.05us,完成一次AD采样,AD7982AN-1大约需要2us,40个时钟周期)
ST1:对AD7892的初始化,此时conv<='1';cs<='1';rd<='1';lock<='0';wr_en='0';rd_en='0'
ST2:启动AD7892输入端,使采样保持器保持开始转换,此时conv<='0';cs<='1';rd<='1';lock<='0';wr_en='0';rd_en='0'
ST3:开始进行模数转换,此时conv<='1';cs<='1';rd<='1';lock<='0';wr_en='0';rd_en='0';
ST4:采样周期等待,等待EOC跳变低电平,此时conv<='1';cs<='1';rd<='1';lock<='0';wr_en='0';rd_en='0';
ST5:判断EOC是否跳变高电平,若跳变,则开始读数据,此时conv<='1';cs<='1';rd<='1';lock<='0';wr_en='0';rd_en='0'
ST6:锁存信号有效,锁存转换后的数据到12位并行输出口,FIFO的写信号有效,此时conv<='1';cs<='0';rd<='0';lock<='1';wr_en='1';rd_en='0'
ST7:从FIFO中读出写入的数据,此时conv<='1';cs<='1';rd<='1';lock<='0';wr_en='0';rd_en='1'
ST8:等待状态,准备下次的采样,此时conv<='1';cs<='1';rd<='1';lock<='0';wr_en='0';rd_en='0'
程序的主体如下:
com1:process(current_state,eoc) begin case current_state is when st1 => next_state <= st2; when st2 => next_state <= st3; when st3 => next_state <= st4; when st4 => if (eoc='1') then next_state <= st4; else next_state <= st5; end if; when st5 => if (eoc='0') then next_state <= st5; else next_state <=st6; end if; when st6 => next_state <= st7; when st7 => next_state <= st8; when st8 => next_state <= st1; when others => next_state<=st1; end case; end process com1; com2:process(current_state) begin case current_state is when st1 => conv<='1';cs<='1';rd<='1';lock<='0';wr_en<='0';rd_en<='0'; when st2 => conv<='0';cs<='1';rd<='1';lock<='0';wr_en<='0';rd_en<='0'; when st3 => conv<='1';cs<='1';rd<='1';lock<='0';wr_en<='0';rd_en<='0'; when st4 => conv<='1';cs<='1';rd<='1';lock<='0';wr_en<='0';rd_en<='0'; when st5 => conv<='1';cs<='1';rd<='1';lock<='0'; wr_en<='0';rd_en<='0'; when st6 => conv<='1';cs<='0';rd<='0';lock<='1'; wr_en<='1';rd_en<='0'; when st7 => conv<='1';cs<='1';rd<='1';lock<='0'; wr_en<='0';rd_en<='1'; when st8 => conv<='1';cs<='1';rd<='1';lock<='0';wr_en<='0';rd_en<='0'; when others => conv<='1';cs<='1';rd<='1';lock<='0';wr_en<='0';rd_en<='0'; end case; end process com2; com3:process(clk) variable dog_count:integer range 0 to 64; variable com3_num_count:integer range 0 to 16553500; begin if(clk'event and clk='1') then current_state<=next_state; --看门狗 if(current_state=st4) then m_watchdog <= s0; end if; if(current_state=st6) then m_watchdog <= s1; dog_count:=0; end if; if(m_watchdog=s0) then dog_count:=dog_count+1; if(dog_count>40) then current_state<=st1; dog_count:=0; end if; end if; --看门狗 end if; end process com3; latch1:process(lock) begin if lock='1' and lock'event then regl1<=D; end if; end process latch1; regl<='0'&b2&b1&b0®l1; Q<=regl1;
由程序三个主控进程可以知道,此状态机属于Moore机,外加一个辅助进程,即锁存器进程LATCH1,层次清晰,各进程分工明确。在一个完整的采样周期中,状态机中最先被启动的是以CLK为敏感信号的时序进程,接着两个组合进程COM1和COM2被同时启动,因为他们以同一信号current_state为敏感信号。最后被启动的是锁存进程,它是在状态机进入ST6后被启动的,即此时LOCK产生了一个上升沿信号,从而启动进程LATCH1,将AD7892在本次采样周期的12位数据和通道选择的3位数据锁存到寄存器中,同时FIFO存储器从Q端读到稳定正确的数据,进入下一个状态后FIFO又把数据读出到q端,这样一个采样周期就完成。在MAX PlusⅡ仿真的波形如下图4.11所示:
图4.11 AD采样控制仿真波形
从仿真波形可以看出, 控制信号符合AD7892的时序,可以对AD进行采样控制,同时数据的锁存信号也符合题目设计要求。但从仿真图中可以看到,这些信号都很多毛刺,由于毛刺很短,多为几纳秒,基本上都不可能满足数据的建立和保持时间,这对整个系统的影响不会很大,所以就没有对这些毛刺进行处理。
4.3.3延时模块的设计
在采样控制部分的状态机中也加入了输出数据编码部分,因为是循环采集8路的模拟信号,而输出为一路输出,这样就需要对输出信号进行标志,方法就是把12位数据转换为16位数据,第一位是0,第二位到第四位是标志位,标志是哪一通道数字信号,如果是串行输出的时候可以让接受方知道是第几通道的数据。又因为数字信号数据锁存信号是比通道选择信号早一个周期,所以要加一个延时模块,这样就可以实现每次锁存了通道的标志位和采样的数据。通过程序来实现对通道选择信号的延时。如果当前选择第3个通道采样,那么通道选择信号就是“011”,在这个通道信号采集完毕后锁存信号就会使计数器进行加1操作,这样通道选择信号就是“100”,而这个时候锁存的数据需要“011”,所以将标志位信号通过“100”的延时一个时钟周期变成“011”即可。VHDL完成可以胜任。
延时模块程序主体部分
process(in1,in2,in3) begin comin<=in3&in2&in1; case comin is when "000"=> comout<="111"; when "001"=> comout<="000"; when "010"=> comout<="001"; when "011"=> comout<="010"; when "100"=> comout<="011"; when "101"=> comout<="100"; when "110"=> comout<="101"; when "111"=> comout<="110"; when others=>comout<="ZZZ"; end case; out1<=comout(0);out2<=comout(1);out3<=comout(2); end process;