PCI总线是通过主桥电路挂接在Host CPU上的局部总线,典型的PCI局部总线系统结构如图1所示。PCI的外部设备既可以作为PCI总线目标设备(Slave),实现基本的传送要求,也可以作为PCI总线的主控设备(Master),访问其他PCI总线设备及系统的其他资源。用户在实际应用中可以根据实际需求来设计设备的功能。
由于PCI总线规范[1]定义了严格的电气特性和时序要求,因而开发基于PCI总线的接口卡有一定的难度。它要求在接口卡和终端设备之间有一个总线接口控制器,以解码PCI总线线范并完成数据传送,这需要开发人员对PCI总线规范有深刻的理解并具有较高的计算机开水平。开发PCI接口大体有两种方式:使用专用的PCI接口芯片和可编程器件。如果使用ASIC厂家提供的专用接口芯片,用户使用到的只是部分PCI接口功能,会造成了一定的资源浪费,而且芯片价格高,不经济。使用可编程器件设计,将厂家提供的PCI软“核”引入可编程器件中,根据插卡的功能进行最优化,不必实现所有的PCI功能机以将PCI插卡的用户逻辑与PCI接口逻辑集成在一个芯片上,实现紧凑的系统设计。当系统升级时,只需更改可编程器件的逻辑,无需更新PCB版图。许多可编程器件产生厂商都提供经过测试的PCI接口功能模块,如Xilinx公司的LogiCore,Altera公司的AMPP(Altera Megafunction Partners Prongam)。下面介绍用Xilinx公司的LogiCore来实现控制连接在PCI局部总线上的外设。
1 Xilinx公司的LogiCore简介
Xilinx公司的LogiCore逻辑框图如图2所示。可以看出,该LogiCore的功能是将左边复杂的PCI接口转换成右边的用户接口信号:周期控制信号(包括用于配置PCI接口的信号CEG[255:0])、从设备控制信号、主设备控制信号、状态机信号等。其主要的功能是起一个桥梁作用,完成用户设备与PCI总线的信息传送,并且可以在Bus Master方式下直接访问系统主存储器。图2的LogiCorem逻辑框图只给出Xilinx的LogiCore中与PCI Master控制器有关的关键信号。现在就以上信号进行介绍:
PCI Host 端总线接口:
AD[31:0] 时分复用地址/数据信号,在帧信号有效的一个时钟AD[31:0]上的信号为地址信号。
C/BE[3:0] 命令/字节使能信号,在帧信号有效的第一个节拍,指示总线作业类型。
FRAMF 由总线上设备驱动,指明传输的起始时间和终止时间,在该信号有效期间表示总线传输开始,当该信号无效时,传输的是最后一个数据节拍。
IRDY 由总线主设备驱动,读操作时表示总线传输开始,当该信号无效时,传输的最后一个数据节拍。
IRDY 由总线主设备驱动,读操作时表示已准备好接受数据,写操作时表示有效数据已经在数据上。
TRDY 由从设备驱动,读操作时从设备正在把有效数据放在数据总线上;写操作时表示从设备准备接受来自Host的数据。
DEBSEL 译码出的地址在该设备的地址范围内时,则该信号有效。
IDSEL 配置读、写期间由Host发出的片选信号。
STOP 从设备向Host表示停止目前信号的传送。
PAR 奇偶校验信号,它通过AD[31:0]和C/BE[3:0]进行奇偶校验。
PERR 该信号只报告数据奇偶校验错。
SERR 该信号只报靠地址奇偶校验错,或者特殊命令序列中的数据奇偶校验错。
INTR_A 表示PCI设备请求中断。
REQ 表示总线主设备向仲裁器发出要占用PCI总线的请求。
User端总线接口:
ADIO[31:0] 地址数据复用总线,该总线由三态缓冲器驱动。
ADDR[31:0] 在地址周期,输出PCI总线当前作业的起始地址。
DEVSEL_USR 是DEVSEL信号的“克隆”版本。
FRAME_USR 是FRAME信号的“克隆”版本。
[page]
STOP_USR 是STOP信号的“克隆”版本。
[page]
STOP_USR 是STOP信号的“克隆”版本。
CFG_HIT 表明一个有效的配置周期开始。
ADDR_VLD 表明当前作业地址线的起始地址有效。
S_SRC_EN 在Slave模式读操作期间,告诉用户模块驱动下一片数据到总线ADIO[31:0]上。
S_DATA_VLD 表明当前ADIO[31:0]上的数据为有效数据(在Slave模式下)。
BASE_HIT[7:0] 表明基地址寄存器译码并选中相应的PCI映射空间。
CFG[255:0] PCI设备配置空间接口信号。
M_SRC_EN 在写操作时,表明数据源可以驱动下一片数据到ADIO[31:0]上(在INItiator模式下)。
M_DATA_VLD 表明当前数据线ADIO[31:0]上的数据为有效数据(在Initiator模式下)。
REQUEST 在主设备模式下,DMA控制器请求系统仲裁器让出总线。
M_WRDN 在主设备模式下,当前的作业进行读操作或写操作。M_WRDN=1时表示写,M_WRDN=0时表示读。
M_DBE[3:0] 在主设备模式下,驱动总线命令和字节有效信号。
COMPLETE 在主设备模式下,当前的DMA方式传送数据完成。
M-DMTA 表示在Initiator模式下当前主设备正片于数据周期。
DR_BUS 表示主设备状态机正驱动PCI总线。
I_IDLE 表示主设备状态机正在空闲状态,当前PCI总线没有被驱动。
M_ADDR_USR 表示主设备状态机在地址周期要求驱动地址信号到ADIO[31:0]上。
RST PCI总线复位信号的“克隆”版本。
CLK 由系统缓冲区驱动的PCI总线时钟。
INTER_USR 由用户发出的中断请求信号。是INTR_A信号的“克隆”版本。
从LogiCore提供的接口看出,该软“核”将复杂的PCI接口按照PCI的两种工作模式转化成相对简单的Slave和Master两组独立接口信号。用户可以根据实际需要来确定的应用那种模式,从而选用相应的一组或两组信号作为接口。而且LogiCore这种桥梁作用只是对PCI功能进行划分,它将PCI控制器的核心逻辑留给用户来实现,并给出状态机的接口信号。
2 PCI Master控制器的实现
以一个基于PCI总线的数据采集卡为例说明利用LogiCore实现PCI Master控制器的方法。由PCI协议知道,当PCI设备工作在Master模式下,可以直接访问计算机系统主存储器,而不通过计算机CPU。为此,在PCI Master控制器中必须设计一个DMA控制器。这样同主存储器传送数据时,可以暂时接管系统总线,控制传送字节数,判断DMA传输是否结束,发出DMA结束等信号来保证数据的正确传送。该数据采集卡所实现的功能就是不断从外部接收数据并以DMA方式输入到计算机系统缓冲区中,同时将预先放在计算机内存中的大量数据以DMA方式输出到外部的仪器中。DMA控制器属于LogiCore逻辑框图中的用户控制模块。它由现行字节数寄存器、现行地址寄存器、基字节数寄存器、基地址寄存器、半满地址寄存器、全满地址寄存器、状态寄存器、读写缓冲器及控制寄存器和优先级编码器等组成、DMA控制器原理图如图3所示。其中控制寄存器和优先级编码器是DMA控制器的关键。
2.1 DMA控制器的特点
(1)现行地址寄存器、基字节数寄存器、基地址寄存器、半满地址寄存器、全满地址寄存器5个寄存器可由高层应用程序根据当前驱动程序分配的系统内存空间来灵活配置。当传送完规定的传送长度(字节数减到零时),结束当前DMA传送并自动重新对现行地址寄存器进行初始化,具有自动初始化能力。
(2)优先级编码器中的4个DMA请求源的优先级是固定的,不可以旋转。优先级按照从高到低依次为读缓冲器、STATUS_C(由状态寄存器C-D发出的)、写缓冲器、STATUS_D(由状态寄存器C-D发出的)。
优先权编码器对4个DMA请求源进行优先级编码,并向LogiCore发出DMA请求信号。
(3)DMA数据传送有单字节传送和数据块传送两种方式。数据块传送方式可由用户初始化基字节寄存器来灵活设置一次传送的数据块长度。DMA控制器向系统缓冲区发送状态寄存器C-D中的信息时采用单字节传送方式。而传送读缓冲器和写缓存器中的数据时采用数据块传送方式并可由用户设置一次传送数据的长度。此时每传送一个数据,地址指针加1,字节数据1。
(4)DMA控制器中读缓冲器和写缓冲器都是2KB。
2.2 DMA控制器基本工作原理
2.2 DMA控制器基本工作原理
首先由高层应用程序根据采集卡的低层驱动程序分配的系统内存地址对基地址寄存器、半满地址寄存器、全满地址寄存器、状态寄存器、读写缓冲器和控制寄存器进行初始化。然后启动系统,开始工作。当读缓冲器的数据量不到半满或写缓冲器中接收到的数据量已超过半满或状态寄存器C-D有状态信息向高层报告时,则向优先级编码器发出相应的请求信号。DMA优先级编码器根据DMA请求对象的操作类型向DMA控制寄存器发出相应的控制信号。当DMA控制器检索到对应的控制信息发生变化时,向LogiCore发出DMA请求,并用基字节寄存器和基地址寄存器分别初始化现行字节数寄存器和现行地址寄存器。当计算机系统允许DMA控制器占用PCI总线时,则DMA控制器接管PCI总线,并在地址周期向LogiCore发出DMA读写命令,同时输出当前要对系统缓冲区操作的起始地址。在随后的数据周期中,从数据总线ADIO上输出或接收数据,同时修改地址指针(DMA支持隐含寻址)和字节计数器值,DMA控制器检测传送是否结束。如未结束则不停循环传送。当检测到字节计数器即将为零时,则向LogiCore发出COMPLETE信号,COMPLETE信号持续到字节计数器为零时,DMA控制器释放掉对PCI总线的控制权,使CPU恢复正常工作状态。
在DMA控制器中,状态寄存器C-D有两个DMA请求源STATUS_C和STATUS_D。其中STATUS_C在地址比较器检测到读缓冲器读完对应系统缓冲区一半空间或全部读守对应系统缓冲区数据时,置相应的状态信息并向优先级编码器发出STATUS_C请求信号。而STATUS_D在地址比较器检测到写缓冲器写完对应系统缓冲区数据、置相应的状态信息并向优先级编码器发出STATUS_D的请求信号。
值和注意的是,在DMA控制器设计过程中,当进行数据块传输、字节数寄存器计数快结束时,应提前向计算机系统发出完成本次数据块传送的COMPLETE信号,这样可保证DMA数据块传送的正确进行。至于提前几个字节数据可以根据试验来确定,一般提前2~4个字节即可。
PCI总线设计中定义的双向信号,均要用OE信号来控制。同时有些信号如地址比较等要进行分割,以使用最少的通用逻辑模块数来实现。这些是PCI总线设计所要注意的事项。由于LogiCore中对这些情况在逻辑上已经进行优化处理,从而使用户避免了同复杂的PCI接口打交道,减少犯错误的可能,缩短了开发周期。
本数据采集卡在WINDOWS 98多任务操作系统下运行数据传输速率可以达到140Mbps,满足了实际要求。
上一篇:基于STD总线的变电站监控保护系统通信设计
下一篇:基于PXI总线的某装备自动测试系统设计与实现
推荐阅读最新更新时间:2024-05-02 22:36
S3C2410的linux 下DMA驱动程序开发
网上介绍LINUX下的一般驱动程序开发示例浩如烟海,或是因为简单,关于DMA驱动的介绍却寥寥无几;近期zhaoyang因工作需要,花了几日时间开发了某设备在S3C2410处理器Linux下DMA通信的驱动程序,有感于刚接手时无资料借鉴的茫然,故写点介绍,期待能给有DMA开发任务的网友们一点帮助。 本文将包括如下内容: DMA驱动主要函数功能 驱动中关键技术分析 具体的DMA实例分析 申明:本DMA驱动开发介绍仅适合S3C2410处理器类型,分析源码为韩国MIZI研究中心维护的dma驱动代码: linux/arch/arm/mach-s3c2410/dma.h,linux/arch/arm/mach-s3c2410/dma.c,
[单片机]
一种基于PCI总线的反射内存卡设计
1 引言 对实时传输, 传统的以太网络由于传输协议开销的不确定性, 很难满足实时网络的要求, 实时网络是一种应用于高实时性要求的专用网络通信技术, 一般采用基于高速网络的共享存储器技术实现。除了具有严格传输确定性和可预测性外, 还具有传输速度高、通讯协议简单、软硬件平台适应性强、可靠的传输纠错能力、支持中断信号的传输等特点。鉴于以上原因, 设计一款反射内存卡, 写入一个节点的内存的数据可以通过网络硬件传输到其它所有的节点。 2 硬件设计 反射内存卡系统的总体框图如图1 所示, 主要由5部分组成:FPGA、PCI 接口、SDRAM、数据编解码电路、光纤收发电路。 其中,FPGA 内部包含SDRAM控制器和F
[工业控制]
STM32F407的串口采用DMA收发数据
环境: 主机:WIN8 开发环境:MDK5.13 mcu: stm32f407VGT6 说明: 之前用STM32F103实现DMA收发串口数据,现在项目中采用STM32F407,所以将此机制移植到F4上。 STM32F103上用DMA收发串口数据文章: STM32的串口采用DMA方式发送数据测试 STM32的串口采用DMA方式接收数据测试 源代码: 串口初始化代码: /********************************************************************* * 初始化串口 ************************
[单片机]
基于PCI 9052总线的高速噪声检测系统
摘要 :文章介绍了一种基于PCI总线的高速噪声检测系统,介绍了采用PCI 9052作为PCI总线接口芯片的数据采集部分的设计原理,并说明了数据采集卡的高速采样和速率可变的实现原理,给出了底层硬件同上层软件的连接实现。 关键字 :噪声检测;PCI总线;PCI 9052;WDM 前言 噪声检测系统用于对环境噪声进行样本采集和频谱分析,确定噪声中的频率分量是否对人体造成伤害。该系统分为高速数据采集卡和频谱分析两部分。数据采集卡将采样采集到的数据送入计算机内,由应用程序完成快速频谱分析功能。由于环境噪声是实时变化的,因此需要采集电路的高速采样和数据的高速传输。鉴于传统总线无法满足高速传输的要求,采用了P
[嵌入式]
STM32HAL库DMA模式串口收发
一.简单了解 串口模式实现有三种 1.普通模式:在主函数中接收函数 2.中断模式:产生的不影响主程序运行 3. DMA模式:与主函数互不影响,独立运行 本文记录第一种普通模式。 学习目标是:实现DMA串口的数据收发,发送数据时LED灯电平翻转。 二.步骤 1-在原来工程基础上,在stm32cubemx中增加dma,usart1中的DMA Settings,ADD USART1_RX循环接收和USART1_TX单次发送 2-添加MDA宏定义代码 #define UART1_DMA uint8_t TdataDMA ={ welcome to uart DMA!rn }; uint8_t Rdata; 3-在主函数添加
[单片机]
STM32F0单片机快速入门八 聊聊 Coolie DMA
苦力 DMA 世上本没有路,走的人多了,便成了路。世上本没有 DMA,需要搬运的数据多了,便有了 DMA。 大多数同学应该没有在项目中用过这个东西,因为一般情况下也真不需要这个东西。在早期的单片机中也不存在DMA模块。再加上很多谈 DMA 的文章,一上来就先来一个总线架构图,然后来一大堆让人生畏的词儿:共享总线,仲裁器,指针增量,对齐,中断 ... 好吧,每一个词都能吓跑一批胆小的。 真的需要这么复杂吗?就好比我们学开车一样,能不能先别去尝试弄懂发动机的原理,直接挂档踩油门走起来呢? DMA是很简单的一个模块,首先他的功能单一,就是把数据从一个地方搬运到另一个地方,再一个它的用法也很简单,我们还是先从一个例子说起: 我们用 K
[单片机]
小白都看得懂的STM32的DMA知识
一、DMA简介 1、DMA简介 DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。 CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝。 DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作--计算、控制等。 2、DMA的工作原理 DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样
[单片机]