相信通过上一期的文章,大家已经对逻辑电路和单片机的区别有了一些了解,也看到了一些其它爱好者使用逻辑电路(FPGA)做的一些制作。今天要讲的则是一些更加实际的东西,关于相关芯片、开发板的购买,以及本系列实现教程的目标——游戏机——的过程概览。

74 or PLD?

也是按照之前的顺序,我们先讲74再讲CPLD/FPGA。74系列芯片虽然是很早以前就有的东西,功能也可以被可编程器件取代,但是它并没有被完全淘汰。74系列芯片仍然经常被应用在各种电路当中,也容易被买到。值得注意的是,74系列芯片也经常被称为TTL芯片,这是不准确的,74系列也有不少使用CMOS技术制造的芯片,且CMOS是最常使用的,而非TTL。另外提一点,虽然74系列芯片可以被认为是基础,但是完成本系列的教程并不一定需要购买使用74系列芯片,当然作为增加趣味是可以的。

74系列之所以被称为系列,是因为它里面有许多不同功能的芯片,组成了一个系列。基础的比如与或非门,稍微复杂一些的如触发器,再复杂一些如计数器、加法器,都有对应的芯片可以选择。玩过单片机的朋友可能比较熟悉595、245,这些也是74系列芯片的成员,这两者分别常用于扩展IO口和驱动总线。通常来说,74系列芯片使用14脚的DIP或SOP封装,实现一个制作通常也需要多片74芯片。因为根据不同制作和设计的不同,需要的芯片种类和个数也有可能非常不一样,这里可能很难做一个具体的推荐。但是为了完成一些基础的实验,通常来说会用到74HC04(非门)、74HC08(与门)、74HC32(或门)、74HC74(D触发器)和74HC47(LED译码器)。考虑到这些芯片的价格通常比较便宜(几毛钱到1块多人民币不等),可以在买元件的时候顺便带上几片。值得注意的是,由于74芯片确实可以实现和FPGA等价的逻辑功能(但是设计的时序问题可能就较难处理,通常只能实现较为低速的电路设计),为此有不少人热衷于使用74芯片来实现大型的电路,而不是FPGA。毕竟最初的目的只是为了好玩,用74来设计确实可以增加不少乐趣。以下是一个完全用74芯片制作的CPU——TD4: 感兴趣的朋友可以自己搜索来了解一下,也可以尝试把它做出来。

1540158703162-fac22940d9e151e423c33c001dbc899249d24e91.jpg@1320w_990h.jpg

(使用74系列芯片制作的CPU——TD4)

接下来,来讲讲CPLD和FPGA。74虽然能做逻辑电路,但是,设计起来费力,制作起来费力,调试起来也费力。可编程逻辑器件就相对友好的多。可编程逻辑器件,最常见的也就是CPLD和FPGA。

CPLD or FPGA?

初学者常有的一个疑问就是,CPLD和FPGA有什么区别?在过去,CPLD和FPGA是两种不同的技术。虽然他们都用来实现类似的目的:实现逻辑电路,但是内部使用了不同的实现方法。比如一个重要的区别是CPLD是基于ROM而FPGA是基于RAM的,以至于CPLD可以上电就立即开始工作,而FPGA需要先从Flash载入配置到RAM。以及,CPLD内部使用了PAL结构的可编程块,FPGA内部使用基于查找表的逻辑单元按照矩阵排布,以至于CPLD的逻辑规模通常不及FPGA。不过,各大厂家都已经开始生产一些内置Flash的FPGA,然后当成CPLD来卖,所以上面讲的原理上的区别,对于今天的CPLD和FPGA而言,可能已经不一定成立了,毕竟你买到的CPLD里面可能实际上是个FPGA。

那么对于我们而言,CPLD和FPGA应该怎么选呢?我的建议是,它到底是CPLD还是FPGA其实对于我们而言不重要,重要的是它内部的资源。就像我们买单片机的时候,会看它的主频、内存容量等参数,FPGA也有这样的参数,而这个参数就是逻辑规模。通常而言这个逻辑规模使用等效4输入查找表的数量来描述,单位也就是LUT或者kLUT,不同厂家的说法存在不同,如Intel的单位是LE,Xilinx的单位是LC,但是含义是差不多的。注意等效这个词,在单片机的世界里,虽然多少KB就是多少KB,但是不同单片机的“KB”可能是不能直接比较的,同样的程序在不同的单片机上可能需要占用不同的内存空间,而同样MHz主频的单片机也可能性能存在巨大的差异。在CPLD/FPGA的世界里这个问题就更加严重了,同一个厂商不同系列的产品通常内部架构都有差异,以至于带有的资源数量很难直接用于比较,所以才有了等效量的说法。

那么,这个等效量,典型的值是多少呢?目前规模最小的CPLD具有的等效逻辑量只有约30(0.03K),而最大的可以到达约2.8M(2800K),可以说差距是十分的悬殊了。而对于爱好者,通常常用的规模范围,是在数百到几十K之间,太少了通常做不了什么事情,太多了其实也用不过来。举几个例子的话,通常而言入门的逻辑电路实验不会使用超过10个查找表,而实现一个简单的4位CPU通常需要100个查找表,实现一个典型的8位CPU需要500到5000个查找表,而这次教程的目标——实现一个完整的GameBoy,需要大约10000(10K)个查找表。所以如果要购买开发板实现这次的完整的目标,我也推荐购买至少达到10K逻辑规模的开发板。当然,只是为了学习的话,也没有必要全部搬到板子上运行,就像玩单片机一样,玩仿真也是玩。在FPGA开发当中仿真是极其有效且极其重要的一个手段,即使是有了开发板也是离不开仿真的。所以想要学习的话不买板子也行,或者只买个低容量的板子也行。

容量怎么看呢?很简单。市面上FPGA主要有两大厂家,一个是Intel(原先的Altera),另外一个是Xilinx。Intel的最常用的就是Cyclone系列,型号通常开头为EPaAb的格式,a和b分别表示代数和规模,A表示系列,如EP3C25,这个3表示代数,25则是表示25K的规模,C就是表示Cyclone了。一般对于初学而言,第几代关系不大。常用的是2-4代。第5代更换了命名规则,可能不容易从型号中直接看出规模了,需要查询手册。另外推荐的一个系列就是上面提到过得MAX10,作为低端FPGA性价比很不错,命名方法类似,10M50就表示MAX10系列50K单元。而Xilinx这边的命名方式是类似的,通常为XCaAb,a和b表示代数和规模,A表示系列。如XC6SLX15,6是代数,15是规模(15K),SLX是系列,表示Spartan LX。最常用的低端系列就是Spartan(S)和Artix(A),推荐可以考虑的型号如XC6SLX16和XC7A50。这个命名法适用于5-7代的产品,更早的标识方法不同。

开发板?

下一个问题,也是大家在买51单片机开发板时遇到过的问题,板子上需要有什么外设。ADC?DAC?串口?视频接口?LED?DDR内存?确实这也是个取决于你想做什么的事情,但是这里有一些大体上的建议。对于初学来说,LED和按钮/开关,是挺好用的东西,板子上最好能有。视频输出接口,最好能有,VGA/DVI/HDMI都行,如果没有的话能有配套的较大尺寸LCD也是好的。内存方面,虽然SDRAM和DDR内存容量更大,但是使用起来略微麻烦一些,如果有SRAM会很方便,但是有SDRAM和DDR也不是坏事,当然如果没有的话就会稍稍有些尴尬。另外并行Flash也是一种很好用的东西,然而除了大厂和官方出的一些开发板会有配备外,一般都没有。音频接口对于实现GameBoy而言也是必要的,当然如果没有可以用通用DA代替,或是用普通的IO+PWM/PDM代替,不是很要紧。最后的,USB、网口一类的接口,本次教程中并不会涉及到。

具体的选择?我个人虽然更加喜欢官方或者说大厂的板子(如Terasic和Digilent),但是国产的开发板有更多高性价比的选择。具体什么样还是看各位自己的喜好啦。本次的教程,演示将主要在Terasic的DE10-Lite(使用Intel MAX10系列FPGA)和Xilinx的ML505(使用Xilinx Virtex 5系列FPGA)上同步完成,方便选择任意一家板子的同学学习使用。之后也会教大家如何参考开发板提供的资料,把设计移植到自己的开发板上。如果说你决定选择这两家之外的FPGA(比如安路或者Lattice),使用方法也是大同小异的,毕竟大家都是使用的同样的编程语言。编程语言的问题我们将在之后讲到。

1540158857998-de10-lite.jpg

(DE10-Lite开发板)

1540158862311-ml505.jpg

(ML505开发板)

最后来具体说说这次教程的安排和具体的目标。之前说了要实现一个GameBoy,但是并没有讲这个东西要怎么实现。我也问过我的一些朋友,有的告诉我这个作为教程很有趣,也有的告诉我这个目标实在太大了,做不到。我想的是,希望这样的项目相比常见教程中的一个个实验而言,足够有趣。作为一个大的项目,其本身的挑战和趣味能够一定程度上激励大家慢慢完成吧。废话不多说,来具体讲讲GameBoy。

上期提过,FPGA的一个玩法是用来实现一些老的电脑,而GameBoy也可以被看成是一种特殊的电脑。这里就简单列举一下GameBoy的一些基本硬件参数:

  • 4MHz 类8080 8位处理器
  • 8KB工作内存+8KB视频内存
  • 像素处理单元(PPU)用于产生图像
  • 音频单元,可以合成2个通道的方波,1个通道的杂波和1个通道的PCM
  • 游戏卡带,最大容量可达8MB

而以下就是在FPGA中实现GameBoy的整体框图:

1540158947166-verilogboy_architecture.png

东西不少,要完整实现确实是有不少活要干的。里面有复杂的部分比如一个完整的CPU,也有简单的部分比如定时器。另外还有一些常见的音视频接口的实现(AC97和VGA),还有基础协议的实现(手柄接口中的SPI)。作为一个项目而言,涵盖的部分算是挺全了,但是与此同时各部分又是模块化的,可以剥离开来单独研究、实现。在之后的教程中我们也将逐一的完成整个GameBoy。

从下一期开始,我们也将正式开始相关知识的学习。为了保证趣味性,理论和操作的内容将会穿插进行,且尽可能以,先操作后学习的顺序来,因为实际操作的经验有助于理解学习的内容。最开始的知识点自然就是逻辑电路和数字电路的基础了。基础虽然枯燥但是如果没有基础,到最后的空中楼阁就更加难办了。而有了基础之后,就可以开始设计GameBoy中简单的一些部分了,如定时器。之后慢慢就可以进行更复杂的模块的设计,如视频和音频。于此同时我也会穿插一些CPU相关的内容,毕竟也是最终需要实现的一部分。希望到最后,大家能够在自己的开发板上造出一个可以玩的GameBoy吧?

1540158996853-gbdemo.jpg

(FPGA上的GameBoy Demo)