上图是一个与非逻辑,基于与非逻辑,下面的n-FETs是串联的,上面的p-FETs是并联的(逻辑表达式可以转换成与非逻辑或者或非逻辑。二者对应的CMOS电路不同)。其分析逻辑和开始的反相器是一样的,大家可以动手算一下真值表。
上图给出了分析过程。
上图是对应的标准单元,如果有做个Layout的朋友应该对这个画面比较熟悉。对于设计而言留个印象即可,不用掌握。
然后介绍了一下D-Flip-Flop。如图所示,由图大家可以知道,为什么触发器是边沿采样。我们可以分析一下,低电平的时候左侧从D到QM是导通的。数据锁存在QM处,然后高电平的时候右边导通,数据可以输出到Q。这也解释了为什么需要建立时间和保持时间。以建立时间为例,数据采样是需要时间的。你在低电平的时候需要及时的变化,以采集你的数据到QM,否则还没采样到就到了高电平,这个数据就进不来了。同理保持时间也是,如果你数据变化太快。左侧还没有关闭,那QM的值就变了,进而Q的值也不是预期希望的值了。而是你新数据的值了。
然后给了D触发器的标准单元图示。
可以看到随着设计变得复杂,版图已经看不清了。
2018年的新款英伟达GPU,采用12nm工艺制程,有超过230亿个晶体管。
我们再看看FPGA和ASIC的设计流程有何不同,可以看到前端基本是一样的。对于后端而言有很大的区别,FPGA采用FPGA芯片上的逻辑块,由Vivado等软件进行自动映射,布局布线实现。而ASIC基于标准库,由DC等工具进行综合,然后还要进行后仿真(用带有逻辑延迟的库进行仿真),再基于标准库进行布局布线等。通常我们认为ASIC的设计要比FPGA更为复杂,风险更高。需要更加专业的人员来把控全局。
对于初学者而言,能选择其中一个方向都是很好的,身边也有很多从FPGA转来ASIC的。并没有特别困难,只需要一定的学习即可。
如果面试官问你ASIC和FPGA的区别,可以考虑从以下几个方面回答:
- 所使用的工具不同,ASIC开发使用的工具远远多于FPGA开发。
- FPGA更多的时候是使用Vivado自带的IP库,当然ASIC设计也可以使用DesignWare等,但是其便捷性远不如Vivado的调用速度,毕竟FPGA用一个Vivado工具就可以完成整个开发流程。
- 时钟、存储电路、IO等完全不同。FPGA开发一般调用MMCM/PLL的IP核即可,方便快捷。而ASIC设计在时钟花的时间非常多,也很复杂。还有存储电路,FPGA开发调用MIG,进行生成即可。而ASIC一般是使用制定厂商工艺库,基于Memory Compiler进行生成。IO的话FPGA一般进行XDC约束即可,而ASIC是要单独做IO PAD的。FPGA很少听说有自己动手做IO PAD的,Vivado工具已经支持的很好了,不需要过度操心。
- FPGA通用性更强,可以反复的烧录(当然综合烧录的时间也很长)。而ASIC一旦回片,基本就定型了,希望大家的ASIC都能一次点亮。
- 综合/PR不同,虽然叫一个名字,但基本是两回事。根据上面所说的大家可以知道,对于FPGA的CLB而言,其中的LUT实现组合逻辑,D触发器实现时序逻辑,再加上一些BRAM,硬核资源如DSP等,就可以实现任意电路。所以FPGA的综合就是把RTL映射到这些资源上。ASIC综合是将RTL映射到标准单元库上,有些RTL,语法是支持,但是就是综合不了。很多时候会出现Vivado可以综合过的,但DC不一定过。FPGA综合和ASIC综合区别很大很大。
- 此外做ASIC基本也会用到FPGA,做原型验证。而通常说的FPGA开发是直接拿FPGA去做产品,这种广义上来讲,也可以算嵌入式开发的一部分。
最后对于想学习FPGA的朋友,建议直接学习ZYNQ。该芯片开发可以大幅度提高大家的软硬件协同开发能力,可以说事半功倍,并且对学SoC、AMBA总线等也有非常大的好处。