打印

ARM与FPGA通信(转)

[复制链接]
6957|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jancey|  楼主 | 2010-7-19 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
作为新手,这篇**对我的帮助很大,转贴共享

在数据采集卡中ARM主要负责数据显示和数据分析,处理的速度处于MS级;而FPGA在系统中处于数据的高速采集和高速处理,处理的速度是ns级。两个处理器的之间的数据传输属于典型的异步数据通信,它们之间通信的速度之间决定了系统处理数据的效率。FPGA与ARM之间属于大量数据交换,以异步并行读取的方式为例介绍ARM与FPGA的通信,实际设计中使用DMA方式来实现ARM与FPGA之间的大数据量通信。

ARM存储系统分析

    S3C2410A存储控制器提供访问外部存储器所需要的存储器控制信号。S3C2410A支持大、小端模式,将存储空间分为8个组(Bank),每组大小是128M,共计1GB,如图1所示。所有存储器组都可用于ROMA或者SRAM,Bank6、Bank7还可以用于SDRAM。所有内部块的访问周期都可编程。总线访问周期可以通过插入外部等待来延长,支持SDRAM的自刷新和掉电模式。Bank0~Bank6的开始地址是固定的,Bank7的开始地址是Bank6的结束地址,灵活可变,并且Bank7的大小与Bank6的大小必须相等。除Bank0外,其余各存储器的总线宽度可编程设置为8位、16位或者32位,但是Bank0只支持16位或者32位。Bank0作为引导ROM,地址映射到0x0000_0000。OM[1:0]是系统的引导模式控制引脚,在复位时,系统将检测OM[1:0]上的逻辑电平,并根据这个电平来决定Bank0区存储器的总线宽度
图1 ARM存储单元分配图
    在设计中ARM的bank0用于Nor Flash,bank6和bank7用于两块SDRAM,我们选择bank4作为FPGA内部RAM映射的空间。Bank4在ARM的统一基地址为0x20000000,后面的采集的数据都是基于这个地址为首地址的。
     EP3C25基于SRAM结构,器件内部自带RAM,容量最大达到594Kbit。为了方便ARM与FPGA通信,在FPGA上建立一个8Kbit的RAM数据缓冲区,将AD采集的数据缓冲在这8Kbit的RAM中,将ARM的数据总线和地址总线与RAM缓冲区构建的双口RAM的数据线、地址线直接相连,使用总线访问FPGA内部RAM就可以达到高速数据读取的目的。这种结构下相当于将采集到的数据直接存储到S3C2410的系统内存中,从而节省了数据传输的时间,大大提高了系统的效率。如上图4-2所示ARM存储系统的结构图,ARM与外部存储器相连时,必须先给其分配在一个固定的Bank,本设计将FPGA内的缓冲区指定在Bank4上,地址范围从0x2000_0000到0x2000_1000。使用片选引脚nGCS4、读引脚nOE和写引脚nWE即可完成对FPGA内存储空间的读写。




ARM读取双口RAM中的数据

    被测信号经过AD9480转换后,需要将转换后的数据进行存储,这是数字存储示波器与模拟示波器的区别之一。对于数据的存储方案主要有FIFO和双端口RAM两种。第一种使用FIFO方案,其特点是数据存储格式是先入先出,可以省去地址总线,只需要将数据按照一定的时钟写入存储单元,数据的读取相同。第二种是双端口RAM方案,其特点是需要两个独立的数据总线、地址总线和控制总线;一方在写入的时候,另一方可以进行数据的读取。由于需要读取存储器中某个“特定”位置的数据,所 以必须使用地址线,所以后端的存储器选择双口RAM。
图2 双口RAM与ARM总线连接图
    上图2是双口RAM与ARM总线连接图,双口RAM的地址线addr[8..0]与ARM的地址线的低九位相连,nOE取反后作为双口RAM的读取时钟,双口RAM的数据输出q经过一个八位的三态缓冲器输出。如图ARM读取信号nOE低电位有效,而双口RAM的读时钟为上升沿有效,为了得到合适的读取时序,我们将nOE取反后作为双口RAM的读取时钟。输出数据总线与ARM的数据总线连接,若直接连接共享存储区的数据总线会长期占用ARM的数据总线,会造成CPU无法运行。在两个数据总线中加一个三态缓冲器,以取反的nOE 为三态门的选通信号后问题既可以解决。
以读取操作为例,ARM读取外部存储器的时序图如下图3所示,针对FPGA内部缓冲区的读取,下面通过一个最基本的读语句来分析ARM读取的过程。

图3 ARM读取外部存储器的时序图
    以程序a[0] = *0x20000000为例,这条程序是将地址0x20000000地址中的数据赋给a[0],地址0x20000000为bank4的首地址,当程序需要访问bank4地址空间内的数据时,操作步骤如下:
    在接下来的时钟上升沿,将需要访问的地址赋给地址总线。
    在第二个周期选通访问地址所在bank的片选,即nGCS4拉低。
    在第三个周期将nOE拉低,给出发出读取信号。
    在第四个周期,将访问地址中的数据赋给数据总线。
    由于整个调试过程都在SDRAM中运行,而a[0]也是在SDRAM中由编译器指定一个地址,因此在读操作完成后,紧接着的是向SDRAM中某个地址赋值的写操作,所以片选信号和读信号在读操作完成后立即被拉高了。设计中真是使用了读信号nOE在读一次时产生的这个下降沿,将其取反做为双口RAM的读时钟。当nOE上升沿时,要读取的地址正占据着地址总线,地址被送到双口RAM的读地址,得到双口RAM内的数据,被送到数据总线上,ARM数据总线接收数据。经过若干个周期的读取即可完成ARM与FPGA之间的数据读取。

相关帖子

沙发
jy2010| | 2010-8-14 09:52 | 只看该作者
用不着这么复杂的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

200

帖子

0

粉丝