1 换体DMA数据采集电路原理
系统原理框图如图1所示。在时序电路的控制下,模拟输入开关将多达16路(单端输入)或8路(差分输入)的模拟输入信号经多路开关送至放大器的输入端,放大后由内含采样/保持电路的模数转换器AD774B转换成数字量,转换完的数字量经时序电路的控制写入两个存储体的一个(例如存储体0)中。每个存储体有4KB的容量,但实际使用中的存储体容量可设定为小于4KB。当计数到设定的存储容量后,控制电路产生换体信号,后续的A/D转换数据自动地存入另一个存储体(存储体1)。同时控制电路向主机发出DMA请求信号,主机响应请求后在时序电路的配合下,从已存够规定数据的存储体(存储体0)中读入所存的数据。这样存储体0和存储体1交替存取,直到规定的换体次数计完为止。
数据采集电路中,时序控制电路、地址发生器、多路控制驱动器等芯片众多,占用了大部分体积,逻辑时序复杂。用CPLD实现这些电路则显得简单明了,如图2所示。图2中地址发生器、双端口RAM、时序控制等电路都可以用HDL语言或原理图,或是两者结合来实现,使电路开发简单、灵活、方便。
2 采用CPLD实现换体DMA
CPLD的开发必须经过前期的逻辑设计、前仿真、后仿真、目标代码下载及在线调试等过程,该设计过程是借助ALTERA公司的EDA软件MAXPLUS II 10.1来实现的。MAXPLUS II支持原理图输入、HDL语言输入、设计波形输入等。本设计则是将原理图和HDL语言输入相结合,这样既可以加快开发速度,又不失灵活性。本电路设计所用的CPLD芯片—FLEX10K30E。它是ALTERA公司1995年把EAB与逻辑阵列块相结合的产品,增加了许多FLEX10KA、B系列没有的新特点;FLEX10K30E内有30000个逻辑门,247576个RAM位,支持3.3V、5V多种电源,速度等级高。
2.1 数据缓存——双端口RAM
双端口RAM的核心是存储器阵列,它的读与写相互独立,有各自的时钟线、地址总线、数据总线和使能端。在数据采集时,数据进入存储器进行缓存,同时CPU可以从缓存中取出数据读进计算机内存。在传统的双RAM换体方案中要实现换体,存储器芯片必须使用偶数片来交互存储;当A/D数据位数超过8位时,需要另加芯片来存储高于8位的数据。在CPLD中设计双端口RAM模块不但实现了双RAM换体功能,而且使缓存RAM的数据位数、存储量大小可以根据需要任意配置。
如上所述,在CPLD中设计双端口RAM,可以有两种方式:原理图输入和HDL语言输入。本设计采用的是MAXPLUS II库中的LPM_RAM_DP宏,原理图如图3所示。
在LPM_RAM_DP宏中总共有10个可配置参数。通常情况下,只配置LPM_WIDTH(数据宽度)、LPM_WIDTHAD(地址总线宽度)、USE_EAB(是否使用嵌入式阵列块EAB)三个参数。在本设计中,AD774B的数据宽度是12位,转换速率为8微秒,所以配置了LPM_WIDTH=12,LPM_WIDTHAD=10(缓存容量为1K),USE_EAB=ON。对于缓存的大小,可以在调试过程中根据具体采集速度和缓存要求进行在线调整,而不影响其他逻辑电路。
图3LPM_RAM_DP模块中rdaddress、rden、rdclock、rdclken、q分别为读端的地址线、使能端、时钟线、时钟使能和数据线;data、wraddress为写端的数据总线和地址总线。图3的双端口RAM模块并没有BUSY端,当写地址和读地址相同时,数据位冲突,读写不能正常工作。在实际工作中,这种问题是不应该出现的。结合本系统的具体需要,在此引入了存储器分页概念,即把1K字节的双端口RAM分为2页,每页512字节,分别为读缓存页和写缓存页,两者相互交换。当采集数据量达到512字节时,系统马上申请DMA传送,把刚转换完的第一页中的512字节数据送给计算机,传送结束后等待下一次DMA申请;与此同时,A/D继续工作,转换的数据放在第2页0~511地址中。任何时候读写都分别在不同的页工作,从而有效地避免了数据冲突,但又不影响数据传输速度。具体的分页控制主要由地址发生器设计确定。
2.2 分页地址发生器
分页地址发生器不但要产生双端口RAM的读写地址,而且还要为缓存器分页;页写满时,还要提供DMA传输申请信号。为了增强灵活性,读写地址发生器由VHDL语言编程集中在一个模块实现,部分程序如下:
signal wtmp:integer range 0 to 1023;
signal rtmp:integer range 0 to 1023;
signal page:intefer range 0 to 1;
if(wclk'event and wclk='1') then
if(wtmp>1023) then wtmp<=0;
else wtmp<=wtmp+1; --wtpm为写地址值
end if;
if (0=
else page<=1; --“0”代表第0页
end if; --“1”代表第一页
if(wtmp=512 and wtmp=1023)then page_full<='1';
else page_full<='0'; --page-full为页写满标志,同时为DMA传送申请信号
end if;
end if;
if(page=0)then rtmp<=0; --不同的页置不同的数据读地址初始值
else if(page=1)then rtmp<=512;
end if;
if(rclk'event and rclk='1') then
if(en='1' and rtmp<1024) then rtmp<=rtmp+1;
end if; --rtmp为读地址值
end if;
代码经过编译生成的原理框图如图3的ADD_CREATE模块。在图形输入编辑环境下,可以把它作为一个标准的原理图与其他模块连接;写地址时钟WCK由AD774B的STS端产生,每一组数据转换结束后,地址发生器加1,读地址时钟RCK由DMA应答信号DACK提供;PAGE_FULL在0页或1页满时变为高电平,经D触发器申请DMA传输,把刚满页的数据送给计算机内存。
2.3 时序逻辑电路的设计
在数据采集电路中,时序逻辑电路主要解决地址译码、时序逻辑控制、数据锁存等功能。用普通的中小规模集成电路实现,电路组成庞大;而用VHDL语言实现则简单灵活、易于更新升级。图3中的微机译码电路、数据缓冲器、D触发器等都可以在MAXPLUS II的图形编辑环境下,从库中直接调出。计算机在每次DMA传送中都向外设输出一个应答信号DACK和读允许信号IOR,利用这个特点,正好把它们作为读缓存的地址时钟,即每DMA传送一次,读地址加1;AD774B每转换完一组数据,在STS端输出由低电平转为高电平,刚好给写缓存提供写地址时钟,同时经过适当延时,STS又可以送到R/C端作为A/D下一次转换的启动信号。
3 DMA的应用
数据传送的查询方式和中断方式都是在CPU的控制下进行的,因而传输速率受CPU指令运行速度的限制。直接存储器存取方式,即DMA方式。存储器与外设在DMA控制器控制下,直接传送数据而不通过CPU,传输速率主要取决于存储器存取速度。所以在DMA过程中,数据传输完全由DMA控制器8237A控制,不占用CPU时间。
在本换体DMA高速数据采集电路中,用复杂可编程逻辑器件CPLD来实现数据缓存、带分页功能的地址发生器以及复杂的逻辑和时序电路等,使得电路大大简化;同时硬件电路软件化,具有可在线更新、升级容易、保密性强等特点。本换体DMA高速数据采集电路已成功地应用在生物医学仪器、核谱获取电路中。