跳转到主要内容

一文彻底掌握inout双向端口

judy 提交于

文章来源:<span id="profileBt"><a href="https://mp.weixin.qq.com/s/eeSl034rRMZm99OmAY6YoA">FPGA入门到精通</a></span&…;

inout端口信号在FPGA中应用还是很广泛的,特别是一些总线通信、数据交互的场景,比如i2c、spi等等。

<strong>一、inout的基本概念</strong>

Inout 端口的实现基础是三态门。
<center><img src="https://fpga.eetrend.com/files/2024-10/%E5%8D%9A%E5%AE%A2/100585336-364…; alt=""></center>

三态门具有三种输出状态,即高电平、低电平以及高阻态(Z)。

高阻态是 Inout 端口实现双向功能的关键所在,通过C来控制三态门的导向变化。

当C=0时,三态门输出处于高阻态(Z)时,它相当于与外部电路断开连接,此时该端口可以作为输入端口接收外部信A。

当C=1时,三态门切换到导通状态,使得信号能够顺利传输到外部,即B = A。

<strong>二、inout 端口特点</strong>

1、inout信号只能声明成wire类型,但位宽可变。

2、inout端口赋值,可以通过?:条件表达式或原语来实现。

3、inout端口一般建议只在顶层模块使用。

<strong>三、inout端口的处理</strong>

1、assign形式

module inout_test
(
input clk,
input rst,
inout data_inout
)

reg data_out;
wire data_in;
wire control;

assign data_inout = control ? data_out : 1'bz ;

assign data_in = data_inout ;

endmodule

2、原语

module inout_test
(
input clk,
input rst,
inout data_inout
)

wire data_out;
wire data_in;
wire control;

IOBUF #(
.DRIVE(12),
.IBUF_LOW_PWR("TRUE"),
.IOSTANDARD("DEFAULT"),
.SLEW("SLOW")
) IOBUF_inst (
.O(data_out),
.IO(data_inout),
.I(data_in),
.T(control)
);

endmodule

<strong>四、仿真测试</strong>

仿真测试激励中,inout端口声明为wire型。

需要分别模拟input和output的行为,以测试模块为基准:

在测试模块读取数据时,赋值有效数据;
在测试模块发送数据时,赋值为高阻态。

reg data_inout_en;
wire data_inout;
reg data_in;

assign data_inout = data_inout_en ? data_in : 1'bz;