声明:
本博客参考学习正点原子教程,用做个人学习笔记以及帮助他人学习,不做其他用途,后续根据学习深度的增加进行知识的补充,也欢迎各位大佬指点传授知识。
什么是组合逻辑
之前的理解
组合逻辑就是使用wire对信号进行定义,使用assign进行赋值输出或者在always块中根据某些信号的电平的变化(一般自动匹配always块中需要捕获的信号量)产生不同的输出。
现在的理解
- 组合逻辑中,某一信号的输出只与当前时刻的输入有关,与之前的输入没有任何关系,组合逻辑电路没有记忆功能,没有反馈环路
- 组合逻辑电路是有时间延迟的,也就说组合逻辑的输入变化到输出变化之前是有时间的,不同的组合逻辑电路延迟不一样,逻辑级数也可能不一样
问题来了,什么是逻辑级数?
逻辑级数就是组合逻辑的深度,可以理解为输入到输出经过的组合逻辑单元的个数,比如输入信号经过一个与门和一个非门那就是2级,算两级门延迟
逻辑级数太大会有什么问题?
- 如果电路是一个寄存器 – 组合逻辑 – 寄存器
- ![[Pasted image 20240104210552
- 如果组合逻辑的部分总的延迟大于一个时钟周期,会造成后端的寄存器无法采集到数据,导致采样失败,所以逻辑级数不能太大
- 一些典型的时序问题大多是由于逻辑级数太大引起的,需要进行优化,减少逻辑级数
问题又来了,既然延迟不同,而且信号变化需要时间,有多路信号同时发生会有什么问题?
- 当多路信号同时发生跳变的瞬间,就产生了“竞争冒险”,可能会有一些不正确的尖峰信号,称为“毛刺”
什么是“毛刺”?
- 不同的输入信号到达最后一级门电路的时间不一样
- a -> e = 3ns; b -> e = 3ns; c -> f = 2ns
如何解决毛刺现象?
- 组合逻辑输出加寄存器(常用)
将最后一级门电路的输出写入寄存器后,再输出
- 信号同步法
设计数字电路的时候采用同步电路设计可以大大减少毛刺现象,这种方法的关键保证在时钟的跳变沿读取的数据是稳定的数据而不是毛刺数据,做到真正的“同步”。因为无法保证在某个时钟的跳变沿读取的数据是一个稳定的数据,尤其是在多级设计中,这个问题就更加突出。- 两种方法
- 信号延迟同步法:
- 比如对c–>f延迟1ns
- 状态机控制:
- 有状态机在特定的时刻分别对特定的模块的时钟信号或者模块使能信号进行控制,状态机的循环运行使得整个系统协调运作
- 信号延迟同步法:
- 两种方法