李中发 制作中国水利水电出版社数字逻辑电路第 10章 可编程逻辑器件学习要点
了解 EDA技术的发展概况
了解简单可编程逻辑器件的构造和工作原理
掌握用 PROM和 PLA实现组合逻辑函数的方法
了解高密度可编程逻辑器件的构造及应用
10.1 电子设计自动化概述
10.2 简单可编程逻辑器件
10.3 高密度可编程逻辑器件
10.4 PLD开发工具 Max+plusⅡ
第 10章 可编程逻辑器件
10.1 电子设计自动化概述
EDA技术,是指以计算机硬件和系统软件为基本工作平台,利用 PLD器件和 EDA开发工具,
在计算机上完成电路的功能设计、逻辑设计、
性能分析、时序测试直至印刷电路板(简称
PCB) 的自动设计。
10.1.1 EDA技术发展概况集成电路技术方面,1958年出现了第一块数字集成电路。 20世纪 60年代初出现了小规模集成电路和中规模集成电路 。 1967年,
数字集成电路跨入大规模集成电路时代,在一块芯片上集成
1000个以上的晶体管。 1977年出现了在一块芯片上集成 13万个晶体管的集成电路,从而使数字集成电路进入了超大规模集成电路时代。 1998年,数字集成电路达到了在一块芯片上集成超过一亿个晶体管或基本单元的规模。
从 20世纪 70年代起,在集成电路版图设计方面,出现了基于门阵列和标准单元的计算机辅助设计工具;在系统设计方面,出现了计算机辅助电路分析工具和逻辑综合与优化工具,以及简单可编程逻辑器件 。 20世纪 80年代出现了 PCB自动布局布线工具,标准的硬件描述语言 HDL及其仿真工具,以及复杂可编程逻辑器件 。 20世纪 90年代出现了可编程模拟电路,以及标准
HDL的综合工具,电子设计才真正进入了自动化时期 。 进入 21
世纪,又出现了可编程片上系统 。
10.1.2 EDA技术的特征现代 EDA技术的基本特征是采用高级语言描述,具有系统级仿真和综合能力。
与这些基本特征有关的技术有自顶向下设计方法、硬件描述语言( HDL),逻辑综合优化、开放性和标准化以及库的引入。
10.1.3 电子系统的仿真、综合与实现电子系统的仿真是用计算机模仿电子系统的实际工作情况。因此,仿真时要在计算机上建立电子元件和模块的功能模型,还要将系统(电路)的构成描述给计算机。此外,设计工程师还要为被仿真的电路设计适当的输入信号,在计算机模拟结果出来后要对其进行分析,从而判定电路正确与否。根据设计验证的不同层次和要求,仿真分为系统仿真、逻辑仿真、时序仿真、
电路仿真等。
电子系统的综合是将较高层次的描述转换为由低层次便于实现的模块所装配成的统一实体。综合分高层综合、逻辑综合和版图综合。高层综合是从系统级(算法级)的行为(功能)描述产生功能级的结构描述。逻辑综合是将功能级描述转化为逻辑
(门)级的描述。版图综合是在逻辑综合完成后,由门级和电路级向物理版图描述的转换,完成最终的布局布线。
电子系统的实现方式通常有通用集成电路、可编程器件和定制集成电路 3种方式。
10.2 简单可编程逻辑器件
10.2.1 PLD的结构、分类和内部电路表示方法输入电路与门阵列或门阵列
… …
输入输出输入项 与项 或项 输出电路
1 & ≥ 1
A B C D A B C D
Y = A · C · D Y = A + B + C
A
A
A
× ×
( a ) 缓冲器画法 ( b ) 与门画法 ( c ) 或门画法
PLD的基本结构
PLD内部电路的简化画法
1 1
A
B
Y
1
Y
2
≥ 1 ≥ 1
&
&
&
&
1 1
A
B
Y
1
Y
2
≥ 1 ≥ 1
&
&
&
&
A
A B B
Y
1
Y
2与阵列或阵列
SPLD的分类分类 与阵列 或阵列 输出电路 编程方式
P R O M 固定 可编程 固定 熔丝
P L A 可编程 可编程 固定 熔丝
P A L 可编程 固定 固定 熔丝
GAL 可编程 固定 可组态 电可擦除
10.2.2 PROM及其应用
1 1 1
A
2
A
1
A
0
D
2
D
1
D
0
与阵列 ( 固定 )
&
&
&
&
&
&
&
&
≥ 1 ≥ 1 ≥ 1
或阵列 ( 可编程 )
P
R
O
M
的阵列结构例 用 PROM实现下列一组函数
ABCCABBCACBAY
ADACDCADABY
ACCBBAY
ABCDDABCABBAY




4
3
2
1
用 PROM实现组合逻辑函数的方法与 ROM相同,即首先列出要实现的逻辑函数的真值表,然后再根据真值表画出用 PROM实现这些逻辑函数的阵列图。
真值表
A B C D Y
1
Y
2
Y
3
Y
4
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
0 0 0 0
0 0 0 0
0 0 0 1
0 0 0 1
0 1 0 0
0 1 0 0
0 1 0 1
0 1 0 1
1 0 0 0
1 0 1 0
1 1 1 0
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
阵列图
Y
1
Y
2
Y
3
Y
4
A A B B C C D D
10.2.3 PLA及其应用
P
L
A
的阵列结构
1 1 1
I
2
I
1
I
0
O
2
O
1
O
0
与阵列 ( 可编程 )
&
&
&
&
&
&
≥ 1 ≥ 1 ≥ 1
或阵列 ( 可编程 )
用 PLA实现逻辑函数的基本原理是基于函数的最简与或表达式,故 首先需要将逻辑函数化为最简与或表达式,然后根据最简与或表达式画出 PLA的阵列图。
例 用 PLA实现下列一组函数
ABCCABBCACBAY
ADACDCADABY
ACCBBAY
ABCDDABCABBAY




4
3
2
1
化简
CAABY
ADACABY
ACBY
AY



4
3
2
1
阵列图
A
A
B
B
C
C
D
D
Y
1
Y
2
Y
3
Y
4
10.2.4 PAL及其应用
PAL的阵列结构
1 1 1
I
3
I
2
I
1
I
0
O
3
O
2
O
1
O
0
与阵列 ( 可编程 )
&
≥ 1
或阵列 ( 固定 )
1
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
≥ 1 ≥ 1 ≥ 1
1I
3
O
3
&
&
&
&
1
1
1
I
2
I
1
I
0
≥ 1
≥ 1
≥ 1
≥ 1
O
2
O
1
O
0
专用输出结构 1I
输入
O
& ≥ 1
可编程
I/
O
结构
1I
输入、反馈及 I/ O
I/ O
& ≥ 1
1
1
EN
带反馈的寄存器结构
1I
输入、反馈及 I/ O
I/ O
& ≥ 1
1
1
EN
D Q
C
Q
异或型输出结构
I/ O
&
1I
≥ 1
输入、反馈及 I/ O
1
1
EN
D Q
C
Q
= 1
例 如图所示为用 PAL实现的一组组合逻辑函数,试写出该组逻辑函数的表达式 。
1A
Y
3
&
&
&
&
1
1
1
B
C
D
≥ 1
≥ 1
≥ 1
≥ 1
Y
2
Y
1
Y
0
解 根据如图所示 PAL与阵列的编程情况可知,函数 Y3是由 4个与项相加组成的,这 4个与项分别为 ABC,BCD,ACD和 ABD,
所以函数 Y3的表达式为:
A B DA C DB C DA B CY3
同理,函数 Y2是由 3个与项、
和相加组成的,函数 Y1是由
2个与项和相加组成的,函数 Y0是由个与项 AB和相加组成的,所以:
BAABY
BABAY
DCBBAY



0
1
2
10.2.5 GAL
11
19
1
2
&
1
O L M C
1
18
1
3
&
1
O L M C
1
17
1
4
&
1
O L M C
1
16
1
5
&
1
O L M C
1
15
1
6
&
1
O L M C
1
14
1
7
&
1
O L M C
1
13
1
8
&
1
O L M C
1
12
1
9
&
1
O L M C
1
1
OE
C
0 4 8 12 16 20 24 28
11
(19)
(18)
(17)
(16)
(15)
(14)
(13)
(12)
0
8
7
15
16
23
24
31
32
39
40
47
48
55
56
63
3 7 1 1 1 5 1 9 2 3 2 7 31
GAL器件在制造工艺上采用了 EECMOS工艺,可以反复编程,且集成度比 PAL有了较大的提高,其与阵列的规模大大超过了 PAL,每个或门的输入端数增加到 8~ 10
个,可实现较为复杂的逻辑函数。在结构上,GAL不但直接继承了 PAL器件的由一个可编程与阵列驱动一个固定或阵列的结构,而且还具有可编程的输出逻辑宏单元
(简称 OLMC)。 通过对
OLMC编程,可实现多种形式的输出,使用起来比 PAL
更加灵活方便。
11
10
01
00
0
1
≥ 1
=1
D
Q
Q
0
1
1
U
CC
AC
0
AC
1
( m )
AC
1
( n )
I/ O( n )
接与阵列反馈
C OE
OE
C
P T M U X
T S M U X
O M U X
F M U X
≥ 1
&
X O R( n )
接邻级输出 ( m )
AC
1
( n )
AC
0
11
10
01
00
GAL16V8中 OLMC的结构
O L M C 输出状态与结构控制字 SY N,AC
0
,AC
1
( n ) 的关系
SY N AC
0
AC
1
( n ) 功 能 说 明
0 1 0 寄存器输出 纯时序输出
0 1 1 组合与寄存器混合输出本单元组合输出,其他单元至少一个寄存器输出
1 0 0 纯组合输出 无内部反馈和使能控制
1 0 1 纯输入方式 输入为 I/ O ( m ),三态门禁止
1 1 1 组合输出 组合 I/ O 输出,第一乘积项控制输出使能
10.3 高密度可编程逻辑器件
CPLD基本上沿用了 GAL的阵列结构,在一个器件内集成了多个类似 GAL的大模块,大模块之间通过一个可编程集中布线区连接起来 。 在 GAL中只有一部分引脚是可编程的 ( OLMC),其他引脚都是固定的输入脚 。 而在 CPLD中,所有的信号引脚都可编程
,既可做输入,又可做输出,故称为 I/O脚 。
10.3.1 CPLD
如图所示给出了一个典型 CPLD的内部结构框图。总布线区( GRP
) 是一个二维的开关阵列,负责将输入信号送入通用逻辑模块,
并提供通用逻辑模块之间的连接通路。在 GRP两侧各有一个巨模块,每个巨模块含 8个通用逻辑模块( GLB),一个输出布线区(
ORP),一组输入总线和 16个输入 /输出模块( IOC)。
10.3.2 FPGA
FPGA是由普通的门阵列 ( 需在制造厂加工,又称为掩膜门阵列 ) 发展而来的,其结构与 CPLD大不相同,其内部含有成千上万个较小的逻辑单元,所以在布局上呈二维分布 。 要将如此众多的逻辑单元连接起来,需要丰富的连线资源,其布线的难度和复杂性较高 。
Xilinx公司的 XC系列 FPGA器件由可编程输入 /输出模块 ( 简称
IOB),可编程逻辑模块 ( 简称 CLB) 和可编程连线资源 ( 简称 PI) 3种可编程逻辑单元组成 。
C L BI / O B 可编程内部连线输入缓冲器
O FF
ON
MUX2
D
MUX 1
I / O 输出三态控制
ST
输入输出缓冲器
OE
Q
I / O 时钟输入通道输出通道
XC系列 FPGA的内部结构框图可编程输入 /输出模块( I/OB)
M U X 1
组合逻辑电路
A
B
C
D
输入输出
X
Y
G
F
K
时钟
D
S
R
Q
存储电路
XC系列 FPGA的 CLB结构开关矩阵开关矩阵
C L B
B
C
K
A
D
X
Y
C L B
C L B
C L B
C L B
C L B
直接连线垂直通用连线 垂直长线水平通用连线水平长线
XC系列 FPGA的 PI连接方式
10.3.3 CPLD/FPGA的编程技术在系统编程技术 ISP,ISP技术采用 EECMOS工艺,其编程数据存储在 EEPROM中,通过电信号擦写,无需专用的编程器就可编程,可预先将器件安装在电路板上,预留编程口(插座),
用微机通过编程电缆就可以在线对器件编程,使用非常方便。
ISP技术采取了在信号引脚上增加三态门和增加编程接口与控制电路两项措施来实现在系统编程。
在线配置技术 ICR,ICR技术采用 SRAM工艺,在线写入,无需专用的写入器。由于 SRAM所存信息掉电时无法保存,因此每次通电都必须重新写入编程数据,这类 FPGA的编程称为配置。由于 SRAM的写入次数没有限制,因此可无穷多次的配置。
FPGA有多种在线配置方式可分成被动配置和主动配置两类。
反熔丝编程技术,反熔丝开关是由在多晶硅与扩散层之间夹有特殊介质的可编程低阻元件构成的开关。未编程时多晶硅与扩散层呈高阻状态;在多晶硅和扩散层两端加上编程电压时介质击穿,多晶硅与扩散层导通。由于介质一旦被击穿就无法还原,
所以这是一种一次性编程方法。
10.4 PLD开发工具 MAX+plusⅡ
10.4.1 PLD的设计过程设计输入,将所设计的电路以开发软件要求的某种形式表达出来,并输入到相应的软件中。主要包括原理图输入方式、硬件描述语言输入方式、高级设计输入方式、波形设计输入方式、
层次设计输入方式和底层设计输入方式,最常用的是原理图输入方式和硬件描述语言输入方式两种。
设计实现,由 EDA开发工具根据设计输入文件自动生成用于器件编程、波形仿真及延时分析等所需的数据文件。通常设计实现是由 EDA开发工具自动完成的,设计者只能通过设置一些控制参数来控制设计实现过程。设计实现时主要完成优化和合并、
映射、布局和布线以及生成编程文件 4个任务。
设计校验,包括功能仿真和时序仿真两部分,这一步通过功能仿真器和时序分析器来完成,利用编译器产生的数据文件自动完成逻辑功能仿真和时序特性仿真。在仿真文件中加载不同的激励,可以观察中间结果以及输出波形。必要时,可以返回设计输入阶段,修改设计输入,最终达到设计要求。
下载编程,将设计阶段生成的编程文件(熔丝图文件或位流文件)装入到可编程器件中。由于器件编程需要满足一定的条件,如编程电压、编程时序、编程算法等,因此,对于不能进行在系统编程( ISP) 的 CPLD器件和不能在线配置
( ICR) 的 FPGA器件,需要编程专用设备(编程器)完成器件编程。
10.4.2 设计输入指定项目名称,在管理器窗口的 File→Project 菜单中选择
Name… 项打开 Project Name对话框,从 Project Name对话框中选择适当的驱动器和目录,键入项目名后点击 OK。
1.建立原理图设计文件
( 1)打开原理图编辑器。在管理器窗口的 File 菜单中选择
New… 打开 New列表框。从 New列表框中选择 Graphic Editor
File和,gdf项,然后点击 OK。 此时便会出现一个原理图编辑窗口。( 2)输入元件和模块。在原理图编辑窗口空白处双击鼠标左键或在 Symbol菜单中选择 Enter Symbol,打开 Enter Symbol对话框。从 Enter Symbol对话框中选择适当的库及所需的器件
(模块),然后点击 OK。 这样所选元件(模块)就会出现在编辑窗口。重复这一步,选择需要的所有模块。相同的模块可以采用复制的方法产生。用鼠标左键选中器件并按住左键拖动,
可以将模块放到适当的位置。
( 3) 放置输入,输出引脚 。 输入,输出引脚的处理方法与元件一样 。 在原理图编辑窗口空白处双击鼠标左键或在 Symbol菜单中选择 Enter Symbol便打开了 Enter Symbol对话框 。 在 Symbol Name
框中键入 input,output或 bidir,分别代表输入,输出和双向 I/O。
点击 OK。 这样输入或输出引脚便会出现在编辑窗口中 。 重复这一步产生所有的输入和输出引脚,也可以通过复制的方法得到所有引脚 。 电源和地与输入,输出引脚类似,也作为特殊元件,采用上述方法在 Symbol Name中键入 VCC( 电源 ) 或 GND( 地 ),
即可使它们出现在编辑窗口中 。
( 4)连线。将电路图中的两个端口相连的方法:将鼠标指向一个端口,鼠标箭头会自动变成十字,+”。一直按住鼠标左键拖至另一端口。放开左键,则会在两个端口间产生一根连线。连线时若需要转弯,则在转折处松一下左键,再按住继续移动。连线的粗细通过点鼠标右键弹出菜单中的 Line Style来选择,粗线代表总线。
( 5)输入 /输出引脚和内部连线命名。输入 /输出引脚命名:在引脚的 PIN-NAME位置双击鼠标左键,然后键入信号名。内部连线的命名方法是:选中连线,然后键入信号名。总线的信号名一般用 X[n-1..0]表示,其中的单个信号名为 Xn-1,Xn-2,…,X0。
( 6)保存文件。在 File菜单中选择 Save As… 或 Save,如是第一次保存,需输入文件名。
( 7)建立默认的符号文件。在层次化设计中,如果当前编辑的文件不是顶层文件,则往往需要为其产生一个符号,将其打包成一个模块,以便在上层电路设计时加以引用。建立符号文件的方法是,在 File菜单中选择 Create Default Symbol项即可。
2.建立 HDL设计文件
( 1)打开文本编辑器。在管理器窗口的 File 菜单中选择 New…
打开 New列表框。选择 Text Editor File,此时便会出现一个文本编辑窗口。点击 OK。
( 2)选择 HDL种类。在 File菜单中选择 Save As… 或 Save,或在工具栏点击按钮,打开 Save As对话框,键入文件名并选择文件扩展名,MAX+plusⅡ 支持 3种 HDL,VHDL,Verilog HDL和
Altera HDL,对应的扩展名依次为 vhd,v和 tdf。 这一步也可以等到 HDL源码输入完以后再做,但先确定 HDL种类可以在键入
HDL源码时自动检查并显示其中的语法错误。
( 3)输入 HDL源码。
( 4)保存文件。在 File菜单中选择 Save,保存输入的 HDL源码。
( 5)建立默认的符号文件。与由原理图生成符号文件的方法一样。
10.4.3 设计实现
1.编译与网络表提取运行编译器的方法:在 MAX+plusⅡ 菜单中选 Compiler选项。启动编译器后首先进行编译与电路网络表提取工作。做完这一工作后编译器便停下来等待用户的指示。如果编译中未发现错误,
则可以点击窗口中的 Start,接着做设计实现的工作。
2.参数设置编译器有很多参数设置,但并不是每一项都需要用户去设置,
有些设置编译器可自动选择(如器件选择、引脚分配等),而其他的设置往往有默认值。
3.运行设计实现做好必要的设置后,在编译器窗口中按 Start就可以连续执行后续的设计步骤,产生的数据文件的扩展名会出现在各个执行框的下方。
10.4.4 设计校验
1.建立波形文件
( 1)打开波形图编辑器。在管理器窗口的 File菜单中选择 New…
打开 New列表框。选择 Waveform Editor File和,scf项,按 OK。 此时便会出现一个波形图编辑窗口。
( 2)设定时间参数。从 File菜单中选择 End Time… 项,键入仿真结束时间,按 OK。 在 Options菜单中选择 Grid Time… 项,键入显示网格间距的时间,按 OK。
( 3)确定需观察的信号。在 Node菜单中选择 Enter Nodes From
SNF… ( SNF指仿真网络表文件)项,打开 Enter Nodes From
SNF对话框。在 Type框中选择信号类别,最常用的是 Input和
Output( 输入、输出)。点 List按钮,将所选类别的所有信号均列于 Available Nodes & Groups框中。从 Available Nodes & Groups
框中选择信号,然后按,=>”箭头,使所选信号名进入 Selected
Nodes & Groups框。按 OK,所选信号将出现在波形图编辑窗口中。然后根据需要编辑输入波形。最后在 File菜单中选择 Save
As… 或 Save。如是第一次保存,需输入文件名。
2.运行仿真程序在 MAX+plusII菜单中选 Simulator选项,打开仿真对话框。按
Start开始仿真。仿真结束后按 Open SCF,在波形编辑窗口中将显示出仿真结果(波形)。
3.仿真结果分析仿真结果分析由用户人工进行。
10.4.5 下载编程
1.选择编程文件在编程界面下,从 File菜单中选择 Convert SRAM Object Files… 命令可以由 *.SOF文件产生 *.POF文件,选择 Save Programming Data
As… 命令可读出已编程器件中的数据或由 *.JED文件生成 *.POF文件。
2.下载编程步骤
( 1)打开编程窗口。在 MAX+plusII菜单中选 Programmer选项,
打开编程窗口。
( 2)硬件连接。在编程界面下,从 Options菜单中选择 Hardware
Setup…,再在 Hardware Setup对话框中选择 ByteBlaster或
BitBlaster,然后用下载电缆将 PC机并口(若选 ByteBlaster) 或串口(若选 BitBlaster) 与电路板上的 PLD连接起来(通过接插件)。请注意:这一步工作最好在关断 PC机和电路板电源的情况下进行,可以在开机前预先接好。
( 3)选择编程文件。默认情况下,编程文件已根据当前项目名选好,并显示在编程窗口的右上角。如果发现编程文件名不对,
可在 File菜单中点 Select Programming File… 项进行选择。
( 4)下载。在编程窗口中按 Program( 对 CPLD或配置用 EPROM,
此时文件为 *.POF) 或 Configure( 对 FPGA,此时文件为 *.SOF)。