摘要:FLEX 10K是ALTERA公司研制的第一个嵌入式的PLD可编程逻辑器件系列。它具有高密度、低成本、低功率等特点,利用FLEX 10K系列CPLD可编程逻辑器件的EAB可在系统中实现逻辑功能和存贮功能,文中介绍了EAB的几个应用实例,同时给出了采用VHDL语言编写的VHD的文件及其具体代码。
1楼
0
0
回复
关键词:CPLD 嵌入式阵列块(EAB) FIFO 双端口RAM VHDL
1 概述
FLEX 10K是ALTERA公司研制的第一个嵌入式的PLD,它具有高密度、低成本、低功率等特点,是当今ALTERA CPLD中应用前景最好的器件系列之一。它采用了重复可构造的CMOS SRAM工艺,并把连续的快速通道互连与独特的嵌入式阵列结构相结合,同时可结合众多可编程器件来完成普通门阵列的宏功能。每一个FLEX 10K器件均包括一个嵌入式阵列和一个逻辑阵列,因而设计人员可轻松地开发集存贮器、数字信号处理器及特殊逻辑等强大功能于一身的芯片。
EAB(Embedded Array Blocks)的概念源于门阵列的嵌入式功能,为了使复杂的功能在尽可能小的硅片上得以实现,通常需把定制的硅片放在门阵列基片之上。Altera公司首先把这一技术应用于FLEX 10K器件系列。
FLEX 10K中的嵌入式阵列由一系列具有实现逻辑功能和存贮功能的FAB组成。EAB是在输入、输出口上带有寄存器的RAM块,利用它可以非常方便地实现一些规模不太大的ROM、RAM、双端口RAM和FIFO等功能。
2 EAB的结构
2 EAB的结构
每个FLEX 10K中的EAB均含有2048bit的RAM。另外,每个EAB单元中还包括数据区、总线和读/写控制等几部分。图1所示为EAB单元的内都结构。
数据区是EAB的核心部分,每个EAB包含2048bit的RAM,同时又可根据数据线/地址线的不同设置将其宽度调整为2048×1bit,1024×2bit,512×4bit,256×8bit等。
总线是指EAB中所包括的三条总线,即输入数据总线、地址总线和输出数据总线。其中输入数据总线可以配制成8bit、4bit、2bit或1bit位宽;地址总线同数据总线相适应,具有8bit、9bit、10bit或11bit位宽;而输出数据总线则与输入总线相对应,这三条总线都设计有同步/异步两种工作方式。
第三部分为读/写控制部分。当EAB用于异步RAM电路时,必须外加RAM写使能信号WE,以保证数据和地址信号满足其时序要求,而当EAB用作同步RAM时,它可以产生相对其全局时钟信号的WE信号。EAB的RAM与EPGA中的分布式RAM不同,FLEX 10k EAB能够信号可预测的定时关系,而且EAB的写使能信号(WE)即可与输入时钟同步工作,也可以异步工作。另外,EAB还包含用于同步设计的输入寄存器、输出寄存器和地址寄存器。EAB的输出可以是寄存器输出,也可以是组合输出,EAB RAM的大小很灵活,因此,它既可以配置成256×8、512×4,也可以配置成1024×2或2048×1。FLEX 10K器件的EAB资源如表1所列。EAB的RAM资源较为丰富,可用来设计RAM、FIFO及双端口RAM等许多应用电路。
表1 FLEX 1K器件EAB资源
表1 FLEX 1K器件EAB资源
器件型号 | EAB的个数 |
EPF10K10 EPF10K10A | 3 |
EPF10K20 | 6 |
EPF10K30 EPF10K30A EPF10K30B | 6 |
EPF10K40 | 8 |
EPF10K50 EPF10K50V EPF10K50B | 10 |
EPF10K70 | 9 |
EPF10K100 EPF10K100A EPF10K100B | 12 |
EPF10K130V EPF10K130B | 16 |
3 FLEX 10K的应用
3.1 RAM的设计
RAM的设计分同步RAM或异步RAM,当设计同步RAM时,DATA信号和ADDRESS信号应在EAB中锁存。包括WE在内,所有信号均应在EAB内完成,这样可以排除一些可能破坏数据时序的潜在故障。当WE信号被锁定为高时,EAB内部电路会产生一个与DATA信号和ADDRESS信号的建立和保持时间相匹配的写脉冲。而在用异步RAM方式时,一定要遵从以下几个原则:
(1)WE信号一定要避免那些可能会无意覆盖RAM区数据的时序。
(2)WE信号的建立与保持时间一定要与DATA和ADDRESS信号相适应。
(3)当WE=1时,ADDRESS信号不能发生变化。由于FLEX 10K器件都有多个EAB,所以可由多个EAB来构成所需要的RAM。
LPM(Library Of Parameterized Modules)是一个参数化的模块库,它是优秀的版图设计人员和软件人员智慧的结晶。通过修改LPM器件的某些参数,可很容易地到达设计要求。下面的RAM(VHD)文件是一个寄存器输入、寄存器输出的1k×8RAMr VHDL设计代码:
RAM.VHD
Library ieee;
Use ieee,std_logic_1164.all;
Library lpm;
Use lpm.lpm-components.all;
Entity LL is Generic (data-width:integer:=8;addr-width:interer:=10);
Port (data:in std-logic-vector(data-width-1downto 0);
addresss:in std-logic-vector(addr-width-1 downto 0));
End LL;
Architcture RAM of LL is Begin
U1:lpm-ram-dp
Generic map (lpm-widthad=>addr-width,lmp-width=>data-width)
Prot map(data=>data,address=>address,we q=q);
End;
输入
data[ ]: 数据输入RAM
address[ ]:地址输入RAM
we: 写使能
inclock :同步输入时钟
outclock: 同步输出时钟
输出
q[ ]: 数据输出
3.2 FIFO的设计
3.2 FIFO的设计
FIFO(First-in First-out)存储器可以从一个子系统把数据流传送到另一个子系统。它有输入和输出两个相对独立的端口,当存储器为非满载状态时,输入端允许许高速突发信息经输入缓冲器存入存储器,直到存满为止,只要存储器中有数据就允许将最先写入的内容依次通过输出缓冲器输出。FIFO可广泛应用于通信、打印机、微处理器等设备中,这些突发性的数据速率往往大于它们所能接受或处理的速率。通常这些系统需要一个缓冲器对高速数据进行存贮,直到较慢的处理进程准备好为止。但数据进入FIFO缓存的平均速率必须小于或等于数据输出速率。
每个EAB均提供了一个2048bit数据存贮区,输入寄存器可为读、写指针计数器存贮元素。周期共享的FIFO配置将在第一个时钟周期里启动一个读操作,并将数据锁存在输出寄存器中,然后在第二个时钟周期里写入,此时读出的数据在访问寄存器时仍有效,利用图2所示的交织EAB存贮功能可构成更高的全局时钟速率和更大的FIFO区域。同时通过把同一个存贮单元分布在不的地址范围还可以把几个FIFO功能集中在同一个EAB中实现。一个512×8且周期共享的FIFO的VHDL代码如下面的
FIFO.VHD文件所示:
FIFO.VHD
Library ieee;
Use ieee.std_ligic_1164.all;
Libreay lpm;
Use lpm.lpm_components.all;
Entity LL is Generic(data_width:integer:=8;
numwords:integer:=256);
Port(data:in std_logic_vector(data_width_1downto 0);
Wreq,rreq,clock,clockx2,clr,sclr:in std_logic;
Empty,full:out std_logic;
q:out std_logic-,vector(lpm-width-1 downto 0));
end LL;
Architecture FIFO of LL is
Begin
U1:csfifo
Generic map (lpm-width=>data-width,
Lpm-numwords=>numwords)
Port map(data=>data,wreq=>wreq,rreq=>rreq,clock=>clock,
clockx2=>clockx2,Clr=>clr,sclr=>sclr,empty=>
empty,full=>full,q=>q);
End
输入
data[ ]: 数据输入FIFO
wreq: 写请求
rreq:读请求
clock:时钟,正极性边沿触发
clockx2: 倍频时钟,正极性边沿触发
clr: 复位清FIFO
sclr: 同步清零
输出
q[ ]:FIFO数据输出
full:指示FIFO已满
Empty:指示FIFO已空
3.3 双端口RAM的设计
双端口RAM有两套独立的地址线、数据线和控制信号线,适用于需要高速共享数据缓冲器的系统,实际上它常作为双CPU系统的全局存储器。下面是DTRAM、VHD的文件代码:
DPRAM.VHD
Library ieee;
Use ieee.std-logic-1164.all;
Library altera;
Use altera.maxplus2.all;
Entity LL is Generic (data-width:integer:=8;Addr-width:integer:=10);
Port(datal:in std_logic_vector(data-width-1 downto 0);
Datar:in std_logic_vector(data_width_1 downto 0);
Addressl:in std_logic_vector(addr_width_1 downto 0);
Addressr:in std_logic_vector(addr_width_1 downto 0);
Wel,wer:in std_logic;
Clock,clockx2:in std_logic;
Busy:out std_logic;
Q1,qr:out std_logic_vector(data_width_1 downto 0));
End LL;
Architecture DPRAM of LL is Begin
U1:csdpram
Generic map(lpm_width=>data_width,Lpm_widthad=>addr_width,
Lpm_numwords=>1024)
Port map(data=>datal,datab=>datar,Addressa=>addressl,addressb=>addressr,
Wea=>wel,web=>wer,
Clock=>clock,clockx2=>clockx2,
Qa=>ql,qb=>qr,busy=>busy);
End;
输入
data[ ]:左端口数据输入
datar[ ]:或端口数据输入
addressl [ ]:左端口地址输入
addressr[ ]:右端口地址输入
wel:左端口写使能
wer:右端口写使能
clock:时钟,正极性边沿触发
clockx2:倍频时钟,正极性边沿触发
输出
ql[ ]:左端口数据输出
qr [ ]:右端口数据输出
busy:忙信号,指左、右端口同时写同一地址