FPGA中双向端口I/O的研究字体大小:小中大作者:莫海永张申科来源:日期:2007-03-07点击:1039摘要:针对现场可编程门阵列(FPGA)芯片的特点,研究FPGA中双向端口I/O的设计,同时给出仿真初始化双向端口I/O的方法。采用这种双向端口的设计方法,选用Xilinx的Spartan2E芯片设计一个多通道图像信号处理系统。引言FPGA是现场可编程门阵列的缩写,它是在PAL,GAL及EPLD等可编程器件的基础上发展起来的。FPGA具有速度快、密度高、功耗小的特点。采用FPGA芯片进行专用集成电路设计,既可以解决定制电路缺乏灵活性的不足,又可以通过相关的软硬件环境掌握芯片的最终功能,提高一次设计的成功率,所以,目前FPGA在电子设计中已被广泛使用。同时,由于FPGA经常要和外部存储器及CPU进行数据输入输出交换,而利用双向端口的设计来进行数据交换可以成倍地节省各自的引脚资源。双向端口顾名思义是一种既可以作为输入端口接收数据,也可以作为输出端口发出数据,它对数据的操作是双向的。比如某个设计需要一个16位的数据输入口和一个16位的数据输出口,并且数据输入和输出不会同时发生。如果数据输入口和输出口分别设计则需要32根数据线,而用双向端口来设计,则只需要16根数据线,这样就节省了16根数据线引脚。由于现在的大多数资料对双向端口的设计介绍很少,本文给出FPGA中双向端口的设计原理和方法,以及仿真和初始化双向端口的方法,同时选用Xilinx的Spartan2E芯片进行实际应用。1、FPGA中双向端口的设计原理和Verilog硬件语言程序设计首先介绍双向端口在FPGA内部硬件资源是怎样实现的。在FPGA中它是通过对三态门控制来实现双向端口的,比如在Xilinx的Spartan2E中的图例(如图1所示):图1双向端口的硬件图当z=0时,上面输出的管子开通,此时数据可以从上面的管子中输出,这时双向端口就作为输出口;当z=1时,上面的管子被置为高阻态,数据不能从上面的管子输出,此时数据只可以从下面的管子由外向内输入,这时的双向端口是输入口。限于篇幅,我们做一个简单的模型来说明双向端口的设计。下面我们用Verilog硬件语言进行双向端口的程序设计,为了看出双向端口分别作为输入端口和输出端口的功能,我们的模块分别定义一个数据输入口din和一个数据输出口dout,一个三态门选通信号z,触发时钟clk,还有双向端口dinout。我们设数据为8位宽。图2为该模块图:图2定义的模块图输入口din定义:input[7:0]din;当双向端口dinout作为输出口时,我们从din端口输入数据到模块中,让数据从dinout口出来。输出口dout定义:output[7:0]dout;当双向端口dinout作为输入口时,我们让数据从dinout口输入,从输出口dout输出。双向端口dinout定义:inout[7:0]dinout;三态门选通信号z:inputz;当z=1时,把三态门置为高阻态,这时dinout作为输入口用;当z=0时,开通三态门,这时dinout作为输出口用。三态门控制语句为:asigndinout=(!z)?din_reg:8'bz;总的完整程序如下:moduledinout(din,z,clk,dout,dinout);input[7:0]din;inputz;inputclk;output[7:0]dout;inout[7:0]dinout;reg[7:0]dout;reg[7:0]din_reg;asigndinout=(!z)?din_reg:8'bz;always@(posedgeclk)beginif(!z)din_reg=din;elsedout=dinout;endEndmodule2、仿真及初始化双向端口下面我们对上述程序进行时序仿真。这里我们选用的FPGA芯片为Xilinx的Spartan2E系列,型号为xc2s300e-7pq208,在ISEFoundation6.1软件中综合及布局布线,并用ModelsimSimulator进行时序仿真。当双向端口dinout作为输出口时,我们不需要对它进行初始化,只要开通三态门。我们设定在200ns后,让数据10,11,12,13,14,15,16,17,18,19,20依次从din口输入,然后用20ns的采样时钟从dinout口输出。它的测试仿真顶层模块为`timescale1ns/1psmoduledinoutest();reg[7:0]din;regz;regclk;wire[7:0]dout;wire[7:0]dinout;integeri;dinoutuut(.din(din),.z(z),.clk(clk),.dout(dout),.dinout(dinout));always#10clk=~clk;initialbegindin=0;z=0;clk=0;#200din=10;for(i=0;i10;i=i+1)#20din=din+1;endendmodule该仿真的时序图如图3所示:可以看出这时双向端口dinout作为输出口,输出从din输入口输入到模块中的数据。当双向端口dinout作为输入口时,我们需要对它进行初始化赋值,此时关闭三态门。而对双向端口的初始化赋值,如果把它跟一般的输入口一样直接赋值给它,则会出错,因为在定义它的时候是wire型了,而不是reg型。在许多Verilog书籍和参考资料中,有关双向端口的初始化赋值介绍的很少。这里需要用到一个force命令,用来给dinout输入赋值。我们设定在200ns后,让数据20,19,18,17,16,15,14,13,12,11,10从dinout口输入模块,然后用20ns的采样时钟从输出口dout输出。以下是它的仿真顶层模块`timescale1ns/1psmoduledinoutest();reg[7:0]din;regz;regclk;wire[7:0]dout;wire[7:0]dinout;integeri;dinoutuut(.din(din),.z(z),.clk(clk),.dout(dout),.dinout(dinout));always#10clk=~clk;initialbeginz=1;clk=0;forcedinout=20;#200for(i=0;i10;i=i+1)#20forcedinout=dinout-1;endendmodule该仿真的时序图如图4所示:图4双向端口作为输入口时的时序仿真可以看出这时双向端口dinout作为输入口,数据从dinout口输入模块,然后从输出口dout完整地输出来。3、实际应用这种双向端口设计方法已被我们用到目前开发的一个多通道图象捕获和显示控制系统中。在该系统中,FPGA接收从两个图像传感器传来的数字视频信号,然后根据CPU的命令对这两路视频信号进行四种显示模式的组合操作。FPGA将处理好的信号存到外部存储器中。如果LCD显示信号来了,FPGA从外部存储器中取数据给LCD显示。如果CPU想要对某一帧图像数据进行图象识别操作,可以经过FPGA从外部存储器中把该帧图象数据取下来。其中LCD的时钟频率为6M,FPGA对外部存储器及CPU数据操作的时钟频率为24M,并且LCD显示操作优先级最高。在这个系统中用到了两个双向端口,一个是FPGA与CPU的数据交换,另一个是FPGA与外部存储器之间的数据交换,他们都是16位的数据交换,由于用了双向端口,节省了32个引脚资源,同时优化了器件的选择和整体设计,降低了成本。图5为多通道图象捕获和显示控制系统的框图。图5应用双向端口的多通道图象捕获和显示控制系统4、结论由于现在FPGA设计和外部存储器或CPU数据交换的频繁运用,以及引脚资源有限,而使用双向端口设计可以成倍的节省数据引脚线,所以设计好FPGA的双向端口至关重要。在设计FPGA中的双向端口时应注意两点:其一,要用三态门的控制来处理实现双向端口;其二,要分别指定双向端口作为输出口和输入口时,对外部对象的数据操作。FPGA管脚分配需要考虑的因素字体大小:小中大作者:来源:日期:2007-01-30点击:814在芯片的研发环节,FPGA验证是其中的重要的组成部分,如何有效的利用FPGA的资源,管脚分配也是必须考虑的一个重要问题。一般较好的方法是在综合过程中通过时序的一些约束让对应的工具自动分配,但是从研发的时间段上来考虑这种方法往往是不可取的,RTL验证与验证板设计必须是同步进行的,在验证代码出来时验证的单板也必须设计完毕,也就是管脚的分配也必须在设计代码出来之前完成。所以,管脚的分配更多的将是依赖人,而非工具,这个时候就更需要考虑各方面的因素。综合起来主要考虑以下的几个方面:1、FPGA所承载逻辑的信号流向。IC验证中所选用的FPGA一般逻辑容量都非常大,外部的管脚数量也相当的丰富,这个时候就必须考虑到PCB设计时的布线的难度,如果管脚的分配不合理,那么有可能在PCB设计时出现大量的交叉的信号线,这给布线带来很大的困难,甚至走不通,或者是即便是布线走通了,也有可能由于外部的延时过大而不满足时序方面的要求。所以在管脚分配前对FPGA工作的环境要相当的熟悉,要对其中的信号来自哪里去向何方非常的清楚,这就按照连线最短的原则将对应的信号分配到与外部器件连线最近的BANK中。2、掌握FPGA内部BANK的分配的情况。现在FPGA内部都分成几个区域,每个区域中可用的I/O管脚数量各不相同。在IC验证中都是采用了ALTERA与XILINX系列的FPGA,这两个厂商的FPGA中内部BANK的分配有一定的差异,这可以在设计中查阅相关的手册。下面与ALTERA中StratixII系列的FPGA内部BANK的分配为例来进行说明。图中详细说明了FPGA内部BANK的分配情况和每个BANK中所支持的I/O标准。根据FPGA中内部BANK的分配的情况,同时结合图1中信号的流向也就可以大体固定FPGA在单板中的方向,同时按照就近的原则将相关的信号分配到相关的BANK中,这样的方法可以完成一般信号的分配。3、掌握所选FPGA每个BANK所支持的I/O标准。从图2中可以看出FPGA内部的每个BANK所支持的I/O的标准不尽相同,所以在管脚的分配时要将支持相同标准的管脚都集中到一个BANK中,因为FPGA中同一个BANK一般不同时支持两种I/O标准,当然也有例外,这就需要查阅相关I/O标准所要求的工作条件。4、关注特殊信号的管脚的分配这里的特殊信号主要是指时钟信号与复位信号,或者是一些要求驱动能力较高的信号。时钟信号一般都是要求分配到全局的时钟管脚,这样获得的时间的延迟将是最小的,驱动也最强。复位信号因为要求同步性好驱动的能力强,所以一般的情况下也会从全局的时钟管脚送入。在分配时钟时,根据时钟的多少分配的策略差别很大,也需要重点关注,这需要查阅相应的手册看哪些时钟分别能到达哪些区域,一般的时钟都是差分时钟,这个时候如果所用的不是差分时钟就需要注意P端与N端一般不能同时分配给不同的时钟信号。如下图所示XILINX系列的FPGA中成对的时钟如果是同时采用那么就不能同时到达相同的区域,因为到达相同区域的时钟线只有一根。所以在时钟较少时最好成对的P和S不要同时使用,而是只是选择P或者是N这样就不会出现冲突的情况。5、兼顾信号完整性的考虑。由于在分配中常常会出现总线分配的情况,同时大量的总线又有可能常常是同时翻转,这样就会带来了一系列信号完整性的问题,所以在管脚分配时大量同时翻转的信号尽量分开。双向口问题小结在工程应用中,双向电路是设计者不得不面对的问题.在实际应用中,数据总线往往是双向的.如何正确处理数据总线是进行时序逻辑电路设计的基础.在程序设计过程中,关键技术在于:实体部分必须对端口属性进行申明,端口属性必须为inout类型,在构造体需要对输出信号进行有条件的高阻控制.在双向电路的处理问题上,常用的处理方式有两种,在介绍双向电路的处理方式之前,先看看双向电路的基本格式:EN