通俗易懂的带你解读inout双向端口【Verilog高级教程】

这篇具有很好参考价值的文章主要介绍了通俗易懂的带你解读inout双向端口【Verilog高级教程】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球
四社区联合力荐!近500篇数字IC精品文章收录
【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍

通俗易懂的带你解读inout双向端口【Verilog高级教程】

一、写在前面

本专栏为作者在 【数字IC手撕代码】 【数字IC笔试面经分享】 【数字IC工具解析】 以外开设的第四个独立专栏,旨在学习并提供有关Verilog硬件描述语言中非基础性的高阶语法特性知识,因本身专栏的独特定位,因此作者并不会涉及基础Verilog语言如阻塞式非阻塞赋值,过程块,数据类型等内容;同时受限于作者知识有限,本专栏也不会涉及System Verilog的相关内容,若按照IEEE的相关标准来看,本专栏将会聚焦Verilog-2005,即“IEEE Std 1364™-2005”以及之前的有关内容,提供相关的IC设计领域语法特性。以下为Verilog的进阶框图,有更多学习需求的读者可以检索相关英文标准进行学习。
通俗易懂的带你解读inout双向端口【Verilog高级教程】

二、什么是inout双向端口

在Verilog中,inout是一个双向接口(区别于input与output),也是一个可综合语句,广泛的应用于比如I2C等协议的设计中,声明inout端口,意味着数据既可以从主设备流向从设备,也可以从从设备流向主设备。

三、inout端口的综合

inout端口会被综合成为如下所示的三态门高阻态的引入,有效的消除了电路中其他部分对于此门的影响,也解决了常规端口可能会出现的多驱动的问题,因此,三态门广泛的应用于总线互联的端口,也是我们今天所讨论的inout端口的综合结果
通俗易懂的带你解读inout双向端口【Verilog高级教程】

四、inout双向端口的要求

  • inout端口默认为wire型,这意味着我们不能在always中对其进行赋值,而需要使用assign进行赋值
  • 每一个inout端口都需要一个reg型的buffer来做缓冲器

考虑这种情况:
当控制信号为真时,三态门开启,此时DataOut的输出通过双向端口传输到数据总线上。
但是DataIn和DataOut是直接相连的,如何保证DataOut的数据不会影响到与DataIn相连的电路呢?
解决这个问题的方法是将DataIn声明为reg类型,将reg类型变量复制到always进程块中,需要添加一个控制信号,由always敏感表监控,保证inout端口的输出不能直接贯通到Datain处。

在Verilog描述的实际过程中,往往容易忽略某个inout端口的reg语句。以 CPU 或 RAM 为例。RAM本身是作为内存用reg声明的,所以不需要这个reg缓冲区;而 CPU 模块的 inout 端口的 reg 语句经常被忽略,因为这东西看起来“多余”。这也是初学者在使用 inout 端口时最容易出错的地方。

  • 我们没有办法同时对inout端口既写又读(即同一时刻,数据只能有一个方向),配合着三态门的综合结果,在接收数据的的时候我们使其保持高高阻态
  • inout 端口不能独立存在

对于一个模块,inout 端口可以用作输入和输出。那么,连接到inout口的另一个模块是什么情况呢?显然,另一个模块也应该是一个inout端口,一个inout端口不能独立存在。但在实际编写 Verilog 代码的过程中,这点往往被忽略。

  • 对inout的赋值需要使用一对信号来完成

如前所述,inout 端口不能独立存在。为了进一步考虑,当一个模块的inout端口作为输出时,那么另一个模块的inout端口必须作为输入;反之,当一个模块的inout口用作输入时,那么另一个模块的inout口一定是输出口。因此,两个inout端口的控制信号实际上是由一对信号控制的。

五、inout端口的赋值

5.1 设计文件的赋值

方法一:声明一个受control信号控制的inout型的myport,当control为1时,赋值为data,control为0时,赋值为高阻态,推荐这个方法

assign myport = control ? data : 'z;

方法二:虽然本专栏在探讨IEEE Verilog-2005的相关设计标准,但是都说到这里了,作者再补充以下System Verilog出现后,inout端口新的赋值方法,以下的赋值看起来会比较奇特,因为正常的寄存器不产生Z值,但是在System Verilog的编译条件下,这种方法也是可行的。

logic myport_reg;
assign myport = myport_reg;] 
// in procedural code
    myport_reg <= data; // myport becomes an output
    myport_reg <= 'z; // myport becomes an input

5.2 仿真文件的赋值

testbench没有端口名称,因此我们没有办法在testbench中将其声明为inout端口,为了在testbench中体现inout,首先,我们需要将inout端口声明为wire型,例化的时候与设计文件连接,其次,我们要分别模拟input和output的行为,读取的时间高阻态,发送的时间有相对应的值,下文的案例为SRAM的testbench,其中Databus在设计文件中声明为了inout端口

module test;

reg [9:0]AddressBus;

reg Read,Write;

wire [31:0]DataBus,TestOut;

reg [31:0]TestIn;

DRAM dram(DataBus,AddressBus,Read,Write);

assign DataBus=(Write==1)?TestIn:32'bz;

assign TestOut=(Read==1)?DataBus:32'bz;

initial

begin

Write=1'b0;Read=1'b0;
AddressBus=1'b0;
TestIn=1'b0;
#100 
Write=1'b1;
AddressBus=10'd4;
TestIn=32'd64;
#10 Write=1'b0;
#10 Read=1'b1;
AddressBus=10'd8;
#30 $stop;
end
endmodule

六、更多资料

有更多学习需求的读者可以直接参考以下连接的文章,虽然是英文的,不过应该可以说将inout讲的非常清晰明了,作者的本篇博客也参考了很多下面的文章内容
How to use the inout port in Verilog文章来源地址https://www.toymoban.com/news/detail-401180.html

七、往期【Verilog】高级教程文章

  • 多维数组:灭霸打个响指的功夫,看懂Verilog多维数组
  • clog2系统函数: 关于Verilog自动计算位宽的系统函数$clog2,这些是你不得不知道的
  • UDP用户原语:玩转UDP用户原语,这篇文章就够了
  • $monitor系统函数:放学前的最后几分钟,看懂Verilog中的monitor系统函数
  • generate语句:一把王者的时间,学会Verilog中的generate语句
  • parameter常量:玩转parameter与localparameter,这篇文章就够了
  • inout双向端口:通俗易懂的带你解读inout双向端口
  • task与function区别:芯片人必会的task与function区别详解

到了这里,关于通俗易懂的带你解读inout双向端口【Verilog高级教程】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA实现三态门(inout)Verilog代码详解】

    【FPGA实现三态门(inout)Verilog代码详解】 三态门(tristate gate)是在数字电路中使用频率较高的一种逻辑门,其特点是输出端具有三种可能的状态:高电平、低电平和高阻态。在实际应用中常常用于多个设备共享同一个总线的情况下,有效地防止输出口相互影响、产生干扰等

    2024年02月10日
    浏览(42)
  • verilog基础语法,wire,reg,input,output,inout

    概述: 输入输出是模块的端口,寄存器是数据存储介质,线用于把各个电路关联起来,形成一个数据流通通道,进行形成具有具体功能的电路模块。线是信息关联与传递的介质,也是可以称为信息流通的管道。在FPGA中的基本定义为wire,reg,input,output,inout。只有正确的认识到

    2024年04月24日
    浏览(42)
  • 最通俗易懂的讲解HTTPS的加密原理【多图、易懂】

    目录 前言 HTTPS加密原理概述 HTTP 为什么不安全 安全通信的四大原则 HTTPS 通信原理 对称加密:HTTPS 的最终加密形式 非对称加密:解决单向的对称密钥的传输问题 数字证书:解决公钥传输信任问题 证书一整个被掉包怎么办? 总结 其它 HTTPS 相关问题 什么是双向认证? 什么是

    2024年02月05日
    浏览(58)
  • 通俗易懂的TextCNN

      了解TextCNN,看这一篇就够了。   我们之前提到CNN时,通常会认为属于CV领域,是用于解决计算机视觉方向问题的模型,但是在2014年,Yoon Kim针对CNN的输入层做了一些变形,提出了文本分类模型TextCNN。与传统图像的CNN网络相比,TextCNN 在网络结构上没有任何变化(甚至更

    2024年02月06日
    浏览(35)
  • C 递归 详解(通俗易懂)

    目录 一、定义         1.概述         2.条件         3.比较 二、 如何理解递归?         1.函数调用其他函数示例 :          2.函数调用函数自身示例 :          3.函数调用自身的底层操作 :                  ①在主调函数调用被调函数之前——              

    2024年02月05日
    浏览(36)
  • useVModel()的使用------通俗易懂

    用于父子组件共享数据, 1、父组件有个flag(Boolean)属性 2、将flag属性传递给子组件,要实现双向数据绑定 3、flag属性在子组件发生变化,父组件的flag属性一起改变 父组件app.vue 1、父组件有flag属性,使得flag和子组件uniInput双向绑定 2、使用v-model:flag进行双向绑定,v-model的默

    2024年01月15日
    浏览(36)
  • 通俗易懂:什么是拉链表

    拉链表是数据仓库中一种重要的模型,相信很多数据工作者都接触过,面试也是经常考察的点。 但是很多人第一次接触“拉链表”这个词,难免会产生疑惑:拉链表是什么? 按照度娘的解释:“拉链表是一种针对数据仓库设计中表存储数据的方式而定义的数据模型,它有点

    2024年02月08日
    浏览(37)
  • Java反射(通俗易懂)

    目录 1、反射介绍 2、反射API 2.1 获取类对应的字节码的对象(三种) 2.2 常用方法 3、反射的应用 3.1 创建 : 测试物料类 3.2 获取类对象 3.3 获取成员变量 3.4 通过字节码对象获取类的成员方法 3.5 通过字节码对象获取类的构造方法 4、创建对象         Reflection(反射) 是 Java

    2024年02月03日
    浏览(38)
  • 简述马尔可夫链【通俗易懂】

    马尔可夫链(Markov Chain)可以说是机器学习和人工智能的基石,在强化学习、自然语言处理、金融领域、天气预测、语音识别方面都有着极其广泛的应用 The future is independent of the past given the present 未来独立于过去,只基于当下。 这句人生哲理的话也代表了马尔科夫链的思想:

    2023年04月08日
    浏览(34)
  • 通俗易懂声学基础

    声音是由振动产生的,当物体振动时,会引起周围空气的波动,导致空气粒子间的距离发生疏密的变化,从而引发空气压强的变化,这种变化会传到人的耳膜,再传到人的大脑,人就听到声音了。 物理上,声音有四个基本特性:音色、音强、音高、音长。其中音色为音段特征

    2023年04月24日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包