基于FPGA数据采集系统方案.docx
《基于FPGA数据采集系统方案.docx》由会员分享,可在线阅读,更多相关《基于FPGA数据采集系统方案.docx(15页珍藏版)》请在冰豆网上搜索。
![基于FPGA数据采集系统方案.docx](https://file1.bdocx.com/fileroot1/2022-10/11/1f82fcf8-148e-4fbc-9fe4-43f058936f51/1f82fcf8-148e-4fbc-9fe4-43f058936f511.gif)
基于FPGA数据采集系统方案
基于FPGA数据采集系统
一.引言
传统的数据采集系统,通常采用单片机或DSP作为主要控制模块,控制ADC、存储器和其他外围电路的工作。
随着数据采集对速度性能的要求越来越高,传统采集系统的弊端就越来越明显。
单片机的时钟频率较低且需用软件实现数据采集,这使得采集速度和效率降低,此外软件运行时间在整个采样时间中也占很大的比例。
而FPGA(现场可编程门阵列)有单片机无法比拟的优势。
FPGA时钟频率高,部延时小,全部控制逻辑由硬件完成,速度快、效率高。
在此技术基础上,为了满足数据采集对速度的要求,本文就着重介绍了一种基于FPGA,采用VHDL硬件描述语言设计实现的高速数据采集系统。
二.设计思路
本设计采用FPGA器件EP1C12Q240C8实现对高速A/D转换芯片ADC08200的采样控制,解决了传统方法的速度问题。
使用VHDL语言采用电路结构图为顶层向下的方法;结合FIFO存储器的设计实现了高速A/D采集转换和转换后数据存储,并给出了采样系统框图与FPGA部设计框图。
图1系统框图
图2FPGA部结构
一.硬件设计
对A/D转换器进行采样控制,传统方法一般是用CPU或单片机完成的。
其优点是编程简单、控制灵活,但缺点是控制周期长、速度慢,例如MCS51系列单片机最高时钟频率为12MHZ,AT89C2051单片机为24MHZ,这样当A/D本身的采样速度比较快时,CPU或单片机的慢速工作时序将极限制A/D高速性能的利用。
当采用FPGA对其进行控制时,由于FPGA的时钟频率可达100MHZ以上,从而可实现数据的高速采集,还可以把采样数据实时存入FPGA部的高速RAM中。
本设计是利用FPGA直接控制高速ADC08200对模拟信号进行采样,采集速度可达200MS/s,然后将转换好的8位二进制数据迅速存储到FPGA部的FIFO存储器中。
在完成对模拟信号一个周期的采样后,由外部电路系统将存储器中的采样数据读出处理。
采用自顶向下的设计方法可将本设计分为控制器模
块和FIFO缓冲模块。
1.系统的模块设计与功能仿真
ad转换模块与高速存储模块结合调理电路与数据处理电路就构成了一个完整的系统。
调理电路和模拟信号经由a/d转换器adc08200转换模块后变为数字信号,传给同样由fpga控制的先进先出存储器fifo这样就弥补了由单片机控制带来的速度低的缺点.fpga存储的数字信号可由单片机系统来读取和处理.在quartus2平台下使用原理图输入方式可以使设计得到简化.系统的连接图如图4所示.其中clk为时钟信号;rst为复位信号;d[7...0]转换后的数字信号,接a/d的输出;wr/rd为读写控制;rdclk为读时钟;aclr为清零信号;adclk接a/d转换器的时钟clk;adpd接adc08200的pd;wrfull;rdempty为写满,读空显示信号;q{7...0}为输出数据.
2.控制器模块设计
2.1ADC08200芯片功能介绍
ADC08200是美国国家半导体公司生产的单通道、低功耗、高速8位模数转换器。
它具有成本低、功耗低、体积小和易于使用等优点。
最高采样频率达200MS/s。
在掉电模式下ADC08200仅消耗1mw。
独特的结构在50MHZ标准信号的输入情况下可达到7.3有效采样位。
单电源3v或2.5v的供电,带高质量参考源和高性能采样保持电路。
主要端口:
Clk:
时钟输入端;
Vin模拟信号输入端;
PD:
掉电保护,当PD为低时,D0-D7正常输出,当PD为高时,D0-D7输出保持;
D0-D7:
数据输出端口。
D0为数据最低位,D7为最高位;
图3为ADC08200的工作时序图和外围接口电路图。
图3ADC08200接口电路图
2.2基于VHDL控制器设计
VHDL是一种硬件描述语言,它可以对电子电路和系统的行为进行描述。
基于这种描述,结合相关的软件工具,可以得到所期望的实际电路与系统。
根据ADC08200的特点,可通过硬件描述语言设计一个状态机,最后下载到FPGA芯片上,通过FPGA芯片控制ADC08200的工件。
时钟由外部引入,由分频模块得到想要的时钟。
设计过程为编写VHDL代码,然后在QuartusII平台下进行编译,仿真。
最后下载到FPGA芯片中。
2.3高速存储模块的设计
FIFO是一种存储器参数可设置模块库,在高速数字系统中常用作缓存。
在高速数据传输和实时显示领域中,需要对数据进行快速储存和发送,要实现快速的数据采集、顺序储存和传送,传统的RAM型存储器已经无法满足要求。
目前许多高速系统都采用FIFO作为缓存体。
因为FIFO的写入(读出)时间只需要一个时钟周期,不需要对地址进行加1操作,大大提高了存储速度。
利用LPM中的宏功能块LPM_FIFO,在QuartusII平台下定制一个高速的先进先出FIFO根据需要对所使用的宏功能块的参数进行适当调整,由此生成一个满足自己特定需要的模块。
二.VHDL软件设计
1.主控制模块VHDL程序
libraryieee;
useieee.std_logic_1164.all;
entityadc08200is
port(rst:
instd_logic;
clk:
instd_logic;
d:
instd_logic_vector(7downto0);
ctloe:
instd_logic;
adclk:
outstd_logic;
adpd:
outstd_logic;
data:
outstd_logic_vector(7downto0);
dclk:
outstd_logic);
endentityadc08200;
architecturebhvofadc08200is
typead_statesis(state0_type,state1_type);
signalsta_g_currentstate:
ad_states;
signalsta_g_nextstate:
ad_states;
signalctl_gp_latchflag:
std_logic;
signalchipselect:
std_logic;
begin
:
process(sta_g_currentstate)
begin
casesta_g_currentstateis
whenstate0_type=>adclk<='1';
ctl_gp_latchflag<='1';
dclk<='0';
sta_g_nextstate<=state1_type;
whenstate1_type=>adclk<='0';
ctl_gp_latchflag<='0';
dclk<='1';
sta_g_nextstate<=state0_type;
whenothers=>adclk<='0';
ctl_gp_latchflag<='0';
dclk<='1';
sta_g_nextstate<=state1_type;
endcase;
endprocess;
reg:
process(clk,rst)
begin
ifrst='0'thensta_g_currentstate<=state0_type;
elsif(clk'eventandclk='1')then
sta_g_currentstate<=sta_g_nextstate;
endif;
endprocessreg;
latch:
process(ctl_gp_latchflag)
begin
ifrst='0'thendata<=(others=>'0');
elsif(ctl_gp_latchflag'eventandctl_gp_latchflag='1')then
data<=d;
endif;
endprocesslatch;
chipselect<=ctloe;
adpd<=notchipselect;
endarchitecturebhv;
2.LPM-FIFO宏模块的调用
1.1在设计数据采集系统前,必须首先完成对采集转换数据缓存和存放的设计。
利用MegaWizard
Plug-InManager定制FIFO宏功能块。
设计步骤如下:
(1)打开MegaWizardPlug-InManager初始对话框。
在Tools菜单中选择MegaWizard
Plug-InManager,产生如图7-5所示的界面,选择Createanewcustom…项(如果要修改一
个已编辑好的LPM模块,则选择Editanexistingcustom…项),即定制一个新的模块。
单
击Next按钮后,产生如图7-6所示的对话框,在左栏选择memorycompiler项下的LPM_FIFO,再选择Cyclone器件和VHDL语言方式;最后输入FIFO文件存放的路径和文件名:
F:
\adc08200\fifo(定制的fifo元件文件名),单击Next按钮。
(2)选择ROM控制线、地址线和数据线。
在如图7-7和图7-8所示的对话框中选择
地址线位宽和ROM中数据数分别为6和64;选择地址锁存控制信号inclock。
(3)单击Next按钮后出现图7-9的界面。
在“Whatshouldthefifo”栏选择默认的
“Auto”。
在适配中,QuartusII将根据选中的目标器件系列,自动确定嵌入fifo模块的类型。
生成FIFO模块如下:
1.2其FIFO部VHDL语言程序:
LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYaltera_mf;
USEaltera_mf.all;
ENTITYfifoIS
PORT
(
clock:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(7DOWNTO0);
rdreq:
INSTD_LOGIC;
wrreq:
INSTD_LOGIC;
empty:
OUTSTD_LOGIC;
full:
OUTSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
usedw:
OUTSTD_LOGIC_VECTOR(9DOWNTO0)
);
ENDfifo;
ARCHITECTURESYNOFfifoIS
SIGNALsub_wire0:
STD_LOGIC_VECTOR(9DOWNTO0);
SIGNALsub_wire1:
STD_LOGIC;
SIGNALsub_wire2:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALsub_wire3:
STD_LOGIC;
COMPONENTscfifo
GENERIC(
add_ram_output_register:
STRING;
intended_device_family:
STRING;
lpm_numwords:
NATURAL;
lpm_showahead:
STRING;
lpm_type:
STRING;
lpm_width:
NATURAL;
lpm_widthu:
NATURAL;
overflow_checking:
STRING;
u