一.模块结构
二、信号类型
首先必须知道该信号的最大值(计算该信号的位宽)
wire
wire用于结构化器件之间物理连线的建模
在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是组合逻辑;并且只能在assign左侧赋值,不能在always @ 中赋值。
reg寄存器
reg可以综合成register,latch,甚至是wire(当其只是中间变量的时候),能存储数据,有驱动能力,可以用于组合逻辑或者时序逻辑;在always @模块表达式左侧被赋值。
只要在always中设计的信号都用reg,其他信号都定义为wire型。
Example: 信号x是用always设计的,所以要定义为reg型,但是实际的电路中x不是寄存器类型,但仍然定义为reg型。
扩展:reg、wire怎么确定?明德扬总结了以下的3句话,大家记好啦:
1、功能文件:由本模块产生,并且用always产生的信号,就定义成reg
2、测试文件:由初始化initial产生(一般是对测模块的输入)的信号,就定义成reg
3、除了以上两种情况,就定义成wire型
(一个模块中可以有许多个initial块,它们都是并行运行的。initial语句最常见的是用于测试文件里面的初始化语句,用来产生测试环境和设置信号记录。)
* 组合逻辑和时序逻辑**
数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路(简称组合电路),另一类叫做时序逻辑电路(简称时序电路)。掌握组合逻辑和时序逻辑的区分手段与实现方法是数字系统设计的基本要求。
8.1.1 组合逻辑设计
1.组合逻辑概念
组合逻辑是VerilogHDL设计中的一个重要组成部分。从电路本质上讲,组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数,与其他时刻的输入状态无关。无存储电路,也没有反馈电路其典型结构如图8-1所示。从电路行为上看,其特征就是输出信号的变化仅仅与输入信号的电平有关,不涉及对信号跳变沿的处理。
根据组合逻辑的电路行为,可以得到两种常用的RTL 级描述方式。第一种是always模块的触发事件为电平敏感信号列表;第二种就是用assign 关键字描述的数据流赋值语句。
(1)always 模块的敏感表为电平敏感信号的电路
这种方式的组合电路应用非常广泛,几乎可以完成对所有组合逻辑电路的建模。always模块的敏感列表为所有判断条件信号和输入信号,但一定要注意敏感列表的完整性。在always模块中可以使用if、case 和for 等各种RTL关键字结构。由于赋值语句有阻塞赋值和非阻塞赋值两类,建议读者使用阻塞赋值语句“=”,详细原因将在8.3.1 节进行说明。
always 模块中的信号必须定义为reg 型,不过最终的实现结果中并没有寄存器。这是由于在组合逻辑电路描述中,将信号定义为reg型,只是为了满足语法要求。
(2)assign语句描述的电路
利用条件符“?”可以描述一些相对简单的组合逻辑电路,信号只能被定义为wire型。当组合逻辑比较复杂时,需要很多条assign语句或者多重嵌套“?”,使得代码可读性极差,因此此时推荐第一种组合逻辑建模方式。
时序电路
1.时序逻辑中的always定义的 reg 型信号都被综合成 reg (寄存器),一般建议使用非阻塞赋值操作 “<=”,但是要注意并行执行的语句可能会带来的delay_cycle的问题
2.敏感变量表中只要有时钟沿的变化即可,即每次触发输出变化都是时钟沿引起的
数字表示方式
不定态(X态)
常用于判断条件,
如果有影响的话,考虑其是0还是1,不影响的话,不考虑。
=”和“”不同体现在对含有不定制X和高阻态Z数据的处理中:
先说结论:
==为逻辑相等,没有x/z时相同输出1,不同输出0;有x/z时,若其余位相同,输出是x,其余位不同,输出为0;
!=为逻辑不等,没有x/z时相同输出0,不同输出1;有x/z时,若其余位相同,输出是x,其余位不同,输出为1;
===与!===为逻辑全等和逻辑不全等,x/z当作普通元素处理。
高阻态(Z态)
表示不会驱动这个信号,(既不给也不给1)。通常用于三态门中。
“不驱动总线”