一种基于CPLD的单片机与PCI接口设计解决方案

发布者:荒火最新更新时间:2006-09-11 来源: 微计算机信息关键字:单片机  总线  存储器 手机看文章 扫描二维码
随时随地手机看文章

   0 引言

  8位单片机在嵌入式系统中应用广泛,然而让它直接与PCI总线设备打交道却有其固有缺陷。8位单片机只有16位地址线,8位数据端口,而PCI总线2.0规范中,除了有32位地址数据复用AD[3~0]外,还有FRAME、IRDY、TRDY等重要的信号线。让单片机有限的I/O端口来直接控制如此众多的信号线是不可能的。一种可行的方案就是利用CPLD作为沟通单片机与PCI设备间的桥梁,充分利用CPLD中I/O资源丰富、用户可自定制逻辑的优势,来帮助单片机完成与PCI设备间的通信任务。

  1 PCI接口设计原理

  1.1 PCI总线协议简介

  这里只讨论PCI总线2.0协议,其它协议仅仅是在2.0的基础上作了一些扩展,仅就单片机与PCI设备间的通信来说,意义不大。PCI总线是高性能局部总线,工作频率0~33MHz,可同时支持多组外围设备。在这里,我们只关心单片机与一个PCI设备间通信的情况,而且是以单片机与CPLD一方作为主控方,另一方作为PCI从设备。这样做的目的是为了简化问题,降低系统造价。

  PCI总线上信号线虽然多,但并不是每个信号都要用到。实际上PCI设备也并不会支持所有的信号线,比如错误报告信号PERR与SERR在网卡中就不支持。我们可以针对具体的应用选择支持其中部分信号线,还有一些信号线可以直接连电源或接地。下面简单介绍一下常用信号线的功能。

  AD[31~0]:地址数据多路复用信号。在FRAME有效的第一个周期为地址,在IRDY与TRDY同时有效的时候为数据。

  C/BE[3~0]:总线命令与字节使能控制信号。在地址中传输的是总线命令;在数据期内是字节使能控制信号,表示AD[31~0]中哪些字节是有效数据。以下是总线命令编码的说明:

    C/BE[30]# 命令类型说明C/BE[30]# 命令类型说明

    0 0 0 0  中断应答  1 0 0 0  保留

    0 0 0 1  特殊周期  1 0 0 1  保留

    0 0 1 0  I/O读   1 0 1 0  配置读

    0 0 1 1  I/O写   1 0 1 1  配置写

    0 1 0 0  保留    1 1 0 0  存储器多行读

    0 1 0 1  保留    1 1 0 1  双地址周期

    0 1 1 0  存储器读  1 1 1 0  存储器一行读

    0 1 1 1  存储器写  1 1 1 1  存储器写并无效

    PCI总线上所有的数据传输基本上都由以下三条信号线控制。

   FRAME:帧周期信号。由主设备驱动,表示一次访问的开始和持续时间,FRAME有效时(0为有效,下同),表示数据传输进行中,失效后,为数据传输最后一个周期。

  IRD:主设备准备好信号。由主设备驱动,表示主设备已经准备好进行数据传输。

  TRDY:从设备准备好信号。由从设备驱动,表示从设备已经准备好进行数据传输。当IRDY与TRDY同时有效时,数据传输才会真正发生。

  另外,还有IDSEL信号用来在配置空间读写期间作为片选信号。对于只有一个PCI从设备的情况,它总可以接高电平。IDSEL信号由从设备驱动,表示该设备已成为当前访问的从设备,可以不理会。

  在PCI总线上进行读写操作时,PCI总线上的各种信号除了RST、IRQ、IRQC、IRQ之外,只有时钟的下降沿信号会发生变化,而在时钟上升沿信号必须保持稳定。

  1.2 CPLD设计规划

  出于对单片机和CPLD处理能力和系统成本的考虑,下面的规划不支持PCI总线的线性突传输等需要连续几个数据周期的读写方式,而仅支持一个址周期加一个数据周期的读写方式。对于大部分应用而言,这种方式已经足够了。图1是经过简化后的PCI总线读写操作时序。

  在CPLD内设有13个8位寄存器用来保存进行一次PCI总线读写时所需要的数据,其中pci_address0~pci_address3是读写时的地址数据;

图1 简化的PCI写操作时序

  pcidatas0~pci_datas3是要往PCI设备写的数据;pci_cbe[3~0]保存地址周期时的总线命令;pci_cbe[7~4]保存数据周期时的字节使能命令;pci_data0~pci_data3保存从PCI设备返回的数据;pci_request是PCI总线读写操作状态寄存器,用于向单片机返回一些信息。当单片机往pci_cbe寄存器写入一个字节的时候,会复位CPLD中的状态机,触发CPLD进行PCI总线的读写操作;单片机则通过查询pci_request寄存器得知读写操作完成,再从pci_data寄存器读出PCI设备返回的数据。

  CPLD中状态机的状态转移图如图2所示。每一个状态对应FRAME与IRD信号的一种输出,而其它输入输出信号线可由这两个信号线和pci_cbe的值及TRDY的状态决定。当FRAME为有效时,AD[31~0]由pci_address驱动,而C/BE[3~0]由pci_cbe低4位驱动;当IRDY有效时,C/BE[3~0]视总线命令,要么由pci_cbe高4位驱动,要么设为高阻态,而AD[31~0]在pci_cbe[0]为“0” (PCI读命令)时,设为高阻态,而在pci_cbe[0]为“1” (PCI写命令)时由pci_datas驱动。另外一方面,一旦TRDY信号线变为低电平,AD[31~0]线上的数据被送入pci_data寄存器,而C/BE[3~0]线上的数据被送入pci_request寄存器的低4位。

图2 状态转移图

  考虑到在不正常情况下,PCI设备不会对PCI总线作出响应,即TRDY不会有效,为了不使状态机陷入状态S2的僵持局面,另外增设了一个移位计数器mycounter。当IRD信号有效时,计数器开始计数。计数溢出之后,不论PCI总线操作是否完成,状态机都会从状态S2转移到状态S3,即结束PCI总线操作。当TRDY有效时,会立即置位mycounter.cout。

  PCI总线操作是否正确完成,可查询pci_request的最高位是否为“1”,而IRDY与FRAME的值可分别查询pci_request的第4位和第5位。这两位反映了PCI总线操作所处的状态,两位都为“1”时可以认为PCI总线操作已经完成。在实践中,如果单片机的速度不是足够快的话,可以认为PCI总线操作总是即时完成的。

  2 PCI设计接口实现

  2.1 CPLD VHDL程序设计

  我们针对8位单片机控制PCI以太网卡进行了程序设计,CPLD器件选用Xilinx的XC95216系列。针对以太网卡的特点在逻辑上进行了再次简化,最终程序将适配进XC95261芯片中,并在实践中检验通过。

  以太网卡仅支持对配置空间和I/O空间的读写操作,而且这两个空间的地址都可以设置在0xFF以内,所以可以只用一个pci_address0寄存器,其它地址都直接设为“0”;如果再限制,每次只往网卡写入一个字节数据,则可以只用一个pci_datas0寄存器,其它数值在具体操作时设成与pci_datas0寄存器的一样即可。

  2.2 单片机PCI读写C语言程序设计

  在CPLD在帮助下,单片机读写PCI设备就变得相当简单。首先,将pci_cbe等寄存器都声明为外部存储器变量,并根据CPLD的设计指定地址。然后,传递适当的参数给以下两个读写子函数,即可完成对PCI设备配置空间、I/O空间、存储器空间的读写操作。从PCI设备的返回数据存放在全局变量savedata中。

  实际上在写PCI设备时,也可以从pci_data中得到返回数据。这个数据必须等于往PCI设备写的数据。利用这一点可以进行差错检验和故障判断,视具体应用而定。

   bdate unigned char request;

   sbit IRDY0=request^4;

   sbit FRAME0=request^5;

   sbit VALID=request^7;

   void readpci(unsigned char addr,unsigned char cbe){

   pci_address0=addr;

   pci_cbe=cbe;

   request=pci_request;

   while(!IRDY0 & FRAME0)) request=pci_request;

   savedata0=pci_data0;

   savedata1=pci_data1;

   savedata2=pci_data2;

   savedata3=pci_data3;

   if(!VALID)printf("Data read is invalid! ");

   }

   void writepci(uchar addr,uchar value0,uchar cbe){

   data uchar temp;

   pci_address0=addr;

   pci_datas0=value0;

   pci_cbe=cbe;

   request=pci_request;

   while(!(IRDY0 & FRAME0)) request=pci_request;

   if(!VALID)printf("Data write is invalid!");

   }

  3 结论

  用CPLD实现单片机与PCI总线接口的并行通信,电路结构简单、体积小,1片CPLD芯片足够,并且控制方便,实时性强,通信效率高。本设计方法已成功地应用于作者开发的各种数据采集系统中,用作单片机与PC104之间的并行数据通信,效果非常理想。

  4 参考文献

[1] 周明德.微型计算机系统原理及应用 [M] .第四版,北京:清华大学出版社,2002.

[2] 白中英.计算机组成原理 [M] .北京:科学出版社,1999.

[3] Xilinx芯片手册.美国赛灵思半导体公司

关键字:单片机  总线  存储器 引用地址:一种基于CPLD的单片机与PCI接口设计解决方案

上一篇:基于CPLD的任意波形发生器
下一篇:VHDL设计的消抖与滤波

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

PIC12C508单片机控制灯光源程序
;P IC 12C508 单片机 控制灯光源程序 ;以上程序使用PIC12C508 单片机 ,内部4M Hz 时钟,4脚输入50HZ脉冲信号,7,6,3脚(GP0,GP1,GP4端口)为输出口。其中渐变部分是让灯慢慢的变亮(或灭)。不知道以上程序有没错误,有错误之处请大家多多给意见。谢谢 ;程序如下: GPI0 EQU 6 COUNT1 EQU 11 COUNT2 EQU 12 COUNT3 EQU 13 COUNT4 EQU 14 COUNT5 EQU 15 POINTER EQU 16 POINTER1 EQU 17 ORG 00H MOVLW 07H ;设定时钟参数1:256 分频 OPTION MOVL
[单片机]
51单片机(AT89C52)外部中断程序
#include reg52.h #define uchar unsigned char #define uint unsigned int #define DELAY 1000 void delay(uint z) //1ms { uint x,y; for(x=z;x 0;x--) for(y=111;y 0;y--); } void main() { uchar i,dt; EA=1; //开总中断 EX1=1; //开外部中断1 // IT1=0; //设置外部中断1为低电平触发 IT1=1; //设置外部中断1为下降沿触发 while(1)
[单片机]
51<font color='red'>单片机</font>(AT89C52)外部中断程序
单片机按键检测笔记
单片机检测按键原理: 单片机的的IO口既可以作为输入使用也可作为输出使用,当检测按键时用的是它的输入功能,我们把按键一端接地,另一端与单片机的某个IO口相连,开始时先给该IO口赋一个高电平,然后让单片机不断检测该IO口是否变化为低电平,当按键闭合时,即相当于该IO口通过按键与地相连,变成低电平,程序一旦检测到IO口变为低电平则说明按键被按下,然后执行相应的命令。 独立按键: 直接检测电平高低变化即可,存在抖动现象,一般需要delay()延时确认按键按下,确认按键被按下后,还应该有while(!key)来等待按键释放,若按键没有释放,则key键始终为低电平,程序就一直停在此刻,直到按键释放才去执行接下来相应的代码。 矩阵键
[单片机]
<font color='red'>单片机</font>按键检测笔记
BCD码借用十六进制形式表示引出的单片机存储数据
BCD码借用十六进制形式表示引出的单片机存储数据,数据数制,数据类型,数据编码分析 单片机存储数据都是二进制存储的。 数据数制:二进制、十进制、十六进制等。 数据类型:字符类型(一个字节)、整型(两个字节)、浮点类型(四个字节)。有无符号。 数据编码:8421码,ASCII码,LED等显示字形编码。 BCD码借用十六进制形式表示,只是意义不同24H写到寄存器里面也是24H,读出的也是24H,只不过代表的是十进制的24,而不是十进制的36.书写形式和十六进制一样,但是代表的十进制数就不一样了 对类似DS1302中寄存器的操作,虽然存放的数据是以BCD编码的意义,但是对这类寄存器的读写操作也是以二进制或者以十六
[单片机]
瑞萨科技采用Synopsys VCS解决方案和VMM方法论
Synopsys的SystemVerilog解决方案被用于验证针对网络、外设和消费应用的下一代片上互连架构 全球电子设计自动化软件工具(EDA)领导厂商Synopsys(Nasdaq: SNPS)近日宣布,全球领先的移动、汽车和PC/音频视频半导体系统解决方案供应商—瑞萨科技采用其VCS的功能验证解决方案,开发复杂的芯片上系统(SoC),并选定了VMM方法集,即《Verification Methodology Manual (VMM) for SystemVerilog》,用于创建先进的SoC验证环境。瑞萨科技采用VCS解决方案和VMM方法论验证了其重要的SuperHyway总线片上互连架构。 瑞萨科技系统级设计与验证技术部
[焦点新闻]
单片机的汇编指令
学习了指令系统后就可以编写一些简单的汇编程序。 一、汇编程序功能 汇编语言编写的程序不能直接被机器执行,需要翻译成机器码组成的目标程序,这个过程就是汇编。目标文件虽然已经是二进制文件,但它还不能直接运行,需要通过连接程序把目标文件和其他目标文件连接在一起形成可执行文件。这个文件才能在机器上运行。因此,要在计算机上运行汇编语言程序的步骤是: (1) 用编辑程序建立源文件ASM; (2) 用汇编程序把ASM文件转换成OBJ文件; (3) 用连接程序LINK把OBJ文件转换成EXE文件; (4) 执行该程序。 二、汇编语言源程序的格式 汇编语言源程序有一定的书写格式。一般由左到右按序至少包括下列四项内容: 操作 操作数 名
[单片机]
手把手教学51单片机 | 第五课 独立键盘 矩阵键盘
编码键盘 电脑的键盘 非编码键盘 (1)硬件消抖 (2)软件消抖 独立键盘 线与的关系 先给IO口高电平 用一个if检测IO口高低电平,若按键按下IO口为0(1&0=0)没按下则继续保持高电平 按键在闭合和断开开始 触电会存在抖动的现象 2.矩阵键盘 #include reg52.h #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit key1=P3^4; uchar code table ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7
[单片机]
手把手教学51<font color='red'>单片机</font> | 第五课 独立键盘 矩阵键盘
如何采用STM32单片机实现SPI的驱动
前言:每学一个新知识,都会出现很多出错的情况,百度也查不出来,耗费很多时间,主要是不理解底层原理,没太多时间去理解,催得紧。SPI嘛,是人都知道干嘛用的,我一时半会也不知道怎么表达,百度最不缺的就是定义。缺的是实现过程,本少爷花了几十个积分搞了n多个实例,终于总结了要成功实现SPI要哪些奇葩的步骤。 正文: ---------------------------------------------配置SPI1的时钟------------------------------------ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); //SPI1初始化 //RCC_APB
[单片机]
如何采用STM32<font color='red'>单片机</font>实现SPI的驱动
小广播
最新应用文章
换一换 更多 相关热搜器件

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