基于ARM的FPGA加载配置实现

发布者:快乐舞动最新更新时间:2007-03-15 来源: 微计算机信息关键字:SRAM  存储  I/O 手机看文章 扫描二维码
随时随地手机看文章
0引言

基于SRAM工艺FPGA在每次上电后需要进行配置,通常情况下FPGA的配置文件由片外专用的EPROM来加载。这种传统配置方式是在FPGA的功能相对稳定的情况下采用的。在系统设计要求配置速度高、容量大、以及远程升级时,这种方法就显得很不实际也不方便。本文介绍了通过ARM对可编程器件进行配置的的设计和实现。

1 配置原理与方式

1.1配置原理

在FPGA正常工作时,配置数据存储在SRAM单元中,这个SRAM单元也被称为配置存储器(Configuration RAM)。由于SRAM是易失性的存储器,因此FPGA在上电之后,外部电路需要将配置数据重新载入到片内的配置RAM中。在芯片配置完成后,内部的寄存器以及I/O管脚必须进行初始化。等初始化完成以后,芯片才会按照用户设计的功能正常工作。 

1.2配置方式

  根据FPGA在配置电路中的角色,其配置数据可以使用3种方式载入到目标器件中:

  ·FPGA主动(Active)方式;

  ·FPGA 被动(Passive)方式;

  ·JTAG 方式;

在FPGA 主动方式下,由目标FPGA来主动输出控制和同步信号(包括配置时钟)给专用的一种串行配置芯片,在配置芯片收到命令后,就把配置数据发到FPGA,完成配置过程。在被动方式下,由系统中的其他设备发起并控制配置过程,FPGA只输出一些状态信号来配合配置过程。被动方式包括被动串行PS(Passive Serial )、快速被动并行FPP(Fast Passive Parallel)、被动并行同步PPS(Passive Parallel Serial)、被动并行异步PPA(Passive Parallel Asynchronous)、以及被动串行异步PSA(Passive Serial Asynchronous)。JTAG是IEEE 1149.1边界扫描测试的标准接口。从JTAG接口进行配置可以使用Altera的下载电缆,通过Quartus工具下载,也可以采用微处理器来模拟JTAG时序进行配置。

2硬件电路设计

AT91ARM9200对EP1C6配置的硬件电路示意图如图1所示。

在配置FPGA时,首先需要将年nCONFIG拉低(至少40us), 然后拉高。当nCONFIG被拉高后,FPGA的nSTATUS也将变高,表示这时已经可以开始配置,外部电路就可以用DCLK的时钟上升沿一位一位地将配置数据写进FPGA中。当最后一个比特数据写入以后,CONFIG_DONE管脚被FPGA释放,被外部的上拉电阻拉高,FPGA随即进入初始化状态。

图 1 ARM配置FPGA电路原理图

3软件设计

  本文在设计时使用Linux系统,软件编写和调试是在ADS 下。主要程序如下:

  static AT91PS_PIO pioc;

  inline void pioc_out_0 (int mask)

  {

    pioc->PIO_CODR = mask;

  }

  inline void pioc_out_1 (int mask)

  {

    pioc->PIO_SODR = mask;

  }

  inline int pioc_in (int mask)

  {

    return pioc->PIO_PDSR & mask;

  }

  inline void xmit_byte (char c)

  {

    int i;

    for (i = 0; i < 8; i++)

    {

    if (c & 1)

             pioc_out_1 (DATA0);

        else

             pioc_out_0 (DATA0);

             pioc_out_0 (DCLK);

             pioc_out_1 (DCLK);

        c >>= 1;

     }

  }

  

  void pioc_setup ()

  {

     pioc->PIO_PER   =DATA0 | nCONFIG | DCLK | nSTATUS | CONF_DONE;

     pioc->PIO_OER   =DATA0 | nCONFIG | DCLK;

     pioc->PIO_ODR   =nSTATUS | CONF_DONE;

     pioc->PIO_IFER   =nSTATUS | CONF_DONE;

     pioc->PIO_CODR   =DATA0 | nCONFIG | DCLK;

     pioc->PIO_IDR   =DATA0 | nCONFIG | DCLK | nSTATUS | CONF_DONE;

     pioc->PIO_MDDR =DATA0 | nCONFIG | DCLK;

     pioc->PIO_PPUDR =DATA0 | nCONFIG | DCLK | nSTATUS | CONF_DONE;

     pioc->PIO_OWDR =DATA0 | nCONFIG | DCLK | nSTATUS | CONF_DONE;

  }

  int pioc_map ()

  {

      int fd;

      off_t addr = 0xFFFFF800;   // PIO controller C

      static void *base;

      if ((fd = open ("/dev/mem", O_RDWR | O_SYNC)) == -1)

       {

         printf ("Cannot open /dev/mem.\n");

         return 0;

       }

      printf ("/dev/mem opened.\n");

      base = mmap (0, MAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, addr & ~MAP_MASK);

      if (base == (void *) -1)

      {

      printf ("Cannot mmap.\n");

        return 0;

      }

      printf ("Memory mapped at address %p.\n", base);

      pioc = base + (addr & MAP_MASK);

      return 1;

  }

  int main (int argc, char **argv)

  {

      FILE *file;

      char data[16];

      int nbytes, i;?

      if (argc != 2)

     {

        printf ("%s \n", argv[0]);

        return -1;

     }

      file = fopen (argv[1], "r");

      if (!file)

     {

         printf ("File %s not found.\n", argv[1]);

         return -1;

     }

     if (!pioc_map ())

          return -1;

     pioc_setup ();

     pioc_out_0 (nCONFIG);

     for (i = 0; i < 10000 && pioc_in (nSTATUS); i++) { }

     if (i == 10000)

     {

         printf ("nSTATUS = 1 before attempting configuration.\n");

         return -1;

      }

      pioc_out_1 (nCONFIG);

      for (i = 0; i < 10000 && !pioc_in (nSTATUS); i++) { }

      if (i == 10000)

      {

      printf ("Timeout waiting for nSTATUS = 1.\n");

         return -1;

      }

      while ((nbytes = fread (data, sizeof (char), sizeof (data), file)) > 0)

      {

         if (pioc_in (CONF_DONE))

         {

               printf ("CONF_DONE = 1 while transmitting data.\n");

               return -1;

          }

          if (!pioc_in (nSTATUS))

          {

             printf ("nSTATUS = 0 while transmitting data.\n");

             return -1;

          }

          for (i = 0; i < nbytes; i++)

               xmit_byte (data[i]);

     }

     for (i = 0; i < 10000 && !pioc_in (CONF_DONE); i++)

     {

         if (!pioc_in (nSTATUS))

         {

            printf ("nSTATUS = 0 while transmitting data.\n");

            return -1;

         }

         pioc_out_0 (DATA0);

         pioc_out_0 (DCLK);

         pioc_out_1 (DCLK);

     }

     if (i == 10000)

     {

            printf ("Timeout waiting for CONF_DONE = 1.\n");

            return -1;

     }

     return 0;

  }

4 结论

本文给出了基于ARM的FPGA加载配置软件实现。这种方法充分利用了ARM的速度快、灵活的特点,节省了开发成本,又满足了一些特殊的系统设计要求。本方法也适用于其它的微处理器。

参考文献

[1]王诚,吴继华,范丽珍,薛宁,薛小宁.Altera FPGA/CPLD设计(基础篇) 人民邮电出版社 2005.7 PP187~190

[2] 王艳,李秀华 基于单片机的现场可编程门阵列的配置 微计算机信息 2005,13,104-105。  

关键字:SRAM  存储  I/O 引用地址:基于ARM的FPGA加载配置实现

上一篇:CPLD在水下冲击波记录仪中的应用
下一篇:CPLD在三相PFC矩阵变换器中的应用

推荐阅读最新更新时间:2024-05-13 18:34

英特尔Optane SSD DC P4800X评测,比其他存储技术有哪些优势?
英特尔新推出的3D XPoint非易失性存储器技术,在过去几年里一直在造势却未见真容,一问世便成为英特尔企业级存储平台的主干力量。下面就紧随eeworld网半导体小编来详细了解一下吧。   英特尔Optane SSD DC P4800X是NVMe标准的PCIe SSD,3D XPoint内存取代NAND闪存可提供优于其他NVMe SSD的吞吐量与更低访问延迟。   3D XPoint   3D XPoint是一种强大的存储技术,3D XPoint是与占据市场主导地位的NAND闪存是完全不一样的技术。尽管目前看,现在仍然是NAND蓬勃发展的时代,但技术的趋势就是被新一代存储技术所取代。一旦NAND在密度以及速度方面不能再有提升,
[半导体设计/制造]
基于ISP1362的U盘MP3播放器设计
播放器与存储器的一体化设计对MP3播放器的便携性起了关键性的作用,但与此同时,它又带来了很多新的问题。比如存储容量固定,如果想装下更多的歌曲只能去购买新的产品,造成了巨大的浪费。另一方面,一体化又限制了MP3播放器在其它领域的应用,比如汽车电子等。于是,将存储器与播放器分离,成为MP3的另一发展方向,也是开发这款U盘MP3播放器的意义所在。 主要芯片简介 AT89C51SND1是ATMEL推出的基于8位C51 MCU内核的MP3解码器芯片。它内置MP3硬件解码器,支持48kHz、44.1kHz、32kHz、24kHz、22.05kHz及16kHz采样频率,具有重低音、中音、高音均衡控制和重低环绕声效果。它可以适应市场上不同DA
[手机便携]
赛普拉斯推出QDRII 和DDRII SRAM器件
赛普拉斯半导体公司推出业界首款四数据速率II+ (QDRII+)和双数据速率II+ (DDRII+) SRAM器件。这些存储器芯片是世界上密度最高带宽最大的,比现有QDRII和DDRII的系统级带宽大50%。这些存储器加速了各种数据密集产品的读写功能,可用于交换机、路由器、服务器、存储设备、无线基站和测试设备。 QDRII+和DDRII+的工作速率高达500MHz,带宽高于QDRII和DDRII,他们均使用相同占位引脚,封装形式为165引脚FBGA封装。这些SRAM的引脚与其它QDR联盟的产品兼容,包括NEC、IDT、Renesas和三星。Cypress的QDRII+/DDRII+ SRAM均采用Cypress的90nm RAM
[新品]
三星电子将在CES2023上推出下一代汽车存储产品
1月4日消息,据外媒报道,三星电子将在CES 2023上推出其下一代汽车存储半导体“1TB BGA NVMe AutoSSD AM991”。 该产品提供了高达1TB的容量,连续读取速度高达2300MB/s,连续写入速度最高1150MB/s,并已获得“AEC-Q1003 Grade 2”认证,这是汽车半导体的可靠性测试标准和质量标准,并保证在-40℃至105 ℃的宽温度范围内性能稳定。
[汽车电子]
三星电子将在CES2023上推出下一代汽车<font color='red'>存储</font>产品
监控应用对存储的需求以及对格局的剖解
安防行业存储选择像是一场花卉展,每种产品都在拼命的争奇斗艳。业内人士预测,监控领域的存储可能朝着两大领域发展,一对于节点不是太多的中小型应用中,NVR是未来的主要发展方向;其次是大型的监控系统,视频管理平台SAN存储(以ISCSI存储为主)仍旧是大型监控系统的不二选择。     监控应用对存储的需求     如果非要做个瞻望,预测一下若干年后的监控存储主要采用哪种方式,具体的答案是比较难作答的,毕竟技术的日新月异让我们连学习都疲于奔命,何况是预测哪种技术更能占据市场的上风。但是万变不离其宗,任何技术或产品的大行其道都和它的应用、它对用户问题的完善解决是紧紧分不开的,所以我们在预测前,先了解一下,监控应用对存储的需求是什么?
[安防电子]
奇梦达向30nm工艺和4F2单元尺寸迈进
  内存芯片厂商奇梦达(Qimonda)日前宣布了一个技术路线图,将走向30纳米工艺和4F2单元尺寸。该公司的首席运营官Thomas Seifert表示,实施这个路线图,将把公司的生产率提高一倍。   Seifert在接受采访时表示,路线图中的关键创新是Buried Wordline Technology,该技术可以把奇梦达沟道技术的功率/性能优势转化成更小的尺寸和更小的存储单元。目前,存储单元的尺寸通常是8F2。奇梦达计划在2008年下半年转向65纳米节点和6F2的单元尺寸。   利用这项技术将使奇梦达能够在2009年下半年转向46纳米节点和4F2尺寸,届时可以把每片晶圆的芯片产量提高一倍,从而提高生产率。Seifert声称
[焦点新闻]
ATmega16 EEPROM数据存储
ATmega16 包含512 字节的EEPROM 数据存储器。它是作为一个独立的数据空间而存在的,可以按字节读写。EEPROM 的寿命至少为100,000 次擦除周期。EEPROM 的访问由地址寄存器、数据寄存器和控制寄存器决定。 通过SPI和JTAG及并行电缆下载EEPROM数据的操作请分别参见 P260、 P265及P250。 EEPROM 读/ 写访问 EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。 EEPROM的写访问时间由Table 1给出。自定时功能可以让用户软件监测何时可以开始写下一字节。用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路中,上电/ 下电时VCC 上升/
[单片机]
ATmega16 EEPROM数据<font color='red'>存储</font>器
TMS320VC5402DSP的并行I/O引导装载方法研究
    摘 要 介绍TMS320VC5402 DSP芯片的性能,着重分析它的片内ROM结构及并行I/O引导装载程序,并给出利用8031单片机实现8位并行I/O引导装载的方法。实践证明,该方法具有很大的灵活性和实用性。     关键词 数字信号处理器(DSP) 引导装载 单片机     TMS320VC5402(以下简称C5402)是德州仪器公司(TI)1999年10月推出的性价比极高(目标价格仅为5美元)的定点数字信号处理器(DSP)。C5402主要特点如下 : ·操作速率达100MIPS; ·具有先进的多总线结构,三条16位数据存储器总线和一条程序存储器总线; ·40位算术逻辑单元(ALU
[嵌入式]
小广播
最新应用文章

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 医疗电子 工业控制

词云: 1 2 3 4 5 6 7 8 9 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved