CPLD和FPGA基础概念和区别

来源:百度文库 编辑:神马文学网 时间:2024/04/20 07:53:13

CPLD和FPGA基础概念和区别


  字号:大中小 订阅

(1)什么是前仿和后仿
前仿:系统级仿真,对模块行为仿真,验证其功能
后仿:电路级仿真,验证时序

(2)阵列型pld器件
prom:与阵列固定,或阵列可编程,输出固定
pla:与阵列可编程,或阵列固定,输出固定
pal:与阵列可编程,或阵列固定,可组态(反馈)
gal:与阵列可编程,或阵列固定,可组态,含存储器

符号:黑点是固定连接,星花是可编程,无标记是固定断开

(3)cpld与fpga
CPLD集成度相对小一点,多用于2万门规模以下的设计,适合实现较复杂的组合逻辑,如编、译码设计
FPGA,集成度较高,内部触发器多,多用于1万门以上的大规模系统设计,适合做复杂的时序逻辑设计
把基于乘积项技术、E2PROM(或Flash MEM)存储工艺的可编程逻辑器件叫CPLD
把基于查找表技术、SRAM存储工艺的可编程逻辑器件叫FPGA

(4)CPLD结构:逻辑块(LB) 或称逻辑阵列块(LAB)(但是LAB是由LE组成的),可编程内连线(PI),可编程I/O控制块(I/O B)
CPLD的逻辑宏单元主要包括与或阵列、触发器和多路选择器等电路,能独立地配置为组合或时序工作方式。
CPLD的逻辑宏单元(也可称为逻辑单元LE)与GAL的OLMC结构非常类似。
GAL器件一般分配给每个宏单元的乘积项的数量是固定的,一般为8、10、12、14、16个。
CPLD的宏单元有固定的乘积项(如MAX系列为4个),同时允许一组扩展乘积项可单独地分配给一个宏单元或多个宏单元使用,扩展乘积项比固定乘积项延时要长。
乘积项共享:并联扩展乘积项,共享扩展乘积项。
每个逻辑宏单元内含有两个或两个以上的触发器。(GAL的OLMC只有1个触发器。)通过对输出触发器编程,
可实现4种不同类型触发器结构:D、T、J-K和R-S触发器。

可编程内连线PI:在各个逻辑宏单元之间以及逻辑宏单元与I/O单元之间提供可编程的信号连接网络。
可编程的I/O控制块:主要由触发器和缓冲器组成。每个IOB控制一个外部引脚,可将其编程为输入、输出或双向I/O功能,或集电极开路、三态门等。

(5)fpga
FPGA都采用查找表(Look-Up-Table,LUT)来实现逻辑函数。FPGA的编程配置元件都是SRAM。(重要:FPGA的LAB一般由一个4输入LUT加Carry Logic加Reg组成。)
与CPLD相比,FPGA具有更高的集成度、更强的逻辑功能和更大的灵活性。
结构:可编程逻辑块(CLB),可编程输入输出块(IOB),可编程连线资源(PIR)
      每个CLB中包含1个或2个逻辑单元(LE)。
LE主要由一个组合逻辑函数发生器、几个触发器、若干个多路选选择器及控制电路组成。
查找表(LUT)就是一个有N根,一般是4根地址线的16x1的RAM存储器。

当用户通过原理图或HDL 语言描述了一个4输入的逻辑电路后,EDA软件就会按设计要求自动计算逻辑电路的所有可能的结果,并把该结果事先写入这个RAM存储器。这样,当输入变量作为RAM的地址信号输入时,预期的结果(输出逻辑函数)就作为RAM的存储数据输出了。(查找表存储组合逻辑值)

一个LUT无法完成的N>4的多输入电路,就需要通过进位和级联的方法将多个LUT单元相连,
这样FPGA就可以实现复杂的逻辑。
特点:结构灵活,内部的CLB、IOB和PI均可编程。

(6)FPGA与CPLD的区别
通常FPGA采用SRAM进行功能配置,可以重复编程,但系统掉电后,SRAM中的数据丢失。
因此,需在FPGA外加EPROM,将配置数据写入其中,系统每次上电自动将数据引入SRAM中。
而一般CPLD器件采用EEPROM存储技术,可重复编程,且系统掉电后,EEPROM中的数据不会丢失,适于数据的保密。
FPGA器件由于含有丰富的触发器资源,容易实现时序逻辑,若要求实现比较复杂的组合电路则需要几个CLB结合起来实现。
CPLD的与或阵列结构,使它更适合于实现大规模的组合逻辑功能,而它的触发器资源相对比较少。
FPGA多为细粒度结构。FPGA内部有丰富连线资源,CLB分块比较小,芯片利用率比较高。
CPLD多为粗粒度结构。CPLD宏单元的与或阵列较大,通常不能完全被应用,而且宏单元之间主要通过高速数据通道连接,
容量有限,限制了器件的灵活布线,因此CPLD利用率比FPGA低。

(7)标准的边界扫描测试只需要五根信号线,能够对电路板上所有支持边界扫描的芯片内部逻辑和边界管脚进行测试。
应用边界扫描技术能够增强芯片、电路板甚至系统的可测试性。
TDI--测试数据输入
TDO--测试数据输出
TMS--测试模式选择
TCK--测试时钟输入

TRST--测试复位输入(可以不需要)添加======= 异步清0的描述方法:
process(rst,clk)
begin
if rst=’1’ then
count<=(others=>’0’);
elsif clk’event and clk=’1’ then
count<=count+1;
end if;
end process;
同步清0的描述方法:
process
begin
wait until clk’event and clk=’1’;
if rst=’1’ then
count<=(others=>’0’);
else
count<=count+1;
end if;
end process;