晚上依然被自愿加班,正纠结得看着VxWorks5.5的User’s Guide总结用户接口,忽然听到小青在一旁对彭兄谆谆教诲着什么,顿时好奇起来。他俩在一起一般就是扯淡,不是小青扯彭兄的淡(蛋),就是彭兄的淡(蛋)被小青扯……彭受不了了就会把老陈叫过来,然后跟小青一起扯老陈的淡(蛋)……今天他俩这明显是在讨论什么严肃的问题啊!于是我悄悄得滑过去,想听听他俩在讨论些什么。FPGA?这东西只能说听过,具体是怎么回事儿完全搞不懂,所以就在旁边听了一下并做为意外收获记录下来。

      注:郑重声明小青是中科大的博士,男博士,而且博士在读期间是主要的方向就是FPGA。

      FPGA(Field-Programmable Gate Array),按照主流的翻译叫做现场可编程门阵列,它存在的主要意义就是在一块芯片投入生产之前,用来验证电路逻辑设计是否正确,以防由于设计问题而造成的成本浪费。作用与虚拟机有点儿相似,相当于硬件的复用,这也是它的可重复擦写的特性决定的。那它是如何实现可重复擦写的呢

      FPGA可以看作是一个大的SRAM(静态随机存储器),我们知道RAM的组成一般是二维的,相当于一个二维数组(横排为位宽,纵列为深度)。我们不妨把该数组的元素看成有四个内存空间的盒子,那么一个元素就好比一个“田”字,而每个元素有两个输入引脚(设为L1和L2),这样输入就有四种情况,如表1所示。

表1

  L1 L2
S0 0 0
S1 0 1
S2 1 0
S3 1 1

      根据L1和L2输入情况的不同,每个元素就对应着四种状态S0、S1、S2和S3,大家可以想像“田”字中的空白部分(注意,每个空白部分是一个存储单元)对应着S0到S3四种状态。如果每种状态看作该元素的一种输出的话,那么是不是有种似曾相识的感觉呢?You got it!有两个输入引脚,有一个输出引脚,那么该元素就可以用来模拟一个“与”门,也就是说S0、S1、S2这三种状态对应的“田”字中的存储单元都初始化为0,S3状态对应的存储单元则初始化为1,那么当L1和L2的输入为0:0时,CPU就会从S0对应的存储单元取值;L1和L2的输入为0:1时,CPU就会从S1对应的存储单元取值;L1和L2的输入为1:0时,CPU就会从S2对应的存储单元取值;L1和L2输入为1:1时,CPU就会从S3对应的存储单元取值。寻址和取值情况如表2所示。

表2

  存储单元 L1 L2
S0 0 0 0
S1 0 0 1
S2 0 1 0
S3 1 1 1

      这样的话,那“或”门该怎么模拟?那就将S0、S1和S2对应的存储单元初始化为1,S3对应的存储单元初始为0就哦了呗!如此说来该元素到底是什么门器件完全看这个“田”中的四个存储单元初始值是什么。这样的话不管是什么样的逻辑电路,有了最基本的“与”、“或”、“非”等门器件,接下来还不就是拼接的问题?那怎么拼接啊?难道要用手把这些“田”挪到相应的位置,然后再把相应的输入输出引脚连到一起?当然不是,你得到的不会是一个一个“田”,而是一个设计完善的FPGA电路板,电路板上已经将这些元素布置好,而其实我们关心的并不是它们的摆放位置和顺序,而是两个元素的输入和输出引脚连接情况。因为你将那这些元素的内存单元初始化好之后就相当于有了N个门器件,而你要形成一个更大的逻辑电路就需要把这些门器件按你的设计连接,起来形成你想要的逻辑处理单元,这才是FPGA的目的所在。在最初的情况下谁也不知道你要怎么连接这种门器件,所以设计人员把输入输出排成一个网型(如图1所示),并将这种线的交点做特殊处理,使得一个交点的连通情况可以人为配置,于是我们就可以通过配置这些“交点”来完成一块芯片的模拟了。

意外收获——我与FPGA的第一次_中科

图1 元素的连接

(这图是从网下down下来的,由于画着太麻烦且只有晚上有时间写日志,困不行了都……)

      听小青巴巴的讲完之后,我首先想到的问题是FPGA模拟出的芯片因为几乎所有的操作都是基于对RAM的存取,所以在速率上肯定会比较慢;其次,由于SRAM的成本较普通RAM高出很多,且FPGA的每个存储单元由6个晶体管组成(普通的为4个),所以总造价上来看,FPGA应该会比较所模拟的芯片高出不少。经小青的验证,我这两种想法也是正确的。再看最开始的听众彭兄,好像还是没太明白,估计他肯定还在想着他的GDB呢,满脑子都是调试中断吧!

 

      注:我这完全是凭借我个人的理解来写的,没有参照任何资料,所以肯定会有不对的地方,但是对我来说理解到这种程度就够,因为这辈子也不一定会真的接触FPGA,我完全是做为一种知识上的扩展来学习和记录的,而且相信我的思维过程跟那些对FPGA只有基本概念的人有相通之处,所以更容易理解。欢迎批评指正……这么晚了?!被我女朋友知道要被骂了……睡了……