FPGA中双向端口inout的设计_第1页
FPGA中双向端口inout的设计_第2页
FPGA中双向端口inout的设计_第3页
FPGA中双向端口inout的设计_第4页
FPGA中双向端口inout的设计_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本周总结、FPGA中双向端口inout的设计1.1双向端口的实现:芯片外部引脚很多都使用inout类型的,为的是节省管脚。一般信号线用做总线等双向数据传输的时候就要用到INOUT类型了。就是一个端口同时做输入和输出。inout在具体实现上一般用三态门来实现。三态门的第三个状态就是高阻Z'。当inout端口不输出时,将三态门置高阻。双向端口inout模式的设计也必须考虑到三态的使用,其实是高阻的使用。这是因为,当双向端口在完成输入的时,必须使原来呈输出模式的端口呈高阻态,否则,待输入的外部数据势必会与端口处原有电平发生'线与”。也就是说,在内部模块最好不要出现inout,如果确实需要,那么用两个port实现,到顶层的时候再用三态实现。理由是:在非顶层模块用双向口的话,该双向口必然有它的上层跟它相连。既然是双向口,则上层至少有一个输入口和一个输出口联到该双向口上,则发生两个内部输出单元连接到一起的情况出现,这样在综合时往往会出错。双向端口inout模式本身不难,难就难在其测试文件编写及仿真设置。FPGA中实现双向端口的关键:FPGA内部线延时难以控制,如果不经过Register将增加InputDelay和OutputDelay。对外部器件速度的要求更加苛刻时序容限缩小。WFPGA的IOB中本身就有register,不用白不用。所以,为了提高单板设计速度,提^O工作的有效频率,所有的输入输出信号都经过寄存器处理。从而放宽对外部电路或其它芯片的时序要求。设计中需要注意以下方面分:(1) IOB中包含有输入寄存器(或锁存器)、输出寄存器和输出三态控制寄存器。在设计中,应当将三态控制寄存器、输入输出寄存器、三态电路都移AIOB中(可在布局布线工具中进行设置)以减少CLB的使用量。为实现这一目的,需采用同样的时钟触发和同样的复位电路,而且三态控制低电平有效,否则三态寄存器无法引进IOB,增加信号输出延时。(2) 另外为了满足外部保持时间要求,在外部引脚和IOB输入触发器(或锁存器)的D输入端之间有一个延时块。如果不需要,可以通过NODELAY设置(可通过UCF)去掉输入寄存器的延时块。(3) 通过综合工具可以控制I/O管脚的边沿速率(Slewrate)。不管I/O配置成输入、输出还是双向,都能在IOB中获得上拉和下拉电阻。缺省时所有未用的IOB都配置为接上拉电阻的输入信号。UCF中对IO进行约束的命令:#defineIOstandardandslewrateNETRGMII_TXD_0<0>LOC=J16|IOSTANDARD=LVCMOS33|SLEW=FAST;PlaceflipflopsinIOBsINST"*gmii0?RX_ER_TO_MAC"IOB=true;IDELAYondatapathtoalignitwiththeclockINST"*gmii_rxd?_delay"IOBDELAY_TYPE=FIXED;INST"*gmii_rx_er_delay"IOBDELAY_VALUE=0;INST"*gmii_rx_clk_0_delay"IOBDELAY_VALUE=31;二、三态总线的实现moduleUni_dir_bus(data_to_bus,ckt_to_bus,bus_enable);inputbus_enable;input[3:0]ckt_to_bus;output[3:0]data_to_bus;assigndata_to_bus=(bus_enable)?ckt_to_bus:32'bz;endmodule■:=■..Design I•(Scfc^wn-.lUm_*bJHjs]-JKisddJnjMpqdFta„laJwrljlt|氐M*㈣endmodule■:=■..Design I•(Scfc^wn-.lUm_*bJHjs]-JKisddJnjMpqdFta„laJwrljlt|氐M*㈣f ♦"ttMUI~.任MliCFiJcuiuiPtCIcUjbM|l|mjojuii|LbI'*^v9虹Il(fltfirHtfwA* ^litdn「Hi;~ ' —' —'£7_|m上二DesignVision综合结果(原理图)FPGA综合结果(原理图)gduiaoUtede*deletegduiaoUtede*deletedee<WfnMehndtoHogrataeaXocMte■oUe条lilinxFPCAEditor-Om_dir_bua.ned-l^lockl-VievSiteP190nthCoapdat*_to_t)u«<2>]EE8|还Eil«-X。修旧僵|X|国田|・|63|回购|:供]敏|.1回。1▲限iibEKi网・■[■n:Data_to_busiob三、双向接口的实现:moduleBi_dir_bus(data_to_from_bus,data_from_bus,ckt_to_bus,send_data,rcv_data);inout[1:0]data_to_from_bus;output[1:0]data_from_bus;inputsend_data,rcv_data;input[1:0]ckt_to_bus;assigndata_from_bus=(rcv_data)?data_to_from_bus:4'bz;assigndata_to_from_bus=(send_data)?ckt_to_bus:4'bz;endmoduleBi_dir_bu3—3Bi_dir_bu3data_to_fron|_b~.tri[O]TBUickt_to_bu3[1:0]ckt_to_bus[0]bus[O]data_to_from_b~data_to.data_to_from_b~data_to_from_b~data_to_from_b~da|a_frOTaTBUIbu3_tri{1]data_lfrom_bus(1]data_from_bu3[1]daia_frOTnTBUIDesignVision-TopLevel.1-[Schematic.!Bi_dir_bus]-Bi_dir_bu:OFileEditViewSelectUstHierarchyDesignSchematicAttributesTimingTestWindovHe©Design_vision综合结果(原理图)这个双向接口设计包含两个三态门(输入输出各一个),可以很清楚地看到输入输出如何通过一个pad实现。但是,对于输入接口的三态门是冗余的,可以在实际的设计中去掉以简化设计。

FPGA综合结果(原理图)「)。十。tnfrcmRiiqTCRData_from_busIOB四、FPGA中双向端口I/O设计实例(参考文献:莫海永,张申科:同济大学电子与信息工程学院上海200092)双向端口顾名思义是一种既可以作为输入端口接收数据,也可以作为输出端口发出数据,它对数据的操作是双向的。比如某个设计需要一个16位的数据输入口和一个16位的数据输出口,并且数据输入和输出不会同时发生。如果数据输入口和输出口分别设计则需要32根数据线,而用双向端口来设计,则只需要16根数据线,这样就节省了16根数据线引脚。1、FPGA中双向端口的设计原理和Verilog硬件语言程序设计首先介绍双向端口在FPGA内部硬件资源是怎样实现的。在FPGA中它是通过对三态门控制来实现双向端口的,比如在Xilinx的Spartan2E中的图例(如图1所示):图1双向端口的硬件图由上图可见,双向端口只在输出方向采用一个三态门,在输入方向没有三态门。这是因为,当数据从芯片内部经双向端口输出到芯片外部时,输出数据只会返回到芯片内模块的输入端口,不会遇到发生冲突的信号,因此不会影响芯片内模块的功能。当数据从芯片外部经双向端口输入到芯片外部时,如果不采用三态门置高阻,则会发生输入芯片的数据和芯片内模块的输出数据相撞的情况,导致不同信号在相同的信号线上发生冲突,影响芯片内模块的功能。当z=0时,上面输出的管子开通,此时数据可以从上面的管子中输出,这时双向端口就作为输出口;当z=1时,上面的管子被置为高阻态,数据不能从上面的管子输出,此时数据只可以从下面的管子由外向内输入,这时的双向端口是输入口。限于篇幅,我们做一个简单的模型来说明双向端口的设计。下面我们用Verilog硬件语言进行双向端口的程序设计,为了看出双向端口分别作为输入端口和输出端口的功能,我们的模块分别定义一个数据输入口din和一个数据输出口dout,一个三态门选通信号z,触发时钟clk,还有双向端口dinouto我们设数据为8位宽。图2为该模块图:Fii>-如(硕 : 派邮:明》图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]dinreg;assigndinout=(!z)?din_reg:8'bz;always@(posedgeclk)beginif(!z)din_reg<=din;elsedout<=dinout;endendmodule为了清楚地看到综合结果,在综合之前对总线宽度减小为2bit。Design_vision综合结果(原理图)FPGA综合结果(原理图)

DinoutIOB这是布线图,从图中可以看到,双向端口并没有占用Slice中的寄存器资源,完全采用IOB中包含的寄存器来实现了双向端口输入输出数据的寄存。2、仿真及初始化双向端口下面我们对上述程序进行时序仿真。这里我们选用的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;i<10;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),.di

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论