4.3.4串并输出选择控制
从AD控制模块输出的数据是并行16位数据。串行输出的原理是:通过一个16选1的数据选择器连续选择输出的并行16位数据,数据选择器的选择信号是一个对系统时钟记数的二进制模16的计数器输出,这样就可以实现将并行16位数据转换为串行数据。通过外部输入信号P/S可以实现是串行输出还是并行输出,如果P/S是低电平,就选通16选1的选择器,禁止16个与门的输出,此时为串行输出;如果P/S为高电平,则禁止16选1的选择器,同时打开16个与门,此时为并行16位输出。输出模式可选择性使得系统的应用相当广泛,串行输出可以用于通信信号的采集,方便调制后发射到远程接受端,远程接收端对采集的数据进行解调;而并行输出模式则可以通过高速存储器将采集的信号放到微机或者其他的处理器上,根据采集的数据进行相应的控制。
4.3.5 FIFO模块
本设计项目是利用FPGA直接控制AD7892来实现对音频信号的高速信号采集,在完成对一个周期的采样后,将数据存储到存储器中,然后从存储器中读出数据并显示出来,采样存储器可以有多种方式实现:
(1)外部随机存储器RAM,其优点是存储量大,缺点是需要外接芯片,且常用的RAM读写速度较低;与FPGA间的连接线过长;特别是在存储数据时需要对地址进行加一操作,影响读写速度。
(2)内部随机存储器RAM,在Altera的大部分FPGA器件中都含有EAB模块,由此可配置成不同类型的内部高速RAM。与外部RAM相比,尽管内部RAM有更大的优势,但使用中仍然存在需要对地址加一的操作,而影响数据读写速度的缺点。
(3)内部FIFO,相比之下,FIFO更适合与用做高速AD采样的数据存储器,因为FIFO的写入时间只有一个时钟周期,因此决定使用LPM_FIFO作为采样存储器。
由计算公式:数据量(字节) =(采样频率×量化精度×声道数)/8×时间(秒)以及本次设计的采样频率为62.5KHz,量化精度为12位,声道是单声道,可以计算出一分种采样所需要的存储空间是5625000个字节,而FPGA芯片的内部RAM最多只有49152位(每个EAB有4096位),不足以存储一分种需要的存储容量,所以我们选择FIFO作为暂存器,设计FIFO的容量是512×16=8192位,每次锁存数字数据后,状态机在下一个状态(状态6)进入写指令,将锁存的数据写入FIFO队列中,由于FIFO的读写操作都只需要一个时钟周期,所以在状态机再下一个状态(状态7)进入读操作,从FIFO队列中读出数据,将数据送到输出端口,其实FIFO队列只需要16位的存储容量就足够了,但设计让整个EAB块都用来储存,这也是为了存储中有多余空间。采用FIFO队列就不需要存储容量为5626000个字节的存储器了,更有效得利用了FPGA芯片资源。
如果采样先将256个数据存到FIFO队列中,由于从FIFO队列中读数据只需要一个时钟,而在串行输出的模式下,在进行串并转换的时候,需要最少16个时钟周期,而FIFO端口的数据只出现一个周期就会发生改变,这样就体现出FIFO的高速特性,而在一个AD采样周期中完成一次串并转换时间是足够的。
本次设计是通过调用MAX+PlusⅡ的参数可设置LPM兆功能块来实现FIFO队列的。LPM是参数可设置模块库的英文缩写(Library of Parameterized Modules),这些可以以图形或硬件描述语言模块形式方便调用的兆功能块,使得基于EDA技术的电子设计的效率和可靠性有了很大的提高。设计者可以根据实际电路的设计需要,选择LPM库中的适当模块,并为其设定适当的参数,就能满足自己的设计需要。从而在自己的项目中十分方便调用了优秀电子工程技术人员的硬件设计成果。在MAX+PlusⅡ中,进入LPM元件定制器界面,按照电路需要设计各个参数,最后完成FIFO的设计,通过调用生成的图形来调用FIFO队列模块。
4.3.6AD采样系统顶层电路设计
通道选择模块、AD采样控制模块、延时模块、串并输出控制模块以及FIFO模块设计完毕以后,我们就可以将设计的各个模块连接起来,可以得到整个系统的顶层电路。顶层电路见附录。
4.4 FPGA的硬件设计
本次毕业设计选用的FPGA芯片是ALTERA公司的ACEX1K系列的EP1K30TC144-3。由于它的高密度和易于在设计中实现复杂宏函数和存储器,因此可以把一个子系统集成在单一芯片上,EP1K30包括一个嵌入式阵列,这为设计人员提供了有效的嵌入式门阵列和灵活的可编程逻辑。嵌入式阵列是由一系列嵌入式阵列块(EAB)组成的,它能够用来实现各种存储器和复杂逻辑功能;该器件也提供多电压I/O接口操作。它允许器件桥架在不同电压工作的系统中。比如本次系统设计器件的I/O输出就是2.5V,这样不但使FPGA芯片工作安全,也可以让AD7892能工作安全状态。
4.4.1EP1K30TC144-3芯片介绍
EP1K30TC144-3芯片特性:
有30000个典型门,最大的系统门可达119000个;
1728个逻辑单元(LE);
6个嵌入式阵列块(EAB);
具有实现宏函数的嵌入式阵列和普通功能的逻辑器件;
高达49152位的内部RAM(每个EAB有4096位),使得RAM并不影响或减少其他逻辑功能;
支持多电压I/O接口,低功耗(维持状态小于0.5mA);
器件可在2.5V和3.3V电源电压下工作;
多种系统配置方式;
时钟锁定和时钟自举选项有助于减少时钟延迟/变形和对时钟进行倍频;
快速、可预测连线延时的快速通道(Fast Track)连续式布线结构;
实现快速加法器、计数器和比较器的专用进位链;
每个引脚都有一个独立的三态输出使能控制;
每个引脚都有漏极开路选择;
具有快速建立时间的寄存器;
提供多种其他EDA产品的设计文件输出;
4.4.2芯片组成描述
ACEX1K系列的EP1K30主要有嵌入式阵列块,逻辑阵列块,Fast Track和I/O单元四部分组成。
(1)嵌入式阵列
嵌入式阵列是由一系列嵌入式阵列块(EAB)构成的。当要实现有关存储器功能时,每个EAB提供2048位用来构造RAM,ROM,FIFO或者双口RAM等功能。当EAB用来实现乘法器、微控制器、状态机以及DSP等复杂逻辑时,每个EAB可贡献出100-600个门。EAB可以单独使用,也可以组合起来使用。
(2)逻辑阵列
逻辑阵列是由一系列逻辑阵列块(LAB)构成的,每个LAB包括8个LE和一些连接线,每个LE含有一个4输入查找表(LUT)、一个可编程触发器、进位链和级联链、LE的结构能有效实现各种逻辑。每个LAB是一个独立的结构,它具有共同的输入,互连与控制信号,LAB的这种“粗粒度”结构有利于布线和实现器件的高性能,例如8位计数器、地址译码器或者状态机。多个LAB组合起来也可以构成更大的逻辑块,每个LAB代表大约96个可用逻辑门。
(3)快速通道(Fast Track)
器件内部信号的互连和器件引脚之间的信号互连是由快速通道连线提供的,它是贯通器件长、宽的快速连续通道。
(4) I/O单元
EP1K30器件的I/O引脚是有一些I/O单元(IOE)驱动的,IOE位于快速通道的行和列的末端,每个IOE有一个双向I/O缓冲器和一个既可作输入寄存器也可作输出寄存器的触发器。当IOE作为专用时钟引脚时,这些寄存器提供了特殊的性能。当它作为输入时,可提供少于4.2ns的建立时间和0ns的保持时间;而作为输出时,这些寄存器可提供少于5.7ns的“时钟到输出”的时间。
EP1K30还提供了6个专用输入引脚,这些引脚用来驱动触发器的控制端,以确保控制信号高速、低偏移(1.2ns)地有效分配。这些信号使用了专用的布线支路,以便具有比快速通道更短的延时和更小的偏移。专用输入中的4个输入引脚可用来驱动全局信号,这4个全局信号也能由内部逻辑驱动,它为时钟分配或产生用以清除器件内部多个寄存器的异步清除信号提供了一个理想的方法。
4.4.3芯片工作电压设计
由于芯片对工作电压有很高的要求,所以选择三端稳压器LM317,LM317是美国国家半导体公司的三端可调稳压器集成电路,它的使用非常简单,仅需要两个外接电阻来设置输出电压。此外它的线性调整率和负载调整率也比标准的固定稳压器要好,它还内置有过载保护、安全区保护和多种保护电路。由于设计FPGA芯片的I/O口的引脚电压设为2.5V,所以把LM317的电压设计为2.5V为整个FPGA芯片提供工作电压。LM317的典型应用电路如图4.12所示:
图4.12 三端稳压器LM317的典型应用
下面对三端稳压器LM317的特性做简单的介绍。
保证1%的输出电压误差;
保证最大0.01%的线性调整率;
保证0.1%的负载调整率;
保证1.5A的输出电流;
可调整电压输出最低1.2V,最高可以调到37V;
输出短路保护,过流、过热保护;
80db的纹波抑制;
标准三端晶体管封装;
三端稳压器LM317在输出和稳压器的末端提供一个内部参考电压1.25V,这样就可以过两个电阻的比例关系来决定的输出的电压,输出电压和参考电压的关系如下式
式(3-1)
器件设计的最大值为100,这个值是不随负载的变化而变化的,所以通常可以忽略的。
由于本设计需要2.5V的稳定电压,而是1.25V,所以=1,让R2=R1=240即可达到输出2.5V的电压。
4.4.4芯片配置介绍
目前常见的大规模可编程逻辑器件的编程工艺有三种
① 基于电可擦除存储单元的EEPROM或FLASH技术,CPLD一般使用此技术进行编程。CPLD被编程后改变了电可擦除存储单元的信息,掉电后可保持。
② 基于SRAM查找表的编程单元,对该类器件,编程信息是保持在SRAM中的,SRAM在掉电后编程信息立即丢失,在下次上电后,还需要重新载入编程信息。因此该类器件的编程一般称为配置,大部分FPGA采用该种编程工艺。
③ 基于反熔断丝编程单元。Actel的FPGA;Xilinx部分早期的FPGA采用此种结构,现在Xilinx已不采用。反熔断技术编程方法是一次性可编程性。
相比之下,电可擦除编程工艺的优点是编程后信息不会因掉电而丢失,但编程次数有限,编程的速度不快。对于SRAM型的FPGA来说,配置次数为无限,在加电时可随时更改逻辑,但掉电后芯片中的信息即丢失,每次上电时必须重新载入信息,下载信息的保密性不如前者。
FPGA配置可以用专门的编程设备,也可以使用下载电缆。如Altera的ByteBlaster(MV)并行下载电缆,连接PC机的并行打印口和需要编程或配置的器件。并与MAX PlusⅡ配合可以对Altera 公司的多种CPLD、FPGA进行编程或编程。由于实验台上有一个FPGA的配置端口,所以在本次毕业设计中选用ByteBlaster(MV)配置方法。ByteBlaster(MV)下载电缆与Altera器件的接口一般都是10芯的,引脚对应关系如下表4.3所示,FPGA上配置引脚功能说明如表4.4所示。
表4.3:ByteBlaster(MV)下载电缆引脚信号名称
引脚 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
器件引脚 |
DCLK |
GND |
CONF_DONE |
VCC |
nCONFIG |
- |
nSTATUS |
- |
DATA0 |
GND |
表4.4:芯片的配置引脚功能说明
DATA0 |
输出 |
配置数据 |
DCLK |
输出 |
配置时钟 |
nCONFIG |
输出 |
器件复位脚(该信号线的上升沿使配置开始) |
CONF_DONE |
输入 |
状态位(在配置完成后,该信号线为高) |
nSTATUS |
输入 |
状态位(如果该信号线为低,表明在配置过程中出现错误,需重新配置) |
编程配置电路的设计图入图4.13所示:
图4.13 编程配置电路图
Altera的SRAM LUT结构的器件中,FPGA可使用6中配置模式,这些模式通过FPGA上的两个模式选择引脚MSEL1和MSEL0上设定的电平来决定;
1.配置器件,如用EPC器件进行配置;
2.PS(Passive Serial 被动串行)模式:MSEL1=0,MSEL0=0;
3.PPS(Passive Parallel Synchronous 被动并行同步)模式:MSEL1=1,MSEL0=0;
4.PPA(Passive Parallel Asynchronous 被动并行异步)模式:MSEL1=1,MSEL0=1;
5.PSA(Passive Serial Asynchronous 被动串行异步)模式:MSEL1=1,MSEL0=0;
6.JTAG模式:MESL1=0,MESL0=0;
这6种配置模式中,PS模式可以利用PC机通过ByteBlaster(MV)下载电缆Altera器件应用ICR(电路可重配置)。在本次毕业设计中,选用第二种配置模式,即被动串行模式,配置时序如图4.14所示:
图4.14 PS配置时序图
由时序图可用看出PS配置工作过程:当nCONFIG产生下降沿脉冲时启动配置过程,在DCLK上升沿,将数据移入目标芯片。在配置过程中,系统需要实时监测,一旦出现错误,nSTATUS将被拉低,系统识别到这个信号后,立即重新启动配置过程。配置数据全部正确地移入目标芯片内部后,CONF_DONE信号跳变为高,此后,DCLK必须提供几个周期的时钟(具体周期数与DCLK的频率有关),确保目标芯片被正确初始化,进入用户工作模式。由时序图可以看出,在芯片配置之前和配置之后,nCONFIG,nSTATUS,CONF_DONE都是高电平,所以需要注意的是在配置电路的设计中需要在每个配置引脚上都需要加一个上拉电阻。
4.4.5电路设计注意事项
本次设计采用的EP1K30TC144-3是贴片式的封装,引脚共有144个,所以对电路的设计有很大的要求,在设计电路中遇到很多麻烦,比如开始设计想通过布双面板,但Protel的双面板布线是以工业制板作为标准的,在自动布线的时候,在芯片中间设计了许多过孔,这在手工制板中是很难实现的,所以采用手动布线来实现电路,把要用到的引脚通过插针引出来,这样就可以拓宽布线的空间,使得可以用单面板来实现FPGA硬件电路,这次布线的不足之处是在电源和地线上没有处理好,本来可以把地线布在芯片里面,而把电源放到外面,而我把电源和地都放在外面,这样就有很多跳线,让电路板很不美观。
本次设计中的外部时钟采用有源晶振,因为有源晶振可以提供稳定时钟,增强线路板抗干扰性能,所以选用20M的有源晶振,在布线的过程中,有源晶振离FPGA芯片距离尽量小一点,这样是为了防止走线过长,导致电路干扰太大。
在对FPGA芯片没有用到的引脚的处理要特别注意,因为有些引脚在不使用状态下是应该接地的。这一点要特别注意。比如此芯片上的(106脚)是应该接地。
4.4.6硬件电路设计技巧
本次设计中采用的FPGA芯片由于有144个引脚,所以对电路的设计有很高的要求,如果是工业制板,那也就没什么问题,用Protel的自动布线就可以画出电路PCB图了,但如果是手工制板,那就在布线和I/O口的使用有很大的要求,特别是在本设计中,输入信号和输出信号都比较多,在I/O的使用上就应该把相同类型的数据信号引脚尽量锁定在一起,这样就方便制板。还有对地线的处理也很重要,因为在芯片的周围都有电源和地线,这些都是芯片已定好的,不能更改的。技巧就是把地线全部放中间,然后把中间的地线拉出来,和芯片外面的地连在一起。
5 软件介绍
在实验中主要使用了MAX+PlusⅡ、EWB、以及Protel99se三种软件,其中,Max PlusⅡ主要完成对FPGA芯片的编程,仿真,芯片引脚锁定以及编程在线配置等操作,EWB主要用于对放大、滤波电路作分析与设计,并以分析为主,尤其是EWB能提供一个虚拟的实验室,可以对电路和系统进行十分逼真的模拟;Protel99se则是整个电路设计PCB的重要工具。现分别对这三种软件进行介绍,其中重点介绍使用MAX+PlusⅡ的常用基本设计方法。
5.1 MAX+PlusⅡ
MAX+PlusⅡ是Altera提供的FPGA/CPLD开发集成环境,Altera是世界最大可编程逻辑器件供应商之一。MAX+PlusⅡ界面友好,使用便捷,被誉为业界最易用易学的EDA软件,在MAX+PlusⅡ上可以完成FPGA/CPLD的设计所有流程,包括设计输入、综合、适配、时序仿真与功能仿真和编程下载,使设计者能方便地进行设计输入、快速处理和器件编程。常用设计输入方法有图形设计输入,文本编辑输入,波形输入方式和混合输入方式。利用MAX+PlusⅡ进行设计的一般流程如图5.1所示:
图5.1 MAX+PlusⅡ一般设计流程
5.2 Electronics Workbench(EWB)
Electronics Workbench(简称EWB)就是一个虚拟电子实验室,只是这个实验室装入了电脑。Electronics Workbench之所以很快被广大电路设计工作者所接受,首先它真的就像一个电子实验室,提供了模拟和数字电路的虚拟实验环境,具有和真实的实验室一致的元器件库和仪器仪表;其次,EWB提供交互式的SPICE电路模拟,使用人机图形界面真实、方便、快捷;EWB具有完整的模拟混合和数字信号模拟功能,可以任意地在系统中集成数字和模拟元件,会自动地进行信号转换。总之,EWB作为EDA软件,功能强大,可视化界面清晰,且易学易用。
5.3 Protel99SE
Protel 99SE采用数据库的管理方式。Protel 99SE软件沿袭了Protel以前版本方便易学的特点,内部界面与Protel 99大体相同,新增加了一些功能模块,功能更加强大。新增的层堆栈管理功能,可以设计32个信号层,16个地电层,16个机械层。新增的3D功能让您在加工印制版之前可以看到板的三维效果。增强的打印功能,使您可以轻松修改打印设置控制打印结果。其主要组成部分有:
原理图设计系统(Design system of schematic diagram),原理图设计系统用于原理图设计的Advanced Schematic系统。
印制电路板设计系统(Design system of printing circuit board),印制电路板设计系统是用于电路设计的Advanced PCB系统。
信号模拟仿真系统(Simulation system of signal imitation),信号模拟仿真系统是在原理图上进行信号模拟仿真的 SPICE系统。
可编程逻辑设计系统(Programmable logical design system),可编程逻辑设计系统是基于CUPL的集成于原理图设计系统中PLD设计系统。
6 整机调试
6.1硬件电路的调试步骤
在硬件电路中用到了音频放大、滤波电路,电源稳压电路,AD采样电路,FPGA控制等主要部分,由于电路连线较多而且复杂,采用的方法是分块调试,这样比较容易发现问题和解决问题。这种硬件调试方法在实际应用是比较普遍的。
在进行硬件调试之前,首先要检查电路板,看看电路板上的线路是否有短路、虚焊或者是断路的情况,如果有则要修正它,如果没有就可以进行各个模块的调试。
6.1.1音频放大部分调试
对音频放大部分调试需要一个函数信号发生源,一个示波器,一个万用表和提供放大器电源的直流稳压电源。首先,给NE5532加上+12V的电源,使之工作起来,用万用表检查NE5532除了正负电源引脚的电压,电压接近为零,这表明放大器正常工作,在输入端输入频率为1KHz,幅度为300mV的正弦波,用示波器观察输出端的波形,可以看到输出幅度为5.3V的正弦波,正弦波中包含了很多高频干扰,这是由于周围的干扰在放大器的放大作用,使得干扰成为一个明显波形出现在示波器上,通过滤波器后可以滤掉这些干扰。调节可调电阻,可以观察到输出波形的幅度变化。接上音源,可以看到示波器有不规则波形输出,增大音源的音量可以看到输出波形的幅度也随之增大,只是这不规则波形中混有很多的干扰,通过滤波器后可以滤掉这些干扰。这表明音频放大部分工作正常,达到设计要求。
6.1.2滤波部分调试
对滤波部分调试需要一个函数信号发生源,一个示波器,一个万用表和提供放大器电源的直流稳压电源。首先,给LM324加上+12V的电源,使之工作起来,用万用表检查LM324除了正负电源引脚的电压,电压接近为零,这表明滤波器的放大器正常工作。输入1KHZ,300mv的正弦波信号,经过音频放大电路放大后得到的1KHZ,5.3V的正弦波信号从输入点进入滤波电路。调试过程中发现示波器中的波形一直有一定高频和低频的干扰,检查电路没有错误,最后判断是电源的干扰,在电源输入端加上一个大电容和一个小电容分别滤掉电源的高频干扰和低频干扰,再调试可以看到完整的正弦波波形。减少输入信号的频率到10HZ,可以看到当频率减到20HZ的时候,输出信号的幅度逐渐变小,这表明高通滤波部分已实现其功能,滤掉小于20HZ的低频干扰;然后慢慢增加输入信号的频率到30KZ左右,可以看当频率大于18KHZ的时候,输出信号的幅度开始减小,达到20KHZ,输出信号幅度衰减到通带内的幅度的75%,大于20KZ后,输出幅度小于通带内幅度一半,达到衰减的目的,这表明低通滤波器也实现了其功能。整个滤波器部分调试完毕,达到设计要求。
6.1.3LM317稳压块调试
在调试LM317的输出电压的时候遇到这样一个问题,本来LM317是稳压块,它的输出电压是不应该随输入电压的改变而改变的,而当改变输入电压的时候,输出电压有很大的变化,这样对FPGA芯片很危险,如果电源电压突然变高,FPGA的VCCINT引脚无法承受这个电压就会烧掉整块FPGA芯片。在后面的毕业设计中发现,在用LM317的时候,最好不要用可调电阻,虽然是精密的可调电阻,它的阻值随温度的变化是很大的,当外部电压升高,通过可调电阻的电流就越大,就会让电阻的温度升高。这样LM317的输出电压随温度的变化而变化,所以换下可调电阻,用一个固定240代替它,这样就解决输出电压随外部电压的变化而变化的问题。
6.1.4FPGA硬件电路调试
这部分调试是整个调试的主体,包括对有源晶振的调试,配置电路的调试。在MAX+PlusⅡ中写一个小程序,选择器件和锁定引脚后,用ByteBlaster(MV)下载电缆连接PC机上的打印并行口和硬件电路板上的下载口,在配置即将结束的时候弹出配置失败,读静态存储器失败,检查硬件和FPGA的配置时序图知道,在配置结束的时候,芯片的第二个引脚CONFING_DONE会跳回高电平,而硬件上的一直是低电平,经过了解,是应该在引脚上加一个1K的上拉电阻,这样在配置结束后就会变成高电平。加上拉电阻后还是出现同样的问题,查阅相关资料后知道,芯片的引脚是应该接地的, PS配置模式下,FPGA芯片的MSEL0,MSEL1引脚是应该接地,改过电路后,再进行配置,用示波器检查配置时候的5个引脚的波形符合配置时序图。这样就解决了芯片无法配置的错误。接着是检查外部时钟产生电路,由于采用的是有源晶振,所以必须把2.5V电源接入FPGA模块上,让有源晶振工作起来,把有源晶振的输出端连接到示波器上,由于采用的20M的有源晶振,在用示波器观察波形的时候要选用100MHZ示波器,而且要把输入信号衰减后才可以进入示波器,否则无法看不到准确的时钟波形。通过示波器,可用看到有源晶振已经起振。
6.1.5AD采样模块调试
将实现AD采样的状态机程序单独写成一个文件,选择器件和锁定引脚后,配置到FPGA芯片中,模拟信号采用+5V电源,在调试过程中,发现AD采样在工作若干次后,就会出现“死机”现象,分析知道,在采样过程中会出现控制AD开始采样的CONV信号丢失现象,导致AD无限期等待采样开始信号CONV,而状态机又无限期等待采样结束信号EOC,这样就使得状态机进入“死机”状态。解决的方法是加入一段“看门狗”程序,当状态机进入死机状态后,用一个变量判断状态机是否等待超过一个采样周期,如果超过,就复位状态机,使状态机重新进入开始状态。这样就可以解决状态机的“死机”现象了。加入“看门狗”程序后,通过示波器可以看到12位数据的任何一位的电平信号。这样AD采样部分就调试完毕。
6.2 联机调试
联机调试需要实验工具有:示波器,稳压电源,EDA实验台,PC机,ByteBlaster(MV)下载电缆。按照图2.1中各模块连接顺序连接好整个采样系统,分别接上12V的放大器工作电压,+5V的AD采样电压和+2.5V的FPGA芯片工作电压,把串并选择端口选择串行输出,也即将短路帽短路,这样输入到器件是低电平。将示波器连接到串行输出口,用EDA实验台上的下载电路连接PC机上的打印并行口和硬件电路板上的下载口,可以看到示波器有高低的电平输出。将串并选择端口选为并行输出,也即将短路帽断开,这样输入到器件是高电平,任意选择一位连接到示波器,也可以看到有高低电平输出。通过调试可以证实整个高速多通道采样系统基本实现,联机调试完毕。
6.3调试注意事项
在调试音频放大部分的时候,话筒和电路板的连接线要选用屏蔽线,这样用助于屏蔽周围的干扰信号,普通的电线无法做到这一点。
由于FPGA芯片引脚过多,而且电路相对复杂,所以在硬件电路的功能调试之前,需要对硬件电路的检查和调试。特别是对FPGA芯片的电源的检查,电源电压的过高,芯片就会烧坏;电压过低,芯片就工作不起来。设计把AD部分和FPGA芯片分到了两块板子上,而且FPGA芯片电源是由LM317稳压块提供,所以先在AD模块加上+5V电源,用万用表测得LM317的输出电压是否是2.5V,这样就起到保护FPGA芯片的作用。
电路需要外部供电的部分,为防止电源对电路的干扰,在电源的输入两端都要接一个大电容(47uF)和一个小电容(0.1uF),这样可以滤掉电源中的高频和低频的干扰。
7 结论
本次设计采用FPGA实现采样系统,从而系统具有高速、稳定、低功耗等特点,音频模拟信号经放大器NE5532放大后,经过8路选择后,进入滤波器进行滤波,滤掉高频干扰信号和低频干扰信号的干扰,然后进入AD7892进行AD采样,采样后的12位数据通过一个FIFO队列存储,最后从FIFO中读出数字信号,在串并输出模式的选择下在示波器上显示出来。
本系统基本达到了预期的设计,但还有一些不足之处,例如:在对FIFO队列的读写操作中是通过状态机来实现的,但这样FIFO队列就只起了一个缓存的作用。由于本人水平有限,无法实现其存储后再进行读写的操作,恳请各位老师多多批评指教。
多通道采样系统应用十分广泛,特别是在控制系统上的应用,比如说温度,湿度等,通过传感器把模拟信号采集到微机或者控制部分,根据采集的数据来对系统进行相应的控制,同时基于FPGA的多通道采样系统的实现,为一些特殊领域的实时测控提供了一个简单、灵活、可靠的方案,不失为一个良好的尝试。
附 录
1 各模块程序
(1)通道选择模块
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count is port(clk:in std_logic; --cnt:out integer range 0 to 7; cnt : out std_logic_vector(2 downto 0)); --oc : out std_logic); end count; architecture archcount of count is 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";--oc<='1'; else q<=q+1;--oc<='0'; end if; end if; cnt<=q; end process; end archcount;
(2)延时模块
library ieee; use ieee.std_logic_1164.all; entity delay is port(in1,in2,in3:in std_logic; out1,out2,out3:out std_logic); end delay; architecture behav of delay is signal comin:std_logic_vector(2 downto 0); signal comout:std_logic_vector(2 downto 0); begin 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; end behav;
(3)AD采样控制模块
library ieee; use ieee.std_logic_1164.all; entity adcontrol is port(D : in std_logic_vector(11 downto 0); clk,eoc : in std_logic; b0,b1,b2:in std_logic; wr_en,rd_en : out std_logic; lock0,conv,rd,cs: out std_logic; Q : out std_logic_vector(15 downto 0)); end entity; architecture behav of adcontrol is type states is(st1,st2,st3,st4,st5,st6,st7,st8); signal current_state,next_state:states:=st1; signal regl1 : std_logic_vector(11 downto 0); signal regl : std_logic_vector(15 downto 0); signal lock : std_logic; begin lock0 <= lock; 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; end behav;
(4)串并转换模块部分程序
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity counter4 is port(clk:in std_logic; cnt4 : out std_logic_vector(3 downto 0) ); end counter4; architecture archcount of counter4 is signal q:std_logic_vector(3 downto 0); begin counter:process(clk) begin if(clk'event and clk='1') then if q="1111" then q<="0000"; else q<=q+1; end if; end if; cnt4<=q; end process; end archcount;
1 FPGA顶层设计图
3 电路设计图
(1)音频放大
(2)滤波器
(3)AD7892电路
FPGA芯片PCB图
表1 归一化的巴特沃斯低通滤波器传递函数的分母多项式