一:相关基本配置:

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. 【Python】Java程序员学习Python(二)— 开发环境搭建

    巧妇难为无米之炊,我最爱的还是鸡蛋羹,因为我和鸡蛋羹有段不能说的秘密. 不管学啥,都要有环境,对于程序员来说搭建个开发环境应该不是什么难题.按顺序一步步来就可以,我也只是记录我的安装过程,你也可以滴. ...

  2. LeetCode题解之Find the Difference

    1.题目描述 2.题目分析 比较两个字符串中加入的一个字符,由于可能在字符串中加入一个已经存在的字符,因此使用hash table 去统计字符个数最好. 3.代码 char findTheDiffer ...

  3. 使用 PowerShell 创建和修改 ExpressRoute 线路

    开始之前 安装最新版本的 Azure Resource Manager PowerShell cmdlet. 有关详细信息,请参阅 Azure PowerShell 概述. 在开始配置之前,请查看先决 ...

  4. [VS2008] [.NET 3.5] 如何解决 The imported project "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.CSharp.targets" was not found

    重新安装或者修复 NETCFv35PowerToys https://download.microsoft.com/download/f/a/c/fac1342d-044d-4d88-ae97-d27 ...

  5. java:通过Calendar类正确计算两日期之间的间隔

    在开发Android应用时偶然需要用到一个提示用户已用天数的功能,从实现上来看无非就是持久化存入用户第一次使用应用的时间firstTime(通过SharedPreferences .xml.sqlit ...

  6. 配置nginx官网yum源

    由于yum源中没有我们想要的nginx,那么我们就需要创建一个“/etc/yum.repos.d/nginx.repo”的文件,其实就是新增一个yum源 二.添加nginx.repo 文件: [roo ...

  7. session过期,拦截ajax请求并跳转登录页面

    1.方法一 :1.1使用filter 和ajaxsetup 对ajax进行拦截并跳转登录页面 public void doFilter(ServletRequest request, ServletR ...

  8. ubuntu修改用户环境变量解决音乐播放器Rhythmbox乱码问题

    先打开主文件夹 cd /home/user #user是你的用户名 然后编辑用户环境 sudo gedit .profile在打开的文件中添加: export GST_ID3_TAG_ENCODING ...

  9. mysql大数据量使用limit分页,随着页码的增大,查询效率越低下

    1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from product limit start, count当起始页较小时,查询没有性能问题 ...

  10. libextobjc 实现的 defer

    算法沉思录:分而治之(复用): 分而治之是指把大而复杂的问题分解成若干个简单的小问题,然后逐个解决.这种朴素的思想来源于人们生活与工作的经验,也完全适合于技术领域. 要崩溃的节奏: 要崩溃的节奏: V ...