GPIB接口的FPGA实现
扫描二维码
随时随地手机看文章
摘 要:GPIB接口是测试仪器中常用的接口方式。通过将接口设计分解为同步状态机设计和寄存器读写电路设计,采用Verilog语言实现了满足IEEE488.1协议的IP Core设计。将此IP Core固化到FPGA芯片中即可实现GPIB各种接口功能。
引言
在自动测试领域中,GPIB通用接口是测试仪器常用的接口方式,具有一定的优势。通过GPIB组建自动测试系统方便且费用低廉。而GPIB控制芯片是自动测试系统中的关键芯片,此类芯片只有国外少数公司能生产,不仅价格昂贵,而且购买不便。因此,GPIB 接口的FPGA实现具有很大的实用价值。
本文论述的是采用Verilog语言来设计基于IEEE488.1协议的IP Core,然后将用户逻辑与此Core集成在一片FPGA中实现GPIB接口功能。
GPIB 接口体系结构设计
首先把整个待设计系统划分为若干基本功能模块,其中包括复杂的同步状态机以及寄存器读写电路。内部结构如图1所示。
接口功能设计
接口功能的设计是设计的核心。按照IEEE488.1协议与实际设计的要求,设计选取了八种接口功能:源方挂钩 、受方挂钩、讲者、听者、服务请求、远控/本控、器件清除和器件触发。其中源方挂钩接口功能保证多项消息的正确传输;受方挂钩接口功能保证正确地接受远地消息;讲者接口功能让器件在接口上把数据发送到其他一些器件去;听者接口功能让器件在接口上接受来自于其他器件的数据;本控就是本地控制(面板或后背板)。在实际设计中,再把各接口功能划分为若干相关状态,这样在用VerilogHDL实现这些相互作用影响的状态跃迁的时候就可以引入状态机设计。为了保持状态机之间相互的状态挂钩的协调一致性,设计采用同步状态机,在时钟信号的触发下,完成各个状态之间的转移。
接口功能的Verilog HDL实现
由于八种接口功能实现方式较为相似,这里以最具有代表性的受方挂钩功能(AH)来具体说明其用VerilogHDL的实现方式。对受者接口功能应具有的能力、作用及变迁条件,用一组互相排斥而又互相联系的状态图来给定,如图2所示。状态图中,各状态之间的变迁分别用状态之间的箭头来表示。每一个状态变迁都用一个逻辑表达式来表示变迁的条件。表达式由本地消息、远地消息、状态交连、运算符等组成。其中本地消息用三个小写的英文字母表示。远地消息用三个大写的英文字母来表示。状态交连是指一个接口功能的状态变迁受其他接口功能的状态的制约。
在用VerilogHDL语言对状态机进行的设计中,采用了一位热码状态编码。虽然一位热码采用的触发器较多,但可以简化组合电路。对于寄存器数量多,而组合逻辑门相对缺乏的FPGA器件,一位热码可以提高电路的速度和可靠性,也有利于提高器件资源的利用率。AH功能状态机代码如下:
module
input clk,reset,swrst,LADS, LACS,rdy,ATN,DAV;
output AIDS,ANRS,ACRS, ACDS,AWNS,NRFD,NDAC;
parameter S1=5'h01,S2=5'h02, S3=5'h04,S4=5'h08,S5=5'h10;
assign NRFD=(ANRS| ACRS|ACDS|AWNS ) ? NRFDt: 1'bz;
assign NDAC = (ANRS| ACRS|ACDS|AWNS) ? NDACt: 1'bz;
always @(negedge clk )
begin if ((~reset)|swrst|((~ATN) &(~(LACS|LADS)))) present=S1;
else present=next; end
always @(present or LADS or LACS or rdy or ATN or DAV)
begin AIDS=0 ;ANRS=0; ACRS=0; ACDS=0; AWNS=0; NRFDt=0; NDACt=0;
case (present)
S1: begin if (ATN) next=S3;
else if((~ATN)& (LADS|LACS)) next=S2;
else next=S1; AIDS=1; NRFDt=0;NDACt=0; end
S2: begin if (ATN|rdy) next=S3; &
nbsp;
else next=S2; ANRS=1; NRFDt=1;NDACt=1; end
S3: begin if (~(ATN|rdy)) next=S2;
else if (DAV) next=S4;
else next=S3; ACRS=1; NRFDt=0;NDACt=1; end
S4: begin if( (ATN)|(~ATN)&(~rdy)) next=S5;
else next=S4; ACDS=1; NRFDt=1;NDACt=1; end
S5: begin if (~DAV) next=S2;
else next=S5; AWNS=1; NRFDt=1;NDACt=0; end
default: next=S1;
endmodule
AH功能逻辑设计的功能仿真
对前述AH功能编码进行编译和功能仿真,仿真结果如图3所示。由图可见,当同步触发信号reset为0,swrst为1时,系统回到空闲态。LADS(听者被寻址态)与LACS(听者作用态)同时为0时,系统进入AIDS(受者空闲态),此时受者NRFD、NDAC为高阻态。LADS与LACS任一为1时,受者进入ANRS(受者未准备好态)。rdy为1与ATN为0时,受者进入ACRS(受者准备好态),NRFD、NDAC为0。可以看出,随着输入条件的变化,输出相应变化,满足时序逻辑。接下来,生成受者功能模块符号图,以便于下一步系统级的设计。
其他接口功能的状态机实现与AH功能类似。最后将每个接口功能的状态机实现,生成便于互连的符号模块,各个模块连接起来就组成系统的接口主状态机模块。其中状态机子集模块所需的信号一些来自状态交连(图2阴影部分即各接口功能之间的互相影响信号),另外一些则来自其他模块所产生的信号。
寄存器读写电路设计
在设计图1中的寄存器读写电路时,选择设计了9个8位内部寄存器。其中可读寄存器有5个:中断状态寄存器0(ISR0)、中断状态寄存器1(ISR1)、总线状态寄存器(BSR)、数据输入寄存器(DIR)和地址状态寄存器(ADSR);可写寄存器有4个:中断屏蔽寄存器0(IMR0)、中断屏蔽寄存器1(IMR1)、地址寄存器(ADR)和辅助命令寄存器(AUXCR)。其中可读寄存器用来存储状态机的当前状态、中断情况、仪器地址、输入数据和控制信息。计算机把中断屏蔽位,辅助命令写入可写寄存器,从而实现对GPIB总线的控制。在上位机与芯片之间引入D0~D7 作为本地双向数据总线,通过译码模块实现对内部寄存器的读写,产生状态机子集模块所需的信号以及GPIB接口信号。寄存器读写电路的设计用译码器,寄存器等实现,由于篇幅所限,这里不再赘述 。
接口的FPGA实现
在完成基本模块以后,可以用类似画电路图的方法直接对这些模块符号进行调用。然后通过MAXplusⅡ进行综合、仿真,做在线调试。再完成整个内部电路的软件设计以后就可以把该“软件核”(Core)固化到具体选定的FPGA芯片上,本文选用ALTERA公司的ACEX1K30QC208芯片。
结语
在测试仪器的研制过程中发现,GPIB接口往往不需要IEEE488.1的全部接口功能,很多仪器只需要听、讲功能即可。如果采用Nat9914之类的芯片,控者、并行查询功能都用不到,这样既会造成资源与功能的浪费,又延长了开发周期。设计基于FPGA芯片的专用IP Core不仅拥有自主知识产权,而且可以通过与计算机接口(如ISA口)与计算机直接相连,装入驱动程序即可工作。这对测试仪器开发有一定的借鉴作用,无论是采用PCI、USB,还是单片机控制,只需将用户逻辑与符合IEEE488.1协议的IP Core集成在一片FPGA中即可实现测试仪器的GPIB接口功能。这将大大缩短开发周期,降低开发成本。