数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 6153|回复: 75

[Arduino] 简介 SPLD 器件的工作原理,并搭建基于 ATF16V8 的逻辑门实验板(原创)

[复制链接]
发表于 2023-8-15 17:32:11 | 显示全部楼层 |阅读模式
提到可编程逻辑器件(PLD: Programmable Logic Device),大家可能直觉想到 FPGA/CPLD 这两个玩意。

PLD 按照电路复杂度分为简单(SPLD: Simple-PLD)、复杂(CPLD: Complex-PLD),其中后者就是常提到的 CPLD.
从内部原理上 SPLD/CPLD 属于相同结构,仅资源数目、资源规模上有所区别,因而 CPLD 实则是 SPLD 的升级版。

今天从 CPLD 的前身 SPLD 讲起,介绍下 16V8 的基本工作原理,并最终搭建一套逻辑门实验板供折腾。

【线与】

PLD 器件是作为 74LS/HC 逻辑门替代品出现的。传统逻辑门一旦完成电路连线,逻辑就无法更改,电路灵活度差。

PLD 则希望在外部连线不变的前提下,可以软件配置内部走线,实现灵活的逻辑功能。
这思路类似于单片机当中的 IO 配置:把信号就近接在 IO 上,由软件来管理具体 IO 调用。

为此首先考虑“线与”(Wired And)结构与门:



如图,每个输入端 A1-An 通过隔离二极管接在公共的逻辑线上,并由上拉电阻维持 Y 高电平。
当 A1-An 中至少有一个信号为低电平(L=0v)时,输出 Y=0v 即低电平(L);
仅在 A1-An 全为高电平(H=5v)时,输出 Y=5v 即高电平(H).

线与结构便宜简单,但严格实现了 n 输入端的逻辑与门:Y = A1*A2*...*An .

这里表达式以 * 代表逻辑与,以 + 代表逻辑或,下同。


【可编程乘积项】

上述“线与”门虽然实现了多输入端与门,但仍旧不存在任何意义上的“可编程”,输入输出均确定。

为此对线与进行改进,在每个二极管支路上放一只 MOS 当作电子开关:



每支 MOS 的栅极使用 EEPROM 技术,可由编程器注入或擦除电荷,并且长时间保持电荷状态(F1-Fn)。
这样一来注入了正电荷的 MOS 保持导通(记作Fx=L),擦除了正电荷的 MOS 保持截止(记作Fx=H),就有了传说的“可编程”能力。

逻辑门的表达式更新为:Y = (A1+F1)*(A2+F2)*...*(An+Fn) .

对于 Fi=H 的输入端 Ai,相当于被屏蔽;对于 Fj=L 的输入端 Aj,相当于被选中。举例:

a. 通过编程器,另 F2=F5=F7=L,其余 Fx=H.
b. 逻辑门表达式动态更新为:Y = A2*A5*A7

这样一来可以实现 A1-An 的任意乘积组合,即从 A1-An 当中任选几根线组成与门逻辑。


【乘积项禁用】

上述可编程乘积项接近完美,然有两个极端例子需要考虑:Y≡H、Y≡L,即输出恒定电平的情况。

对于Y≡H,只需要 F1=F2=F3=...=Fn=H,从逻辑表达式上就可以实现;

但是Y≡L,就无论如何都无法消除所有的输入端影响。
因而在上述电路基础上,额外增加一只对地 MOS(状态为 Fd),用于实现 Y≡L 逻辑:



如图所示,当额外对地的 mos 被编程导通时(Fd=L),输出 Y≡L,此状态被称作“乘积项禁用(PTD)”


【可编程乘积阵】

有了前边的乘积项设计,就可以很顺利的升级为可编程乘积阵:



如图所示,把 k 个乘积项的结果送入一个或门当中,获得了一个 k*n 尺寸的可编程乘积阵,Z= Y1+Y2+...+Yk.

逻辑学上可以证明,包含与、或、非门的前向逻辑电路(不含寄存器、反馈环节),总可以简化为若干最小乘积项之和。
例如为实现 Z= (A+B)*((C+D+E)*F) 逻辑,有:

Z= (A+B)*((C+D+E)*F) = (A+B)*(C*F +D*F +E*F) = A*C*F +A*D*F +A*E*F +B*C*F +B*D*F +B*E*F

整个化简过程类似于多项式展开,最终由各乘积项先“与”再统一“或”输出。
上式使用 6 个可编程乘积项,分别实现 Y1=A*C*F、Y2=A*D*F、...、Y6=B*E*F,最终再 Z=Y1+Y2+...+Y6 即得所需逻辑电路。


【ATF16V8】

上述可编程乘积项+乘积阵的结构,就已经达到了传说中 SPLD 的规模。以最常见的工业 16V8 为例,
目前仍存活的型号有: Microchip 的 ATF16V8, Lattice 的 GAL16V8,功能基本兼容。

这片 SPLD 有着经典的 DIP-20 封装,非常适合 DIY 万用板折腾:



早期芯片的手册非常实在,详细讲述了这片 SPLD 内部的接线,甚至连熔丝编号都写好了:



如图,图中红色区域为两个“8*32可编程乘积阵”,带有 PTD 乘积项禁用功能。
可编程乘积阵的输入,由各引脚(1、2、...)电平信号组成,可以选择使用或禁用反相器,相当于 A、~A 任选;
乘积阵的结果送入“逻辑输出宏”(OLMC: Output Logic Macrocell)进行简单或运算,并最终由右侧引脚(19、18、...)输出。

这片 SPLD 以熔丝作为配置,最多可以配置 16 个输入端、8 个输出端(但总IO数≤18),每个输出端都拥有一个 8*32 可编程乘积阵,
因而实现诸如 3-8译码器、与或非组合门之类的逻辑电路都不在话下。

在编程上,正规军一般选 WinCupl 或者 Protel99SE 配合 HDL 语言;
但作为 DIY 没必要专门去装软件还要学 HDL,我选择直接人肉熔丝编程:对照原理图,按照熔丝号直接写0/1,最终转 jed 文件即可烧录。

关于 ATF16V8 的编程/烧录就不再详细展开了,后续如有必要我另开贴介绍。


【应用】

关于 ATF16V8 的实际应用,在我以往的帖子里也能找到只言片语,但大多一带而过。
这次专门针对 SPLD 实现逻辑门,进行一个略详细的介绍。

经朋友推荐,在一个外国开源网站上看到了一款迷你逻辑板:http://www.technoblogy.com/show?4FFY



被数电实验摧残过的朋友一眼就能认出,这就是数电实验箱的迷你版本:
左侧四个开关产生 0/1 逻辑,右侧五个灯用于指示 0/1 状态,中部整片的与/或/非门供你随便连线。

为求简洁,原作者使用了一片 AVR 单片机来模拟逻辑门功能。
在低速情况下自然无虞,然而真要上高速了目测是要出问题,例如拿两个反相器来当振荡器用。

心生不悦,打算改版:仅借鉴门电路布局,而逻辑门一定要用真实玩意来搞。
由于逻辑门种类相当多,如果用 74HC 得好几个型号,还会有鬼一样的走线;这时候上 PLD/FPGA 最为合适。

ATF16V8 标称的前向频率 >45MHz,这种速度对于单片机 IO 模拟几乎是碾压。话不多说,两片 16V8 画起来:






既然是实验板,当然要考虑拆修的情况。记得数电实验室几乎每天都有烧坏的 74HC/LS 在更换。
使用 DIP 封装的 SPLD 可以高枕无虞,坏了换个新的就行,有手就能干。

打板焊接走起:






软件上就是依照人肉编译原理,在特定的熔丝位置写入0,实现电路重构。我用 VS 来辅助下(用C宏提高可读性):



运行生成一个 bin 形式的烧录文件,转成 jed 格式以后就可以用 PROTEUS 仿真,避免烧录返工:



最后上自制的烧录器,野生二手 ATF16V8 烧起来:



烧录好两片固件以后,插回逻辑板,就可以愉快的折腾数电了。
如图是个 2bit*2bit = 4bit 无符号硬件乘法器,目前状态是 3x3=9 的二进制样子:



数电实验室要插成这样,大概是要被管理员谈话的;但自己的爱怎么折腾就怎么折腾,烧了 16V8 也就 ¥2 一片自己换。

附上本实例中两片 16V8 的 VS 编译包(含源码+Proteus测试):

---------------------------------------------------------------------------------------------------------

以上,简介了 SPLD 器件的工作原理,并在其基础上搭建一套逻辑门实验板,供折腾。

最后祝大家数电不迷路,折腾愉快!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 6家元 +180 收起 理由
zzy_85569381 + 30 謝謝分享
200birds + 30
ch104517745 + 30 原創內容
jf201006 + 30 優秀文章
hongo + 30 原創內容
aping365 + 30 優秀文章

查看全部打赏

 楼主| 发表于 2023-11-5 16:22:29 | 显示全部楼层
icespirit 发表于 2023-10-30 08:16
目前的情况是,我按照初始电路图绘制了原理图,原理图还未转换成PCB,因为按照你的意思若22v10其工作原理 ...

哈哈还在卡壳啊,我这边也只能是分析分析逻辑,具体走线也是完全没思路
回复 支持 反对

使用道具 举报

发表于 2023-10-30 08:16:10 | 显示全部楼层
本帖最后由 icespirit 于 2023-10-30 09:04 编辑
t3486784401 发表于 2023-10-30 00:28
22V10 读出的熔丝,烧录进另一片全新的 22V10,还能工作不?

印象中熔丝分析的结果,有些地方与套路不太 ...

目前的情况是,我按照初始电路图绘制了原理图,原理图还未转换成PCB,因为按照你的意思若22v10其工作原理与初始电路图套路若完全不一致的话,这版电路图就是没有任何用途。我联系了我朋友让他拿实物板子测量下,可惜他过于繁忙一直没有回复我。

这几天我正在想有没有其它办法可以验证这颗芯片的布线,因为我查看实物图发现22v10的第23引脚和24引脚接着一颗贴片电阻,那么说明23引脚还有1引脚都是从电源24引脚直接连接的,可能这颗电阻为10K或其它阻值,目的估计是一个上拉或者下拉电阻。
搜寻互联网记忆,发现了一份该主机升级各种版本的说明文档,但是研究后发现其软件版本似乎是针对那颗ROM27C1001内的固件说明,而这颗22v10一直未见有任何说明,详见下图所示





下图是我找的24064信号电平,不知道是否有助于分析

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-30 00:28:31 | 显示全部楼层
icespirit 发表于 2023-10-27 12:00
大神还有其它可行性办法么?进入死胡同了

22V10 读出的熔丝,烧录进另一片全新的 22V10,还能工作不?

印象中熔丝分析的结果,有些地方与套路不太相符
回复 支持 反对

使用道具 举报

发表于 2023-10-27 12:00:42 | 显示全部楼层
t3486784401 发表于 2023-10-26 15:35
话说这个破解可还有后续?

大神还有其它可行性办法么?进入死胡同了
回复 支持 反对

使用道具 举报

发表于 2023-10-27 11:48:48 | 显示全部楼层
t3486784401 发表于 2023-10-26 15:35
话说这个破解可还有后续?

目前知道的情况是程序固件是读取正确的,22V10Z的第23脚引脚和24VCC引脚接着一个贴片电阻。实物图片如下图所示。另外RAM和ROM实物图片也过来了。由于只能看到引脚走线并无法分析准确的连接通路,还在等待更进一步的连接确认


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-26 15:35:11 | 显示全部楼层
icespirit 发表于 2023-9-5 19:34
会不会有一种可能,那就是程序是对的,原理图上那些信号定义被重新编排过了?例如:22脚WRLCD和19脚RWRAM ...

话说这个破解可还有后续?
回复 支持 反对

使用道具 举报

发表于 2023-9-5 19:34:43 | 显示全部楼层
t3486784401 发表于 2023-9-5 19:25
手头有机器的话,另找一片全新 22V10,把读取的结果烧进去,看是否能工作。

如果有加密/读取错误的话, ...

会不会有一种可能,那就是程序是对的,原理图上那些信号定义被重新编排过了?例如:22脚WRLCD和19脚RWRAM位置互换了?苦于手头没有机器呀,要有的话我就直接测量信号走线就可以了,而不去费力的这么分析信号了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-5 19:25:44 | 显示全部楼层
icespirit 发表于 2023-9-5 16:15
还有会不会是22V10加密了导致读到的是错误的?数据也能读到这没道理呀

手头有机器的话,另找一片全新 22V10,把读取的结果烧进去,看是否能工作。

如果有加密/读取错误的话,应该无法正确复制 22V10
回复 支持 反对

使用道具 举报

发表于 2023-9-5 16:15:32 | 显示全部楼层
t3486784401 发表于 2023-9-5 15:49
仔细看了看 #50 楼的反编译图,这个图里边很多熔丝点设置的不合套路:

如果一行写零的话,应该是编程所 ...

还有会不会是22V10加密了导致读到的是错误的?数据也能读到这没道理呀
回复 支持 反对

使用道具 举报

发表于 2023-9-5 16:03:44 | 显示全部楼层
t3486784401 发表于 2023-9-5 15:49
仔细看了看 #50 楼的反编译图,这个图里边很多熔丝点设置的不合套路:

如果一行写零的话,应该是编程所 ...

这个固件对应的芯片型号是PAL22V10Z,DIP24封装,固件应该没错误。和原理图有出入的是RAM芯片和ROM芯片,原来原理图RAM芯片型号是LH5160,芯片实际是28只引脚,但是原理图上却32只引脚,还有就是ROM芯片原原理图上是27C010。实际电路板上的RAM芯片是LH5164和ROM芯片是27c1001,从而导致原本ram芯片上的uPA13和uPA14引脚就不够了,因为没有A13和A14通道,还有就是ROM芯片A17ROM信号,27c1001的第30引脚是NC,即空位。那么A17ROM连线还有什么意义呢。所以我才想要分析看看22V10这颗PLD


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-5 15:49:51 | 显示全部楼层
icespirit 发表于 2023-9-5 15:16
我明白。第一个jed其外围很多原理图,我暂时还没找到,目前暂不分析第一个,最近我一直在努力分析第二个j ...

仔细看了看 #50 楼的反编译图,这个图里边很多熔丝点设置的不合套路:

如果一行写零的话,应该是编程所有熔丝点,而非只编程一部分;
某些 OLMC 的逻辑阵,还有各行写零的情况;
两个 LCD_WR, RD 信号居然都是输入状态。

因而除了怀疑与电路不匹配,还得怀疑你这个 jed 文件是否读取有误,根本不是给 22V10 用的?
回复 支持 反对

使用道具 举报

发表于 2023-9-5 15:16:39 | 显示全部楼层
t3486784401 发表于 2023-9-5 14:57
注意这篇帖子里有两个 jed 文件,都进行了反编译,怀疑搞混了;

第一个 jed 反编译结果位于 #36 楼,使 ...

我明白。第一个jed其外围很多原理图,我暂时还没找到,目前暂不分析第一个,最近我一直在努力分析第二个jed,而提供原理图的即是第二个jed,因为我这几天一直在研究这块,对外围元件及原理图部分比较熟悉,所以才非常奇怪,PLD里面的和外面的尽然冲突了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-5 14:57:22 | 显示全部楼层
icespirit 发表于 2023-9-5 14:20
不对吧。我从这颗PLD外面信号分析,22引脚接的是WRLCD,这个信号应该是向液晶LCD写数据,理应该是输出信号 ...

注意这篇帖子里有两个 jed 文件,都进行了反编译,怀疑搞混了;

第一个 jed 反编译结果位于 #36 楼,使用的是 #33 楼提供的地址;
第二个 jed 反编译结果位于 #50 楼,使用的是 #49 楼提供的地址。

从反编译结果来看,两个 jed 完全不同。

目前 #63-#65 楼讨论的是第二个 jed 反编译结果。
你在 #65 楼给出的原理图,更倾向于适配第一个 jed,这个得确认下。
回复 支持 反对

使用道具 举报

发表于 2023-9-5 14:20:11 | 显示全部楼层
t3486784401 发表于 2023-9-5 12:44
当一行线与同时打上相邻的点时,相当于把 A 和 A' 信号相与了,结果一直为零。
这一行作用于或门时,相当 ...

不对吧。我从这颗PLD外面信号分析,22引脚接的是WRLCD,这个信号应该是向液晶LCD写数据,理应该是输出信号才对呀,21引脚是RDLCD这里才是输入信号才正确,怎么反了呢?奇怪

而对于23脚就更加奇怪了。想不通

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-5 12:44:31 | 显示全部楼层
icespirit 发表于 2023-9-5 06:34
由于弄不懂OLMC具体是如何工作的,我先将OLMC即宏之前的逻辑尝试着写了前面2个,即22和23宏之前的逻辑,不 ...

当一行线与同时打上相邻的点时,相当于把 A 和 A' 信号相与了,结果一直为零。
这一行作用于或门时,相当于无效;作用于输出脚使能时,相当于关闭输出,相应输出脚变为输入。

由此,第二个OLMC(对应22脚)可判定为全零,并且 22 脚工作在输入模式。

对于第一个OLMC(对应23脚),之前逻辑为 I2 & I10,并且输出使能也是 I2 & I10.
原理是每条列线都有一个驱动端,矩阵标记了列线4(驱动端为I2) 与 列线36(驱动端为I10),
因而就是 I2 & I10 的逻辑
回复 支持 反对

使用道具 举报

发表于 2023-9-5 06:34:38 | 显示全部楼层
t3486784401 发表于 2023-9-3 11:41
你这教材看的有点跑偏啊,SYN, AC0, AC1 这几个都是 16V8 的信号,在 22V10 当中统一更新为 S1, S0;

寄 ...

由于弄不懂OLMC具体是如何工作的,我先将OLMC即宏之前的逻辑尝试着写了前面2个,即22和23宏之前的逻辑,不知道对不对.
假设输入1脚为I1,2脚为I2。。。。。。。。
于是有了如下的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-3 12:40:42 | 显示全部楼层
icespirit 发表于 2023-9-3 12:11
正是这一段英文描述,我回去翻书看的云里雾里的,正好遇到一个例子在讲16v8的看着感觉可以套在22v10上用, ...

16V8 是全片先选模式(SYN),然后各 OLMC 再选模式(AC0, AC1);
22V10 取消了全片选择,直接就各 OLMC 选模式(S0, S1).

对比一下 22V10 更简洁。
回复 支持 反对

使用道具 举报

发表于 2023-9-3 12:11:12 | 显示全部楼层
t3486784401 发表于 2023-9-3 11:41
你这教材看的有点跑偏啊,SYN, AC0, AC1 这几个都是 16V8 的信号,在 22V10 当中统一更新为 S1, S0;

寄 ...

正是这一段英文描述,我回去翻书看的云里雾里的,正好遇到一个例子在讲16v8的看着感觉可以套在22v10上用,就被带偏了............

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-3 11:41:24 | 显示全部楼层
icespirit 发表于 2023-9-3 06:33
目前为止所知道的是14、15、18的引脚对应的 OLMC 工作在寄存器模式,其余的16-23工作在组合逻辑模式。

...

你这教材看的有点跑偏啊,SYN, AC0, AC1 这几个都是 16V8 的信号,在 22V10 当中统一更新为 S1, S0;

寄存器模式,就是带时钟锁存状态的,一般在电路里用于锁存总线地址;
组合逻辑模式,就是常规的组合逻辑,也可能是 OLMC 用于输入的情况。
回复 支持 反对

使用道具 举报

发表于 2023-9-3 06:33:09 | 显示全部楼层
t3486784401 发表于 2023-9-2 13:58
请你把手册手册手册通读一遍,里边有详解 OLMC 是什么的。另外 S1 S0 状态我都标在图上了,对照手册就可以 ...

目前为止所知道的是14、15、18的引脚对应的 OLMC 工作在寄存器模式,其余的16-23工作在组合逻辑模式。

我理解的是一种即直接转发临近的数据,一种是自身逻辑处理后再输出。不知道对不对。一边看教材,一边看英文手册,即一边知道OLMC内部工作原理,还有很多SYN、AC0、AC1、XOR内部OLMC电平,看的头大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-24 14:48 , Processed in 0.171601 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表