目录
1. NMOS 和 PMOS
2. MOS 管搭建逻辑门
3. 锁存器和触发器
3.1 交叉耦合反相器
3.2 SR 锁存器
3.3 D 锁存器
3.4 D 触发器
4. D 触发器的建立、保持时间
1. NMOS 和 PMOS
MOSFET(金属氧化物半导体场效应晶体管)或 IGFET(绝缘栅场效应晶体管)是一种场效应晶体管,它在栅极和主体之间利用绝缘体(如 SiO2)。如今,MOSFET 是数字和模拟电路中最常见的晶体管类型。
NMOS 和 PMOS 的区别体现在其衬底和掺杂类型的不同,NMOS 的衬底为P型半导体,掺杂两个高浓度的 N 型半导体,并用铝金属引出两个电极分别为作为源极(Source)和漏极(Drain),并在半导体表面覆盖一层很薄的 SiO2 作为绝缘层,在源极和漏极之间的绝缘层上添加一个多晶硅(Polysilicone)作为栅极(Gate),最后在衬底引出电极,这样就构成了 N 沟道增强型 MOS 管。
PMOS 和 NMOS 大体相同,在衬底变成 N 型半导体,在掺杂的为 P 型半导体,其余和 NMOS 如出一辙,但是仅仅就是这两点区别,却使得它们的特性完全不同。
对于 NMOS 管,当对栅极进行正向偏压(高于阈值电压)时,在绝缘层下方就会汇集大量的电子,由于 N 型半导体多电子,就会与两侧的 N 型半导体形成 "N 沟道",进而实现整个回路的导通,如果施加的电压低于阈值电压,则无法实现导通。
同样的对于 PMOS 管,由于衬底和掺杂物互换,如果施加的电压高于阈值电压,在绝缘层下方就会汇集大量空穴,在两个 P 型半导体之间就会形成阻隔,无法导通。如果施加电压低于阈值电压,则可以导通。
NMOS 和 PMOS 在专业电路图如下所示,NMOS 由栅极指向源极,PMOS 由源极指向栅极,并且 PMOS 在栅极处有取反标识。
NMOS 的特性:Vgs 大于一定的值就会导通,适合用于源极接地时的情况(低端驱动),只要栅极电压达到阈值电压就可以了。
PMOS 的特性:Vgs 小于一定的值就会导通,适合用于源极接 VCC 时的情况(高端驱动)。但是,虽然 PMOS 可以很方便地用作高端驱动,但由于导通电阻大,价格贵,替换种类少等原因,在高端驱动中,通常还是使用 NMOS。
同时衍生一个问题:PMOS 管比 NMOS 管宽的原因是什么?
因为 PMOS 管是空穴导电,NMOS 管是电子导电,而电子的迁移率约是空穴的 2 倍,因此PMOS 管要宽一些增加迁移速率。
2. MOS 管搭建逻辑门
MOS 管搭建非门
将 PMOS 与 NMOS 的漏极和栅极相连,给 PMOS 的源极接 VDD,给 NMOS 的源极接 GND,给两个的共同栅极 In 输入高于阈值电压,在前面介绍过,此时 PMOS 截止,NMOS 导通,所以输出 Out 相当于接 GND 拉低,而输入 In 低于阈值电压时,此时 PMOS 导通,NMOS 截止,所以输出 Out 相当于接 VDD 拉高。
以此可以得到其真值表:
In | Out |
---|---|
0 | 1 |
1 | 0 |
可以发现就是反相器,这是最经典的 CMOS 结构,需要消耗 2 个晶体管搭建。
基于此可以进行更多扩展,衍生出各种逻辑门电路。
MOS 管搭建与非门
首先看与非门的真值表
输入 A | 输入 B | 输出 OUT |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
从与非门的真值表中可以看出,只有输入 A 和 B 都为 1 的情况下,输出才为 0,其他情况输出均为 1,结合到 PMOS 和 NMOS 的性质来看,对于输出为 0 的情况,NMOS 输入为 1 则导通也就是接地为 0,并且需要输入同时为 1,相当于把两个 NMOS 串联,而对于输出为 1 的情况,只要两个输入其中有一个为 0 则输出为 1,因此相当于把两个 PMOS 并联,于是得到了以下的逻辑门电路。搭建与非门逻辑门需要耗费 4 个晶体管。
MOS 管搭建或非门
同样的先看或非门的真值表
输入 A | 输入 B | 输出 OUT |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
有了上面与非门的铺垫,或非门就更好理解了,由真值表可知,只有在输入都为 0 的情况下输出为 1,只要输入有 1 则输出为 0,和与非门恰好相反,需要将 PMOS 串联接在上端,NMOS 并联接在下端,便得到了或非门的逻辑门电路。同样需要消耗 4 个晶体管。
MOS 管搭建与门
与门的真值表如下
输入 A | 输入 B | 输出 C |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
与门就是在与非门的基础上,在输出端接上一个非门即可。可以发现搭建与门电路需要消耗 6 个晶体管,在一些文章或书籍中看到说在设计中使用与非门比与门更节省资源,其实就是这个原因。
同理或门也是一样,这里就不一一列举了,或门所需要的晶体管同样为 6 个。
3. 锁存器和触发器
3.1 交叉耦合反相器
交叉耦合反相器主要有两种结构:
-
顺序结构
-
对称结构
顺序结构
这种结构较为简单,当输入为 1 时,经过两级反向器输出仍为 1,输出又作为输入。
对称结构
在对称结构中,Q 的输出作为 Q' 的输入,同样 Q' 的输出作为 Q 的输入。这里先假设 I1 的输入为 1,经过反相器输出得到 Q 为 0,同时作为 I2 的输入为 0, Q' 的输出为 1。这样输出就能稳定为 1。反过来假设 I1 的输入为 0,经过反相器输出得到 Q 为 1,同时作为 I2 的输入为 1, Q' 的输出为 0。这样输出就能稳定为 0。Q 和 Q' 互为对方的输入,构成双稳态结构。
这种双稳态结构虽然结构简单,但是缺点在于无法控制其最终的输出,并且在结构上是没有输入的。
3.2 SR 锁存器
在上面的双稳态结构中形成的是闭合的回路,无法给到输入,这样的结构是无法保存数据的,因此就有了下面的结构,带有两输入的 SR 锁存器结构,主体由两个或非门构成,设上下的或非门为 N1、N2。
以下分情况进行讨论
R = 1,S = 0
R 端输入为 1,N1 的输出 Q 为 0,而 Q 又作为 N2 的输入,Q' 为 1,此时表示 R(Reset,复位)有效,Q 输出恒为 0。
R = 0,S = 1
S 端输入为 1,N2 的输出 Q' 为 0,而 Q' 又作为 N1 的输入,Q 为 1,此时表示 S(Set,置位)有效,Q 输出恒为 1。
R = 0,S = 0
R 端和 S 端输入为 0,假设 N1 的输出 Q 为 0,而 Q 又作为 N2 的输入,Q' 为 1,Q' 又作为 N1 的输入,得到 N1 的输出仍然为 0。假设 N1 的输出 Q 为 1,而 Q 又作为 N2 的输入,Q' 为 0,Q' 又作为 N1 的输入,得到 N1 的输出仍然为 1。此时表示 R(Reset,复位)和 S(Set,置位)都无效,输出保持输入不变(hold),也即是常说的产生 latch,把数据给锁存起来了。
R = 1,S = 1
在这个条件下是无意义的,此时 Q 和 Q' 都为 0,显然是不对的,不能同时复位和置位。
由此可以得到 SR 锁存器的真值表
R | S | Q | Q' |
---|---|---|---|
0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 |
0 | 0 | latch | latch |
1 | 1 | 0 | 0 |
对比前面的双稳态结构,SR 锁存器就有了锁存数据的功能,即当 S 和 R 都为 0 时,输出会一直保持原有的输入值不变。
RS 锁存器有两个或非门组成,所以需要消耗 4×2=8 个晶体管。
3.3 D 锁存器
RS 锁存器虽然可以锁存数据,但是当 S 和 R 同时为 0 时结果会出错,对使用带来不必要的麻烦,因此需要去规避,所以有了 D 锁存器。
D 锁存器在 RS 锁存器的基础上增加了一些控制,E 可以看做使能信号,一般也可以为时钟 Clk 信号,基于此对此电路结构进行分析。
E = 0,D = 0
E = 0,则对应 R、S 输入都为 0,参照 RS 锁存器的真值表得到此时为 latch,可以锁存数据。
E = 0,D = 1
E = 0 和上面的情况一样,此时数据仍被锁存,等效为 latch。
E = 1,D = 0
E = 1 且 D = 0,此时上面的与门由于 D 取反为 1,与门输出为 1,相反的,下面的与门输出为 0,对应 RS 锁存器为 R = 1、S = 0,对应 Q 为 0。
E = 1,D = 1
E = 1 且 D = 1,此时上面的与门由于 D 取反为 0,与门输出为 0,相反的,下面的与门输出为 1,对应 RS 锁存器为 R = 0、S = 1,对应 Q 为 1。
由此可以得到以下的真值表。
对上面的结果进一步分析,可以发现 Q 值和 E 值息息相关,当 E = 1 时,此时 Q 输出为 D 的值,当 E = 0 时,此时数据被锁存。这样可以发现 D 锁存器是电平敏感的器件,控制信号 E 一般为时钟信号,并且这个例子的 D 锁存器为高电平敏感的。
D 锁存器所消耗的晶体管个数:
反相器(2)+ 与门(6)* 2 + RS 锁存器(8)= 22 个。
总共需要消耗 22 个晶体管。
3.4 D 触发器
触发器的类型有很多,这里以 D 触发器为例
D 触发器其实就是将两个 RS 锁存器串联起来,第一个 RS 锁存器称为 Master,第二个 RS 锁存器称为 Slave,Master 的输出作为 Slave 的输入,但是两个 RS 锁存器的时钟使能输入恰为相反。
再来分析一下 D 触发器是如何运作的。
-
假设输入为 Data1,当 Clk = 1 时,此时 Master 工作,Slave 锁存。根据 RS 锁存器的真值表,Data1 顺利从 Master 输出。
-
当 Clk 由 1 变化到 0 时,Clk = 0,此时 Master 锁存保持原来的数据 Data1,Slave 工作,Slave RS 锁存器将此前输入数据 Data1 输出。
-
当 Clk 由 0 再次变化到 1 时,Clk = 1,此时 Slave 锁存保持原来的输出 Data1,Maste 锁存器开始工作,接收下一次输入数据 Data2,
-
当 Clk 由 1 再次变化到 0 时,Clk = 0,此时 Master 锁存保持原来的输入数据 Data2,Slave 锁存器开始工作,将之前 Master 输出的 Data2 输出。
就这样循环往复的运作,可以看出这个例子的 D 触发器是下降沿有效的,也就是在时钟下降沿到来时,将输出数据,其他时候数据保持不变。如果是上升沿有效的,只需要将反相器接在 Master 上。
搭建 D 触发器所需要的晶体管数:
D 触发器组成 = RS 锁存器×2 + 反相器 = 22×2 + 2 = 46 个。
4. D 触发器的建立、保持时间
在之前的学习中,对于触发器的建立时间和保持时间的概念一般就是以下定义:
-
建立时间:在时钟有效沿到来之前,数据必须维持一段时间保持不变,这段时间就是建立时间 Tsetup
-
保持时间:在时钟有效沿到来之后,数据必须维持一段时间保持不变,这段时间就是保持时间 Thold
当时只知道触发器需要建立时间和保持时间使得工作稳定,但是为什么需要建立时间和保持时间呢?秉持着对知识点刨根问底的态度,这里就从更底层出发,去深究触发器为什么需要建立时间和保持时间。
下图就是 D 触发器的内部结构展开图,其主要有两个 RS 锁存器组成,在前面的为 Master,后面的为 Slave,两个锁存器串联共用一个时钟信号,但是两者极性相反,为了更符合习惯,这里的触发器定为上升沿敏感的。
为什么需要建立时间?
在前面分析过,在数据传输时,Master RS 锁存器负责将数据锁存,Slave RS 锁存器负责将 Master 稳定锁存的数据输出。因此输入在从 Master 输入到 Slave 输出是一个顺序执行的过程,也就是说要想从 Slave 顺利输出数据,那么在 Master 就必须顺利锁存好数据。
那就先看 Master RS 锁存器是如何对输入数据进行锁存的,数据的路径如下图中的红线所示,当时钟 Clk 为 0 时,数据从 D 输入(假设数据输入为 0)经过反相器历时 t1,数据变成 1,经过与门历时 t2 数据变成 1,再经过或非门历时 t3,由于此时数据为 1,所以经过或非门 Q 端输出为 0,Q 端输出又作为下面的或非门输出为 1,并且在此历时 t4,最终在 Q 端输出 0,此时数据便顺利被锁存起来。
这里忽略不计门与门之间的路径延时时间,只对时间做个大概分析,从这里可以计算得到所历经的总时长为:t1+t2+2*t3+t4,这个时间就可以大致认为是触发器的建立时间 Tsetup。当经过 Tsetup 后数据被稳定的锁存,当时钟上升沿到来时(0->1),Slave RS 锁存器就可以接受到正确的数据并输出,如果不满足建立时间需求的话会发生什么情况呢?
假设此时不满足建立时间需求,当需要被锁存的数据在还未进入到第一个或非门时,时钟上升沿就已经来到,此时 Q 端输出的数据仍然是上一次被锁存的不确定数据,可能为 1 也可能为 0,这样 Slave 输出的数据就可能会出错。
为什么需要保持时间?
再来分析一下保持时间,如下图中绿线为时钟到达与门的路径延时假设为 t5,蓝线为数据到达与门的路径延时假设为 t6,因为时钟路径存在反相器延时,所以延时会大一些,即 t5>t6,假设在 Slave 输出数据的过程中,输入数据 D 由原来的 0 跳变到 1,此时由于 t5>t6,就有可能使得与门的两个输入同时为 1(时钟上升沿来临之前 Clk 为 0,经反相器输出为 1),此时与门输出为 1,推出 Q' 输出为 0,进而 Q 输出为 1,于是新到来的输出 Q = 1 就会将影响原来的 0,最后导致锁存的数据为 1,最终 Slave 的输出为 1,导致数据出错,这就是为什么输入数据需要在时钟上升沿来临之后仍然保持一段时间(t5-t6)不变。
从上面的分析可以得出,D 触发器的建立时间要求比保持时间要求要更严苛,这也是在 RTL 设计综合后,建立时间违例比保持时间违例更频繁的原因,要求高了自然就更难达到,同时建立时间和保持时间也是相悖的,建立时间要求数据路径延时更小,数据路径延时越小,Master 锁存器更容易将数据锁存;保持时间希望数据路径延时更大,一旦使得数据路径延时 t6>t5,Slave 锁存器输出的数据就不会出错。