浅显易懂-Verilog中什么时候用wire?什么时候用reg?wire与reg只有又有啥区别?如何去选择性的使用呢?

在使用FPGA的时候我们经常会遇到这样一个问题,这个信号我们到底是定义成wire类型还是定义成reg类型,如果定义不对编译软件也会通不过,有时候你通过编译软件的的提示将它改了回来,但你却并不明白是为什么会报错,而且下次还会再出现,当它再次出现时,我们又得重复的去修改,这样不仅耽误我们开发的时间,而且还影响我们学习的心情,所以这篇文章就是帮助你如何正确使用wire和reg来定义一个信号。

1wire和reg的区别

我们知道Verilog是硬件描述语言,就是通过描述构造底层的硬件电路来实现我们所需要的功能,那么当我们在设计数字电路的过程中经常需要将不同的芯片的引脚相互连接起来,而这一个过程其实就是wire所定义的变量类型,事实上当你写下如下语句时wire busy;其实就是将某一连线命名为busy,接下来如何连线,就只需要对busy这个线型的信号进行操作了。而reg类型的变量则不同,他是一个寄存器类型的变量,寄存器的功能就是可以将我需要的数据保存在我的寄存器里面,里面的数据也可以根据我的需要随时变化,也就是说当你定义一个需要保存一段时间的数据时,你可以将它定义为一个寄存器变量,如果当你写下如下语句时,reg busy;这里就是将busy定义成为一个寄存器类型的变量,接下来你要如何去操作这个寄存器,就需要你用别的语句去描述了。综合来看wire就是给某个连线取名字,reg就是给某个寄存器取名字。理解这一点后其实就很好区分那个时候用wire那个时候用reg了。

2什么时候定义wire型变量

2.1输入变量input以及双向变量inout

输入进来的变量都会使用wire来定义,这是因为input的意思是输入引脚的意思,你输入到芯片内部的引脚是不可能具有存储功能的,一般你输入进来的变量都需要去连接到某个特定位置去参与逻辑运算。因此这个信号也都是做连线使用,所以一般定义为wire。同理inout也是这个原理必须使用wire来定义。

2.2例化过程中两个模块的连接

在进行例化的过程中我们经常遇到这种情形,需要将两个模块儿通过线连起来,这个时候,我们就需要定义一个线型的变量,两段分别连接两个模块所对应的引脚。

2.3assign语句被指定的对象也被定义为wire

assign本身的意思就是指定,例如

assign andv = a&b;

其中的意思就是指定andv的值为a&b的值,由于它不受时钟的约束,所以他是一个立即生成的组合逻辑,因此它不需要存储信号的值,也不能存储信号的值,因此这种语句在使用时被指定的信号只能用wire来定义它的变量类型。

2.4 部分output类型的变量

对于FPGA中的输出顶层只能为wire类型的变量,而被例化的模块儿内部的output既可以为wire型的变量也可以为reg型的变量,这是因为在FPGA内部的变量的输出取决于信号的源头是从组合电路中输出的还是从时序电路中输出的,无论那种输出对应的外部例化都有一个线与之连接,而顶层模块中的output直接是连接到外部的输出引脚,而这个输出的外部的真实引脚与内部的虚拟的信号必须要有一个信号线连接,所以这种情况就必须使用wire来作为信号的定义。

3什么时候定义reg型变量

3.1由always引导的时序逻辑电路

在时序逻辑电路中,信号不是立即发生变化,而是在驱动时钟到来后才开始变化,这种电路需要临时存储信号的信息,固需要用reg来定义时序逻辑电路中的变量。

3.2在做仿真是initial中的变量也用reg型变量定义

这是因为initial中的变量是需要你赋初值的,有初始值就需要你有相应的存储位置,那么这必定是一个reg类型的变量。

3.3部分output中的变量

在非顶层模块中的部分output中的变量如果是直接从时序逻辑电路中运算出来的信号,可以直接定义为reg类型的变量输出,如果直接从组合逻辑电路中输出来的电路信号则只需要定义成wire类型的变量即可。
总而言之,究竟在什么时候定义它的数据类型,完全取决于它的电路需要,我们上面所总结的几种情形是从我需要用在那些情形下,所以在这些情形下我应该定义什么样的参数类型,这其实是一种就着结果看方法的方式,最好的方式应该是我需要设计的电路电路早已胸有成竹,固我需要什么样的定义来服务我的电路。
熟能生巧,当你熟悉了以后,什么时候定义什么变量都是理所应当。如果觉得我的文章对你有用请给我点赞关注和收藏,如果有那那些不妥的地方请评论指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文华也曾献与你

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

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

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

打赏作者

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

抵扣说明:

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

余额充值