一:相关基本配置:

FPGA:  XILINX XC5VFX130T-1FFG1738

PCI接口部分使用XILINX提供的pci32_v4_8硬核;PCI控制器由FPGA逻辑实现,主要完成PCI设备到内存的DMA读写操作。Ps:此控制器网表文件可付费购买(100元/份,支付宝账号:bubble_fish@yeah.net)

处理器:BM3803FMGRH

操作系统:Reworks/Vxworks

二:调试中遇到的问题

1、 IDSEL引脚无信号输入

每个PCI设备都有一个IDSEL的输入信号,这个信号在读写PCI配置寄存器的时候非常有用。但往往很多时候PCI主设备在给从设备写配置寄存器的时候并不会提供一个IDSEL的输出信号。对于非X86架构的处理器,读写PCI配置寄存器不能通过访问config_address(地址0CF8h) config_data(地址0CFCh)的方式。此时需要从AD线上引一根地址线到IDSEL引脚上。例如BM3803上最多允许挂7个PCI从设备,若某个PCI从设备插在1号槽上,则REQ_N接到pci_arb_req[0],IDSEL接到AD[31],此时配置寄存器的起始地址即为0x8000_0000;IDSEL引脚与AD[31]必须在硬件上连好,不能通过FPGA内部逻辑实现连接。依次推演,当插在2号槽时,REQ_N接到pci_arb_req[1],IDSEL接到AD[30],此时配置寄存器的起始地址即为0x4000_0000.

2、 PCI从设备接口上的双向端口要上拉,未使用到的输出引脚要记得赋值

例如"SERR_N"、"PERR_N"、"STOP_N"、"DEVSEL_N"、"TRDY_N"、"IRDY_N"、"FRAME_N"  "INTA_N"都上拉。未使用到的pci_arb_req和pci_int要赋相应值。

3、 PCI地址映射问题

地址映射一直是纯硬件工程师或纯软件工程师理解PCI设备最大的障碍。这是一个软硬件相互配合的过程。先从硬件说起,每个PCI设备都有一个配置空间(CONFIG_BAR), 在PCI总线上只有这个配置空间是可见的。配置空间如下图:

若FPGA作为PCI从设备,那么在用coregen生成pci32_v4_8硬核时需要输入Device ID、Vendor ID、BAR0空间的大小。当FPGA挂在BM3803的PCI总线一号槽上时,BM3803可以通过读写0x8000_0000+offset来访问到FPGA的配置空间。三个必须的的配置操作是:DMA_CONFIG_WRITE(0x80000004,0xff00_0147, 0x04)//往0x80000004写入4字节数0xff00_0147。DMA_CONFIG_WRITE(0x80000010,0xD0000000, 0x04)//往0x80000010写入4字节数0xD0000000。DMA_CONFIG_WRITE(0x8000001C,0x40000000, 0x04)//往0x8000001C写入4字节数0x40000000。设置完毕,如果此时BM3803想要读写FPGA的BAR0空间,只需要往0xD000000+offset写数就可以了,具体这个offset有多大由FPGA生成IP核时设置的BAR0空间的大小决定。例如DMA_MEM_WRITE(0xD0001000,0x40000000, 0x04)// 往0xD0001000写入4字节数0x40000000。此时BM3803就会在总线上发起地址为0xD0001000的Memory Write操作,作为从设备的FPGA PCI因为上一步配置过BAR0的基地址为0xD0000000,所以能HIT到这个操作,若发起地址为0xA0001000的Memory Write操作,FPGA是HIT不到的,这个操作一般用来实现主设备通过PCI总线来读写FPGA的寄存器。若FPGA想要通过DMA的方式来写内存,此时FPGA逻辑实现的控制器需要发起一个地址为0x40000000的Memory Write操作,若地址为0x50000000,BM3803是不会响应的,因为BM3803芯片手册设置了BAR3-BAR5为主设备接收数据的内存基地址,上一步我们已经配置了BAR3的基地址为0x40000000。

基于BM3803处理器平台的PCI软硬件调试问题汇总(持续更新中)的更多相关文章

  1. CNUTCon2017全球运维技术大会(持续更新中) - 斯达克学院 - 实战驱动的 IT 教育平台 - Powered By EduSoho

    CNUTCon2017全球运维技术大会(持续更新中) - 斯达克学院 - 实战驱动的 IT 教育平台 - Powered By EduSoho   https://new.stuq.org/cours ...

  2. 读书笔记|Windows 调试原理学习|持续更新

    关于调试方面的学习笔记,主要来源于<软件调试>的读书笔记和梦织未来论坛的视频教程 1.调试器使用一个死循环监听调试信息. DebugActiveProcess(PID);while(TRU ...

  3. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】

    最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...

  4. iOS开发调试技巧总结(持续更新中)

    作者:乞力马扎罗的雪  原文 对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不 ...

  5. (持续更新中~~~)kafka--消息引擎与分布式流处理平台

    kafka概述 kafka是一个分布式的基于发布/订阅模式的消息队列(message queue),一般更愿意称kafka是一款开源的消息引擎系统,只不过消息队列会耳熟一些.kafka主要应用于大数据 ...

  6. [C#]asp.net开发微信公众平台----目录汇总-持续更新

    1.[c#]asp.net微信公众平台开发(1)数据库设计 2.[c#]asp.net微信公众平台开发(2)多层架构框架搭建和入口实现 3.[c#]asp.net微信公众平台开发(3)微信消息封装及反 ...

  7. tensorflow安装调试总结(持续更新)

    这段时间需要部署tensorflow到linux上,由于堡垒机不能连外网,所以pip.apt-get.wget.git统统不能用,然后就是各种调试了,下面整理了一些遇到的问题和解决方案,供大家参考(C ...

  8. 【转】基于Jenkins实现持续集成【持续更新中】

    知识预览 持续集成 Jenkins安装 Jenkins插件 Jenkins配置 Jenkins备份与恢复 发布PHP项目 SVN 发布Maven项目 按版本发布 远程管理 War文件部署设置 任务 J ...

  9. 基于Jenkins实现持续集成【持续更新中】

    持续集成 1.什么是持续集成:Continuous integration (CI)持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生 ...

随机推荐

  1. String 类型

    一.不可变 一个 String 类型的值是不可以改变的,比如,String china = "中国",“中国”这个字符串从它创建开始直到销毁都是不可改变的. 二.字符串常量池 字面 ...

  2. apache ftp server的简单入门(properties验证)

    Apache FTPServer:(开源) Apache FTPServer是一个100%纯Java的FTP服务器. 它的设计是基于现有的开放式协议的完整和便携式FTP服务器引擎解决方案.FTPSer ...

  3. pageHelper插件

    mybatis的分页插件使用总结 环境准备工作:    1.在使用pagehelper插件时,我已经搭建好了ssm(spring+springmvc+mybatis) 在这简单描述一下ssm搭建过程 ...

  4. 使用docker安装使用gitlab

    1.下载镜像 gitlab/gitlab-ce:latest            当前gitlab最新版本为10.0.4 2.在服务器上创建目录 mkdir -p /home/work/ins/co ...

  5. SQL Server 索引知识-应用,维护

    创建聚集索引 a索引键最好唯一(如果不唯一会隐形建立uniquier列(4字节)确保唯一,也就是这列都会复制到所有非聚集索引中) b聚集索引列所占空间应尽量小(否则也会使非聚集索引的空间变大) c聚集 ...

  6. 从Azure上构建Linux应用程序映像

    下图描述了总体的虚拟机的VHD映像生成以及发布到 Azure Azure 镜像市场的全过程: 具体步骤如下: 从Azure管理平台上Linux申请虚拟机, 安装和配置您要发布的应用软件产品,制作成映像 ...

  7. Flask配置文件和 路由系统

    debug = True开启debug模式 当你的代码在界面增减之后不用刷新界面自动更新 app.logger.error("这是error模式") app.logger.info ...

  8. 可以简易设置文字内边距的EdgeInsetsLabel

    可以简易设置文字内边距的EdgeInsetsLabel 最终效果: 源码: EdgeInsetsLabel.h 与 EdgeInsetsLabel.m // // EdgeInsetsLabel.h ...

  9. 导出Excel 2007 (NPOI)

    今天在导出Excel2007时报了个错,问是否修复,点yes就提示修复正常了,但具体什么原因没说,如图 之前简单的导出代码是这样写的 public static void ExportToWeb(st ...

  10. Tomcat 配置学习

    1 server.xml <host appBase="d:/aaa"> <Context path="/smswap" reloadable ...