5.5 存储器
存储器概述
存储器是一种能够存储大量二值信息(或称为数据)的器件。由于计算机以及其他一些数字系统在工作过程中需要对大量的数据进行存储,因此存储器成了计算机和这些数字系统不可缺少的组成部分。本文讨论的是用半导体集成电路制成的各种半导体存储器。
随着计算机处理数据量的增加和运算速度的提高,存储器需要具有更大的存储容量和更快的存取速度。因此,存储容量和存取速度是衡量存储器性能的两个最重要的指标。
半导体存储器的分类
由于半导体存储器的存储单元数量庞大而器件的引脚数目有限,在电路结构上不可能像寄存器那样把每个存储单元的输入和输出直接引出。为了解决这个矛盾,每个存储单元都有一个地址,只有被输入地址代码指定的那些存储单元才能与公共的输入/输出引脚接通,进行数据的读出或写入。
半导体存储器种类繁多,主要分为随机存储器(Random-Access Memory,简称RAM)和只读存储器(Read-Only Memory,简称ROM)两大类。
随机存储器(RAM)
随机存储器与只读存储器的根本区别在于,随机存储器可以随时快速地写入或读取数据。根据存储单元工作原理的不同,随机存储器又分为静态存储器(Static Random-Access Memory,简称SRAM)和动态存储器(Dynamic Random-Access Memory,简称DRAM)。
静态随机存储器(SRAM)
SRAM电路通常由存储矩阵、地址译码器和读/写控制电路(也称输入/输出电路)三部分组成,如图5.5.1所示。
SRAM的结构框图
存储矩阵由许多存储单元排列而成,每个存储单元能存储1位二值数据(1或0)。在译码器和读/写电路的控制下,既可以写入1或0,也可以将存储的数据读出。
地址译码器一般分为行地址译码器和列地址译码器两部分。行地址译码器将输入地址代码的若干位译成某一条字线的输出高低电平信号,从存储矩阵中选中一行存储单元;列地址译码器将输入地址代码的其余几位译成某一根输出线上的高低电平信号,从字线选中的一行存储单元中再选1位(或几位),使这些被选中的单元经读/写控制电路与输入/输出端接通,以便对这些单元进行读写操作。
读/写控制电路
读/写控制电路用于对电路的工作状态进行控制。当读/写控制信号R/W′=1时,执行读操作,将存储单元里的数据送到输入/输出端上。当R/W′=0时,执行写操作,加到输入/输出端上的数据被写入存储单元中。图中的双向箭头表示一组可双向传输数据的导线,它所包含的导线数目等于并行输入/输出数据的位数。多数RAM集成电路是用一根读/写控制线控制读/写操作的,但也有少数的RAM集成电路是用两个输入端分别进行读和写控制的。
在读/写控制电路上都设有片选输入端CS′。当CS′=0时RAM为正常工作状态;当CS′=1时所有的输入/输出端均为高阻态,不能对RAM进行读/写操作。
在多位数据并行输出的存储器中,习惯上将并行输出的一组数据称为一个“字”(word),存储器的每个地址中存放一个字。存储器的容量用存储单元的数量表示,通常写成“(字数)×(每个字的位数)”的形式。
1024×4位SRAM的结构框图
图5.5.2展示了一个1024×4位SRAM的结构框图,其中4096个存储单元排列成64行×64列的矩阵。10位输入地址代码分成两组译码。A₄~A₉ 6位地址码加到行地址译码器上,用它的输出信号从64行存储单元中选出指定的一行。另外4位地址码加到列地址译码器上,利用它的输出信号再从已选中的一行里挑出要进行读/写的4个存储单元。
1024×4位SRAM的结构框图
读/写操作在R/W和CS′信号的控制下进行。当CS′=0,且R/W′=1时,读/写控制电路工作在读出状态。这时由地址译码器选中的4个存储单元中的数据被送到I/O₀I/O₃。当CS′=0,且R/W′=0时,执行写入操作。这时读/写控制电路工作在写入工作状态,加到I/O₀I/O₃端的输入数据便被写入指定的4个存储单元中去。
若令CS′=1,则所有的I/O端均处于禁止态,将存储器内部电路与外部连线隔离。因此,可以直接将I/O₀~I/O₃与系统总线相连,或将多片存储器的输入/输出端并联运用。
SRAM的静态存储单元
静态存储单元是在SR锁存器的基础上附加门控管而构成的。因此,它是靠锁存器的自保功能存储数据的。
图5.5.3是用六只MOS管组成的CMOS静态存储单元。其中的T₁~T₄组成SR锁存器,用于记忆1位二值代码。其中T₁、T₂和T₃、T₄分别接成了反相器G₁和G₂。为了减少输入、输出连线的数目,将G₁的输出端与G₂的输入端相连,既可在写入时作为置1输入端,又可在读出时作为置1输出端。同理,将G₂的输出端与G₁的输入端相连,既可在写入时作为置0输入端,又可在读出时作为置0输出端。T₅和T₆是门控管,作模拟开关使用,以控制锁存器的Q、Q′和位线B、B′之间的联系。T₅、T₆的开关状态由字线X的状态决定。X=1时T₅、T₆导通,锁存器的Q和Q′端与位线B、B′接通;X=0时T₅、T₆截止,锁存器与位线之间的联系被切断。T₇、T₈是每一列存储单元公用的两个门控管,用于和读/写缓冲放大器之间的连接。T₇、T₈的开关状态由列地址译码器的输出Y来控制,Y=1时导通,Y=0时截止。
六管CMOS静态存储单元
存储单元所在的一行和所在的一列同时被选中以后,X=1、Y=1,T₅、T₆、T₇、T₈均处于导通状态。Q和Q′与B、B′接通。如果这时CS′=0、R/W′=1,则读/写缓冲放大器的A₁接通、A₂和A₃截止,Q端的状态经A₁送到I/O端,实现数据读出。若此时CS′=0、R/W′=0,则A₁截止、A₂和A₃导通,加到I/O端的数据被写入存储单元中。
采用CMOS工艺的SRAM不仅正常工作时功耗很低,而且还能在降低电源电压的状态下保存数据,因此它可以在交流供电系统断电后用电池供电以继续保持存储器中的数据不致丢失,用这种方法弥补半导体随机存储器数据易失的缺点。例如,Intel公司生产的超低功耗CMOS工艺的SRAM5101L用+5V电源供电,静态功耗仅1-2μW。如果将电源电压降至+2V使之处于低压保持状态,则功耗可降至0.28μW。双极型的SRAM虽然工作速度较快,但功耗很大,所以除了在某些超高速系统中还有应用以外,一般很少应用。
5.5 存储器
5.5.2 动态随机存储器(DRAM)
一、DRAM的动态存储单元
DRAM的动态存储单元是利用MOS电容可以存储电荷的原理制成的。由于存储单元的结构非常简单,在大容量、高集成度的RAM中得到了普遍应用。但由于MOS电容的容量很小(通常仅为几皮法),而漏电流又不可能绝对等于零,所以电荷保存的时间有限。为了及时补充漏掉的电荷以避免存储的信号丢失,必须定时地给电容补充电荷,这种操作称为刷新或再生。因此,DRAM工作时必须辅以必要的刷新控制电路,尽管操作复杂化,但DRAM仍然是目前大容量RAM的主流产品。
早期的动态存储单元为四管电路或三管电路,这两种电路的优点是外围控制电路较简单,读出信号也较大,缺点是电路结构不够简单,不利于提高集成度。单管动态存储单元是所有存储单元中电路结构最简单的一种。虽然外围控制电路比较复杂,但在提高集成度上具有优势,使它成为目前所有大容量DRAM首选的存储单元。
单管动态MOS存储单元
图5.5.4展示了单管动态MOS存储单元的电路结构图。存储单元由一只N沟道增强型MOS管T和一个电容C𝑠s组成。
在进行写操作时,字线给出高电平,使T导通,位线上的数据便经过T被存入C𝑠s中。
在进行读操作时,字线同样应给出高电平,并使T导通。这时C𝑠s经T向位线上的电容C𝐵B提供电荷,使位线获得读出的信号电平。设C𝑠s上原来存有正电荷,电压 𝑣𝐶𝑆vCS 为高电平,而位线电位 𝑣𝐵vB 为低电平,则执行读操作以后位线电平将上升为
𝑣𝐵=𝐶𝑆𝐶𝑆+𝐶𝐵𝑣𝐶𝑆vB=CS+CBCSvCS
由于在实际的存储器电路中位线上总是同时接有很多存储单元,使 𝐶𝐵≫𝐶𝑆CB≫CS,所以位线上读出的电压信号很小。例如,读出操作以前 𝑣𝐶𝑆=5𝑉vCS=5V, 𝐶𝑆/𝐶𝐵=1/50CS/CB=1/50,则位线上的读出信号仅为0.1V。而且在读出以后 𝑣𝐶𝑆vCS 仅剩下0.1V,因此这是一种破坏性读出。为了在DRAM中检测放大器的使用,一方面将位线上读出信号放大,另一方面将存储单元里的原始信号恢复。
二、DRAM的总体结构
为了在提高集成度的同时减少器件引脚的数目,目前的大容量DRAM多半都采用1位输入、1位输出和地址分时输入(亦称“地址多路复用”)的方式。图5.5.5展示了一个1M×1位DRAM总体结构框图。总体上讲,它除了包含存储矩阵、地址译码器和输入/输出电路三个部分外,还增加了一套刷新控制电路。
在进行读/写操作时,地址代码分两次从同一组引脚输入,分时操作由RAS′和CAS′两个时钟信号控制。首先令RAS′=0,输入地址代码的A₀-A₉位,然后令CAS′=0,再输入地址代码的A₀-A₉位。A₀-A₉被送到行地址锁存器,行地址译码器的输出从存储矩阵的1024行中选中一行;A₀-A₉被送往列地址锁存器,列地址译码器的输出再从行地址译码器选中的一行中选出一位。
当R/W′=1时进行读操作,被输入地址代码选中的单元中的数据经过输出数据选择器和输入/输出电路中的三态缓冲器到达数据输出端DOUT。当R/W=0时进行写操作,加到数据输入端DIN的数据经过输入数据分配器和输入/输出电路中的三态缓冲器写入由输入地址指定的单元中。
刷新控制电路包括刷新操作信号及时钟信号发生器、刷新计数器和行地址数据选择器等几部分。对存储单元的刷新操作基本形式是以行为单位逐行进行。启动刷新操作后,刷新计数器从0开始计数。计数器输出的10位二进制代码经过行地址数据选择器加到行地址译码器上,行地址译码器的输出依次给出1024(0-1023)个行地址。在刷新控制信号的作用下,被选中一行中所有单元中的数据将被重新写回原来的单元中。这种刷新操作是自动进行的,每隔10ms左右必须进行一次,以确保存储单元里的数据不至于丢失。在刷新操作过程中不能进行正常的数据读/写。
为了提高刷新操作的效率,以适应各种应用场合的需要,在有些DRAM中还对刷新操作形式作了许多改进,这里不作具体介绍。
5.5 存储器
5.5.3 只读存储器(ROM)
一、ROM的结构和工作原理
在存储器的某些应用场合中,要求存储的是一些固定不变的数据(例如计算机里的字库)。正常工作状态下,这些数据只供读出使用,不需要随时进行修改。为了适应这种需要,产生了只读存储器(Read-Only Memory,简称ROM)。
ROM的特点在于:所存储的数据是固定的、预先写好的。在正常工作时,这些数据只能读出,不能随时写入或修改。
ROM的结构框图
ROM的电路结构包含存储矩阵、地址译码器和输出缓冲器三个组成部分,如图5.5.6所示。
存储矩阵由许多存储单元排列而成,存储单元可以用二极管、双极型三极管或MOS管构成,每个单元能存放1位二值代码(0或1)。每一个或一组存储单元有一个对应的地址代码。通常ROM采用多位数据并行输出的结构形式,每个输入地址同时选中一组存储单元。
地址译码器的作用是将输入的地址代码译成相应的控制信号,利用这个控制信号从存储矩阵中选出指定的单元,并把其中的数据送到输出缓冲器。
输出缓冲器有两个作用,一是提高存储器的带负载能力,二是实现对输出状态的三态控制,以便与系统的总线连接。
二极管ROM的电路结构图
图5.5.7展示了具有2位地址输入码和4位数据输出的ROM电路,存储单元由二极管构成,地址译码器由4个二极管与门组成。2位地址代码A₁A₀能给出4个不同的地址。地址译码器将这4个地址代码分别译成W₀-W₃上的高电平信号。存储矩阵由4个二极管或门组成的编码器,当W₀-W₃每根线上给出高电平信号时,会在d₀-d₃上输出一个4位二值代码。通常将每个输出代码称为一个“字”,并将W₀-W₃称为字线,将d₀-d₃称为位线(或数据线),而A₀、A₁称为地址线。输出端的缓冲器用来提高带负载能力,并将输出的高、低电平变换为标准的逻辑电平。同时,通过给定EN信号实现对输出的三态控制。
在读取数据时,只要输入指定的地址码并令EN'=0,则指定地址内各存储单元所存的数据便会出现在输出数据线上。例如,当A₁A₀=10时,W₂=1,其他字线均为低电平。由于只有d₂与W₂间接有二极管,所以这个二极管导通后使d₂为高电平,而d₀、d₁、d₃为低电平。在数据输出端得到D₃D₂D₁D₀=0100。
不难看出,字线和位线的每个交叉点都是一个存储单元。交点处接有二极管时相当于存1,没有接二极管时相当于存0。交叉点的数目就是存储单元数。ROM的电路结构很简单,集成度可以很高,通常都是批量生产,价格便宜。
MOS管存储矩阵的原理图
在采用MOS工艺制作ROM时,译码器、存储矩阵和输出缓冲器都用MOS管组成。图5.5.8展示了MOS管存储矩阵的原理图。
在图5.5.8中,以N沟道增强型MOS管代替了图5.5.7中的二极管。字线与位线的交叉点上接有MOS管时相当于存1,没有接MOS管时相当于存0。当给定地址代码后,经译码器译成W₀-W₃中某一根字线上的高电平,使接在这根字线上的MOS管导通,并使与这些MOS管漏极相连的位线为低电平,经输出缓冲器反相后,在数据输出端得到高电平,输出为1。
二、ROM的分类


- 掩模只读存储器(Mask ROM)
在采用掩模工艺制作ROM集成电路芯片时,存储的数据由制作过程中使用的掩模板决定。这种掩模板是按照用户的要求专门设计的。因此,掩模ROM在出厂时内部存储的数据已经“固化”在里边。由于这种ROM制作周期较长,制作版图的成本较高,多用于大批量、定型的电子产品中。
- 可编程只读存储器(PROM)
在开发数字电路新产品的过程中,设计人员需要迅速得到存有所需内容的ROM,可以通过将所需内容自行写入PROM得到要求的ROM。对PROM的编程需要在编程器上完成。
PROM的总体结构与掩模ROM一样,同样由存储矩阵、地址译码器和输出电路组成。不过在出厂时,存储矩阵的所有交叉点上已经制作了存储元件,相当于在所有存储单元中都存入了1。
熔丝型PROM存储单元的原理图
图5.5.9展示了熔丝型PROM存储单元的原理图。它由一只三极管和串在发射极的快速熔断丝组成。三极管的be结相当于接在字线与位线之间的二极管。熔丝用很细的低熔点合金丝或多晶硅导线制成。在写入数据时,只需将需要存入0的那些存储单元上的熔丝烧断。因为这种熔丝在集成电路中占用面积较大,后来又出现了所谓“反熔丝结构”的PROM。反熔丝结构PROM中的可编程连接点上不是熔丝,而是一个绝缘连接件。未编程时所有的连接件均不导通,而在连接件上施加编程电压后,绝缘被永久性击穿,连接点的两根导线被接通。
16×8位PROM的结构原理图
图5.5.10展示了一个16×8位PROM的结构原理图。使用编程器编程时,首先应输入地址代码,找出要写入0的单元地址。然后使Vcc和选中的字线提高到编程所需的高电平,同时在编程单元的位线上加入编程脉冲(幅度约20V,持续时间约十几微秒)。这时写入放大器A₀的输出为低电平,低内阻状态,有较大的脉冲电流流过熔丝,将其熔断,使存储单元变成0状态。正常工作时,读出放大器A₀输出的高电平不足以使D₂导通。
可见,PROM的内容一经写入后就不能修改,所以只能写入一次。PROM仍不能满足研制过程中经常修改存储内容的需求。这就要求生产一种可以擦除重写的ROM。
- 用电信号擦除的可编程只读存储器——闪存(Flash Memory)
由于可擦除的可编程ROM(EPROM)中的数据可以擦除重写,在需要经常修改ROM内容的场合,它成为一种理想的器件。
最早的EPROM是用紫外线照射进行擦除,被称为UVEPROM(Ultra-Violet Erasable Programmable Read-Only Memory)。后来出现了用电信号擦除的可编程ROM(Electrically Erasable Programmable Read-Only Memory,简称E²PROM)。之后又研制成功了新一代用电信号擦除的可编程ROM——快闪存储器(Flash Memory),即通常所说的“闪存”。
闪存的存储单元是一只浮栅MOS管(Floating-Gate MOSFET),图5.5.11展示了它的结构示意图。在浮栅MOS管中,除了控制栅G外,还在控制栅和衬底之间增加了一个浮置栅Gf。
闪存的存储单元
图5.5.12展示了闪存的存储单元在存储矩阵中的连接图。在读出状态下,若浮置栅Gf上充有负电荷,则当字线给出逻辑高电平信号时,浮栅MOS管截止,位线上输出高电平;若浮置栅上没充有电荷,则当字线给出逻辑高电平信号时,浮栅MOS管导通,位线上输出低电平。因此,浮置栅上充有负电荷时相当于存储单元存有“1”,而浮置栅上没充有电荷时相当于存储单元存有“0”。
在写入状态下,浮置栅的充电是利用雪崩注入的方法实现的。执行写入操作时,浮栅MOS管的漏极经位线接至一个较高的正电压(一般为6V左右),Vss接0电平,同时在控制栅上加一个幅度12V左右的正脉冲。此时漏极-源极间将发生雪崩击穿,一部分速度高的电子穿过氧化层到达浮置栅,在浮置栅上形成充电电荷。浮置栅充电后,浮栅MOS管的开启电压在7V以上,字线给出的正常逻辑高电平不足以使它导通。
闪存的擦除操作是利用隧道效应进行的。浮置栅与源极之间有一个面积很小、氧化层极薄(厚度在20nm以下)的交叠区,称为隧道区。当隧道区的电场强度大到一定程度时(>10^7 V/cm),便在隧道区出现导电隧道,电子可以双向通过,形成电流。这种现象称为隧道效应。
执行擦除操作时,控制栅处于0电平,同时在源极Vss接入幅度为12V左右、宽度约100ms的正脉冲。由于浮置栅-源极之间的电容比控制栅-浮置栅之间的电容小得多,所以这个脉冲电压几乎全加到隧道区上,使隧道区产生导电隧道,浮置栅上的电荷经导电隧道释放。浮置栅放电后,浮栅MOS管的开启电压在2V以下。当字线给出的逻辑高电平(+5V或+3.3V)加到浮栅MOS管的控制栅时,它会导通。
对于采用如图5.5.8所示的或非结构形式的闪存(亦称NOR闪存),其中所有的源极都是连在一起的。所以在源极上加高电压进行擦除时,所有字线为零的那些字节中的存储单元将同时被擦除。利用这个特点,在对一个大容量闪存进行擦除时,可以将它划分成几个区,每次将一个区内的全部存储单元同时擦除,从而大大提高了擦除速度。
相比之下,编程写入的速度要慢得多。目前闪存的读出周期大约在几十到两百纳秒的范围,而写入一个字节的周期需要十到五十微秒。由于随机存储器必须满足快速存/取的要求(SRAM的存/取周期多在十几到几十纳秒),闪存不能满足要求,所以通常情况下闪存仍只能作为只读存储器使用。
闪存的编程和擦除操作不需要使用编程器,写入和擦除的控制电路集成于存储器芯片中,工作时只需5V的低压电源,使用极其方便。
由于浮栅MOS管浮置栅下面的氧化层极薄,经过多次编程后可能损坏,目前闪存的编程次数有限,一般在10000到100000次之间。随着制造工艺的改进,可编程次数有望进一步增加。
自从20世纪80年代末期闪存问世以来,凭借其高集成度、大容量、低成本和使用方便等优点,迅速普及应用。闪存被广泛应用在手机、数码相机、MP3、U盘、平板电脑等各种便携式电子产品中。目前,容量达128Gb的U盘已经面市。而且,闪存有可能在不久的将来替代较大容量磁性存储器(例如PC机中的硬磁盘)。
5.5.4 存储器容量的扩展
当使用一片ROM或RAM器件不能满足存储容量要求时,需要将若干片ROM或RAM组合起来,形成一个容量更大的存储器。
一、位扩展方式
如果每片ROM或RAM中的字数足够,但每个字的位数不够,则应采用位扩展的连接方式,将多片ROM或RAM组合成位数更多的存储器。
图5.5.13展示了RAM的位扩展连接方法。例子中,用8片1024×1位的RAM接成了一个1024×8位的RAM。
连接的方法非常简单,只需将8片的所有地址线、R/W、CS分别并联起来即可。每片的I/O端作为整个RAM输入/输出数据端的一位。总的存储容量为每片存储容量的8倍。
ROM芯片上没有读/写控制端R/W,在进行位扩展时,其余引出端的连接方法和RAM完全相同。
二、字扩展方式
如果每片存储器的数据位数足够而字数不够,则需采用字扩展方式,将多片存储器(RAM或ROM)芯片接成一个字数更多的存储器。
图5.5.14展示了用字扩展方式将4片256×8位的RAM接成一个1024×8位RAM的例子。由于4片中共有1024个字,所以必须给它们编成1024个不同的地址。每片集成电路上的地址输入端只有8位(A₀A₇),地址范围为0255,无法区分4片中相同地址单元。因此,必须增加两位地址代码A₈、A₉,使地址代码增加到10位,得到2^10=1024个地址。如果取第一片的A₉A₈=00,第二片的A₉A₈=01,第三片的A₉A₈=10,第四片的A₉A₈=11,那么4片的地址分配如表5.5.2所示。
表5.5.2 图5.5.14中各片RAM电路的地址分配
器件编号 | A₉A₈ | Y₀' | Y₁' | Y₂' | Y₃' | 地址范围 A₉A₈ A₇ A₆ A₅ A₄ A₃ A₂ A₁ A₀(等效十进制数) |
---|---|---|---|---|---|---|
RAM(1) | 00 | 0 | 1 | 1 | 1 | 00 00000000 ~ 00 11111111 (0 ~ 255) |
RAM(2) | 01 | 1 | 0 | 1 | 1 | 01 00000000 ~ 01 11111111 (256 ~ 511) |
RAM(3) | 10 | 1 | 1 | 0 | 1 | 10 00000000 ~ 10 11111111 (512 ~ 767) |
RAM(4) | 11 | 1 | 1 | 1 | 0 | 11 00000000 ~ 11 11111111 (768 ~ 1023) |
由表5.5.2可见,4片RAM的低8位地址是相同的,所以接线时将它们分别并联起来即可。由于每片RAM上只有8个地址输入端,所以A₈、A₉的输入端借用CS端。图中使用2线-4线译码器将A₉A₈的4种编码00、01、10、11分别译成Y₀'、Y₁'、Y₂'、Y₃'4个低电平输出信号,然后用它们分别去控制4片RAM的CS端。
此外,由于每片RAM的数据端I/O₀~I/O₇都设置了由CS控制的三态输出缓冲器,而CS在任何时候只有一个处于低电平,所以可将它们的数据端并联起来,作为整个RAM的8位数据输入/输出端。
上述字扩展接法也同样适用于ROM电路。如果一片RAM或ROM的位数和字数都不够用,就需要同时采用位扩展和字扩展方法。
5.5.5 用存储器实现组合逻辑函数
表5.5.3是一个ROM的数据表。如果将输入地址A1和A0视为两个输入逻辑变量,同时将输出数据D0、D1、D2和D3视为一组输出逻辑变量,则D0、D1、D2和D3就是一组A1、A0的组合逻辑函数,表5.5.3也就是这一组多输出组合逻辑函数的真值表。
表5.5.3 一个ROM的数据表
A1 | A0 | D0 | D1 | D2 | D3 |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 0 | 0 |
从图5.5.7所示ROM的电路结构图上也可以看到,其中译码器的输出包含了输入变量全部的最小项,而每一位数据输出都是若干个最小项之和,因而任何形式的组合逻辑函数均能通过向ROM中写入相应的数据来实现。
用具有n位输入地址、m位数据输出的ROM可以获得一组(最多为m个)任何形式的n变量组合逻辑函数,只要根据函数的形式向ROM中写入相应的数据即可。这个原理也适用于RAM。
例5.5.1 试用ROM设计一个八段字符显示的译码器,其真值表由表5.5.4给出。
表5.5.4 例5.5.1的真值表
输入 | 输出 | 字形 |
---|---|---|
D | C | B |
0 | 0 | 0 |
0 | 0 | 0 |
0 | 0 | 1 |
0 | 0 | 1 |
0 | 1 | 0 |
0 | 1 | 0 |
0 | 1 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 0 | 0 |
1 | 0 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
1 | 1 | 0 |
1 | 1 | 1 |
1 | 1 | 1 |
解:由给定的真值表可见,应取输入地址为4位,输出数据为8位的(16×8位)ROM来实现这个译码电路。以地址输入端A3、A2、A1、A0作为BCD代码的D、C、B、A四位的输入端,以数据输出端D0-D7作为a-h的输出端,如图5.5.15所示,就得到了所要求的译码器。
图5.5.15 例5.5.1的电路
例5.5.2 试用ROM产生如下的一组多输出逻辑函数。
𝑌1=𝐴′𝐵𝐶+𝐴′𝐵′𝐶′Y1=A′BC+A′B′C′ 𝑌2=𝐴𝐵′𝐶′𝐷′+𝐴′𝐵𝐶𝐷′+𝐴′𝐵𝐶′𝐷′Y2=AB′C′D′+A′BCD′+A′BC′D′ 𝑌3=𝐴𝐵𝐶𝐷′+𝐴′𝐵𝐶′𝐷′Y3=ABCD′+A′BC′D′ 𝑌4=𝐴′𝐵′𝐶𝐷′+𝐴𝐵𝐶𝐷Y4=A′B′CD′+ABCD
解:将式(5.5.2)化为最小项之和的形式得到:
𝑌1=𝐴′𝐵𝐶𝐷′+𝐴′𝐵𝐶′𝐷+𝐴′𝐵′𝐶𝐷′+𝐴′𝐵′𝐶𝐷Y1=A′BCD′+A′BC′D+A′B′CD′+A′B′CD 𝑌2=𝐴𝐵′𝐶𝐷′+𝐴′𝐵𝐶𝐷′+𝐴𝐵𝐶𝐷′+𝐴′𝐵𝐶𝐷Y2=AB′CD′+A′BCD′+ABCD′+A′BCD 𝑌3=𝐴𝐵𝐶𝐷′+𝐴′𝐵𝐶′𝐷′Y3=ABCD′+A′BC′D′ 𝑌4=𝐴′𝐵′𝐶𝐷′+𝐴𝐵𝐶𝐷Y4=A′B′CD′+ABCD
或写成:
𝑌1=𝑚2+𝑚3+𝑚0+𝑚7Y1=m2+m3+m0+m7 𝑌2=𝑚6+𝑚7+𝑚10+𝑚14Y2=m6+m7+m10+m14 𝑌3=𝑚3+𝑚14Y3=m3+m14 𝑌4=𝑚2+𝑚15Y4=m2+m15
取有4位地址输入,4位数据输出的16×4位ROM,将A、B、C、D 4个输入变量分别接至地址输入端A3、A2、A1、A0,按照逻辑函数的要求存入相应的数据,即可在数据输出端D3、D2、D1、D0得到Y1、Y2、Y3、Y4。
因为每个输入地址对应一个A、B、C、D的最小项,并使地址译码器的一条输出线(字线)为1,而每一位数据输出都是若干字线输出的逻辑或,故可按照式(5.5.4)列出ROM存储矩阵内应存入的数据表,如表5.5.5所示。
表5.5.5 例5.5.2中ROM的数据表
最小项 | 函数 | Y1 | Y2 | Y3 | Y4 | W |
---|---|---|---|---|---|---|
A'B'C'D' (m0) | 0000 | 0 | 0 | 0 | 0 | W0 |
A'B'C'D (m1) | 0001 | 0 | 0 | 0 | 0 | W1 |
A'B'CD' (m2) | 0010 | 1 | 0 | 0 | 1 | W2 |
A'B'CD (m3) | 0011 | 1 | 0 | 0 | 0 | W3 |
A'BC'D' (m4) | 0100 | 0 | 0 | 1 | 0 | W4 |
A'BC'D (m5) | 0101 | 0 | 0 | 0 | 0 | W5 |
A'BCD' (m6) | 0110 | 1 | 1 | 0 | 0 | W6 |
A'BCD (m7) | 0111 | 1 | 1 | 0 | 0 | W7 |
AB'C'D' (m8) | 1000 | 0 | 0 | 0 | 0 | W8 |
AB'C'D (m9) | 1001 | 0 | 0 | 0 | 0 | W9 |
AB'CD' (m10) | 1010 | 0 | 1 | 0 | 0 | W10 |
AB'CD (m11) | 1011 | 0 | 0 | 0 | 0 | W11 |
ABC'D' (m12) | 1100 | 0 | 0 | 0 | 0 | W12 |
ABC'D (m13) | 1101 | 0 | 0 | 0 | 0 | W13 |
ABCD' (m14) | 1110 | 0 | 1 | 1 | 0 | W14 |
ABCD (m15) | 1111 | 0 | 0 | 0 | 1 | W15 |
如果使用EPROM实现上述一组逻辑函数,只需按表5.5.5将所有数据写入对应的地址单元即可。
在使用PROM或掩模ROM时,还可以根据表5.5.5画出存储矩阵的结点连接图,如图5.5.16所示。为了简化作图,在接入存储器件的矩阵交叉点上画一个圆点,以代替存储器件,图中以接入存储器件表示存1,以不接存储器件表示存0。
图5.5.16 例5.5.2的ROM点阵图
我们继续分析例5.5.2中的逻辑函数生成和ROM实现过程。
表5.5.5列出了对应于输入变量的最小项和每个最小项在ROM中的数据存储情况。通过这一表格,我们能够明确每个逻辑函数对应的输出,并在实际设计中按照这些数据在ROM中进行相应编程。
图5.5.16展示了ROM存储矩阵的连接示意图。在这个矩阵中,每个交点上接入存储器件的位置用圆点表示(表示存入1),没有接入存储器件的位置为空(表示存入0)。这种图示方法简洁明了,有助于理解和实现复杂的组合逻辑函数。
图5.5.16 例5.5.2的ROM点阵图
对于复杂的组合逻辑函数,可以利用ROM的这种编程能力,将多输出的组合逻辑函数存储在一个ROM芯片中,减少电路设计的复杂度,提高集成度和可靠性。
本章小结
存储电路的基本功能是存储数字系统工作时需要存储的各种数据和信息。通常将用于存储一组数据的存储电路叫做寄存器,而将用于存储大量数据的存储电路叫做存储器。
寄存器
寄存器的电路结构比较简单,它实际上就是一组具有公共时钟信号输入端的触发器。由于每个触发器的输入端和输出端都被直接引出,所以便于和其他电路直接相连,快速进行数据交换。因此,在计算机和其他一些高速的数据处理系统中,经常会用到寄存器。
存储器
存储器的电路结构形式不同于寄存器。由于存储器中存储单元的数量非常大,而集成电路引出端的数目是有限的,不可能将每个存储单元的输入端和输出端都引出,所以采用了寻址读/写的工作方式:只有被选中地址中的一个(或一组)存储单元才能与输入、输出电路接通,进行读/写操作,而输入、输出电路是公用的。
半导体存储器的种类虽然很多,但是它们的基本结构形式都由存储矩阵和读/写控制电路两部分组成。
首先,从读/写的功能上,可以将半导体存储器分为随机存储器和只读存储器两大类。随机存储器工作时,可以随时对其进行快速的读/写操作;而只读存储器在正常工作状态下,只能从中读出数据。虽然有些只读存储器(如EPROM)中的数据可以擦除改写,但由于擦除改写的速度很慢,无法满足数字系统对数据进行快速读/写的要求,所以通常仍然用来存储一些固定的数据作为只读存储器使用。
随机存储器
随机存储器根据采用的存储单元不同而分为静态随机存储器和动态随机存储器。目前使用的静态存储单元有锁存器和触发器两类。锁存器和触发器的根本区别在于,锁存器的置1和置0操作通过直接输入置1和置0信号即可完成,而触发器的置1和置0操作除了需要输入置1和置0信号以外,还必须有时钟信号到达时才能完成。因此锁存器的电路比较简单,功能也比较单一。由于锁存器不仅电路结构简单,而且所具备的功能可以满足存储器对存储单元的要求,所以在大容量的静态存储器中,都采用锁存器作为存储单元,而不采用电路结构相对复杂的触发器。
然而,在寄存器当中,因为需要用时钟信号控制其中所有的存储单元同时动作,所以必须使用触发器。此外,在设计时序逻辑电路中的存储电路时,锁存器的逻辑功能已无法满足要求,因而也必须使用触发器。
目前为止,触发器的电路结构形式已经有许多种。由于电路结构不同,各种触发器在逻辑功能和触发方式上也不一样。这里所说的“逻辑功能”是指稳态下触发器的次态和触发器的现态与输入之间的逻辑关系。而“触发方式”则表示触发器在动态翻转过程中的动作特点。虽然目前触发器的名目和分类方法繁多,只要掌握了每一种触发器的逻辑功能和触发方式这两个基本属性,就可以正确地选择和使用它们了。
动态存储器
在动态存储器中,目前几乎都采用只包含一个MOS电容和一只MOS管的单管存储单元。尽管动态存储单元的工作速度比较慢,而且由于需要刷新而增加了控制电路的复杂程度,但因为存储单元的电路结构非常简单,便于大规模集成,所以在大容量的存储器中,动态存储器依然得到了广泛的应用。
只读存储器
在只读存储器中,由于每个存储单元所存储的数据都是固定的1或0,所以每个存储单元被选中时,只需给出固定的高电平(要求存入1时)或低电平(要求存入0时)就行了。为此,只要根据要求存储的数据,决定在相应存储单元的位置上是否接入一个二极管或三极管,就可以得到想要存储的数据了。这就使得存储矩阵的电路大为简化,从而更有利于大规模集成。
鉴于只读存储器不仅可以用于存储数据,而且还可以通过写入相应的数据产生所需要的逻辑函数,所以在有些教材中,也把只读存储器视为一种可编程逻辑器件,把有关的内容纳入可编程逻辑器件的章节中。