FPGA数据采集.doc_第1页
FPGA数据采集.doc_第2页
FPGA数据采集.doc_第3页
FPGA数据采集.doc_第4页
FPGA数据采集.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

ADC0809数据采集及显示系统董文来 通信0702引言随着半导体技术和EDA技术的发展,传统的系统设计方法有了飞跃性的进步。可编程技术被广泛应用到器件设计上,给数字系统设计带来很大的灵活性。现在构成数字系统仅需要微处理器、存储器和可编程逻辑器件。由于器件可以进行编程,则硬件的设计便可以像设计软件那样方便。高速数据采集系统是多种测量与控制系统的前端单元,其采集速度、精度、稳定性等直接影响整个系统的性能。本课题就是利用FPGA 以ADC0809为基础设计数据采集及显示系统,控制高速、高精度的A/D 转换器ADC0809实现高速采集并显示在LED灯上。数据采集的应用十分广泛。比如水文、地震、火灾等方面的监测,生产的自动控制,雷达、声纳信号处理等。系统框架的分析与设计ADC0809是8位逐次逼近型A/D转换器,带8个模拟量输入通道,芯片内带通道地址译码锁存器,输出带三态数据锁存器。ADC0809内部没有时钟电路,故时钟需要由外部输入,允许范围为10KHZ1280KHZ,典型值为640KHZ,每一通道的转换需要6673个时钟周期。当地址所存允许信号ALE有效时,将转换器转换输出。输出端具有三态输出锁存缓冲器,收输出允许信号OE的控制,当该信号为高电平时,打开输出缓冲器三态门,转换结果输出到数据总线上;当该信号为低电平时,输出数据线呈高阻态。根据要求可以将系统分为四个模块:采样时钟产生模块.采样控制模块.数据转换模块.译码显示模块。如图1所示各个模块的设计1.采样时钟产生模块由输入输出的比例关系可知可以由256分频器来实现。分频器是对某个给定较高频率的信号进行分频操作,以期得到所需的较低频率信号的电路。本课题需要是分频系数为256的分频器,我们可以采用我们熟悉的设计数字分频器的原理来实现,先通过待分频计数器计数;然后将计数器的相应位直接赋给分频器的输出信号。这种方法可以避免毛刺现象的发生。其部分代码如下,其中clk为原来时钟,fout为256分频后的时钟:SIGNAL FULL : STD_LOGIC;BEGINP_REG: PROCESS(CLK,RST) VARIABLE CNT8 : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINIF CLKEVENT AND CLK = 1 AND RST= 0 THEN IF CNT8 = 01111111 THEN CNT8 := 00000000; FULL = 1; ELSE CNT8 := CNT8 + 1; FULL = 0; END IF; END IF; END PROCESS P_REG ;P_DIV: PROCESS(FULL) VARIABLE CNT2 : STD_LOGIC; BEGIN IF FULLEVENT AND FULL = 1 THEN CNT2 := NOT CNT2; IF CNT2 = 1 THEN FOUT = 1; ELSE FOUT ST=0;ALE0=0;START0=0;ICLK0=0;OE0=0; NSTST=1;ALE0=1;START0=0;ICLK0=0;OE0=0; NSTST=2;ALE0=1;START0=1;ICLK0=0;OE0=0; NSTST=3;ALE0=0;START0=1;ICLK0=0;OE0=0; IF(EOC=0)THEN NST=ST4;转换即将结束,转换至下一状态 ELSE NSTST=4;ALE0=0;START0=0;ICLK0=0;OE0=0; IF(EOC=1)THEN NST=ST5;EOC由0恢复1,转换结束 ELSE NSTST=5;ALE0=0;START0=0;ICLK0=0;OE0=1; NSTST=6;ALE0=0;START0=0;ICLK0=1;OE0=1; NSTST=7;ALE0=0;START0=0;ICLK0=0;OE0=0; NSTNST=ST0;其他状态返回ST1 END CASE; END PROCESS; PROCESS(CLK1,RST) BEGIN IF(CLK1EVENT AND CLK1=0 AND RST=0) THEN CST=NST; END IF; END PROCESS; PROCESS(CLK1)ISBEGINIF(CLK1EVENT AND CLK1=0) THEN用于消除毛刺现象ALE=ALE0;START=START0;OE=OE0;ICLK=ICLK0;END IF;END PROCESS;END ADCX;第三步,利用QuartusII对状态机的功能进行仿真,其波形图如下3.数据转换模块本设计模拟电压输入范围为05V,用8位二进制表示,则其精度为5/256=0.02,本模块将用二进制表示电压转换成BCD码,以便在显示译码模块得以显示。本模块为了得到稳定的数据用ICLK将A/D转换结果进行了锁存。其具体做法如下: 将8位二进制数右移一位,相当于将本数据乘以2(因为精度为0.02) 将移位后的数据转换成整数类型 整数数据加上5,以达到四舍五入的目的 利用VHDL的除法取得百位,十位的数字 分别将百位,十位的数据转换成BCD码:BCDH,BCDL这样我们得到的BCD码表示的就是以0.02为精度,进行过四舍五入的模拟电压值。其部分代码如下:PROCESS(ICLK)VARIABLE A,B,C,D:INTEGER ;VARIABLE AD_DAT0: STD_LOGIC_VECTOR(8 DOWNTO 0);VARIABLE BCDH0,BCDL0: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINBCDH0:=0000;BCDL0:=0000;AD_DAT0(0):=0;AD_DAT0(8 DOWNTO 1):=AD_DAT(7 DOWNTO 0);移位达乘2目的使精度为0.02A:=CONV_INTEGER(AD_DAT0);二进制转为十进制A:=A+5;为达四舍五入B:=A/100;求得百位位,如果数据只有一位或两位则百位为零C:=A-B*100;D:=C/10;求得十位位,如果数据只有一位则十位为零BCDH0:=BCDH0+B;BCDL0:=BCDL0+D;十进制数转为BCD码格式BCDH=BCDH0;BCDLLED7SLED7SLED7SLED7SLED7SLED7SLED7SLED7SLED7SLED7SLED7SCLK1,RST=RESET,FOUT=C);ADC_CTRL1:ADC_CTRL PORT MAP (CLK1=CLK1,EOC=EOC,RST=RESET,CLK2=C,OE=OE,ALE=ALE,START=START,ICLK=D,ST=ST);DAT2BCD1: DAT2BCD PORT MAP(AD_DAT=AD_DAT,ICLK=D,BCDH=E,BCDL=F);LED7S0 : BCD2DISP PORT MAP (DIN=E,LED7S=LED0);LED7S1 :BCD2DISP PORT MAP ( DIN=F,LED7S=LED1);END ONE;系统的仿真波形图如下所示通过以上两种方法的仿真实验,都说明了系统的整个程序设计已经完成了数据采集及显示。完成了在程序初的框架,实现了预期的功能。结束语本文完成了高速、多通道的数据采集及显示系统的设计,在QuartusII环境下,利用VHDL语言编写了整个系统的程序,设计过程中考虑了优化、消除毛刺现象,数据模块采用了算法来实现及四舍五入保留,并做了仿真,达到了预期的功能。本设计充分利用了FPGA的高速度和高可靠性,从而解决了传统中用单片机等来控制是时速慢、开发周期长等问题。以下为源程序1.、采样时钟产生模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clkdiv IS PORT ( CLK : IN STD_LOGIC; RST : IN STD_LOGIC; FOUT : OUT STD_LOGIC );END clkdiv;ARCHITECTURE one OF clkdiv IS SIGNAL FULL : STD_LOGIC;BEGINP_REG: PROCESS(CLK,RST) VARIABLE CNT8 : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINIF CLKEVENT AND CLK = 1 AND RST= 0 THEN IF CNT8 = 01111111 THEN CNT8 := 00000000; FULL = 1; ELSE CNT8 := CNT8 + 1; FULL = 0; END IF; END IF; END PROCESS P_REG ;P_DIV: PROCESS(FULL) VARIABLE CNT2 : STD_LOGIC; BEGIN IF FULLEVENT AND FULL = 1 THEN CNT2 := NOT CNT2; IF CNT2 = 1 THEN FOUT = 1; ELSE FOUT ST=0;ALE0=0;START0=0;ICLK0=0;OE0=0; NSTST=1;ALE0=1;START0=0;ICLK0=0;OE0=0; NSTST=2;ALE0=1;START0=1;ICLK0=0;OE0=0; NSTST=3;ALE0=0;START0=1;ICLK0=0;OE0=0; IF(EOC=0)THEN NST=ST4; ELSE NSTST=4;ALE0=0;START0=0;ICLK0=0;OE0=0; IF(EOC=1)THEN NST=ST5; ELSE NSTST=5;ALE0=0;START0=0;ICLK0=0;OE0=1; NSTST=6;ALE0=0;START0=0;ICLK0=1;OE0=1; NSTST=7;ALE0=0;START0=0;ICLK0=0;OE0=0; NSTNST=ST0; END CASE; END PROCESS; PROCESS(CLK1,RST) BEGIN IF(CLK1EVENT AND CLK1=0 AND RST=0) THEN CST=NST; END IF; END PROCESS; PROCESS(CLK1)ISBEGINIF(CLK1EVENT AND CLK1=0) THENALE=ALE0;START=START0;OE=OE0;ICLK=ICLK0;END IF;END PROCESS;END ADCX;3、数据转换模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY DAT2BCD ISPORT ( AD_DAT:IN STD_LOGIC_VECTOR(7 DOWNTO 0); ICLK: IN STD_LOGIC; BCDH,BCDL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END DAT2BCD;ARCHITECTURE ONE OF DAT2BCD ISBEGINPROCESS(ICLK)VARIABLE A,B,C,D:INTEGER ;VARIABLE AD_DAT0: STD_LOGIC_VECTOR(8 DOWNTO 0);VARIABLE BCDH0,BCDL0: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINBCDH0:=0000;BCDL0:=0000;AD_DAT0(0):=0;AD_DAT0(8 DOWNTO 1):=AD_DAT(7 DOWNTO 0);A:=CONV_INTEGER(AD_DAT0);A:=A+5;B:=A/100;C:=A-B*100;D:=C/10;BCDH0:=BCDH0+B;BCDL0:=BCDL0+D;BCDH=BCDH0;BCDLLED7SLED7SLED7SLED7SLED7SLED7SLED7SLED7SLED7SLED7SLED7SCLK1,RST=RESET,FOUT=C)

温馨提示

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

最新文档

评论

0/150

提交评论