这段时间去面试了几家公司,发现比较大的公司相对于重视基础问题。这里边又有几个问题特别的突出。他们是:同步时钟设计、亚稳态、异步FIFO。可以说,
这些个问题要是弄清楚了,就至少满足了技术方面1/3的要求,另外的2/3是什么,我就说不清楚了。又有人发了竞争冒险毛刺的问题,不过,对于采用同步设
计方法的系统,这些问题一般不会遇到。下面就谈谈我对这些问题的看法,要是你觉得看这些东西觉得类似一堆狗屎,那么恭喜你,你面试成功的机会增加了
1/3;要是你你觉得阿,什么样的牛人拉了一堆牛屎,那么不好意思,还是再去补补课把。这里推荐一本《数字设计——原理和实践》(John
F.Wakerly)的书,仔细看一遍吧。
FPGA同步时钟设计
简单说就是
一个系统中(或系统中的一部分)都采用同一个时钟触发。系统中的(D)触发器全部都连接到一个时钟,而且只控制触发器的同步端(输入,同步置位,同步复
位)。这样的系统是相对于异步系统而言的,异步系统并不是不同的触发器时钟端连接到不同的时钟信号的系统(一般的这样叫做跨时钟系统,是相对几个较小的同
步系统的组合),而是更本没有了时钟的概念,依靠和触发器构造一样的反馈电路组成。相对于异步系统,同步系统更好设计(异步设计则象一个魔术,类似于汇编
和高级语言的关系),更容易进行时序分析(为什么要用D触发器而不用D锁存器)——在这里组合逻辑的竞争冒险毛刺问题都不存在了。应该说,同步系统最大的
问题在于时钟的偏斜(skew)。同步时钟系统也存在一些涉及的技巧,这些技巧一般围绕着降低关键路径的延时和时间和空间的平衡。这些都是平衡的艺术(了
解了基本的部件之后,剩下的工作就是一个字"平衡",这里边的方法就太具体,而且本人也知道得不多,不敢乱说了。不过,只要你用过一种方法,就可以体会到
其中的精神了。
FPGA亚稳态
这是跨时钟设计中最基础的一个问题(宏观的问
题是FIFO),按照我的观察,上论坛问问题多的一般不明白这个,请一定要注意了。
什么是亚稳态?数字电路中的简单双稳态电路就是两个反相器首尾相连组成(加一些控制逻辑变成了锁存器,触发器),然而并不像名字显示的,这种电路其实还有
第三种半稳定态——就是当两个反相器都处于中间值得情况——这称之为亚稳态。我们知道反相器在非逻辑值范围的反馈系数是相当大的,一旦因为干扰或者噪音离
开了这个中心点,就会很快地进入逻辑值范围(稳态)。数学分析,从亚稳态进入稳态,正如放射元素的衰变,是一个指数的规律(为什么是指数的规律?你要是想
不明白,说明你还没有搞明白亚稳态)。那么,亚稳态的危害到底是什么呢?消耗功率;),其实不是(虽然亚稳态消耗很大的功率),亚稳态的问题在于其电平并
不处于有效逻辑电平范围内,而且在变化。这就导致与其相连其他数字部件将其作出不同的判断(注意,不同),有的作为'1',有的作为'0',有的也进入了
亚稳态,数字部件就会逻辑混乱。那么究竟如何避免(或者减小)亚稳态的危险呢?注意到亚稳态的触发器继续停留在亚稳态的几率按照指数减少,那么办法就是等
——等足够长的时间,直到这个几率变得小的实际上不会发生。到底需要有多长呢?有的厂商有一个数据,有的没有,按照普通的做法,至少等一个时钟周期——这
也就是所谓的异步数据要用两个触发器打一下。这一段有点糊涂,不容易说明白,你看了要是觉得云里雾里,不知所云,那们你只有找一本书学习了;要是觉得作者
表达不清,那么恭喜你,面试通过了的几率增加了。关于这个问题有很多糊涂的认识,要是你的主考官和你争论,你就顺着他的意思,毕竟没有人想找一个管教不了
的手下。
FPGA异步FIFO
异步FIFO是跨时钟域设计方法的集中体现,
体现了很多的方法。不过,其中最重要的有两点,一个就是亚稳态,一个就是和亚稳态类似但不相同的——多个控制/状态信号的跨时钟传递。具体地说,就是当你
把一组信号传递到另外一个时钟域的话,这一组信号可能因为延迟不同,这样到达新时钟域之后,得到的数据相差一个老时钟域的时钟周期。兴好,对于FIFO,
需要传递的是一个计数器,这个计数器可以编码成格雷码(gray
code),这样的编码每次只变化一个位,正好解决了上面的问题(要是没有画过图,最好画一个图看一下)。真不清楚这是怎么发明的!注意,这里其实还对格
雷码的相对延迟和相关的时钟周期有一个要求。这就是异步FIFO中最关键的一点,至于指针如何控制,稍微考虑一下都很容易清楚。需要注意的事,这些东西不
是用嘴能说清楚的,最好画一个示意图,不要因为没有说清楚,让主考官觉得你没有清楚。
当然,除此之外还有很多很多的东西。比如组合逻辑的设计技巧,俺就没有研究。比如高速布线信号完整性问题,俺也不敢多说。至于整个系统的设计思想,更不敢妄语。不过如果只要你有一个问题了解到了相当的深度,相信你很容易搞清楚其他问题。
补充:
另一位高人给我解释的亚稳态,更加通俗易懂: 亚稳态就是对于触发器来说,输入信号与时钟之间不满足建立保持时间,导致输出处于'0'和'1'之间的一个电平上,这个状态就是亚稳态。然而亚稳态不能持久,由于电路的噪声,它最后会稳定在'0'或 '1',导致了不可预测的输出。出现亚稳态的原因是输入和时钟不同步,简单的解决方法是将输入用两个D触发器打成同步。
阅读(1326) | 评论(0) | 转发(0) |