FPGA中关于双工、inout,三态关系梳理

概述

在用FPGA开发通信系统时,经常会遇到FPGA接口的双工通信、FPGA的inout端口定义,以及端口三态等概念,如何理解双工通信、inout及三态这三个概念之间的关系,下面总结梳理如下。

双工通信与inout

双工通信包括全双工通信、半双工通信和单工通信,例如以FPGA作为了一个源来看(即观察目标),全双工通信是指FPGA用两根引脚,分别定义为input输入端口和output输出端口,与外部模块同时双向通信,发送与接收互不影响;半双工通信是指FPGA进行仅用一个引脚,与外部模块进行双向通信,但是发送与接收不能同时进行,这种端口即为inout端口;单工就不用多说了,要么定义为input输入端口或output输出端口,只能实现单向通信。

即在半双工通信中我们引出了inout端口。

三态与inout

三态是指芯片的输出端口有高电平、低电平和高阻态三种状态,高阻态是指该芯片的输出管脚切断了与外部其他芯片的连接,输出端口三态模型如下图:
在这里插入图片描述

用verilog可以表示为assign dataout = (enable == 1’b1) ? 1’bz : logic_data。
三态仅表示输出端口的状态,却是实现inout端口的基础,通过输出高阻态,实现端口输入功能,因此得到inout端口的模型如下图:
在这里插入图片描述

inout模块示例

下面是xilinx的ad_iobuf实现inout模块示例代码,通过该模块可以将对外单端口信号转换为内部logic需要的输入和输出信号。

module ad_iobuf (

  dio_t,
  dio_i,
  dio_o,
  dio_p);

  parameter     DATA_WIDTH = 1;

  input   [(DATA_WIDTH-1):0]  dio_t;//端口输出三态控制端
  input   [(DATA_WIDTH-1):0]  dio_i;//端口输出信号
  output  [(DATA_WIDTH-1):0]  dio_o;//采集到的端口输入信号,供FPGA内部逻辑使用
  inout   [(DATA_WIDTH-1):0]  dio_p;//对外输入输出端口

  genvar n;
  generate
  for (n = 0; n < DATA_WIDTH; n = n + 1) begin: g_iobuf
  assign dio_o[n] = dio_p[n];
  assign dio_p[n] = (dio_t[n] == 1'b1) ? 1'bz : dio_i[n];
  end
  endgenerate

猜你喜欢

转载自blog.csdn.net/weixin_39789553/article/details/114528778