ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IOBUF的用法

2022-05-23 13:00:56  阅读:1033  来源: 互联网

标签:Buffer IOBUF 用法 IO output input assign


  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,输出高低电平时可以通过读取输入得到实际输出状态。

 

标签:Buffer,IOBUF,用法,IO,output,input,assign
来源: https://www.cnblogs.com/WenGalois123/p/16300448.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有