×
接口总线驱动 > 总线 > 详情

基于PCI接口芯片外扩FIFO的FPGA实现

发布时间:2020-05-26 发布时间:
|

  0. 引言

  目前,计算机上的系统总线常见的有 ISA总线、 PCI总线以及 VXI总线等。在实际应用中,PCI总线已经成为主流的应用总线,具有较高的数据传输效率,能满足大多数数据采集和发送系统的需求。由于 PCI总线规范相当复杂,一般实际应用中都选择专用的 PCI接口芯片来设计 PCI接口。本文选择美国 PLX公司生产的 PCI总线通用接口芯片 PCI 9054,利用该专用芯片桥接 PCI总线与本地总线。在实际半实物仿真测试系统的应用中,要求仿真计算机能够快速、稳定的连续输出所需数据,而由于 PCI 9054内部 FIFO存储器主要用于数据的读写控制,容量有限,不能满足半实物仿真测试系统数据传输的要求。因此,本文提出利用 FPGA内部的嵌入式阵列块( EAB)(Embedded Array Blocks)来实现外扩 FIFO的功能,目的是用于存储由 PCI总线传输过来的仿真数据,并在 D/A转换期间起到数据缓存的作用。

  1. PCI 9054特性及 FPGA内部 EAB模块简介

  1.1  PCI 9054接口芯片简介及配置

  PCI 9054内部有六个可编程的 FIFO存储器,它们可分别实现 PCI发起读、写操作, PCI目标读、写操作和 DMA方式读、写操作。这里采用 DMA方式传输数据,可实现大量数据的突发传输而不丢失,数据通过 PCI 9054内部的 FIFO进行双向传输。为此,核心控制芯片 FPGA内部专门设计了与 PCI 9054进行数据通信的逻辑控制单元,通过查询 FIFO的当前状态,实时地把数据传送到相应的存储单元。

  PCI 9054内部提供一个串行 EEPROM配置接口,为 PCI总线和局部总线配置部分重要信息,如本地总线的基地止空间、I/O空间、中断控制信号等信息,总容量为 2 K字节或 4 K字节,其内容可通过 PCI总线写入,也可通过编程器直接烧写。EPROM一定要选择支持串行传输方式的芯片,这里选用 93CS56L作为外接 EEPROM,容量为 2 K字节, EEPROM的配置电路如图 1所示。图中 93CS56L的 1、2、3/4引脚与 PCI9054上的 EECS、EESK、EEDI/EEDO引脚相连,系统启动时自动检测 EEPROM,并将初始化配置参数装入 PCI配置寄存器中,根据本地总线对内存、 I/O端口和中断等统一划分空间,自动配置。EEPROM的配置至关重要,其配置不正确可导致整个系统无法运行。


  1.2嵌入式逻辑阵列块( EAB)结构

  嵌入式逻辑阵列块( EAB)具有逻辑和存储功能,在输入、输出端口上带有寄存器的 RAM块,利用它们可以实现 ROM、RAM、双端口 RAM和 FIFO等功能设计。每个 EAB模块均含有 2 K的数据容量,每个 EAB单元中还包括数据区、总线和读 /写控制等。数据区是 EAB的核心部分,可根据数据/地址线的不同设置将其配置为 2048×1bit,1024×2bit, 512×4bit,256×8bit等。相应的数据总线可以配置成 8bit、4bit、2bit或 1bit宽,地址总线可以配置成 8bit、9bit、10bit或 11bit宽。而输入输出总线相对应,这三条总线都可以设置为同步/异步两种工作方式。

  2. 外扩异步 FIFO的 FPGA实现

  2.1异步 FIFO存储器的内部结构及工作原理

  本设计选择的 EPF10K10 FPGA内部含有 3个嵌入式阵列块( EAB)。为了实现大容量的异步 FIFO存储器,可以通过内部级联的方法把多个 EAB模块进行连接,如本设计把 3个 EAB模块进行连接,每个 EAB模块均为 512×4 Bit,连接以后可实现 512×12 Bit的 FIFO存储模块,即 FIFO存储器的容量为 6 KB。图 2给出了利用 EAB模块构成 FIFO存储器的内部结构图。


  从图 2可以看出,异步 FIFO存储器包含一个双端口的 RAM、写指针(WP)、读指针(RP)、空标志产生逻辑( FULL)及满标志产生逻辑 (EMPTY)。其工作过程是把 PCI9054读入的内存波形数据缓存到 RAM中,然后根据仿真需要,把波形数据传送给 D/A转换模块。其遵循的原则是写入数据位数及时钟与 PCI9054输出数据位数及本地时钟( LCLK)同步,而输出数据位数及时钟与 D/A转换模块的输入数据位数及时钟相一致,且硬件系统第一个读入的数据为输出端口读出的第一个数据,依此类推。由于时钟频率的不同,输入口和输出口的工作过程彼此是独立的,即可以同时进行读写操作。只要 FIFO存储器的数据标志位 FULL为非满状态,就可以继续向 FIFO存储器中写入数据;只要 FIFO存储器的数据标志位 EMPTY为非空状态,就可以继续从 FIFO存储器中读取数据。

  2.2异步 FIFO存储器的 FPGA实现方法

  由 EAB构成的 FIFO模块,只需对其进行编程实现,而无需其它外部元件匹配。设计过程中主要考虑的一是如何实现数据在传输过程中不丢失数据,即如何同步异步时钟信号,避免亚稳态的产生;二是如何正确地判断 FIFO存储器的空/满状态。

  图 2 由 EAB模块构成的 FIFO内部结构图图 3给出了 FIFO存储器的四种状态,即:


  1)初始状态:对于本设计而言,即为 WP=0,RP=511。此时的 FIFO处于空状态, RP=WP-1,不能对其进行读操作。

  1 RP=WP状态。FIFO只要再进行一次写操作就会变成满状态。

  2 RP=WP-2状态。FIFO只要再进行一次读操作就会变成空状态。

  3 RP=WP-1状态,FIFO已经存满数据,不能对其进行写操作。

  可以看出,满状态和空状态的 RP和 WP的关系是一致的,均为 RP=WP-1。但在满或空状态出现之前的一个状态是各不相同的。当 RP=WP时,由于写入一个数据而使其进入满状态( RP=WP-1),而在 RP=WP-2时,由于读出一个数据而使其进入空状态( RP=WP-1)。设计中可以根据这一原则通过软件编程来得到空 /满状态标志产生的条件。下面给出一段描述空状态产生的 VHDL语言程序。

  process(wr_clk,reset)

  begin

  if reset='1' then

  empty_in<='1';

  elsif (wr_clk='1' and wr_clk'event) then

  if ((rp=wp-2 or (rp=fifo_depth-1 and wp=1)

  or(rp=fifo_depth-2 and wp=0)

  and (rd_en='0' and wr_en='1')) then

  empty_in<='1';

  elsif (empty_in='1' and wr_en='0') then

  empty_in<='0';

  end if;

  end if;

  end procESS;

  其中:

  wr_clk为写入数据时钟信号; reset为系统复位信号;empty_in为空标志信号; fifo_depth为 FIFO存储器深度值,这里为 512;rp为读数据指针; wp为写数据指针; wr_en为写入数据使能信号;rd_en为读出数据使能信号。

  对于异步 FIFO而言,设计过程中还需考虑的一点就是如何消除不同时钟域的亚稳态。这里主要是对读 /写地址采用雷格码变换,即相邻地址之间只有一个数据位不同,据此可以很好地减少亚稳态的发生。雷格码可以通过对 FPGA内部编程实现二进制计数器来完成,即读地址的雷格码计数器用读时钟,写地址的雷格码用写时钟,数据输入端由两个相邻二进制的数据位异或产生,这样就很好地解决了当读/写地址指针相同时,由于读/写时钟异步而产生的地址错误。下面给出的是读地址雷格码程序描述。

  process(rd_clk,reset,rd_en)

  begin

  if reset='1' then

  rd_gray<="00000000";

  else

  rd_gray(3)<=rp(3);

  rd_gray(2)<=rp(3)xor rp(2);

  rd_gray(1)<=rp(2)xor rp(1);

  rd_gray(0)<=rp(1)xor rp(0);

  end if;

  end process;

  其中: reset为系统复位信号; rd_clk为读出数据时钟信号; rd_en为读出数据使能信号; rp为读数据指针;rd_gray为读雷格码地址。

  3. 结束语 本文根据半实物仿真测试系统的要求,利用 FPGA芯片内部 EAB模块设计了基于 PCI总线接口的异步 FIFO缓存器。针对异步 FIFO设计中的空 /满状态及亚稳态问题,给出了具体的解决方法,主要采用 VHDL语言进行了 FIFO的电路设计,利用 ALTERA公司的 EPF10K10 FPGA芯片实现了该设计,并将这一设计应用到半实物仿真测试系统中进行连续波形数据的传输,在实际测试系统中取得了较好的效果。

  本文作者创新点:在半实物仿真测试系统中,本着模块化的设计思想,本文利用 FPGA芯片内部 EAB模块设计了异步 FIFO存储器,提高了半实物仿真测试系统数据传输效率,解决了由于计算机中断而引起的数据传输间歇性问题。 


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

热门文章 更多
工业以太网交换机在功能和性能优势