可编程逻辑器件(Programmable Logic Device,PLD)是一种电子零件、电子组件,更简单即是颗集成电路)、芯片,这种PLD芯片属于数字型态的电路芯片,而非模拟或混讯(同时具有数字电路与模拟电路)芯片。
PLD与一般数字芯片不同的是:PLD内部的数字电路可以在出厂后才规划决定,有些类型的PLD也允许在规划决定后再次进行变更、改变,而一般数字芯片在出厂前就已经决定其内部电路,无法在出厂后再次改变,事实上一般的模拟芯片、混讯芯片也都一样,都是在出厂后就无法再对其内部电路进行调修。
本文以下将讲述PLD的发展历程,然而要想了解PLD的过往发展历程就不得不谈及一些半导体业者,但讲述这些业者在PLD方面的事迹并非是本文的用意,也没有推介或批评这些业者的意思。
将ROM当成PLD来使用
在PLD还未被发明前,已有人将只读内存(ROM)芯片以PLD的概念来运用,用ROM芯片来充当一些输入性的组合逻辑(combinatorial logic)函式。
首先一颗ROM芯片有 m 个输入(位址线,或称:位址总线、寻址线)以及 n 个输出(资料线,也称:资料总线,在此也可称:资料输出线),当ROM被当成内存使用时,它就有 2m 个 n bits 的记忆储存空间。
现在我们运用一下想像,输入部分不再是个 m-bit 的位址线路,而被看成是有 m 个相互无关连的独立逻辑信号线。且就理论而言一颗ROM芯片内可以放置 2m 个布林(Boolean)函式(也称:布尔函式),且每个布林函式可以有 m 个逻辑信号。
不过,这种用ROM“乔装”成的PLD,碍于ROM自身原有的结构设计,使真正有效的函式数取决于输出接脚(也称:脚位、引脚)数,因此有 n 个输出就只能有 n 个可用的有效函式。更简单的说,这时候的ROM等同于 n 组相互无关的独立逻辑电路,每组电路的产生、形成,则取决于由 m 个输入所组成的逻辑函式。
使用ROM来当PLD的好处是:有几个以m输入方式表示的逻辑函式,就会有几个对应的n输出,且绝大多数一般性用途的组合逻辑装置都可适用此种作法。同样的,PROM(Programmable ROM)、EPROM(ultraviolet-Erasable PROM)、EEPROM(Electrically Erasable PROM)等也都可以用此种方式进行逻辑规划、程式化,而且不需要特殊的软硬件,只要用标准的PROM烧录器即可实现程式化。然而,无论怎么说,这种作法也有些缺点:
与真正专精的逻辑电路相比,在反应速度表现上慢了太多。
在异步(也称:异步)的逻辑状态转变下,无法提供安全性的状态“防护,cover”。
过于耗电(同样是与真正专精的逻辑电路相比)。
整个ROM中仅有小部分的记忆储存空间能被有效使用,其余都形同浪费。
再者,此法也不易于用于序向逻辑电路(sequential logic)中,因为ROM里头并不具备正反器(flip-flop,简称:FF,zh-cn处则称:触发器)。
进一步的也举实例,对电路设计的业余爱好者来说(这类的嗜好者经常就在我们四周),有时也仍然用“2716”之类的普遍型EPROM芯片来充当PLD,这种用法有时也称为“穷人的PAL”。(PAL也是PLD的一种,以下将再进一步说明)
早期的可编程逻辑
MMI公司于1978年推出的PAL,称为PAL16R6,具有20-pin接脚、引脚,采行DIP封装。
第一个在商业化市场运用的PLD,是由Monolithic内存公司(Monolithic Memories, Inc.,简称:MMI)所推出的可编程阵列逻辑(Programmable Array Logic,简称:PAL)<small>(此点有争议,详见讨论页)</small>,虽然IBM公司在1970年代中也有研制类似的装置(器件),但仅在该公司内部使用。[1]
MMI公司在20-pin(20支接脚、引脚、脚位)的PAL方面相当成功,之后超微(AMD)公司也推出了22V10,22V10也是颗PAL,具有原先PAL所有的特性特点,但接脚数增至24-pin。更之后AMD公司收并了MMI公司(约1987年,待查证),并将其纳入自身的PLD部门,数年后AMD以百分之百转投资的方式将PLD部门分立成独立的威特信(Vantis)公司,到了1999年则由莱迪思半导体(Lattice Semiconductor)公司收购AMD公司手中的Vantis公司股份,自此收并Vantis公司。
GAL
以PAL(可编程阵列逻辑)为基础的接续创新是GAL(Generic Array Logic,通用阵列逻辑),此是由莱迪思半导体(en:Lattice Semiconductor)公司所发明,GAL的特性与PAL相同,不过PAL的电路组态、配置只能进行一次的程式烧录,不能再有第二次,而GAL则是可以反覆对电路组态、配置进行烧录、清除、再烧录、再清除。[2]
GAL这种可重复烧录的特性在研发过程时的试制阶段(prototyping stage)中特别好用,一旦在逻辑电路的设计上发现有任何错误(bug),若是用GAL就能够以重新烧录的方式来修正错误。此外GAL也可以用PAL的烧录器来进行烧录及再烧录,虽然现在已经有可线上烧录(In-Circuit Programmable,有时也称:In-System Programmable)的ispGAL22V10。
另一个与GAL相类似的是PEEL(Programmable Electrically Erasable Logic),是由International CMOS Technology(简称:ICT)公司所提出。
CPLD
PAL、GAL仅适合用在约数百个逻辑门所构成的小型电路,若要实现更大的电路则适合用CPLD(Complex PLD,复杂型PLD),一颗CPLD内等于包含了数颗的PAL,各PAL(逻辑区块)间的互接连线也可以进行程式性的规划、烧录,CPLD运用这种多合一(All-In-One)的整合作法,使其一颗就能实现数千个逻辑门,甚至数十万个逻辑门才能构成的电路。
至于CPLD的程式烧录方式,虽然有些CPLD可以用PAL的烧录器来进行烧录,但这种烧录方式对经常有数百只接脚的CPLD来说并不方便。另一种烧录方式是CPLD已焊于印刷电路板上,之后透过额外的临时外接,或原有线路的内接,使CPLD与个人电脑间能取得连线,由个人电脑以串行或并列方式将新的烧录资料发送到CPLD上,而CPLD内部也具有解码电路能对接收到的资料进行还原解析,之后再进行重新的烧录,以此方式让CPLD内的程式(也可称:电路)获得更新。
要注意的是,每家业者的CPLD芯片多具有焊接后再行传输、再次烧录的技术,但各家的技术实现方式与名称多不尽相同,例如莱迪思半导体(en:Lattice Semiconductor)公司就将此种烧录技术称为“in-system programming”。
不过,各家独创、专属的作法也正逐渐消失、去除中,并朝共通标准、一致的方向发展,如IEEE 1532。
FPGA
Altera公司的Flex系列FPGA:EF10K20RC240-4,该芯片内有20,000个Cell(逻辑晶格)可供组态配置。
当PAL忙于进展成GAL、CPLD时,另一种“可编程化”的流派也逐渐成形,此称之为场式可编程闸阵列(Field Programmable Gate Array,简称:FPGA)或现场可编程闸阵列,FPGA是以闸阵列(en:Gate Array)技术为基础所发展成的一种PLD。
FPGA早期的例子是Signetics公司在1970年代晚期所推出的82S100(阵列)及82S105(定序器、编序器),其中82S100为“与,AND”型的闸阵列,而82S105也相同,但再追加正反器(Flip Flop,cn处也称:触发器)的功能。
FPGA运用一种逻辑门式的网格(Grid),这种网格与普通的“闸阵列”相类似,网格可以在FPGA芯片出厂后才进行组态配置的程式性规划。至于为何要称“场式可编程化”就有些难懂了,“场式,Field”对芯片生产厂以外的世界来说是个工程方面的专业术语,然而厂外也是芯片买主的所在处。(言下之意是:不应当以这种艰涩难懂的工程用词来做为芯片产品的推行名称)[3]
FPAG通常也可以在焊接后再进行程式烧录、变更的工作,此在某种程度与大型的CPLD相似。而绝大多数的FPGA,其内部的程式组态配置是属于挥发性的,即是无持续电力供应后组态配置的内容就会消失,所以在装置(也指:器件、芯片)重新获得电力后,就必须将组态配置内容重新加载(re-load)到FPGA中,或者期望改变FPGA内的配置组态时,也必须进行重新加载的动作。
而关于组态配置的内容,就一般来说会存放在非挥发性的内存中,如PROM或EEPROM,若是用EEPROM,则或许也能用线上烧录(In-System Programmable,ISP)的方式来再次改变组态配置的内容(一般来说是透过JTAG接口来进行ISP)。
FPGA与CPLD都很适合用在特殊、特定的工作上,这是以此类芯片的技术本质来做为合适性的考量,然而有时在以经济性为主的权衡评估下也适合使用FPGA、CPLD,或者有时也会以工程师的个人偏好与经验来决定。
其他型态的PLD
除上述外,目前也有许多有趣的可再组态配置的系统(其实多指:芯片)。例如:有些微处理器内除了一些固定性功效的电路外,其他部分的电路则可以依据微处理器所执行的程式码而改变其功效。要想设计这种半变动式的系统,工程师得学习新的方法,甚至可能要用新的软件工具才能够开发。
另外,现在销售的PLD中,有的也会在芯片内提供一个具固定性功效的微处理器,然后微处理器的四周位置则设有许多可供组态配置的可编程逻辑(也因为处理器位在其中,所以也被称为:核心),此种作法的好处是可以让设计者(指:电子应用工程师)更专注在为他的设计增加新的功能特点,而少去担心“如何让微处理器运作”之类的基础性设计。
PLD是如何维持住它的电路组态、配置?
在一个PLD内有逻辑部分也有记忆部分,记忆部分是用来储存组态配置的程式内容,而储存的方式多是存放在可供PLD使用的集成电路(也称:集成电路)中,这包括:
Silicon antifuses(硅反熔丝)
SRAM(静态随机存取内存)
EPROM or EEPROM cells(EPROM或EEPROM的记忆晶格)
Flash memory(快闪存储器,也称:闪存)
硅反熔丝主要是用于PAL内,方式上是在PAL内部可编程化的矩阵中,若期望矩阵中的某处、某一位置能够形成连接连线,则对该位置的行、列两端施压一个烧录烧写电压(此电压通常高于一般运作时的电压),如此该位置就会形成连接的短路、闭路(short)状态,相反的未施加电压的地方则保持开路(open)状态,由这开路、闭路来形成逻辑的0、1储存。不过一旦某位置被施加烧写电压而形成短路后,就无法在恢复成开路状态,但其他仍保持开路的位置,仍可施压电压使其短路,不过整体来说硅反熔丝仅适合一次性的组态配置烧录,一旦烧写的内容有错误,该颗PAL即宣布报废。此外,之所以称为“反熔丝”,理由是它的特性原理恰巧与一般日常所用的熔丝、保险丝(fuse)相反,保险丝平时为短路,而被施加较高电压时便会烧断,成为永久性的断路、开路,反熔丝却是平常为断开,施加电压后反成为连接的短路、闭路。
SRAM属于挥发性的内存,这表示它在每次失去供电后就无法保存资料,若有PLD使用SRAM做为其组态配置的储存记忆(多数为FPGA),则每一次重新供电后就必须再次将组态配置资料加载(load,用意等同于将程式烧录烧写到PLD内)到PLD的SRAM中,不过此一送电后重新加载的程序,通常是交由另一部份的电路以自动化方式来执行,此一“开机后自动将程式加载到PLD内”的电路,过去是在PLD外部另行设计,但现在也有整合(也称:集成)到PLD内部的作法。
EPROM的记忆晶格是一种MOS(metal-oxide-semiconductor,金属氧化半导体)型的晶体管,若对该晶体管的闸极进行充电,则该充电后的状态就会成为一个记忆留存,之后无论芯片有无供电都可以持续维持着该状态,直到数年后充电状态才会消退消失,而透过对各记忆晶格的充电有无就能够储存0、1的组态配置。至于记忆资料当如何抹除(也称:拭除、擦除),这必须用强烈的紫外线对EPROM进行照射,以此强迫各闸极将原有的充电加以释放,且时间必须长达数十分钟才能全部抹除,否则会有抹除不完整的情形,此一抹除程序多是用所谓的“紫外线EPROM抹除盒”,英文称EPROM eraser,即是一个小盒子内设有紫外线灯管,之后将EPROM放入盒内,再将盒子的电源开启并点亮紫外线灯管,让紫外线照射EPROM,以此来进行清除,也因为紫外线对人体有害,所以才要在密闭不透光的小盒子内进行照射,此外为了方便工程师使用,抹除盒通常还设有定时装置,时间到后会自动提醒工程师已经达当初设定的照射时间。
EPROM为了能再抹除、再烧写,必须使用陶瓷材质的封装,且芯片上方必须设有石英材质的透光窗,以便让紫外线射入。图为世界上第一颗EPROM:1702,由英特尔(Intel)公司于1971年提出。
快闪存储器(闪存)具有非挥发性,即是断电后仍可保存记忆内容,且需要时它也随时能再清除抹除(erase)、再烧录烧写(program、reprogram),这些特性对PLD的记忆来说特别好用。
时至2005年,多数的CPLD都已使用电气方式烧写与电气方式抹除,并以非挥发性方式来记忆。因为经过事实验证,在太小的逻辑运用中用SRAM来储存逻辑组态配置,则每次重新送电启动就必须再次进行加载烧写,如此实在过于麻烦,所以才会改成以非挥发方式来进行记忆储存。此外,若是用EPROM方式进行储存,且为了能够再次抹除与再次烧写,则PLD在其芯片封装上就必须使用陶瓷材质的封装,并在EPROM裸晶(Die)位置的上端设立石英材质的透光窗,好让紫外线能够照射入内,如此才能抹除EPROM裸晶上所储存的组态配置资料,而这种封装方式远贵于一般的塑胶材质封装。
PLD的编程语言
有关之前所谈到的“PAL”,若要以手工的方式来产生JEDEC档实是过于复杂,所以多半改用电脑程式(也称:计算机程序)来产生,这种程式(程序)称为“逻辑编译器,logic compiler”,它与程式开发撰写时所用的软件编译器相类似,而要编译之前的原始程式码(也称:源代码)也得用特定的编程语言(也称:程序语言、编程语言)来撰写,此称之为hardware description language(硬件描述语言),简称:HDL。
而且,HDL并非仅有一种,而是有许多种,如ABEL、AHDL、Confluence、CUPL、HDCaml、JHDL、Lava、Lola、MyHDL、PALASM、RHDL等都是,但目前最具知名也最普遍使用的是VHDL与Verilog。