inout 介绍

芯片的许多外部引脚使用输入式来节省管脚。通常,当信号线用于双向数据传输(例如总线)时,使用 inout 类型。也就是说,端口同时用于输入和输出。inout 通常在特定实现中通过三态门实现。三态栅极的第三种状态是高阻抗'Z'。当输入端口不输出时,将三态栅极设置为高阻抗。这样,信号就不会因为两端同时输出而出错。

使用说明

1. 使用 inout 类型数据,可以这样写:

 inout    data_inout;input    data_in;reg      data_reg;reg      link_data;
assign data_inout = link_data? data_reg: 1'bz;

对于 data_reg,可以通过组合逻辑或顺序逻辑根据data_in进行分配。

通过控制 link_data 级的高、低功率,从而设置 data_inout 输出数据或处于高阻抗状态,如果处于高阻抗状态,此时作为输入端口可以通过使用 link_data 相关电路进行控制。

2. 写入测试模块,对于输入类型的端口,需要定义为 wire 类型变量,而其他输入端口都定义为 reg 类型,

两者是有区别的。

当将上面示例中的data_inout用作输入时,需要将其分配给data_inout,其余部分可以断开连接。

这时,可以使用 assign 语句来实现:assign data_inout = link?Data_in_t: 1'bz;

其中 link 和 data_in_t 是 reg 类型变量,在测试模块中分配值。

此外,可以设置输出端口以观察 data_inout 用作输出的情况:

并且在 RTL 中,inout 在顶部模块中输入使用  不要在子模块中使用 inout(tri)

换句话说,最好不要在内部模块中有 inout。如果确实需要它,请使用两个端口来实现它,然后在达到顶层时使用三态实现。原因是:如果一个非顶层模块中使用了一个双向端口,那么这个双向端口的上层必须连接到它。由于是双向端口,因此至少将一个输入端口和一个输出端口连接到上层的双向端口,并且将两个内部输出单元连接在一起,这在合成过程中经常出错。对于双向端口,我们可以将其理解为两个组件:输入组件和输出组件。此外,还需要一个控制信号来控制输出组件的输出时间。

module dual_port (  inout_pin, );
inout    inout_pin;
wire     inout_pin;
wire     input_of_inout;
wire     output_of_inout;
wire     out_en;
assign input_of_inout = inout_pin;
assign inout_pin = out_en? output_of_inout: 1'bz;
endmodule  

可以看出,此时 input_of_inout 和 output_of_inout 可以作为普通信号使用。

在仿真过程中,要注意双向端口的处理。如果直接连接到另一个模块的双向端口,就足以保证当一个模块输出时,另一个模块没有输出(处于高阻抗状态)。

如果在 ModelSim 中作为单独的模块进行仿真,那么当模块输出时,不能使用 force 命令将其设置为高阻抗,而是使用释放命令来释放总线。

源代码:

module xx(data_inout , ........);
inout data_inout;
assign data_inout = (!link) ? datareg : 1'bz;
endmodule  

方法一:使用相反的控制信号输入端口,相当于在两个模块之间使用 inout 双向端口互连。这种方法应该注意,赋值语句只能放在 initial 和 always 块中。

module test();wire  data_inout; reg   data_reg; reg   link;
initial begin..........
end
assign data_inout = link ? data_reg : 1'bz; endmodule

方法2:使用force和reless语句,但这种方法不能准确反映双向端口的信号变化,但这种方法可以在块中反转。

module test();
wire    data_inout;
reg     data_reg;
reg     link;
initial begin  .....
end
assign data_inout = link ? data_reg : 1'bz;
endmodule  

示例

module bidirection_io(
inner_port,
out_en,
outer_port
);
input        out_en;
inout [7:0]  inner_port;
inout [7:0]  outer_port;
assign outer_port = (out_en==1) ? inner_port : 8'hzz;
assign inner_port = (out_en==0) ? outer_port : 8'hzz;
endmodule  

在仿真过程中,需要验证双向端口是否正确输出数据并正确读取数据。因此,有必要驱动out_en端口。

当 out_en 端口为1时,测试平台驱动 inner_port 端口,然后检查 outer_port 端口输出的数据是否正确;当 out_en 端口为0时,测试台驱动 outer_port 端口,然后检查 inner_port 端口读取的数据是否正确。由于 inner_port 和 outer_port 端口都是双向端口,因此驱动方法与单向端口不同。

用Verilog代码编写的 testbench 如下。

`timescale 1ns/10ps
module tb();
reg  [7:0]   inner_port_tb_reg;
wire [7:0]   inner_port_tb_wire;
reg  [7:0]   outer_port_tb_reg;
wire [7:0]   outer_port_tb_wire;
reg          out_en_tb;
integer   i;
initial beginout_en_tb=0;inner_port_tb_reg=0;outer_port_tb_reg=0;i=0;repeat(20)begin#50i=$random;out_en_tb=i[0]; inner_port_tb_reg=$random;outer_port_tb_reg=$random;end
end
assign inner_port_tb_wire=(out_en_tb==1)?inner_port_tb_reg:8'hzz;
assign outer_port_tb_wire=(out_en_tb==0)?outer_port_tb_reg:8'hzz;
bidirection_io bidirection_io_inst(.inner_port (inner_port_tb_wire),.out_en     (out_en_tb),.outer_port (outer_port_tb_wire)
);
endmodule  

【Verilog】inout 端口信号的使用相关推荐

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

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

  2. Verilog inout端口使用详解

    理解 来源特权同学-https://www.eefocus.com/ilove314/blog/11-09/231507_10e01.htmlinout用法浅析有感于之前IIC通信中第一次使用veri ...

  3. Verilog中inout端口的使用方法

    Verilog中inout端口的使用方法 (本文中所有Verilog描述仅为展示inout端口的用法,实际描述则需要更丰富的功能描述) Inout端口的使用 在芯片中为了管脚复用,很多管脚都是双向的, ...

  4. 双向端口inout端口

    verilog里如何处理io成双向 在查阅了各种书和帖子之后,总结了以下inout端口的使用注意事项. (以下资料来源: <Xilinx FPGA开发实用教程 第二版> https://w ...

  5. testbench inout端口处理

    转载自:点击打开链接 1 testbench 的技巧 1)如果激励中有一些重复的项目,可以考虑将这些语句编写成一个 task,这样会给书写和仿真带来很大方便.例如,     一个存储器的 testbe ...

  6. Verilog 双向端口

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

  7. (9)Verilog inout使用方法(FPGA不积跬步101)

    1 inout应用领域 在芯片中为了管脚复用,很多管脚都是双向的,既可以输入也可以输出. 例如IIC总线SDA数据信号.SPI三线制数据信号等.在Verilog中即为inout型端口. 2 inout ...

  8. FPGA中inout端口使用方法总结

     输入端口可以由wire/reg驱动,但输入端口只能是wire:输出端口可以使wire/reg类型,输出端口只能驱动wire:若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型.用关键 ...

  9. VIVADO inout 端口的使用

    使用2018.1版本编译带有INOUT 端口的代码,代码逻辑没问题,写了三态控制.但是下板子,inout端口输入数据一直是0. 最终查找原因,看RTL级原理图,并没有三态控制,端口信号只是被认为一个简 ...

最新文章

  1. MongoDB分布式原理以及read-preference和readConcern解决读写一致性问题
  2. centos下axel安装与使用
  3. 了解Access安全性
  4. python在abaqus中的应用代码下载_Python-(source-code)-in--Abaqus Python语言在Abaqus中的应用(源码) - 下载 - 搜珍网...
  5. 自写sonar 插件加载到sonar 服务中的展示信息
  6. OpenCV3.4.5带GPU编译error: #error This file requires compiler and library support for the ISO C++ 2011
  7. 在Spring中使用Future对象调用Async方法调用
  8. Leetcode--438. 找到字符串中所有字母异位词
  9. java基础排序_Java排序算法-Java入门|Java基础课程
  10. Pytest之pytest.assume用例中断言1失败会继续执行后续代码断言2
  11. 七、Framework类库
  12. shell中的大括号和小括号
  13. 自己编写错误代码的规范
  14. Python3爬虫入门之Request库的使用
  15. 数据结构 python堆_Python中的堆栈数据结构是什么?
  16. Oracle 学习笔记(四) Oracle表空间和数据文件
  17. 电影《战狼》评论词云分析
  18. 物联网技术发展前景_3种推动物联网发展的技术
  19. 通过授权微信,达到软件登录账号的效果~~未完
  20. 萨摩耶数科林建明:坚守“终局思维” 让金融科技发展行稳致远

热门文章

  1. Socket心跳包机制总结
  2. Windows必装的3款免费效率工具,排名不分先后
  3. Golang 二叉树遍历
  4. 压缩包文件如何将密码找回来
  5. 小议SCI 论文攻略(转载)
  6. 运筹学 --- 线性规划
  7. 如何在一台计算机上使用两个网络,电脑一拖二显示器怎么用?一台主机两个显示器的连接设置方法...
  8. 计算机主机怎么连接显示器,一台主机两个显示器怎么连接 一台主机两个显示器如何设置...
  9. svn初步安装使用(详细教程图文操作)
  10. 《STL源码剖析》-- stl_deque.h