打印

工控机箱中CPCI接口通讯协议的FPGA实现办法

[复制链接]
3273|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dameihuaxia|  楼主 | 2020-11-26 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


0引言
目前的仪器或者工控系统多数使用集成式工控机箱,机箱背板一般通过 CPCI(Compact PCI)接口连接所有的插卡,包括工控电脑和各种采集卡、控制卡等。设计板卡时需要考虑CPCI 接口实现及通信机制,现有板卡多使用专用接口芯片,例如 PCI9054 芯片,这类芯片可扩展性不强,需要外扩 FPGA 芯片,使用不灵活;且直接使用FPGA 的 IP 核实现 CPCI协议占用资源多,开发成本较高,在有某些特殊需求时不便扩展。

本文提出了一种基于 FPGA的 CPCI 系统的设计和实现,使用廉价 FPGA 芯片实现 CPCI 通信协议,同时利用 FPGA 的可编程特性实现电源控制、灵活中断、外部触发、外部通信等特殊应用的功能,解决了 CPCI 协议经过 CPCI 桥时的冲突问题。

1 系统设计
1.1 系统框图
如图 1 所示,本系统主要包含嵌入式板卡和 CPCI 工控机箱,板卡插入到 CPCI 机箱背板插槽。嵌入式板卡内的 FPGA 与 CPCI 插槽间使用 CPCI 总线和用户 IO 连接,FPGA 与 ARM 之间通过特定 IO 实现的总线连接,同时 FPGA 上连接一个三极管驱动的继电器[1]。

1.2 系统功能
FPGA 和背板接口为 CPCI 接口,通过 CPCI 协议通信;ARM 使用自定义总线协议将数据写入到 FPGA 的 RAM 缓存,然后使用 CPCI 接口发送给主控机,反之亦然。FPGA 能识别 CPCI 的信号给 ARM 产生中断,也能够识别 ARM 的信号给 CPCI 产生有效中断,还可以通过继电器控制板卡上电、下电、复位,能通过 IO 控制实现 ARM 的 ISP(在线升级,仅需控制一个 ARM 管脚)功能并产生背板触发信号。

下文从 FPGA 设计、ARM 设计和通信机制三方面进行说明。

2 FPGA 设计
如图 2 所示,FPGA 内部主要包括 CPCI 协议、IO_MEM、ARM 解码、读中断产生、CPCI 中断产生、电源控制等模块[2-3]。FPGA 芯片根据使用资源和成本选择 Xilinx 公司的 XC2S100,最后使用 387 个 Slice 寄存器(占比 16%)、882 个 LUTs(占比 36%)。

2.1 CPCI 协议模块
2.1.1 协议
CPCI 协议兼容 PCI2.2 协议,扩展了部分用户接口,所以模块按照标准 PCI2.2 协议完成,实现配置空间管理、IO 读写、Memory 单字读写、Memory 突发读写、仲裁和中断等功能。协议细节参看文献[4]、[5]。

2.1.2 FPGA 仿真
对 ISE 布线后的文件用 ModelSimXE 进行时序后仿真,下面给出通过 CPCI 总线进行 Memory 突发读写的仿真,因 IO 读写和 Memory 单字读写时序与 Memory 突发读写类似,在此不再赘述[6-8]。

图 3 上半部分是 Memory 突发写的时序过程,在地址 0xd000 处连续写入 10 个依次递增的 32 bit 数据,起始数据为 0x15896345。下半部分是写完之后的 Memory 突发读时序,可见从 0xd000 读出的连续若干 32 bit 数据,与写入完全一致。

此 CPCI 板卡在插入实际机箱槽位时出现这样的问题:某些厂家的机箱特定槽位插入会死机。该问题使用市面上的成品 CPCI 板卡也会遇到,经过分析,修改了 CPCI 板卡协议里的一个关于 CPCI 桥的接口,死机情况不再发生。

2.2 IO_MEM 模块
本模块由 3 个双口 RAM 组成,在 CPCI 系统中命名为 BA0、BAR1、BAR2,BAR0 和 BAR2 是 16 B 的 IO 空间,仅支持单个字读取,BAR1 为 2 048 B 的 MEM 空间,支持单字读写和突发读写。其中 BAR1 仅支持 1 B 的空间访问,只用来进行电源控制和 ISP,不可通过其他外设访问。

2.3 ARM 解码模块
本模块实现 FPGA 与 ARM 之间 IO 和 Memory 接口时序,因两者时序基本相同,以 Memory 时序为例说明,定义如图 4 和图 5 所示。硬件接口由时钟、使能、RAM 选择、读写选择、地址数据总线(8 根)组成。特别需要注意的是,时钟线必须连接到 FPGA 的全局时钟管脚上。

Memory 读 / 写时序必须保证在地址 A 有效之后的第 2 个时钟周期开始接收 / 输入数据,32 bit 数据由 4 B 组成,按低位字节到高位字节的顺序输出 / 输入,数据组合 / 拆分由 ARM 完成。接收 / 写入不同地址段的数据必须先使 en_arm 无效,然后再使能。

2.4 ARM 读中断
当 FPGA 内部的 BAR0 写有效时使能 int_arm,该信号会触发 ARM 的外部 IO 中断。通过 CPCI 接口往 BAR0 写入任何数据均可产生一个脉冲触发信号,可以使用此信号去中断 ARM。

2.5 CPCI 中断
ARM 需要给 CPCI 产生中断,机制如下:

(1)ARM 给 IO0 空间偏移地址 2 写入 0x01,在 INTA#上出现低电平触发信号;

(2)主控机检测到此电平触发中断,马上禁止中断,往 IO1 空间偏移地址 0 写入 0xfb,之后 INTA#被拉高,此时 ARM 无法通过步骤(1)再次发送中断,也就是说,INTA#无法被 ARM 拉低;

(3)主控机处理完临界代码之后,往 IO1 空间偏移地址 0 写入 0xfa,允许 ARM 产生中断,也即,ARM 可以通过步骤(1)再次产生中断。

2.6 外围控制
电源控制和触发信号都是通过 ARM 或者主控机给 CPCI 的特定空间写入预定信息,检测信息之后做出相应的处理[6]。

(1)主控机向 BAR2 空间的 0 偏移写入 0xff、0xfe、0xfd、0xfc 实现上电、掉电、复位、ISP 功能;

(2)主控机往 BAR2 空间的 0 偏移写入一个小于 128 的数,此数值是给背板产生的触发脉冲个数;

(3)ARM 往 BAR0 空间的 1 偏移写入一个小于 256 的数,此数值是给背板产生的触发脉冲个数,ARM 能产生的触发脉冲比主控机多一倍。

3 ARM 设计
在本系统中,ARM 和 FPGA 的总线连接使用 IO 口模拟实现。按照前面描述的时序,ARM 中接口相关功能有:

(1)响应中断信号,读取、执行 IO 命令;

(2)读取 IO 数据;

(3)读写 Memory 数据。

因接口时序的 ARM 代码实现较简单,在此不再赘述,具体的实现机制可参看后续的通信机制设计。

4 通信机制设计
从 CPCI 的角度看,ARM 和主控机为主设备,FPGA 为从设备。对于 FPGA 来说,CPCI 接口和 ARM 接口完全独立,但是两者都可以对 RAM 进行读写,如果没有一个协调机制,很可能发生读写冲突,必须有一个规则来协调数据的传送[9-10]。因为 CPCI 为标准接口,所以需要定义的是 FPGA 和 ARM 的接口和主控机驱动读写规则,下面介绍 FPGA 和 ARM 的接口和主控机读写规则。

主控机与 ARM 需要交互的数据全部放在 FPGA 的 RAM 中进行缓冲。实现规则如下:

(1)IO 空间只分配 1 B,存放主控机发送的命令;

(2)Memory 中读写空间分开,偏移 0~999 为主控机写、ARM 读数据空间,1 000~2 048 为主控机读、ARM 写数据空间。

图 6 描述了 ARM、CPCI 和主控机的数据流向和读写流程。为避免系统读写冲突,需按照如下规则执行操作:

(1)ARM 读写 CPCI 的 Memory 空间之前,使 write_acc 或 read_acc 无效,读写完毕使之有效。

(2)主控机读 Memory 时首先读 read_acc,如果有效,开始读所需内存,否则等待一段时间重试;写 Memory 时首先读 write_acc,如果有效,开始往指定内存写数据,否则等待一段时间重试;主控机对 IO 的写不需要读 write_acc。

(3)主控机写 Memory 一般过程为:先根据所需命令确定需要将数据写入哪些空间,然后将配置数据写入 Memory 中,最后把控制命令写入 IO 空间;读 Memory 则直接读取数据。

本方案用于数据采集卡、数字基带模拟卡、本振信号发生卡、中频变频接收卡等多种功能应用,兼容研华、凌华等几大厂家的工控机箱。

5 结束语
本文给出了一种基于 FPGA 的 CPCI 系统设计方案,介绍了实施基本框架、CPCI 协议、自定义总线通信协议和通信冲突避免机制,按照设计方案实现了低成本、高密度、易扩展的 CPCI 通信系统,在工程上便于实现,能广泛应用于工控和测量领域,对类似设计提供了参考。

使用特权

评论回复

相关帖子

沙发
雷北城| | 2020-11-26 15:20 | 只看该作者
谢谢分享,学习了!

使用特权

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

本版积分规则

298

主题

298

帖子

1

粉丝