引言
传统的逻辑分析仪体积庞大、价格昂贵、通道数目有限,并且在数据采集、传输、存储、显示等方面存在诸多限制,在很大程度上影响了其在实际中的应用。选用高性能的fpga芯片进行数据处理,充分利用pc的强大处理功能,配合labview图形化语言开发的虚拟逻辑分析仪,其数据处理和传输速率大大提高,适用性极大增强,其显示、操作界面和低廉的成本较之传统的逻辑分析仪具有极大的优势和发展前景。
工作原理
本设计选用altera公司的cyclone系列fpga器件ep1c3进行数据采集和处理,外接sram,用于数据的存储。系统通过高性能的pic单片机pic18f6620完成与pc的通信,接收pc发出的触发、配置信息并控制系统将采集处理后的数据上传至pc显示。单片机与pc的接口利用符合usb2.0规范的接口芯片cp2102实现。
首先,pc向fpga发送触发字信息、数据采集控制信息和开启数据采集信号;单片机发送数据至外接dac产生门限电压;采集到的输入信号通过高速比较器与此门限电压进行比较,以确定其值为0或1。接收到pc发出的开启数据采集信号后,fpga按设定的工作方式采集数据,各通道数据移位输入fpga内部缓存并存入外部sram。fpga将缓存中存储的采集数据与设定的触发字、触发方式和屏蔽位进行比较。一旦符合触发条件,则设置触发标志,记录触发位置。当数据采集至设定的点数后,fpga向pc发送采集完成信号。上位机接收到此信号后,发送读取数据命令,系统读回采集数据并在pc屏上显示。系统功能框图如图1所示。
图1 系统功能框图系统触发模块设计
触发模块是整个系统的核心部分,主要包括采样时钟选择模块、触发电平设置和触发电路三个部分。
采样时钟选择模块
时钟选择模块用于选择采样频率。可供选择的时钟源包括:外部时钟(由有源晶振提供)、单片机pwm模块产生的pwm时钟、外部时钟输入(由额外的设备提供)、以第n路数字信号输入作为采样时钟。
触发电平设置
触发电平用来确定系统正确识别采样信号的高低电平。该模块由串行数模转换器tlc5615和高速比较器lt1721构成。采样开始前,单片机向dac发送触发电平数据,转换后的电平信号(范围从0~+5v)送入高速比较器。
触发电路
触发电路的作用是判断采样信号是否满足触发条件,并分别产生触发动作。当采集的信号满足用户设置的触发条件时,系统记录触发位置并产生触发信号通知上位机读取、显示采样数据。本次设计的触发电路具有三种可选的触发模式:立即触发、顺序触发和并行触发。
立即触发
当上位机向fpga发出立即触发触发字和开始采样指令后,fpga开始采样并立即产生触发信号。采样电路将采集到的信号存入外部的sram中,直至采集到规定的点数后停止采样,向上位机发出采样结束信号,通知其读取采样数据。此方式下读回的触发点位置为0。
顺序触发
该方式设置了一个8位的序列触发,只有当被测通道的信号按依次满足触发字所设定的8位序列时,才产生触发信号。同时,为了操作的灵活性,还加入了屏蔽位。若对某一位的数据不敏感,可以将其对应的屏蔽位设置为0,在判断触发条件时不对该位进行检测。
使用顺序触发方式,可以对任意一个通道选择最多8位长度的序列进行触发。在进行触发设置时,除设置触发方式(选择顺序触发)和进行采样频率选择以外,还需要进行通道选择、触发字和屏蔽位设置。其verilog hdl算法源程序如下:
if(((dbuf^{trigword[1],trigword[ 0]})&{enbit[1],enbit[0]}) == 8'h00)
begin
trigflag=2'b01; trigpoint[6:0] <= memabus_wr[6:0];
end
其中:dbuf为所测采样通道的数据缓存;trigword[0]、trigword[1]为触发字;enbit[0]、enbit[1]为屏蔽字;trigpoint为触发位置寄存器。
并行触发
该方式设置了一个八级深度的并行触发,将每次采样得到的4个通道的数据组合为一个十六进制数,对应于一个4位的触发字,当4个通道的数据在时间上依次满足8个4位的触发字时(并非要求连续),产生触发信号。同样,可以使用屏蔽位对某一通道的数据进行屏蔽,即在进行并行触发检测时,不对该路通道进行检测。
使用并行触发方式,可以选择最多八级的并行触发。在进行触发设置时,除设置触发方式(选择并行触发)和进行频率选择以外,还需要进行触发字、屏蔽位和并行深度的设置。其verilog hdl算法源程序如下:
if ((({dbuf4[0],dbuf3[0], dbuf2[0],dbuf1[0]}^ trigword [dcount] )&enbit[0] ) == 4'h0)
begin
if(dcount[2:0]==control[4:2])
begin
trigflag=2'b01; trigpoint[6:0] <= memabus_wr[6:0];
<