Xilinx IOBUF 的用法

这篇具有很好参考价值的文章主要介绍了Xilinx IOBUF 的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Xilinx IOBUF 的用法

一、概念

Xilinx IOBUF 的用法

1. 基本概念

应用场景: 在vivado中,连接的管脚的信号一般都会自动添加OBUF或IBUF。但是对于inout类型的接口,不会主动添加IOBUF,因为in/out切换需要控制信号,需要用户自己分配好。

Xilinx官网原文: The IOBUF primitive is needed when bidirectional signals require both an input buffer and a 3-state output buffer with an active-High 3-state T pin. The IOBUF is a generic IOBUF. A logic-High on the T pin disables the output buffer. When the output buffer is 3-stated (T = High), the input buffer and any on-die receiver termination (uncalibrated or DCI) are ON. When the output buffer is not 3-stated (T = Low), any on-die receiver termination (uncalibrated or DCI) is disabled.

I/O attributes that do not impact the logic function of the component such as IOSTANDARD, DRIVE and SLEW should be supplied to the top-level port via an appropriate property. For details on applying such properties to the associated port, see the Vivado Design Suite Properties Reference Guide (UG912).

个人翻译: 当双向信号需要输入缓冲区和带active-High 3态T引脚的3态输出缓冲区时,需要IOBUF原语。IOBUF是一个通用的IOBUF。T为高电平时关闭output buffer(I端口)。当output buffer为3-state (T = High)时,input buffer和任何固定接收器终端(未校准或DCI)均为有效。当输出缓冲区不是3-state (T = Low)时,任何固定接收器终端(未校准或DCI)都是禁用的。

不影响组件逻辑功能的I/O属性(如IOSTANDARD、DRIVE和kill)应该通过适当的属性提供给顶级端口。有关将这些属性应用到相关端口的详细信息,请参见Vivado设计套件属性参考指南(UG912)。

Vivado原语:

// IOBUF: Single-ended Bi-directional Buffer
//        All devices
// Xilinx HDL Language Template, version 2017.2
    
IOBUF #(
      .DRIVE(12), // Specify the output drive strength
      .IBUF_LOW_PWR("TRUE"),  // Low Power - "TRUE", High Performance = "FALSE"
      .IOSTANDARD("DEFAULT"), // Specify the I/O standard
      .SLEW("SLOW") // Specify the output slew rate
   ) IOBUF_inst (
      .O(O),   // 1-bit output: Buffer output
      .I(I),   // 1-bit input: Buffer input
      .IO(IO), // 1-bit inout: Buffer inout (connect directly to top-level port)
      .T(T)    // 1-bit input: 3-state enable input
   );

个人理解: 这玩意儿的解释有点绕,我们结合结构图原文原语来总结一下,大致是这么个意思:

首先,我为什么说它绕,因为IOBUF的O指的是IO_pin >> FPGA,也就是说这里的Output输出的主语是IO_pin,而不是FPGA;这里的 I 指的是IO_Pin << FPGA,同样主语是IO_pin,这里指的是输入到IO_pin。所以第一次使用的时候容易弄混。

再与结构图结合就很容易理解了,三态门T控制的是I端口能否有效输入:

  • T拉高时,I端口停止工作,O端口向FPGA内部输出信号;
  • T拉低时,I端口向IO_pin输入来自FPGA内部的信号,此时 O = I(因为O端口从这个方向上来说也是 I 的分支);

2. 硬件结构

2.1 IOBUF

官网原图:

Xilinx IOBUF 的用法

Vivado综合后的RTL视图:

Xilinx IOBUF 的用法

真值表:

Inputs
Bidirectional
Outputs
T
I
IO
O
1
X
Z
IO
0
1
1
1
0
0
0
0

接口描述:

Port Direction Width Function 带有个人情感色彩的翻译
I Input 1 Input of OBUF. Connect to the logic driving the output port. OBUF的输入端,连接到Output端口的逻辑驱动
IO Inout 1 Bidirectional port to be connected directly to top-level inout port. 双向端口被直接连接到顶层的inout端口
O Output 1 Output path of the buffer. IOBUF的输出路径
T Input 1 3-state enable input signifying whether the buffer acts as an input or output. 3态门启用输入,表示IOBUF是作为输入还是作为输出。
2.2 OBUFT

Xilinx IOBUF 的用法

真值表:

Inputs
Outputs
T
I
O
1
X
Z
0
1
1
0
0
0

接口描述:

Port Direction Width Function 带有个人偏见的翻译
I Input 1 Input of OBUF. Connect to the logic driving the output port. OBUF的输入端,连接到Output端口的逻辑驱动
O Output 1 Output of OBUF to be connected directly to top-level output port. OBUF的输出端被直接连接到顶层的output端口
T Input 1 3-state enable input. 三态门使能输入

二、实例

首先我们想象这样一个应用场景:

因为某些原因,ARM不能直接连接到PHY芯片上,所以需要通过FPGA间接与PHY芯片相连接,这个时候我们就有以下引脚:

input  i_arm_mdc,
inout  io_arm_mdio,
output o_phy_mdc,
inout  io_phy_mdio

而根据MDIO协议:

Xilinx IOBUF 的用法

Xilinx IOBUF 的用法

IO端口切换输入输出模式的根据是OP位,所以我们可以先设置一系列寄存器来存储io_arm_mdio的input内容,以及读写变化使能。

reg      	        s_mdio_rd_en;
reg      [35:00]    s_mdio_word ;
reg      [01:00]    s_mdio_op   ;	
reg      [05:00]    s_cnt_mdio  ;
reg                 s_add_mdio  ;
wire				s_arm_out	;
wire                s_phy_out	;

assign o_phy_mdc = i_arm_mdc	;

always @(posedge i_arm_mdc or negedge i_rst_n)begin   
    if(!i_rst_n) begin
	    s_mdio_word <= 36'b0;
	end
	else begin
		s_mdio_word <= {s_mdio_word[34:00],s_arm_out};
	end
end

/* ---- mdio contrl ---- */
always @(posedge i_arm_mdc or negedge i_rst_n) begin
    if (!i_rst_n) begin
        s_add_mdio <= 1'b0;
        s_mdio_op  <= 1'b0;
    end 
    else begin
		if((s_mdio_word==36'hffffffff6||s_mdio_word==36'hffffffff5) && s_mdio_trans_cnt == 8'd35)
            s_add_mdio <= 1'b1;
		else if(s_cnt_mdio >= 16'd27)
            s_add_mdio <= 1'b0;
        else 
            s_add_mdio <= s_add_mdio;
        if (s_add_mdio) 
            s_cnt_mdio <= s_cnt_mdio + 1'b1;
        else
            s_cnt_mdio <= 1'b0;
		if(s_mdio_word==36'hffffffff6 && s_mdio_trans_cnt == 8'd35)
            s_mdio_op <= Read_bits;
        else if (s_mdio_word==36'hffffffff5 && s_mdio_trans_cnt == 8'd35)
            s_mdio_op <= Write_bits;
		else
			s_mdio_op <= s_mdio_op;
	end
end

always @(posedge i_arm_mdc or negedge i_rst_n)begin   
    if(!i_rst_n)begin
		s_mdio_rd_en <= 1'b0;
	end
	else begin
		if(s_cnt_mdio>=6'd9 && s_mdio_op == Read_bits)/* 5-bit PHY_ADDR + 5-bit Reg_ADDR = 10-bit */
			s_mdio_rd_en <= 1'b1;
		else
			s_mdio_rd_en <= 1'b0;
	end
end

在需要的参数都准备好后,就可以开始使用原语了:

IOBUF #(
            .DRIVE(12),              // Specify the output drive strength
            .IBUF_LOW_PWR("TRUE"),   // Low Power - "TRUE", High Performance = "FALSE"
            .IOSTANDARD("DEFAULT"),  // Specify the I/O standard
            .SLEW("SLOW")            // Specify the output slew rate
    ) IOBUF_inst_arm (
            .O (s_arm_out      ),    // 
            .IO(io_arm_mdio    ),    // 
            .I (s_phy_out     ),    // 
            .T (!s_mdio_rd_en )     // 3-state enable input, high=input, low=output
    );
IOBUF #(
            .DRIVE(12),              // Specify the output drive strength
            .IBUF_LOW_PWR("TRUE"),   // Low Power - "TRUE", High Performance = "FALSE"
            .IOSTANDARD("DEFAULT"),  // Specify the I/O standard
            .SLEW("SLOW")            // Specify the output slew rate
    ) IOBUF_inst_phy (
            .O (s_phy_out      ),    // 
            .IO(io_phy_mdio    ),    // 
            .I (s_arm_out      ),    // 
            .T (s_mdio_rd_en  )     // 3-state enable input, high=input, low=output
    );

最后综合出来的结果就是这个样子:
Xilinx IOBUF 的用法

三、参考文献

Xilinx: IOBUF English

Xilinx: OBUFT English

KevinChase:【FPGA】xilinx IOBUF的用法文章来源地址https://www.toymoban.com/news/detail-413920.html

到了这里,关于Xilinx IOBUF 的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA之IOBUF功能解释小结

    目录 一、序言 二、IOBUF 例化 三、IOBUF verilog实现 四、IOBUF 综合结果         在verilog设计中,通常端口使用更多的申明为input,output,即输入到FPGA内部,以及FPGA输出到外部,都是单向传输,对于双向传输的场景需要使用到inout类型。         在xilinx中例化使用双向端口

    2024年02月13日
    浏览(10)
  • Xilinx 7系列FPGA全局时钟缓冲器基本单元

    Global Clock Buffer Primitives(全局时钟缓冲器基本单元)在FPGA(现场可编程门阵列)和其他数字系统中扮演着至关重要的角色。这些基本单元被设计用于处理、分配和增强时钟信号,以确保系统中的各个组件都能以精确和同步的方式工作。 表2-2中的基本单元代表了全局时钟缓冲

    2024年04月23日
    浏览(50)
  • FPGA学习_Xilinx7系列FPGA基本结构

    参考:https://xilinx.eetrend.com/content/2019/100042384.html xilinx7系列FPGA主要包括:Spartan®-7、Artix®-7、Kintex®-7、Virtex®-7。其性能/密度/价格也随着系列的不同而提升。 Spartan7 系列拥有最低的价格、最低的功耗、最小的尺寸以及最低的设计难度,一些低端应用中极为合适。 Artix7 系列相

    2024年04月09日
    浏览(68)
  • 零基础学FPGA(八):可编程逻辑单元(基本结构,Xilinx+Altera)

          在写这篇文章之前,对这个专栏做一个补充解释。本来按我之前的想法是,把这个专栏写成一个比较层次化,一层一层慢慢深入的系统化专栏。但是,在工作的时候,刚好在做某一件事,在这个时间段,对这个知识点比较深刻,所以就提前把这篇文章写了,导致此专

    2024年02月01日
    浏览(36)
  • 映射的概念以及用法

    在数学里, 映射 是个术语,指两个元素的集之间元素相互 “对应”的关系 ,为名词。映射,或者射影,在数学及相关的领域经常等同于函数,函数是从非空数集到非空数集的映射,而且只能是一对一映射或多对一映射。 基于此,部分映射就相当于部分函数,而完全映射相

    2023年04月10日
    浏览(11)
  • Web Worker的概念、用法、使用场景

    ​ 目录 1. 简介 2. 适用场景 2.1 复杂计算 2.2 后台下载 2.3 数据处理 2.4 实时通信 3. 代码示例 3.1 Worker特性检测 3.2 Worker API 3.3 SharedWorker API 3.4 创建 JavaScript 文件 3.5 创建 Web Worker 4. 总结 Web Worker  使得在一个独立于 Web 应用程序主执行线程的后台线程中运行脚本操作成为可

    2024年02月08日
    浏览(22)
  • ES6: Symbol概念与用法举例

    概念: ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值。 1- 使用Symbol作为对象属性名 举例理解: a.给对象添加独一无二的属性 b. 便于定义公共库 这里封装属性和方法时, 全部采取Symbol类型, 这样别人就算往里面加name、age等同名的属性或方法, 也不会影响对象原本使

    2024年02月15日
    浏览(22)
  • 英语写作中“概念”concept 、notion、idea的用法

    一、概念concept、notion 是同义词,一般可以互换,例如: The notion/concept of public keys is introduced in the paper “New Direction of Cryptography” half a century ago. Public keys have been widely accepted as a cryptographic concept/notion nowadays.(公钥的概念在半个世纪前的一篇文章“密码学的新方向”中提

    2024年04月09日
    浏览(25)
  • Go语言Context (ctx)的基础概念与用法

    ctx 字面意思 上下文 ,是golang中特有的一种语法,几乎每一个程序中都会通篇传递着一个 ctx 。而一些框架又对其进行二次封装,诸如Gin框架中的 c *gin.Context 。因此此次进行 ctx 的学习并记录。 这是 ctx 的接口部分,其提供了一个接口及许多函数、结构体(如图)。 其通过

    2024年01月22日
    浏览(27)
  • vuex 的基本用法

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用 集中式存储管理 应用的所有组件的状态, 这个状态管理应用包含以下几个部分: state,驱动应用的数据源; view,以声明方式将 state 映射到视图; actions,响应在 view 上的用户输入导致的状态变化。 给出一张官方的

    2024年02月11日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包