组合逻辑电路与时序逻辑电路

组合逻辑电路:输出只是当前输入逻辑电平的函数(有延时),与电路的原始状态无关的逻辑电路。当输入信号中的任意一个发生改变时,输出都有可能变化,但与目前所处的状态没有任何关系(即逻辑电路无记忆部件)。

时序逻辑电路:输出不只是当前输入的逻辑电平的函数,还与目前电路所处的状态有关的逻辑电路(即逻辑电路有记忆部件)。

 

组合逻辑电路实现方法:

  1. 组合逻辑语句可以用 assign 语句实现

          assign c=a+b; //加法器

          assign c= ena ? a : b; //数据选择器

      2. 复杂的组合逻辑最好用 always 块实现:

由于在 always 块中可以使用 if、 case 等语句,所以对于复杂的组合逻辑,使用 always语句描述显得层次更加清楚,可读性更强。

 

时序逻辑电路的结构特点:
1)时序逻辑电路通常包含组合电路存储电路两部分,存储电路(触发器)是必不可少的;
2)存储器的输出状态必须反馈到组合电路的输入端,与外部输入信号共同决定组合逻辑电路的输出。

 

时序逻辑电路的分类:
1)按逻辑功能划分有: 计数器、寄存器、移位寄存器、读/写存储器、顺序脉冲发生器等。
2)根据储存电路中触发器的动作特点不同分为: 同步时序电路异步时序电路。 在同步时序电路中,所有触发器状态的变化都是在同一时钟信号操作下同时发生的。在异步时序电路中,触发器状态的变化不是同时发生的。
3)根据输出信号的特点分为: 米利(Mealy)型穆尔(Moore)型。 在米利型电路中,输出信号不仅取决于存储电路的状态,而且还取决于输入变量。在穆尔型电路中,输出信号仅仅取决于存储电路的状态。穆尔型电路只是米利型电路的一种特例。

 

always & assign:  

同一Verilog模块中所有过程块(如initial/always)、连续赋值语句、实例引用语句都是并行的,前后次序没有关系。

只有连续赋值语句(assign)和实例引用语句可以独立于过程块而存在于模块的功能定义部分。

always块内部的语句顺序执行,always块称为过程块,always块中的语句称为顺序语句。

在 always 块中,被赋值的信号都必须定义为 reg 型,这是由时序逻辑电路的特点所决定的。对于 reg 型数据,如果未对它进行赋值,仿真工具会认为它是不定态。为了能正确地观察到仿真结果,在可综合风格的模块中我们通常定义一个复位信号 reset,当 reset 为低电平时,对电路中的寄存器进行复位。

在 always 块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的。实际的时序逻辑设计中,一般的情况下非阻塞赋值语句被更多地使用,有时为了在同一周期实现相互关联的操作,也使用了阻塞赋值语句。(注意:在实现组合逻辑的 assign 结构中,无一例外地都必须采用阻塞赋值语句。)

仅使用 assign 结构来实现组合逻辑电路,在设计中会发现很多地方会显得冗长且效率低下。而适当地采用 always 来设计组合逻辑,往往会更具实效。

同一组合逻辑电路分别用 always 块和连续赋值语句 assign 描述时,代码的形式大相径庭,但是在 always 中适当运用 default(在 case 结构中)和 else(在 if…else 结构中),通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为 reg 型。不过,如果不使用default 或 else 对缺省项进行说明,则易生成意想不到的锁存器,这一点一定要加以注意。

 

猜你喜欢

转载自blog.csdn.net/weixin_42625444/article/details/82080660