1引言
半导体存储器通常在电路中用于存放程序或数据。在长期的电路实践中,笔者发现,通过向非易失性(即掉电不会丢掉所存数据)并行存储器的存储单元写入特定的数据,并合理地安排并行存储器的地址线(An)、数据线(Dn)和使能(CE)、门控(OE)控制线引脚的功能,可以非常巧妙地将其作为组合逻辑芯片使用,大大简化了电路的硬件设计。尤其在存储器价格相当低廉的今天,合理、巧妙地使用非易失性并行存储器,不仅可以简化电路、方便调试、提高可靠性,还能有效地降低研发成本。本文将对非易失性并行存储器作为多功能组合逻辑和时序逻辑芯片进行研究探讨。如果没有特别指出,文中提到的存储器均指非易失性并行存储器。
在数字电路设计中,我们常常希望有某个特定功能的芯片,而市场上很难找到甚至没有芯片能提供所需要的功能。这时,一个切实可行的办法就是采用可编程逻辑器件(PLD)定制功能,这里讨论用存储器法实现。这种方法很容易推广到其它容量和类型的非易失性并行存储器,如EPROM、EEPROM、Flash等。即使以后推出新型工艺的非易失性存储器芯片,只要是并行输入/输出的,存储器法都适用。
2用EPROM2764(8k×8)实现的几种电路
21将2764作为十六进制-七段数码管译码驱动器
数字电路中经常需要十六进制七段数码管译码驱动芯片。已知的74LS48、74LS248等芯片由于只是BCD码-七段数码管驱动器,都不能正确显示十六进制A~F,如用门电路设计,虽然理论上可行,但所需芯片太多,接线过于复杂,而用存储器实现却很方便,并可自由选择共阴或共阳译码输出。限于篇幅,略去2764作为十六进制七段数码管译码驱动器(包括 74LS48)的真值表。
对2764编程写入真值表中的数据,仅使用16个地址单元(A3~A0:0000~1111)就能实现基本的十六进制数到七段数码管显示的共阴译码功能。如果要驱动的七段数码管是共阳的,只要将写入2764的数据与D6-D0取反即可。我们只用了2764存储器8位字长中的7位,未用的D7可根据电路具体需要用于小数点显示或其它功能。
为了使这个译码驱动器能满足各种场合的需要,我们引入“共阳/共阴选择”功能,并参照74LS48,添加以下控制引脚:
CA/CK——共阳/共阴选择,为低时芯片作为共阴型译码器;为高时则为共阳型译码器。
BI/RBO——灭灯入/下一位无效零消隐输出,低电平时使七段全灭。
LT——灯测试,为低电平且BI/RBO为高时,a-g输出全高,即将数码管的七段都点亮,用来测试数码管或芯片好坏;为高时正常译码显示。
RBI——动态灭灯输入,为低电平且LT、BI/RBO为高时,输入十六进制0时使数码管不显示,其它十六进制值不受影响(常用于消隐所显示整数部分前面的零);为高时输入十六进制0不会使数码管消隐。由此再安排真值表(略)。
将真值表中的数据按地址写入2764,没有用到的高位地址线全部接地,我们就得到了一个功能完整的十六进制-七段数码管译码驱动器,而且功能上兼容74LS48等BCD码-七段数码管译码驱动器。图1为其与七段数码管的接线图,图中CA/CK(2764的3脚)应接地,因为数码管是共阴型的。RBI、BI/RBO、LT的意义和接法与74LS48完全一样。
不难看出,在2764的8K个地址单元中我们仅使用了低端的256个。
22将2764作为八通道同相/反相器
由于电路设计的需要,我们希望有一种芯片提供8位通道,通过一个引脚的电平控制输出与输入是同相还是反相。我们知道,一个异或门是可以控制一位通道正反相的,因而用4重异或门74LS86可以实现希望的功能。但对于8通道来说,就需要2片74LS86。而用1片2764就可以实现,先写出8通道同相/反相器的真值表(略),再将真值表中的数据按其地址写入 2764,就可以将其作为8通道同相/反相器了。当(2764的脚A8)接高电平时,输出与输入是同相的;接地时,输出与输入是反相的。用于控制是否输出,高电平时输出为高阻态,它是存储器本来的功能,与写入的数据无关。图2为其引脚接法。实现8通道同相/反相器用了2764的512个低地址单元。
23用2764实现十六进制(四位二进制)与BCD码的相互转换
当输入的十六进制数为0~9(二进制为 0000~1001)时,输出的两个BCD码的高字节总为0000,而低字节与输入的四位二进制相同;当输入的十六进制数在A~F(二进制为 1010~1111)时,输出的高字节总为0001,而低字节为0000~0101。这个功能可以用门电路实现,或使用1片74LS154(四十六译码器)、2片(74LS147)十线四线优先编码器及8个反相器,但都相当麻烦。而用2764存储器实现起来却特别简单(真值表略)。
由两个BCD码转换到十六进制则执行与上面相反的转换。两个转换电路分别见图3(a)、3(b)所示。两个转换器分别占用8k存储空间的前16个和256个地址单元。下面讨论用1个存储器实现2个转换器的问题。
24使2764同时具有以上4种功能
上面例子中,我们都只是用到了2764的8k存储空间中很少一部分低端地址,未用到的较高位地址线都是接地的,所以绝大多数存储单元都闲置着。其实我们完全可以将各种功能的数据按地址分开写到2764中,以提高芯片的利用率。在使用时将部分引脚置高电平或低电平,选择出需要的功能。
图4为用2764实现上述几个功能的等效电路。通过改变F1F0(即2764的A10、A9脚)的电平,就可以使2764提供不同的功能。
由于各功能所需的存储空间不一样多,我们以需要最多存储空间的功能为准,让其它功能的数据也都占有这么多存储空间,并只使用其中的低端地址(当然,将几个需要空间小的功能集中在一起,合着使用一块与单个需要空间较大的功能相同大小的存储区,可以进一步提高存储空间的利用率)。在本例中占用空间最大的是8通道同相/反相器,它需要512个地址单元,所以其它3个功能也都占有512个地址单元。这样仍难免存在存储地址浪费的问题。但即便如此,1片2764可实现的功能仍是相当可观的——以每个功能需要512个存储地址计算,2764的8K地址单元就能实现16个相互独立的功能。可见用存储器实现组合逻辑功能芯片具有巨大的优越性。
由以上例子可以看出,使用存储器可以非常方便地实现各种组合逻辑芯片的功能,输入信号的最大数目取决于存储器的地址线条数(还有门控信号、片选信号等);而输出信号的最大数目则取决于存储器的字长。因此,如果用户需要的输入信号较多,可以选择容量大的存储芯片;需要的输出较多,就选择字长为16位、32位的芯片。总之,只要存储器地址线和数据线条数满足要求,就可以实现任何可以想象到的组合逻辑功能。
需要注意的是,以上我们一再强调是组合逻辑,而非时序逻辑,是因为存储器没有锁存功能(在读模式下),所以无法单独实现时序逻辑。但若在存储器输入、输出加上锁存器,例如采用透明8D锁存器74LS373、8D边沿锁存器74LS374,也是可以定制时序逻辑功能的。
25将2764作为四位格雷码计数器
格雷码是一种“单位间距”码,其特点是相邻两个码组间只有一位码的取值不同,因而在通信中是一种可靠性较高的编码。格雷码还用于卡诺图中,进行各种信号的逻辑综合用。从四位格雷码编码表(略),可推导出计数器真值表,如表1所示。
推导要写入的存储器数据,即表1内容的方法是:第0个地址单元填入下一个应输出的计数值(0001),然后将此计数值作为存储器地址,在此地址内写入下一个格雷码的值,如此循环直到所有十六个存储单元都填入了数据。这种方法有些类似数据结构中的“指针”概念。显然,如果要求的格雷码位数很长,手工编写存储器数据将非常繁琐,这时最好还是用计算机编程生成,算法为:定义一个数组A,本例中此数组应有十六个元素(A[0]-A[15]),先对第零个元素赋第一个元素的格雷码A[0]=0001,将下标为此十进制值1(0001)的数组元素赋下一个就输出的格雷码A[1]=0011,下标为3(0011)的数组元素赋A[3]=0010,依此类推A[2]=0110,A[6]=0111......过程见图5所示。通过一个循环就可以把整个数组的所有元素赋值。数组A就包含了要写入存储器的数据,其中下标为地址,元素值为存储的数据。
表 1 四 位 格 雷 码 计 数 器 真 值 表
CLR |
二进制数输入 |
格雷码输出 |
A4 |
A3 |
A2 |
A1 |
A0 |
D3 |
D2 |
D1 |
D0 |
0 |
X |
X |
X |
X |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
2764与74LS374的接法如图6所示。构成的格雷码计数器在CLK时钟上升沿计数。CLR(A4)是作为计数复位用的。当其为低电平时,A3-A0无论是什么电平,其存贮内容都是数组中A[9]元素的内容:1000。因此在下一时钟(CLK)的上升沿,Q3-Q0将输出地址为A[8]的内容:0000,从而计数从头开始,可见为CLR同步清零。
事实上,只要将表1的内容以二进制数为地址,对应格雷码作为数据写入2764,用一个四位二进制加法计数器接在2764地址输入端,就能方便地实现格雷码计数功能,清零只需清计数器即可。所以本例只是为了说明用存储器实现时序逻辑功能是可行的,并没有实用价值。从本例还可以看出,由于时序逻辑必须要有输出到输入的反馈,所以手工编写时序逻辑的真值表较组合逻辑复杂得多。
3实现组合逻辑和时序逻辑功能的一般步骤
1)确定所要实现的功能,及有哪些输入、输出信号,输入的控制信号优先级顺序。判断某控制信号的优先级方法是:如果它的有效必须以其它信号为某个电平为前提,那么此信号优先级较低。在21中由于RBI要想低电平有效,就要求LT、RI/RBO先为高才行,因而它在这3个信号中优先级最低,同理LT优先级比RI/RBO低。RI/RBO要起作用不需要其它信号为前提(这里不必考虑门控信号,因为它不编入地址线),所以RI/RBO的优先级最高。
2)规划好输入信号和输出信号应接的存储器引脚。通常输入的数据信号应放在地址低位,且数据最低位D0接存储器地址线A0引脚。控制信号则按照优先级别依次接往地址线高位,优先级越高,地址位越高。
3)按地址顺序列出真值表中的内容,即当输入数据和控制信号的电平是某一确定值时,要求输出数据是什么,要详细到每个地址单元。
4)如果要在一个存储器芯片上实现多个功能,就将各功能分别作好真值表。综合时,找出单个功能占用最多的存储空间,在其基础上增加高位地址线。增加数目与实现的功能数有关。例如,要实现的功能有5-8个,应增加3条高位地址线。这样就得到综合后的真值表(也应按地址顺序列出)。
5)根据真值表生成编程用的数据文件。
6)用编程器将数据写入存储器。
7)将编程成功的存储器用于电路中,按照规划好的输入、输出信号连接引脚。对于存有多个功能的芯片,还要根据综合时的真值表设置所增加高位地址线的电平。未用到的更高位地址线、所用功能中未用的
地址线引脚都应可靠接地,以免引入干扰。
4存储器法的优缺点
41优点
与PLD中的可编程逻辑阵列(PLA)、可编程阵列逻辑(PAL)、通用阵列逻辑(GAL)一样,用存储器实现组合逻辑和时序逻辑,实际上是一种计算机软件和硬件相结合定制芯片功能的方法。与后者不同的是,存储器法的实质就是查表法——存储器就相当于一个表格。向“表格”送入一个行号(地址),就可以从输出得到表格里这一行的内容(所存储的数据),所以输出和输入并没有什么逻辑上的关联;而PLA、PAL、GAL的输入与输出有着逻辑上的关系——输出是输入经过逻辑运算得到的。所以后者对写入的数据进行了“压缩”,用户在写入这些芯片之前,要从真值表或其它途径归纳出输入与输出的逻辑关系。存储器就完全不需要用户这样作,只要将输入按位编成地址,根据地址和实现的逻辑功能确定希望得到的输出,即为应存放的数据。真值表数据的取得既可以用手工的方法,也可以用程序生成。由于存储器没有对数据进行“压缩”,因而有很大的冗余度,所以容错能力也比PLA、PAL、GAL强得多。更重要的是,如今存储器芯片价格低廉,存储容量大,因而可以将几十个、甚至成百上千个相互独立的功能用一个存储器实现,这就进一步降低了使用存储器实现各种功能的成本。
42缺点
——不能直接定制时序逻辑功能,必须有外接锁存器配合才能实现。
——如果要求实现的芯片其引脚有双向传输功能(如74LS245)或作双向开关(如CD4016、CD4066),就不能直接用存储器作到,也必须有外电路配合。
——OC门,存储器输出不是OC门,因而不能用存储器定制输出为OC门的功能。不过我们可以通过增加六重集电极开路输出缓冲器74LS07,将存储器输出转换为OC门输出。
——不能将存储器作为增加带负载能力的驱动器用。存储器并不是专门的驱动器,尽管存储器可以作到与输入信号同相,但不要指望存储器通过编程就以为它有了74LS244(八通道缓冲器/线驱动器)那么大的驱动能力。
——存储器也不能实现施密特触发器,及与施密特触发有关的功能。施密特触发器又称电位触发器,它有两个稳定的输出状态,并有两个阈值电平VT+、VT-。当输入信号电平由低向高变化到上限触发电平VT+时,触发器即被触发到某一输出状态;当输入信号电平由高向低变化到下限触发电平VT-时,触发器翻转到另一输出状态,因而施密特触发器的触发有滞后特性。存储器的输入纯粹以电平高低判断逻辑0和1,所以不能实现施密特触发及相关功能。
——与PLA、PAL、GAL芯片相比,存储器法不能实现数据加密,无法有效保护芯片内容的知识产权,因为只要在存储器地址端加上计数信号,就很容易地将其存储的所有内容读出。而GAL等可编程逻辑器件通过加密,可大大提高破译编程信息的难度。
——在高速数据处理条件下应对作为逻辑芯片的存储器仔细测试方可使用,毕竟存储器的读出时间与一般TTL的逻辑传递时间(100ns以内)相比还是很长的,例如2764的读出时间根据型号的不同从100ns到 450ns不等,与CMOS4000系列有些接近。EEPROM、Flash的读出时间要短一些,但还是比TTL长。如果设计的电路工作在高速数据处理或对时序要求非常严格的场合,用存储器作控制逻辑芯片就可能导致时序紊乱。这时应改用GAL、现场可编程门阵列(FPGA)等种类的可编程芯片。如果随着生产工艺的改进,存储器读出时间与TTL相当时,这一局限性就自然不再存在。
5结语
用并行存储器可实现任何组合逻辑功能,其限制只在于输入地址线和输出数据线的条数,并可以将大量功能集成在一片存储器中,使用时通过对引脚电平进行控制来选择要实现的功能。与PLD相比,用存储器实现组合逻辑功能有许多优越性。但单独用存储器不能直接实现时序逻辑功能,而且受硬件限制,存储器法还有一些应用上的局限性。但不管怎么讲,很多场合中利用存储器定制芯片功能,在电路设计、制造时肯定会收到事半功倍的效果。 |