Verilog使用inout信号的方法

目录

一、inout在设计文件中的使用方法

1.1、inout的第一种使用方法

1.2、inout实现的第二种使用方法

1.3、inout使用总结

 二、inout在仿真测试中的使用方法


一、inout在设计文件中的使用方法

在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPI Flash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。

1.1、inout的第一种使用方法

  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电平和高阻态三种状态,在FPGA中,一个三态门的结构如下图所示:

描述这个逻辑的Verilog代码如下:

module inout_top
(
input       I_data_in        ,
inout       IO_data          ,
output     O_data_out     ,
input       Control
);

assign IO_data = Control ? I_data_in : 1'bz ;
assign O_data_out = IO_data ;

endmodule

当Control为1时,IO_data为输出,输出I_data_in的值

当Control为0时,IO_data为输入,把输入的信号赋值给O_data_out

这段代码在Vivado2015.4.2编译环境下的RTL图如下图所示

在ISE14.7的编译环境下的RTL图如下图所示

 

 

可以发现在Vivado2015.4.2环境的Control信号的IBUF后面居然还综合出了一个LUT,在ISE14.7环境下Control信号后面综合出了一个反向器,出现这个LUT和反向器的原因是Control为1才把IO_data设置成输出,而在Xilinx中一个IOBUF资源默认T端为0时IO端才为输出,T端为1时,IO端为输入,所以把

assign IO_data = Control ? I_data_in : 1'bz ;//Control=1时 作为输出

改为

assign IO_data = (Control == 1’b0) ? I_data_in : 1'bz ;//Control=0时 作为输出

在Vivado2015.4.2环境下综合出的RTL图为下图

在ISE14.7的环境下综合出的RTL图如下图所示

 

 

显然,Vivado环境中LUT和ISE环境中的反相器不见了,节省了1个Cell资源。

1.2、inout实现的第二种使用方法

以上是处理inout的第一种方法,第二种处理inout信号的方法是调用Xilinx的IOBUF原语,IOBUF的原语可以在Vivado2015.4.2的Language Templates中找到。

调用这个原语的Verilog代码如下:

module inout_top
(
input   I_data_in,
inout   IO_data  ,
output  O_data_out  ,
input   Control
);

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_data_out),     // Buffer output
  .IO(IO_data),   // Buffer inout port (connect directly to top-level port)
  .I(I_data_in),     // Buffer input
  .T(Control)      // 3-state enable input, high=input, low=output
);

endmodule

 在Vivado2015.4.2环境下综合出的RTL图如下图所示

在ISE14.7环境下综合出的RTL图如下图所示

 

显然和  assign IO_data = (Control == 1’b0) ? I_data_in : 1'bz ;这种情况下综合出的RTL完全一样。

1.3、inout使用总结

利用Verilog处理双向信号有两种方式:

  1、写代码

assign IO_data = (Control == 1’b0)? I_data_in : 1'bz ;
assign O_data_out = IO_data ;

  2、例化IOBUF原语

    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_data_out),     // Buffer output
      .IO(IO_data),   // Buffer inout port (connect directly to top-level port)
      .I(I_data_in),     // Buffer input
      .T(Control)      // 3-state enable input, high=input, low=output
    );

 二、inout在仿真测试中的使用方法

Verilog中使用inout如何编写以及仿真 - 百度文库

  • 17
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子木呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值