问题起因:最初学习数字逻辑设计理论的时候还没有注意到,在实验课上写代码的时候发现了一个问题:

对于源码模块的变量定义,何时定义为reg、何时定义为wire?它们各自又有什么特性和物理意义?

1. wire

wire是网络数据类型的关键字。

网络数据类型表示结构实体(例如门)之间的物理连接(线)。网络类型的变量不能储存值。

语言特性

wire型数据常用来表示用于

  • 结构化定义

  • assign为代表的连续赋值描述

    也叫数据流描述方式、RTL级描述方式

指定的组合逻辑信号。

程序模块中,输入输出信号类型缺省时,自动定义为wire型。

wire型信号可以用作任何表达式的输入,也可以用作“assign”语句或实例元件的输出。

示例:

1 wire a; 
2 //定义了一个一位的wire型数据 
3 wire [7:0] b; 
4 //定义了一个八位的wire型数据 
5 wire [4:1] c, d;
6 //定义了两个四位的wire型数据
7 //注意是两个

物理意义

表示线。

上面的

 wire [7:0] b;  

就表示一组编号从7到0的八条线。

从这个层次可以理解为什么

1 wire [0:7] b;
2 3 wire [1:8] b;
4 5 wire [8:1] b;

都是符合定义不会报错的;

也可以理解其可以作为任何表达式的输入和输出。

2. reg

reg是寄存器数据类型的关键字。而寄存器是数据存储单元的抽象。

语言特性

reg型数据常用来表示用于always模块内的指定信号,常代表触发器。即常用在行为描述语句中。

在always块内被赋值的每一个信号都必须定义成reg型。

示例:

1 reg rega; 
2 //定义了一个一位的名为rega的reg型数据 
3 reg [3:0] regb; 
4 //定义了一个四位的名为regb的reg型数据 
5 reg [4:1] regc, regd; 
6 //定义了两个四位的名为regc和regd的reg型数据

reg型数据可以赋正值,也可以赋负值。

物理意义

表示类寄存器(registor)的存储单元。

联系上面的语言特性,赋值语句的作用就是改变一组触发器存储的值。

另外强调一点:

reg型只表示被定义的信号将用在always块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出。虽然reg信号常常是寄存器、触发器的输出。

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/Roboduster/p/15616097.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!