IOBUF的用法

  IOBUF这个原语在Xilinx的原语手册有说明,主要作为三态端口使用,作用是把FPGA内部三态信号与外部的双向信号连接。对于UltraScale
系列芯片说明文档为:ug974-vivado-ultrascale-libraries.pdf,对于Z7系列芯片说明文档为:ug953-vivado-7series-libraries.pdf。可自行到xilinx官网下载。笔者粗略对比两文档中的IOBUF原语,发现差别不大,Z7多了些参数设置,大多情况默认即可。下面为UltraScale文档IOBUF部分说明:

  根据上述大段的英文介绍笔者大概了解关键信息:当信号T为1时,IOBUF作为输入;T为0时IOBUF作为输出。

  实际使用时,方向引脚对应T,代码模块输出对应IOBUF的I,代码块输入对应IOBUF的O。需要注意代码块的引脚方向信号必须是1为输入,0为输出,IOBUF的IO脚直接连FPGA引脚。

  UltraScale官方代码如下:

 1 // IOBUF: Input/Output Buffer
 2 // UltraScale
 3 // Xilinx HDL Language Template, version 2020.1
 4 IOBUF IOBUF_inst (
 5 .O(O), // 1-bit output: Buffer output
 6 .I(I), // 1-bit input: Buffer input
 7 .IO(IO), // 1-bit inout: Buffer inout (connect directly to top-level port)
 8 .T(T) // 1-bit input: 3-state enable input
 9 );
10 // End of IOBUF_inst instantiation

  Z7官方代码如下:

 1 // IOBUF: Single-ended Bi-directional Buffer
 2 // All devices
 3 // Xilinx HDL Language Template, version 2020.1
 4 IOBUF #(
 5 .DRIVE(12), // Specify the output drive strength
 6 .IBUF_LOW_PWR("TRUE"), // Low Power - "TRUE", High Performance = "FALSE"
 7 .IOSTANDARD("DEFAULT"), // Specify the I/O standard
 8 .SLEW("SLOW") // Specify the output slew rate
 9 ) IOBUF_inst (
10 .O(O), // Buffer output
11 .IO(IO), // Buffer inout port (connect directly to top-level port)
12 .I(I), // Buffer input
13 .T(T) // 3-state enable input, high=input, low=output
14 );
15 // End of IOBUF_inst instantiation

  根据三态门的原理可以通过代码把3态门表示出来,为了不与IOBUF的名称相冲突,该模块改为PIN脚的PIOBUF:

 1 module PIOBUF
 2     (
 3         inout        IO  ,
 4         input        T   ,
 5         input        I   ,    
 6         output       O     
 7     );
 8 
 9     assign O      = IO;        
10     assign IO     = ~T ? I : 1'bz; 
11     
12 endmodule
 1 module PIOBUF
 2     (
 3         inout        IO  ,
 4         input        T   ,
 5         input        I   ,    
 6         output       O     
 7     );
 8 
 9     assign O      = T     ? IO : I;        
10     assign IO     = ~T    ? I  : 1'bz;
11     
12 endmodule

  以上便是最常见的两种三态门写法,很多双向口都是使用该方法。实际上这两种方式是一样的,assign语句是线型,所以当T为0时,直接把I的值赋给O与先把值赋给IO,IO再赋给O,结果是一样的。

  根据Xilinx的IOBUF原语T=0时,I与O信号是连接的特性,可以实现一些接口的小妙用。比如对于音频接口I2S,如果RX与TX作为两个模块,在FPGA作为时钟WCLK,BCLK输出,同时使用数据输出输入时,那么WCLK,BCLK分别使用IOBUF连接可以简单的解决既能发送数据,也能采样接收的数据。也可以在GPIO使用,三态口接IOBUF,输出高低电平时可以通过读取输入得到实际输出状态。

   T=1时,3态的原语的I/O端口到input的路径是断路,不连通的

posted on 2022-05-23 12:48  Galois_V  阅读(6463)  评论(0编辑  收藏  举报