基于FPGA的IEEE488接口协议实现及驱动程序开发
2022-08-26罗显志周杨罗
刘 阳,罗显志,周杨罗,李 政
(湖北大学 计算机与信息工程学院,武汉 430062)
0 引言
在自动测试系统中,IEEE488总线扮演着重要的角色。它是一种面向仪器设备的通用总线接口,也被称为GPIB总线[1-2]。该接口最早由HP公司提出,经过几十年的发展,已经形成了一套行业标准。且该接口能满足设备之间互相通信的功能,实现信息共享的需求。
近年来,国内在自动化控制、精密仪器研制等领域发展迅猛,在医疗、军工等领域,对测试系统的需求越来也越大。GPIB作为业界使用最广泛的测试总线,不仅成本低,而且传输稳定,在未来的一段时间内,国内市场仍然有一定的需求量。
市面上的GPIB转换器基本都采用专用接口芯片来设计,此类芯片连接微处理器,通过读写寄存器等操作能很
方便的实现GPIB接口的所有功能。目前,能自主生产基于IEEE-488协议的专用GPIB接口芯片的公司仅NI、TI、NEC、Intel几家[3],但该类芯片都已停产,可供购买的成品GPIB转换器如NI-GPIB-USB-HS价格在3 000元以上,对国内庞大的用户群体来说成本过高。国内在测试接口领域的研究较少,仅有电子科大等几个团队,且市面上国产转换器占有率不高。随着ASIC技术的飞速发展,FPGA在嵌入式领域得到了广泛应用,它灵活、稳定、可移植性强,所以能够用来替代一些专用芯片。
基于以上因素,本文详细阐述使用FPGA芯片来实现IEEE488总线协议的方案及实现流程,为相关开发人员提供可行性参考。
1 总体设计
基于FPGA的IEEE488协议转换器的设计主要包括硬件和软件两部分。硬件部分包括硬件电路设计与硬件控制程序设计;软件部分主要是驱动程序开发,最后通过用户程序与仪器通信。该方案组建一套完整的测试系统,其总体结构[4]如图1所示。
图1 总体结构框架
该方案的核心在于硬件控制程序设计,开发前需要对IEEE488总线协议做深入研究,同时剖析NI的NAT9914的内部结构,掌握其协议的工作原理。硬件控制程序的主要内容是模拟GPIB接口的十种功能,然后通过读写控制模块控制数据准确无误的传输,在PC与仪器之间搭建数据传输的桥梁。软件驱动程序连接PC与转换器,实时发送程控指令并接收返回的数据。
2 硬件电路设计
硬件电路设计主要包括电源模块、USB-UART模块、FPGA主控模块及外围电路、GPIB接口模块。硬件设计框架如图2所示。
图2 硬件设计框架
2.1 电源模块
电源模块为整个系统提供稳定电压。电源芯片使用MC34063,该芯片性能好,市场应用广泛,可实现升压和降压功能,但其实现电路不同。本系统采用USB接口供电,其电压大致为5.2 V左右,所以需设计降压电路。FPGA芯片的不同BANK所需电压不同,因此添加LM1084可调输出线性稳压器,提供3.3 V、2.5 V、1.2 V工作电压。电源电路部分设计如图3所示。
图3 电源模块
该芯片内部有恒定的1.25 V基准电压,输出电压与R35和R36的阻值有关,其输出电压的计算公式为:
Vout=1.25*(1+R36/R35)
(1)
由公式(1)推出,为输出5 V电压,R36和R36的阻值分别为10 K和3K3。
2.2 USB-UART模块
USB-UART模块建立PC端与主控芯片的数据通道。协议转换芯片采用CH340G-USB转串口芯片,该芯片外围电路简单,性能稳定,资料丰富。电路中将Rx与Tx引脚接入FPGA芯片进行数据交换,D+与D-接入USB接口数据引脚与PC端进行数据交换。该芯片工作时需外接12 M晶振,同时为保证系统时钟的同步,引出时钟输入引脚与FPGA芯片相连。USB-UART模块如图4所示。
图4 USB-UART模块
2.3 FPGA主控模块及GPIB接口模块
FPGA主控芯片的选择参考市场两大主流FPGA芯片厂商,再结合本项目的设计要求,最终采用Xilinx的Spartan-6系列的XC6SLX4芯片,该芯片的引脚数和容量能满足设计需求,且网络资源充足,易上手。
主控芯片的差分引脚主要与GPIB接口的16根信号线和UART模块的数据线连接,以实现接口的控制和数据传输。外围电路还包括JTAG下载电路、SDRAM外部存储模块以及时钟和复位电路。JTAG下载调试电路使用XCF01SVO20C-FPGA配置芯片,系统外部时钟采用50 M晶振。此外,使用K4S511632B-TC75存储芯片设计SDRAM外部存储模块,防止因FPGA芯片内部缓存不足造成数据丢失的现象。主控模块还外接了LED小灯等外围电路,用来作为数据读写的指示灯。
传统的GPIB接口电路模块一般由专用GPIB接口芯片和总线收发器组成。本方案使用FPGA芯片模拟GPIB接口功能,因此无需GPIB接口芯片和总线收发器。但GPIB接口工作电压是5 V,而FPGA芯片的最高电压为3.3 V,故在FPGA芯片与GPIB接口之间添加MOS-N模块实现电平转换。
3 硬件控制程序设计
硬件控制程序是设计的核心与难点。在设计之前,需要对IEEE488总线协议和GPIB接口芯片的内部结构做深入研究。
3.1 IEEE488总线介绍
IEEE488总线[5-6]自提出以来,一直被广泛应用于测试、控制等领域。它由数据线、三根握手线、五根接口管理线以及地线组成。三根握手线配合工作,通知总线何时传输数据,何时接收数据,确保数据传输准确无误。接口管理线ATN控制总线上传输的是数据还是指令,EOI提示总线何时传输结束等,IFC设置所有的设备于静止状态,REN使能设备进行远程编程,SRQ提醒控制器是否需要服务。在工作时,测试系统存在3种角色,即控者负责发送各种命令,讲者发送数据,听者接收数据。
典型的GPIB专用接口芯片NAT9914的内部电路主要分为两部分。一部分面向GPIB总线,主要包括GPIB接口的十种功能以及各种缓冲器和译码器。另一部分面向微处理器,通过编写驱动程序让微处理器访问25个可寻址寄存器,其主要类型有数据类寄存器、中断类寄存器、地址类寄存器。NAT9914的内部结构[7-8]如图5所示。
图5 NAT9914内部结构
GPIB接口共定义了10种接口功能,分别是源方和受方挂钩功能、讲者、听者、控者、器件清除功能、服务请求功能、并行轮询功能、远控/本控功能、器件触发功能。其中前五种是基本接口功能,后5种是辅助接口功能。基本功能是所有带GPIB接口的设备必须具备的,保证测试系统中各仪器之间能相互通信,辅助功能让测试系统更便捷、更智能。
3.2 GPIB接口功能的程序设计与仿真
该方案的硬件程序使用Verilog硬件描述语言进行开发,软件采用Xilinx的ISE。整体设计采用自顶向下的设计思想,将整个系统拆分成若干个子功能模块,其中包括串口数据收发模块、数据读写控制模块、中断模块以及GPIB接口功能模块,每个子功能模块又有不同的状态,同一时刻只允许存在同一种状态,不同的状态又通过相互联系的小状态机进行切换,且状态的改变与之前设备所处的状态关联,这样就构成了一个相互排斥又相互联系的状态机。通过各模块的接口功能状态机的联系,最总形成一个顶层GPIB接口功能状态机。
GPIB接口功能的实现依赖于各个功能模块的实现,由于篇幅有限,该章节主要对GPIB接口的讲者(T)、听者(L)功能、FIFO模块的设计进行详细描述,并利用Modelsim软件进行仿真验证。
3.2.1 讲功能(T)设计
讲功能[9-10]的主要作用是将用户发送的程控指令或者数据通过总线发送到测试系统中的仪器中,或者将仪器自身的工作状态以及参数等信息通过数据总线传输到PC端。只有当系统控者寻址讲者或者设备通过ton指令将自身设置为讲者时,才赋予这种功能。同一时刻,一个测试系统中只存在一位讲者。
讲功能的状态分为TIDS(讲者空闲态)、TADS(讲者被寻址态)、TACS(讲者活动态)、SPAS(串行活动态)、SPIS(串行空闲态)、SPMS(串行模式)共6种,按照协议功能又分为讲者数据传输和串行轮询两组事件,分别如图6(a)和图6(b)所示。讲者状态图如图5所示。
图6 讲功能状态图
事件(a)中,在设备上电后,讲功能同时进入TIDS和SPIS两种状态,此时不具备数据传输能力。当设备被寻址为讲者(即MTA=1)或设备通过ton指令设置自身为讲者,且ACDS为活动态时,讲功能进入被寻址态,此时讲者准备好发送数据。ATN信号线决定系统传输的数据类型,当ATN为假时,表示GPIB总线上传输的是数据,当SPMS是活动态时,设备进入SPAS状态;当SPMS为假时,讲者进入TACS状态,此时配合SH功能将数据传到GPIB数据总线。当设备处于SPAS或TACS状态时,若ATN为真,说明系统控者发送命令,讲功能返回寻址态。
事件(b)中,若SPE为真,即允许串行查询,听者进入串行轮询模式状态,并参与串行轮询。当系统活动控者发送SPD命令,即禁用串行轮询。听者进入串行轮询空闲状态。
讲功能的Verilog设计包括了图5中两组状态,每种状态的转换都通过分析当前的状态机来转换,结合各状态之间相互排斥又相互联系的特征,TIDS和SPIS采用并行语句执行。(b)状态的具体实现的核心部分代码如下所示:
case (current_state_2)
T_STATE_2_SPIS :
if (event2_1)
current_state_2 <= T_STATE_2_SPMS;
T_STATE_2_SPMS :
if (event2_3)
current_state_2 <= T_STATE_2_SPIS;
else if (event2_2)
current_state_2 <= T_STATE_2_SPIS;
default :
current_state_2 <= T_STATE_2_SPIS;
endcase
assign event2_1 = SPE 1'b1 & ACDS 1'b1;
assign event2_2 = SPD 1'b1 & ACDS 1'b1;
assign event2_3 = IFC 1'b1;
通过编写Testbench仿真文件,使用Modelsim仿真后波形如图7所示。根据分析可以看出,讲功能的每个状态严格按照状态图进行变换,且同一时刻只存在一种活动态。
图7 讲功能仿真波形
3.2.2 听功能(L)设计
听功能[11]的主要作用是接收仪器发送过来的状态信息或者主控设备的指令。同一时刻,一个测试系统中可以存在多位听者。
听功能的状态分为LIDS(听者空闲态)、LADS(听者被寻址态)、LACS(听者活动态)、LPIS(听者主空闲态)、LPAS(听者主被寻址态),其中后两种为扩展听者(LE)状态。听者状态如图8所示。
图8 听功能及扩展听功能状态图
状态图(a)是听功能的状态图,当设备上电后,听功能同时进入LIDS和LPIS两种状态。当设备被寻址为听者(MLA=1)或者设备通过lon指令设置自身为听者,且ACDS为活动态时,听功能进入被寻址态,此时听者准备好接收数据。若ATN为假,表示GPIB总线上传输数据,此时听者变为LACS状态,并且配合AH功能从数据总线上接收数据。若ATN为真,表示GPIB总线传输命令,听者由活动态变为被寻址态。当控者发出unl命令,宣布测试系统内所有的设备取消听者状态,且ACDS为真时,听者进入空闲态。
状态图(b)是扩展听功能的状态图,在LPIS状态下,听功能可以识别它的主地址,但无法响应它的副地址。当听功能被寻址且处于接收数据状态时,听功能进入被寻址主状态,此时听功能可以识别并响应它的副地址。
听功能的Modelsim仿真波形如图9所示。
图9 听功能仿真波形
3.2.3 FIFO模块设计
为提高系统传输数据的稳定性,避免因控制端和数据端传输速率差异造成的数据丢失现象,设计FIFO模块作为数据缓冲区。
FIFO模块连接读写控制端和数据总线端。读写控制部分由Clk、Reset_Fifo、Read、Write、Buffer_full组成,data_in[7:0]和data_out[7:0]连接数据总线。当转换器身份为讲者时,从FIFO中取数据放入总线,若FIFO数据为空,则读写控制端写入准备发送的数据。当转换器身份为听者时,将总线上的数据存入FIFO,若FIFO存在数据,则通知读写控制端读取数据。FIFO的RTL视图如图10(a)所示。Modelsim仿真波形如图10(b)所示。
图10 FIFO RTL视图与仿真波形
3.3 内部寄存器设计
NAT9914芯片的工作主要通过配置内部寄存器来完成。设计中通过读写控制模块对各个寄存器进行配置,从而控制接口的数据传输。
设计的寄存器主要有地址寄存器、GPIB总线寄存器、GPIB状态寄存器、接口功能寄存器、GPIB控者寄存器、读写控制寄存器,中断控制寄存器。其中,中断寄存器ISR0与听、讲功能相关,其结构如表1所示。
表1 ISR0寄存器
ISR0可读寄存器的BI、BO、END位分别代表数据接收位、数据发送位、数据传输结束位。当设备为系统活动控者或者讲者时,BO位置1,此时可以向系统内其他设备发送命令或数据;当设备为听者时,当数据接收寄存器接收到数据时,BI位置1;当接收到结束符0x0A时,END位置1,结束本次数据传输。
3.4 GPIB数据传输
数据传输是硬件控制程序的核心部分,也是该协议转换器要实现的最主要功能。
在各个子功能模块完成的基础上,构建从UART模块到GPIB接口模块的数据通道。数据的传输主要依靠设备的听、讲功能以及读写控制模块,还有FIFO存储模块。听讲功能控制数据传输的方向,FIFO模块控制数据的存取。读写控制模块直接配置状态寄存器,进而配置GPIB的接口功能,并配合FIFO模块完成数据的存取。在程序中设计了GPIB_Read和GPIB_Write两个资源文件,用来实现GPIB的读写操作。在GPIB_Read模块中,输入输出端口名分为GPIB接口、外部接口、FIFO模块3部分。GPIB接口部分用来判断当时是否处于听活跃状态,外部接口模块负责产生数据中断等信号,FIFO模块则提示是否存在数据以及数据的存取。GPIB_Write模块的结构与GPIB_Read模块基本类似。读写的逻辑结构如图11所示。
图11 GPIB读/写流程图
4 软件驱动程序设计
4.1 VISA简介
VISA(virtual instrument software architecture),即虚拟仪器软件结构[12-14]。VISA是一种通用的I/O标准,提供了一套完整的、易操作的函数库,存在于计算机系统内,通过软件层与仪器建立连接。
传统的仪器,不同的接口需要开发不同的驱动程序来供用户使用,这将耗费大量的人力物力来开发与维护。VISA独立于接口、语言和操作系统,采用统一的操作函数,无论是串口、GPIB、LAN接口,都使用VISA函数来操作,体现了VISA的硬件无关性。统一的核心函数与其它无法合并的、与仪器类型相关的功能函数一起构成了自底向上的I/O接口模型,实现不同类型的仪器的互操作性与兼容性,这也是VISA的最大优点之一。
VISA的结构共分为五层,资源管理层主要主要负责资源的寻址、创建与删除等功能的实现。I/O资源层提供了底层I/O函数,对硬件接口进行读写等操作,该资源与传统的I/O函数相似。仪器资源层主要针对不同仪器的特定功能。用户资源层是可变层,根据用户自己定义资源。应用程序层提供用户与仪器交互的窗口。
4.2 VISA驱动程序开发
本设计采用NI公司提供的VISA库,在开发之前需安装NI-VISA。驱动程序的一般设计流程如图12所示。
图12 驱动开发流程
驱动程序具体实现流程[15-18]如下:
1)扫描资源:首先调用viOpenDefaultRM()函数来扫描系统中的接口和设备资源,此后才能调用其他VISA函数。当用户需要查找特定的设备时,可以调用viFindRsrc()函数。
2)打开资源:通过viOpen()函数建立仪器之间的会话通道,其参数根据接口类型确定。如建立与主地址为2的GPIB接口的会话,则参数设置为GPIB0::2::INSTR。
3)读写操作:公用的VISA底层I/O函数有viRead()、viWrite()等;GPIB接口特殊I/O函数有的viReadSTB()、viClear()等,每个函数实现一种接口功能。本设计调用公用I/O函数与建立会话通道的接口进行通信。
4)关闭资源:调用viClose()函数关闭已建立的会话通道,并清除资源。
在VC++6.0环境下测试VISA驱动程序,将VISA.H和VISATYPE.H文件拷贝到工程中,使用C语言调用相关库函数。核心代码部分如下所示:
int main(void){
ViSession defaultRM;
....... //定义变量
status=viOpenDefaultRM (&defaultRM);
status=viOpen(defaultRM,"ASRL4::INSTR",VI_NULL,VI_NULL,&instr);
status = viSetAttribute (instr,VI_ATTR_TMO_VALUE,5000);
....... //参数配置
status=viWrite(instr,"*IDN? ",(ViUInt32)strlen("*IDN? "),&writeCount);
status = viRead (instr,buffer,100,&retCount);
if (status! printf ("
Data read:%*s
",retCount,buffer); } status = viClose (instr); status = viClose (defaultRM);} 将协议转换器和Tek1002示波器连接,运行该程序生成的.EXE可执行文件,运行测试结果如图13所示。 图13 VC++下VISA测试结果 驱动应用层开发平台为Visual Studio 2017,采用C#面向对象高级程序设计语言,它运行在.NET Framework框架上。.NET Framework包括3个应用程序模型,设计采用Windows Forms模型,它属于.NET Framework中的GUI类库,该模型采用控件式编程,开发难度较低。 NI-VISA提供了基于.NET的VISA函数库,在项目中添加NI的NationalInstruments.Visa和Ivi.Visa函数库可直接调用VISA函数。 应用层开发主要分两部分,一部分为资源搜索界面,另一部分为基本读写操作界面。资源搜索界面通过ResourceManager.Find(“(ASRL|GPIB|TCPIP|USB”?*INSTR))函数来搜索系统中所有类型的设备,并将值返回ListBox列表框中。选中资源,点击OK按钮时,执行ResourceManager.Open函数与设备建立连接。操作界面主要由Button和TextBox两大控件组成,读写等按钮执行基本IO操作,在控件中调用RawIO.BeginWrite()和RawIO.BeginRead()函数,当点击事件发生时,则执行读写函数,并将返回值发送到TextBox文本框中,此外还添加了Trigger和Read STB等功能型按钮,通过调用接口功能函数对设备进行操控。 最终设计的用户操作界面如图14所示。 图14 用户程序界面 可编程仪器标准命令,简称SCPI[19-20]。它是一种控制仪器的语言规范,规定了一种标准的语言结构来控制仪器,采用ASCI字符串的形式与设备之间进行数据的交互。 早期的仪器设备,由于没有统一的程控命令标准,不同的仪器在软件上很难兼容。SCPI的出现,给整个行业提供了一套可参考的标准,完美解决了不同仪器的兼容性问题。且SCPI采用助剂符的方式,把复杂的指令缩写成简洁且容易记住的指令,便于用户使用。 测试采用对比实验,实验设备使用Tek1002示波器。通过对基本指令以及示波器的数据采集等指令的测试,评估其性能。 5.2.1 公用指令测试 SCPI公用指令共39条,是所有带GPIB接口的设备必须具备的。 公用指令测试使用自主研发的GPIB上位机和转换器与NI控制面板和NI-GPIB-USB作比较,都发送*IDN?指令,查看其返回结果是否一致。测试结果如图15所示。其中,图(a)为自主研发设备返回结果,图(b)为NI设备返回结果。 图15 公用命令测试结果 5.2.2 性能测试 性能测试软件采用NI公司的I/O Trace,该软件能捕获各函数的响应时间,通过在同一软件下对比自研GPIB转换器和NI-GPIB-USB转换器来评估该设计的设备性能。测试结果如图16所示。图(a)自主研发设备响应时间,图(b)为NI设备响应时间。 图16 指令响应时间 从图16中可以看出,自研设备在响应*IDN?和*TST?两个指令的时间分别为958 ms和1 252 ms,NI的响应时间为982 ms和1 242 ms。经对比,自研GPIB转换器性能优异,完全能满足实际应用需求。 GPIB接口的重要功能是采集仪器的数据。数据采集实验通过STM32F103开发板的DA模块输出波形,使用Tek1002示波器测量波形,将该设计的GPIB卡连接示波器,通过Tek公司的OpenChoiceDesktop上位机软件连接示波器,首先发送:SELECT:CH1选择示波器通道1,然后发送CH1:PROBE?等查询指令查询示波器的各种参数,最后发送:CURVE?返回曲线数据,并反馈到Tek公司的OpenChoiceDesktop上位机软件上。测试结果如图17所示。 图17 数据采集测试结果 本文设计了一款以FPGA芯片为主控,通过硬件描述语言实现IEEE488接口的所有功能的协议转换器。文中介绍了转换器硬件设计、控制程序设计,还详细介绍了基于VISA的驱动程序设计流程。该设计为解决当前市场GPIB专用芯片停产、转换器价格昂贵等问题提供了一套完整的替换方案。经测试实验表明,该转换器性能稳定、体积小,完全满足日常测试所需,为从事相关方面研究的开发人员提供了可行性的参考案例。4.3 驱动应用层开发
5 SCPI指令测试
5.1 SCPI简介
5.2 SCPI命令测试
5.3 示波器数据采集测试
6 结束语