目录

1. 概要

2. 三态门

2.1 概念

2.2 三态门建模

3. 双向端口

3.1 HDL语言描述

3.2 直接调用元件库中的模块

3. 仿真

4. 综合


1. 概要

双向端口顾名思义是一种既可以作为输入端口接收数据,也可以作为输出端口发出数据,它对数据的操作是双向的。比如某个设计需要一个 16 位的数据输入口和一个16 位的数据输出口,并且数据输入和输出不会同时发生。 如果数据输入口和输出口分别设计则需要32根数据线,而用双向端口来设计,则只需要16根数据线,这样就节省了16根数据线引脚。在很多情况下,芯片端口是宝贵的设计资源,而且芯片间的连线少对于板级设计也非常有利。因此,双向端口常用于芯片间需要进行半双工双向通信的场合,可以节省一半芯片端口以及减少板上芯片间连接的走线。

常见的一些例子有:

. I2C总线中的SDA信号线

. AXI总线中的数据线

. JESD207接口中的数据线DIQ、等等

在电路层面,双向端口是通过三态缓冲器(也称三态门)控制实现的。在数字电路中,逻辑输出有两个正常态:低电平状态(逻辑0)和高电平状态(逻辑1),此外,电路还有不属于0和1的高阻态(逻辑Z)。所谓高阻,即输出端处于浮空状态,只有很小的漏电流流动,其电平随外部电平的高低而定,门电平放弃对输出电路的控制,或者可以理解为输出和电路是断开的。

2. 三态门

2.1 概念

在数字电路中,逻辑输出有两个正常态:低电平状态(对应逻辑0)和高电平状态(对应逻辑1);此外,电路还有不属于0和1状态的高阻态(对应逻辑Z  )。所谓高阻,即输出端属于浮空状态,只有很小的漏电流流动,其电平随外部电平高低而定,门电平放弃对输出电路的控制。或者可以理解为输出与电路是断开的。最基本的三态缓冲器的逻辑符号如下图:

当OE为高电平时,Dataout与Datain相连,数据流向是从Datain向Dataout;而OE为低时,Dataout为高阻态,相当于与Datain之间的连线断开,此时可以从外部向Dataout驱动信号,实现相反方向的数据流向。

2.2 三态门建模

三态门的RTL描述方式有以下两种等价的方式。

// Tristate Description Using Combinatorial Always Block
// File: tristates_1.v
//module tristates_1 (OE, I, O);input  OE, I;
output O;
reg    O;always @(OE or I)
beginif (OE)O = I;elseO = 1'bZ;
endendmodule
// Tristate Description Using Concurrent Assignment
// File: tristates_2.v
//module tristates_2 (OE, I, O);input  T, I;
output O;assign O = (OE) ? I: 1'bZ;endmodule

3. 双向端口

通常两种双向端口建模的方法。

第一种是直接用HDL语言进行行为级描述,基于以上三态门的RTL描述,稍作修改即可。另一种则是直接调用元件库(cell library)中的模块,比如说Xilinx FPGA中的IOBUF等。后者通常只用于在纯粹的FPGA开发(即FPGA实现就是最终实现)中,在芯片开发中,应该采用第一种,如果采用第二种描述的话,将会导致FPGA综合代码与芯片实现代码不一致,并导致FPGA原型验证的有效性受损,这是应该尽量避免的。

3.1 HDL语言描述

以下为双向端口的两个行为级描述的module例。其中第一个有时钟控制,以同步于时钟沿的方式工作,第二个是存粹的组合逻辑描述方式。前者从综合时序的角度来说会更好一些。

module BIDIR_CLKED
#(parameter    P_WIDTH   = 6'd1       //
)
(
input                CLK  ,
input                OE   ,     // 1: Output port; 0: Input port
input  [P_WIDTH-1:0] DIN  ,
output [P_WIDTH-1:0] DOUT ,
inout  [P_WIDTH-1:0] BIDIR
);reg     [P_WIDTH-1:0] din_reg;
reg     [P_WIDTH-1:0] dout_reg;assign BIDIR = OE ? din_reg : {P_WIDTH{1'bZ}};
assign DOUT  = dout_reg;// Pipelining
always @ (posedge CLK)
begindin_reg <= DIN;dout_reg <= BIDIR;
endendmodule
module BIDIR
#(parameter    P_WIDTH   = 6'd1       //
)
(
input                CLK    ,
input                OE     , // 1: Output port; 0: Input port
input  [P_WIDTH-1:0] DIN    ,
output [P_WIDTH-1:0] DOUT   ,
inout  [P_WIDTH-1:0] BIDIREC
);assign BIDIREC = OE ? DIN : {P_WIDTH{1'bZ}}; // DIN --> BIDIREC
assign DOUT    = {P_WIDTH{~OE}} & BIDIREC;   // BIDIREC --> DOUTendmodule

3.2 直接调用元件库中的模块

不管是FPGA还是ASIC其标准单元库中通常都会包含双向端口单元。以Xilinx为例,它提供了IOBUF单元(另外,还有IOBUF_DIFF_OUT、IOBUFDS等),IOBUF的符号、真值表如下所示(参见UG768):

以下是两个直接实例化IOBUF的代码例。第一个是1比特的双向端口的IOBUF实例化;第二个是一个多比特的双向总线模块,在该模块中实例化了多个IOBUF。

3. 仿真

以下案例取自于一个实际的JESD207接口设计,JESD207接口中DIQ信号线是双向信号线。上半部分代码是DUT中实例化BIDIR_CLKED实现双向端口JESD207.DIQ;下半部分为testbench中的处理。

// ***************************************************************************
//BIDIR instantiation in DUT
wire [11:0] diq_tx;
wire [11:0] diq_rx;
assign diq_rx = ...;
BIDIR_CLKED #(12) u_BIDIR_CLKED
(
.CLK    (CLK      ),
.OE     (DIQ_OE   ),        // 0: RX; 1: TX
.DIN    (diq_tx   ),
.DOUT   (diq_rx   ),
.BIDIREC(DIQ      )
);// ***************************************************************************
//Signal assignment in testbench.
logic diq_oe;        // Connect to DUT.DIQ_OE port
wire [11:0] tx_diq;
wire [11:0] rx_diq;
wire [11:0] diq;     // Connect to DUT.DIQ port
assign diq    = diq_oe ? {12{1'bZ}}: rx_diq;
assign tx_diq = diq;
// ***************************************************************************

需要注意的是,在testbench中,对应于DIQ的信号需要定义成wire类型。此外,对于双向端口/信号的描述,在DUT和testbench中是互补的。如以上代码例所示,由当DUT.DIQ在DIQ_OE的控制下作为输出端口使用,testbench中则应该是要作为输入信号处理,即接收DUT输出的信号;反之,当DUT.DIQ在DIQ_OE的控制下作为输入端口使用,testbench中则应该是要作为输出信号处理,即对DIQ信号进行驱动赋值。

4. 综合

如上所述,作为芯片设计的FPGA原型验证时,应该使用行为级的方式描述双向端口。但是如何确认描述是否正确呢?一般来说仿真当然可以在很大程度确认这一点,但是更为直接方式是针对综合生成电路进行直接确认,确认综合工具是否正确地将行为级描述正确地推断(infer)为IOBUF。

以上所述的JESD207接口的Vivado综合为例,在综合结束后,从Vivado界面点击SynthesisàOpen Synthesized DesignàSchematic打开综合生成的电路图,可以找到如下图所示的对应JESD_DIQ接口电路图。从图中可以明确地看出JESD207接口的DIQ端口被正确地推断为IOBUF。

不管用BIDIR还是用BIDIR_CLKED都可以综合得出以上结果。

芯片综合工具通常也提供查看综合后电路的功能,可以以相同的方式进行直接确认。

参考文献

[1] Tristates • Vivado Design Suite User Guide: Synthesis (UG901)

三态(tri-state)门、双向(bi-directional)端口的建模、仿真和综合相关推荐

  1. 非隔离双向DC DC变换器 buck-boost变换器仿真 输入侧为直流电压源,输出侧接蓄电池

    非隔离双向DC DC变换器 buck-boost变换器仿真 输入侧为直流电压源,输出侧接蓄电池 模型采用电压外环电流内环的双闭环控制方式 正向运行时电压源给电池恒流恒压充电,反向运行时电池放电维持直流 ...

  2. 基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建

    基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建 文章目录 基于双视角图表示算法的双向人职匹配偏好建模推荐系统构建 1. 传统推荐系统模型 2. 协同过滤算法 3. 基于双视角图表示学习算法的模 ...

  3. FPGA设计中inout端口信号的仿真测试

    inout端口作为输入输出口,其在综合中以三态门的硬件形式而存在.但在波形仿真中,其具有输入输出性质就需要特别的操作手法才可以观察到正确的仿真波形. 在inout端口信号的仿真中,测试激励文件中Ino ...

  4. GPIO输入输出各种模式(推挽、开漏、准双向端口)详解---重点双向开漏端口

    GPIO输入输出各种模式(推挽.开漏.准双向端口)详解 原创techexchangeischeap 发布于2017-05-20 10:31:31 阅读数 62961  收藏 展开 技术交流是便宜的博客 ...

  5. 用三态门可实现计算机的什么结构,三态输出TTL门

    OC门虽能实现多个门的输出并联使用,但由于在电源与门的输出之间串入了较大的电阻,因此OC门的负载能力及工作速度都有所降低. ⑴用高阻抗状态实现多个TTL门输出端并接 TTL与非门电路的V3和V4构成推 ...

  6. 【GT的PaddleOCR指南】paddleOCR热(meng)门(bi)Top10

    PaddleOCR问题精选 1.常用的基于深度学习的文字检测方法一般可以分为基于回归的.基于分割的两大类,当然还有一些将两者进行结合的方法. 2.对于中文行文本识别,CTC和Attention哪种更优 ...

  7. 单片机入门:LED双向流水灯(原理图+程序+仿真)

    目录 硬件电路设计 仿真电路设计 程序设计 学习了LED灯的左移和右移后,下面实现LED灯的双向移动点亮. 硬件电路设计 结合51单片机最小系统的知识,利用AD19画好最小系统电路(未包括电源部分). ...

  8. 三态门三个状态vhdl_[转帖]INOUT双向端口仿真 三态门构成 三态门原理 三态门仿真...

    INOUT双向端口仿真 三态门构成 三态门原理 三态门仿真 (2010-04-10 00:17:54) HDL语言的INOUT双向端口仿真暨三态门仿真 ------VHDL和VerilogHDL 概述 ...

  9. Verilog 双向端口

    1.双向端口简介 实现双向端口的典型方法是三态缓冲器也称三态门,它常用于双向数据总线的构建.在数字电路中,逻辑输出有两个正常态:低电平状态(对应逻辑0)和高电平状态(对应逻辑1):此外,电路还有不属于 ...

最新文章

  1. 【小知识点】解决Chrome动画”卡顿”的办法
  2. 简约之美Jodd-http--深入源码理解http协议
  3. Oracle11g 备份和恢复的方法
  4. JSBinding+SharpKit / 更新的原理
  5. Oracle 与 Mysql NULL值,空字符串''的区别
  6. Codeforces 814C - An impassioned circulation of affection
  7. C#反射与特性(一):反射基础
  8. 纪中A组模拟赛总结(2021.7.13)
  9. VS2010不能编译.Net3.5项目的解决方法
  10. java自定义栈类代码,异常堆栈和自定义类
  11. Windows进程通信之共享内存通信(C++)
  12. Weblogic负载均衡/Session复制之集群架构续
  13. Permutations
  14. Android API之android.view.View.MeasureSpec
  15. HTML Table 表格斜线
  16. STC单片机程序下载 STC-ISP软件 和 普中ISP软件 介绍以及使用,图文解释
  17. U转串口时,鼠标乱动,解决办法
  18. 隐私计算:数据脱敏、匿名化、假名化、差分隐私和同态加密
  19. MAC地址 单播,组播,广播
  20. 开闭原则的例子_开闭原则

热门文章

  1. crc校验c语言程序,C语言:CRC校验
  2. internet信息服务器在哪,win10系统Internet信息服务的位置在什么地方如何打开
  3. java小迷弟_论身边有个小迷弟是什么感觉?
  4. 嵌入式Linux应用程序开发详解教程含源代码例子
  5. ionic2微信支付,分享,登录
  6. 云南各地代表性方言辞典
  7. 高级计算机网络技术北邮考试,北邮高级计算机网络技术-英文课件-马严7-IPv6-17.pdf...
  8. 酒桌上的DOTA原理
  9. 怎么使用 Buildroot 构建根文件系统
  10. lc0422lc0423