上一节的答案分别是22和46,做出来了么。这一小节如果仔细阅读过上一小部分,大家一看标题心里就差不多有感觉了。4位输入和4位输出:
时钟CLK是并联的这样就保证了4bit的同时性。给出块图符号:
。这就是最简单的寄存器咯。但是现在我们会发现在时钟上升沿的时候如果有的位不想同时写入怎么办。我们可以加一个始能输入哦。看图:(a)是MUX实现的始能输入组合,(b)是用AND门(c)是块图符号。大家仔细想一下a和b实现有什么区别。b的实现当CLK处于1的状态时如果改变EN会发生glitch!回想一下时序回路里讲的就知道了。所以一般不要对时序进行逻辑操作,要不会导致严重的时序问题。当然会在后几节讲到高级时序分析~。下面继续介绍另一种叫做Resttable FF的。当我们给开发板加电的时候,就是使其进入Reset状态,也就是初始(复原)状态--也就是让寄存器进入有确定输出的状态。下面是实现:
。就是把输入和Reset并起来就可以咯。给出块图符号和减缩符号:。现在我们回到开头的习题。我们建立一个FF要用46个MOS。我们能不能优化一下回路设计,做得更好一些?这是个好问题,不过我们要考虑要优化什么?怎么优化?怎么评价优化结果?解决这些问题的时候,在科学实验中有一种最常用的办法,就是把实验数据和理论拟合。这里由于我们的环境限制仅仅在理论阶段上做讨论。
那么回想Latch的作用无非就是通过开和关控制数据是否可以被Overwrite。所以自然就是和开关的作用一样啦。还记得我们的三态么?那不就是一个相当于可控开关的东东么~。对的,我们从它入手看看是不是能得到一些更优化的设计。
我们的三态也就是传输门。优点不用说了,延迟小,使用的材料少。作为Latch的缺点:1.当CLK=1时,输出Q无法被记录(也被称为浮动),长时间浮动输出易受噪音干扰。2.更坏的是,当CLK=0时,根据MOS管特性,当输入D有大于VDD的电压峰值时,会导通pMOS!这样不光是Q受到影响,由于D输入和别的电路的耦合关系,会影响其它电路的输出。
所以解决第一条我们可以沿用2.1节开头的思路。只是为了节约材料和减少延迟,我们可以用tristate 来代替两个反向器中的一个。解决第二条我们可以用 Buffer来将输入和输出都解耦合。见下图的设计:
这样当CLK=0时,D是不能被传输的,同时T1开放并起反向器作用。这样即使N1有噪音,会被T1稳定住,并且不会逆向影响输入。这里的T1被称为 C2MOS(C平方MOS--clocked CMOS)。(记得1.4三态那一节最后给出的反向三态么。注意那个输入的走线!是跨过EN和~EN的。其实我们也可以把EN和~EN放在两边而把输入放在中间,这样就必须连接中间两个MOS的门,但是这样会导致共享电荷噪音!)再数一数一共才用了12个Mos管要比22个Mos的Latch还要稳定(多了输出和输入Buffer)~~所以这个一般都是不是很要求时间性能的时候,商业级别的设计方案。而做成FF的话,也只要用20个MOS管,留给大家实现一下商业级的D FF~~。下面给出一些对于性能要求很高的时候的Latch设计。
1.这个是把上面的l1去掉以节省第一个缓存延迟。这里用到的设计思想就是约定大于配置。约定就是你给我的输入一定是其它回路的精确的输出,保证无噪音。(例如Intel的Datapath latch)
这两个都是所谓的 门框锁存--jamb latch。那个小的反相器符号代表 弱反馈反相器。就是把Tristate换成一个没有时钟输入的“山寨”tristate,节省了两个Mos,但是要求前面的tristate输出较高的稳定电压来保证弱反馈反相器工作。而下面的这个图,做FPGA(Field Programmable Gate Array-现场可编辑逻辑门阵列)的人应该很熟悉吧。这里WR和RD一个。
3.注意这里我们把时序进行缓冲,保证时序的稳定性。这样我们就可以利用接地和弱高电平(永不减衰!!)来控制输出了(绝妙的设计~~)。例如,当时序phi(CLK)=1的时候,三态锁开放,后面自然和上面的情况一样。只是三态的地方用了个更山寨的weak pMOS。但是注意这个weak pMOS和永远不会衰减的外面的弱高电平相连,所以对抗噪音特别好。但是同时也就要求输入的D信号必须被驱动到比这个反馈还要好的信号才能写入(否则就会被当作杂音无视掉!!)。而当CLK=0的时候,三态锁关闭,如果X=1(上一次操作后存的是“1”)那么输出Q是weak的高电平(--不知道怎么回事?自己动手推一下)反之(X=0)输出是大地的0电平(由于接地的nMOS开放而把弱pMOS的drain拉低到0电平)。
这个技术被大名鼎鼎的Itanium2处理器所应用。
好了就将到这里,下一节我们就要进入对这些FF们进行最重要的时序分析咯~~。