×
EDA > PCB设计 > 详情

FLEX 10K系列EAD的应用

发布时间:2021-06-17 发布时间:
|

  摘要:FLEX 10K是ALTERA公司研制的个嵌入式的PLD可编程逻辑器件系列。它具有高密度、低成本、低功率等特点,利用FLEX 10K系列CPLD可编程逻辑器件的EAB可在系统中实现逻辑功能和存贮功能,文中介绍了EAB的几个应用实例,同时给出了采用VHDL语言编写的VHD的文件及其具体代码。

  关键词: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的结构

   每个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等许多应用电路。

  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的设计 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:忙信号,指左、右端口同时写同一地址。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PCB设计工程师不得不知的法则