Taylor / 知识管理 / DMA

分享

   

DMA

2008-09-22  Taylor
S3C2410数据手册中DMA部分:

DMA请求源通过设置DCON[23]位SWHW_SEL值,选择硬/软件请求,并可进一步通过设置HWSRCSEL[26:24]位选择HW模式下的每个DMA通道的请求源

DMA工作过程使用三态FSM(有限状态机)进行操作,分三步操作:

Stage-1 初始状态,等待DMA请求,若请求到达,进入Stage-2。此阶段,DMA ACK和INT REQ都为0。

Stage-2 DMA ACK变为1,计数器CURR_TC从DCON[19:0]加载数值。注意:此时DMA ACK仍然为1,知道它随后在stage-3中被清0。

Stage-3 在此状态,对DMA进行原子操作的sub-FSM(子状态机)被初始化它从源地址读取数据然后写入目的地址(此操作需要考虑数据大小和传输尺寸)。

每一次DMA传输,必须先得到请求。

有两种请求模式:Demand和Handshake。差别在于是否等待DREQ信号无效:

Handshake模式下,DMA控制器在开始下一次传输之前要一直等待直到DREQ信号无效。如果DREQ信号无效了,DMA 控制器使DACK无效后继续等待下一次DREQ信号有效,之后又开始数据传输,且使DACK信号有效。

Demand模式下,DMA控制器不等待DREQ信号无效。如果传输完毕后DREQ还是继续有效,DMA控制器只是先无效DACK信号,然后又开始新一轮的传输。数据手册上建议对外部DMA请求使用Handshake模式,以避免不经意的开始新一轮数据传输。
 

有两种传输模式:Single service和Whole service。差别在于三态FSM操作的Stage-3:

在Stage-3状态,对DMA进行原子操作的Sub-FSM被初始化,它从源地址读取数据然后写入目的地址(此操作需要考虑数据大小和传输尺寸)。

Whole service模式下,这种读、写操作重复进行直到计数器(CURR_TC)变为0;而Single service模式下读和写操作只进行一次。

数据手册上提醒注意:就算是Whole service传输模式,每一次sub-fsm的原子传输后DMA也会释放总线,然后再试图重新获得总线,以保证其他设备能够有机会获得总线使用权。

每次原子传输(Sub-FSM中)的单元尺寸分为Unit(1次读和写操作,单块数据)和Burst4(分别执行4次连续读、写操作,4块数据)。

在整体服务模式下,使用传统的DMA 计数器,状态机会停留在状态三,直到DMA计数器的值减为零,再回到状态一,等待下一次DMA请求。2410 DMA 数据传输模式:共有两种数据传输模式:

单位数据传输模式:执行一次读操作和一次写操作。

并发数据传输模式:执行四次读操作和四次写操作。2410 DMA 的基本时序:nXDREQ请求生效并经过2CLK周期同步后,nXDACK响应并开始生效,但至少还要经过3CLK的周期延迟,DMA控制器才可获得总线的控制权,并开始数据传输。2410 DMA 的两种协议模式:请求模式:If XnXDREQ remains asserted, the next transfer starts immediately. Otherwise it waits for XnXDREQ to be asserted.

握手模式:If XnXDREQ is deasserted, DMA deasserts XnXDACK 
 
 
ARM的DMA速度由多种因素决定:
1. DMA使用的时钟信号,是系统时钟的几分频,看看所选ARM的时钟框图即可。
2. DMA访问的存储器的时序配置,看看一个读/写周期的时长多少。
3. DMA的工作方式,STEAL CLOCK和ON THE FLY等等模式的工作方式是不同的。
总而言之,DMA的速度很难直接给出最高多少BPS这样的结论,它就是为了外设或存储器与存储器之间的数据交互的,所以速度根据你外设或存储器的速度,及所选择的工作方式,会有不同。
ARM9和ARM7在DMA速度方面的差异,由于受到外设或存储器速度的影响,可能不会很大。但由于CPU速度和执行效率的问题,DMA在ARM9下占用系统资源会比ARM7小一些。
 
跟外设和内存速度有关,比如我用的S3C2410用的内存的速度是133M,如果和一个速度上限只有10M的外设通讯,那么速度就是10M,如果外设速度200M,那么速度就是133M
 
 
MIPS系统中北桥的FPGA设计
作者:武杰 乔崇 张俊杰 杜学峰 唐世悦 张万生 王砚方    时间:2006-12-04  来源:  电子设计信息网-www.edires.net  
 
摘要:本文介绍了一个用FPGA开发的用于MIPS系统的北桥设计,主要包括北桥的结构框架、设计思想和技术特点等内容,并结合同类型的国外产品进行了性能上的比较和测试,得出的结论是此设计的大部分指标均达到或超过同类产品.

关键词:MIPS;北桥;Wishbone总线;总线仲裁

1简介

随着“龙芯”等拥有完全自主产权CPU的诞生,我国结束了无“芯”的历史.但这还不够,因为要构成一个完整的拥有自主产权的计算机系统,还必须有操作系统,芯片组和主板等技术的支持.操作系统可以从一些Open Source的系统(如Linux等)进行移植,主板的设计技术已经被国内一些大的企业和研究院所掌握,也不成问题.但是对于系统的芯片组这一块,目前投入的力量还不大,是一个急需开发的领域.我们正是本着这个目的开发设计了用于MIPS系统的北桥——芯片组的关键组成部分.南北桥这个称呼由来已久,比较开始强调的时期应该是Pentium时代,其实就是人们按照不同的应用特点把各种用途的控制器集成到主板上两枚不同的芯片中.接近CPU的那一个被称为北桥芯片,主要负责系统存储器、CPU以及PCI总线间地数据交换;另一个一般集成有IDE控制器、DMA控制器、USB和其它各种速度相对较慢的I/O控制器,这个芯片被称为南桥.南桥和北桥随着不同公司在不同年代的推出,其内部包含的功能也会有所变化,但基本上快速数据设备之间的数据交换都是由北桥负责,南桥虽然在功能上并不比北桥少,但因它大都和慢速设备打交道,所以从对系统整体性能的影响上来讲,北桥的作用显得更为重要些.

2 北桥整体框架

北桥设计的目的是为了配合“龙芯II”的使用,“龙芯II”与MIPS-IV(64bits)系列CPU兼容,所以我们的北桥也可以和其它公司的同类型CPU配合使用.在本设计中,北桥的主要功能包括MIPS CPU接口、SDRAM控制器接口、PCI总线控制接口、DMA控制器、局部I/O总线接口、内部总线仲裁、PCI总线仲裁、北桥寄存器和系统中断控制等部分.北桥内部结构按照上述接口分成九个相对比较独立的模块,其中CPU接口、PCI从设备接口1和DMA接口作为主设备可以发起内部总线操作,而SDRAM控制器、PCI主设备接口、局部总线和寄存器等部分作为从设备只能被动接收总线命令.

图1给出了北桥的内部结构框架示意图.CPU接口负责北桥和MIPS CPU的通信,它们之间通过SYSAD总线进行数据传递.SYSAD是MIPS CPU常用的一种接口总线,在我们的设计中数据总线宽度为64位,地址总线宽度为32位(可扩展至36位).北桥的PCI接口为32位,总线时钟33MHz,符合PCI2.2的规范.北桥可以作为PCI总线的控制器,并且在内部提供PCI的总线仲裁控制器,包括自己在内一共支持7个PCI设备.系统的SDRAM接口符合Intel的SDRAM2规范,支持两个标准DIMM存储器插条,最大支持容量为2GB字节.在系统上电复位的时候北桥通过I2C总线读取内存条上的SPD(SelfSerial Presence Detect)信息并根据其中的内容对SDRAM进行自动配置.北桥的局部I/O总线主要是提供对一些慢速设备的简单I/O访问,如存放BIOS的FLASH ROM和指示系统运行状态的ASCIILED显示灯等.虽然北桥的主要对象是高速数据设备,但这个接口是必须的,因为只有通过它系统才能完成初始化过程,然后才是其它高速数据设备总线的运行.

图1 MIPS北桥内部结构示意图

3 北桥的技术特点

3.1 Wishbone总线协议
对于这样一个比较复杂的系统,采用分模块的设计是必须的,它不可能由一个人来单独完成,所以必须采取先分模块设计,再整体合成的方法.这样带来的好处是显然的,它可以使多个模块并行开发,大大加快系统的开发速度,但同时也带来一个不能回避的问题,那就是要在设计之初制定一个用于系统内部模块之间互联的数据传递协议.这个协议的制定非常重要,一旦确定后所有的设计都在此基础上独立的展开,各模块之间数据传递的可靠性以及传输效率都由所采取的协议决定,如果在后来的整体调试过程中才发现当初制定的协议存在错误或者不完备,那么它带来的后果是所有的模块必须全部返工.

解决这个问题有两种方案,一是开发自己的总线协议,另一个是采取目前已经成熟的适用于SoC内部互联的总线协议.协议完全由自己开发虽然在总线的传输效率上可能会比较高,能够很好的适应自己的系统,但周期比较长,而且如果考虑不周全,以后升级扩展将变得很困难.对于成熟的SoC总线,有很多选择,许多大公司如IBM、ARM、Motorola等都有自己的总线协议,不过这些都需要公司授权才能使用,不适合开发拥有自主产权的产品.所以我们采用了两者结合的办法,既在现有成熟的总线基础上作适当修改形成适应自己系统的总线.

在这里要介绍的是Silicore公司的Wishbone总线协议,它是一种完全开放的适用于SoC内部IP模块互联的总线协议,用户可免费使用并且还可以对其进行修改.Wishbone采用一种单一的总线方式,支持多主设备和多从设备、8-64+的数据宽度和64位的地址寻址、单字和块传输模式、读修改写指令周期及其它各种常见的总线工作方式,并且还提供了用户扩展功能.Wishbone协议开发的目的就是为了用于芯片内部的总线互联,所以它的很多特点都针对了芯片内部连线和逻辑资源丰富的特性,使得模块与模块之间的连接设计起来非常简单.我们在Wishbone的基础上加以修改形成了适用于北桥的总线协议,修改后的单字读写时序如图2所示.

图2 单字的读写时序

当主设备发起写操作时首先将CYC-I置高,表示一个数据周期的开始,同时给出STB-I告诉从设备准备进行数据操作(WE-I=1代表写操作),从设备在时钟上升沿2检测到STB-I信号有效并且为写数据周期于是就根据主设备给出的ADR-I地址把数据DAT-I写入相应存储空间,SEL-I则表示当前给出数据的那一个字节有效.同样当主设备发起读操作时(时钟3)也是先给出CYC-I和STB-I信号.在时钟沿4从设备检测到主设备的STB-I信号并且为读周期(WE-I=0),如果这个时候数据还没有准备好就可以保持ACK-O无效从而使主设备插入一个等待周期.在时钟沿5主设备收到ACK-O信号,知道从设备已将数据准备好,于是读入DAT-O,完成读周期.

上面描述的是Wishbone总线的单字操作情况,因为Wishbone协议没有采用数据地址复用总线,所以对于数据的块传输和单字方式没有本质区别,只要主设备和从设备同时保持STB-I、ACK-O有效,并且主设备在每个时钟周期都给出下一个地址,那么就可以在做到一个时钟完成一个数据传递,达到系统时钟的最高利用率.由此可见,Wishbone协议不仅考虑了高速设备之间的高速数据通道而且提供了握手信号兼顾慢速设备的数据传递,非常适合像北桥这样多个异速总线之间的相互连接.

3.2 crossbar方式内部互联
北桥性能好坏的一个关键指标就是它能否提供高带宽的数据传输通道.为了达到高的数据带宽必须采用高性能的总线拓扑结构.总线的拓扑结构大致可以分成四种连接方式:点对点连接(Point-to-point)、数据流方式(Data flow)、共享总线方式(Shared bus)和交叉互连方式(crossbar switch).在北桥的设计中我们采用了路由器中常用的数据传输效率最高的crossbar方式(图1)来进行各个模块之间的数据传递.采用这种方式的好处是能够在内部达到最大的数据传输率,多个主从模块之间可以并发的进行数据交换而互不影响.例如当CPU在进行运算的时候,大部分被访问设备都是SDRAM,这个时候如果发起一个PCI到PCI的DMA操作便可以和CPU通道同时进行而不被打断.

3.3 系统仲裁机制
尽管采用了crossbar作内部的数据交换方式,多个主设备仍有可能会在同一时间访问同一个从设备,这个时候就需要系统做出仲裁.对于多主设备的总线仲裁,一般采用的方法有串行的菊花链和并行仲裁两种.串行仲裁虽然连线比较少,但走线延迟较大,不适合在高速系统中使用.在我们的北桥设计中采用了集中式并行仲裁的方法,并且根据北桥的特点设计了一套自己的仲裁算法,它既可以针对不同设备设置不同的优先级而且还可以实现优先级循环调度保证不会发生设备被“饿死”的情况.

这个算法可以说是一种带优先权的roundrobin方式,它主要解决一个问题就是北桥内部的“不公平”竞争,既实现北桥内部的三个主设备“CPU接口、PCI从设备接口和DMA控制器”对系统总线资源的“不公平”使用:CPU是系统的核心部件应该首先保障;PCI因为其本身时钟较慢数据率不高,特权级别排在第二;DMA部分会大量占用资源,严重影响CPU程序的执行,所以把它的优先权设为最低.针对以上特点,我们采用了两个4bits移位寄存器来实现总线使用权的分配.具体实现方法如图3所示。

图3 仲裁器结构

在图3中,两个移位寄存器被分成两级分别表示高优先级(CPU接口)和低优先级设备(PCI和DMA),每个寄存器根据不同需要赋予不同的初值(在我们的设计中初值均为“1110”).设备仲裁得胜得与否根据相应寄存器的最低位判断,如果为“1”表示仲裁得胜取得总线使用权,否则继续等待下一次仲裁.在仲裁事件发生时,挂接在级别较高寄存器上的设备具有较高的优先权,只有它仲裁失败(最低位为“0”)才会轮到下级设备继续仲裁.每发生一次仲裁事件,仲裁得胜设备所对应的移位寄存器进行一次循环移位,下一次仲裁按移位后的寄存器值进行.按照图3给出的初值不难看出,当三个设备都进行总线申请时它们得到仲裁权的比为CPU:PCI:DMA=12:3:1.实际上三个设备的总线申请是随机的,我们假设三个设备出现的总线申请是等几率的,那么三个设备出现的总线申请状态就有2×2×2=8种(每种状态出现的几率相等,都为1/8).如果不同设备在各状态下取得总线使用权的几率用Pxi表示,则各个设备在所有情况下对系统资源的占用就可用得出.

表1中给出了各种总线申请情况下设备取得总线权的几率大小,“1”代表该设备有总线申请,“0”表示没有申请.从表1可以得出CPU、PCI和DMA对总线资源的占用时间比为52:35:25.


上述仲裁逻辑在我们的所采用的FPGA(XCV400e26)中时钟频率可以达到200MHz,而资源仅占用非常少(300门左右),完全满足绝大部分总线仲裁的需要.虽然这个算法建立在三个主设备的模型之上,但是对于多主设备的总线只要适当地增加移位寄存器级数就可以实现.而且只需简单改变寄存器的长度和初值就可以得到不同的设备总线资源占用比,非常方便.

4 北桥性能测试

北桥的性能是与Algorithmics公司(该公司已被MIPS公司收购)2000年推出的一款功能类似的北桥芯片bonito64作对比测试给出的.测试主要是针对北桥的访存性能和PCI总线速度.两个芯片的测试环境完全相同:硬件平台是同一块测试板,CPU为IDT的RC64575,南桥是Intel的82371EB;软件环境均为RedHat7.1for MIPS,测试软件为hdparmV3.9和xbench0.2.其中hdparm主要用来测试硬盘的速度,在我们的测试系统中硬盘挂在Intel的南桥芯片上,而南桥又通过PCI总线和北桥相连,所以对硬盘速度的测试就是对PCI总线速度的测试.xbench是在Xwindows下对显卡的测试,它反映的是系统数据处理能力的综合能力(包括访存和PCI6速度).图4、图5和表2给出了几个具体的测试对比数据.经对比后我们的设计除了在运行时钟上略低于bonito64外(83MHz/100MHz),其它各项指标均超过bonito64或与之持衡.



图4 hdparm测试结果(硬盘缓冲区测试)


图5 hdparm测试结果(非缓冲晚测试)

5 结 论

本文的北桥逻辑设计采用Verilog语言编写,整体可以放在一块Xilinx的Vertex400EFPGA中,资源占用85%,总体上相当于26.5万门左右.目前系统的运行时钟能稳定在83MHz(PCI为33MHz).可以说北桥的FPGA阶段已经完成,如果根据这个设计再作ASIC开发的话,有理由相信它可以取代国外的同类产品从而使计算机系统的国产化迈出新的一步.

 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>