0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA与嵌入式CPU的Local Bus接口调试

FPGA技术江湖 来源: 网络交换FPGA 2023-01-10 10:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Local Bus总线又称为CPU总线,根据高低位地址线序的差异,又可分为Motorola CPU总线和Intel CPU总线。 古老的CS51单片机就是Intel CPU总线的典型代表,而我们常用的Power PC就是Motorola CPU总线架构,它是从60X总线衍变过来的(60X总线支持64、32、16、8四种可选位宽模式)。 本文以一款Power PC CPU通过Local Bus读写FPGA内部寄存器或RAM以及中断响应为例,为大家介绍开发过程中的注意事项。

poYBAGO8zNaAbnbsAADkeFLZl9s707.gif

记得在HINOC1.0的时候,FPGA样机上采用Intel XScale PXA270(ARM CPU)芯片与FPGA芯片互连,采用的接口时序就是Local Bus总线的时序,该时序与CPU与外挂异步SRAM接口时序一样,这样HINOC芯片就可以看做是ARM CPU的一个外设,可以分配可配置的寄存器或RAM等访问空间。 具体时序图如下图所示,总线包括地址、片选、读/写信号,下图是简单的读时序。 注意,所谓异步,就是CPU接口总线与FPGA相应接口是不同步的,也就是CPU送给FPGA的信号中不包括时钟信号,FPGA需要通过自己内部的时钟信号去采CPU接口的地址、数据等信号,同步后才能使用。 如下图中的CPU读FPGA时序,CPU给出度地址和读控制信号后,等待tAA时间后才能从数据总线上取到正确的有效的数据,这个tAA时间长短是可以通过设置PXA270中的寄存器来进行调整的。

poYBAGO8zNaAEheRAAAr_JCsXvU519.png

poYBAGO8zNaAM3HIAAAjiUa61q4662.png

印象比较深刻的是,上面时序图在FPGA侧观察时,就能感受到CPU的效率是如何之慢了,CPU完成一次读写FPGA内部寄存器的操作,对应的FPGA常常已经过了几十个时钟周期,所以效率较低,好在一些改进的SoC总线如AXI等还有Burst等类似于DMA之类的连续读写操作模式。

poYBAGO8zNaANYYsAABLMqfBhGo829.png

在搭建仿真环境时,上图中的CPU行为就可以简化为简单的读、写两个task(如下图)。 在FPGA侧的电路设计代码,则把CPU送过来的信号采用打两拍等方式同步后进行地址译码等再交给后续的模块使用。

pYYBAGO8zNaAML3TAAIUdPkXU0M597.jpg

目前,这种总线使用的已经比较少了。 但在很多专用领域,如航空航天等领域,一些国产的CPU等仍然使用类似的总线时序。 简单、可靠,稳定。

调试环境介绍

硬件开发板:AX7103; CPU开发板:p2020; 驱动操作系统Vxworks

vxworks操作系统下CPU和FPGA的硬件连接关系如下图1所示,采用Local Bus总线接口。

poYBAGO8zNaANGIIAAAlNtGHnJ4280.png

图1 CPU和FPGA的硬件连接

硬件侧没有开发板与p2020 Local Bus的50pins直接相对接,而驱动侧需要开发、测试Local Bus驱动,因此需要创造调试环境,利用AX7103开发板的68个引脚,将Local Bus总线相关的关键引脚(37pins=16pins_addr+16pins_data+3pins_csn+1pin_oen+1pin_ wen)以及中断信号定义到EX_IO1和EX_IO2上,再根据p2020原理图与接插件J5、J4相匹配,调试环境如下图2所示(略丑,只做原型功能验证)。 图示J5为p2020接插件(Local Bus总线相关信号); J4为p2020接插件(硬线中断、GND信号); EX_IO1为Local Bus总线地址、片选和读写使能管脚; EX_IO2为数据、中断管脚。

注意:两块开发板的电平标准要一致,否则不能通过杜邦线直连,另外建议两块开发板杜邦线共地相连。

pYYBAGO8zNaAEeSwAAGvCnPsAdg695.jpg

图2 硬件板和CPU板实际调试环境

概述

前面介绍过FPGA与CPU进行数据交互时使用的接口是PCIe接口等接口,在TSN或TTE系统里,PCIe接口常常用在端节点上,Local Bus接口常用于交换机内CPU与FPGA进行数据交互的接口。 本文只讲述Local Bus调试历程。 对于硬件侧来说,Local Bus相比于PCI、PCIe开发简单些,只需要完成CPU内存地址与硬件寄存器、RAM地址的映射,读/写使能信号和片选信号的时序,此次Local Bus开发是硬件侧建立一个Local Bus测试工程配合Local Bus驱动调试寄存器读写功能以及中断功能。

2.1.数据读写操作

关于寄存器读写功能。 Local Bus的简介网上有参考价值的就是这个链接:https://wenku.baidu.com/view/aeca83593b3567ec102d8a80.html?from=search, 因为局部总线简单,也没有什么可介绍的,理论部分就见链接,我这里就附上关键信号的读写时序图,如下图3,图4所示。 同样的Local Bus接口在不同的CPU处理器地址和数据位宽不一致,信号也会有一些不一致,比如:BM3803处理器中地址数据线未复用,数据位宽32bit(双字操作); p2020处理器中数据线LAD复用(通过LALE信号锁存高11bit的地址,如果只用16bit的地址时可以不接LALE),数据位宽16bit(双字节操作)。

poYBAGO8zNaAGGh0AAAzBRAn-Sk201.png

pYYBAGO8zNaAZ4kEAAAyiPQNzeE407.png

pYYBAGO8zNaAH4nLAAAxpV32pPw745.png

2.2.中断功能

中断的话采用传统的硬线中断,p2020原理图可知,除了irq3已经被占用,另外6个硬线中断(irq0/1/2/4/5/6)可供外设使用,且均在J4接插件位置处。 由p2020的Datasheet可以知道p2020内部中断有64类,外部中断有12类,而我们调试使用的是外部中断中的irq1。

调试历程

3.1.数据读写操作

调试伊始,通过p2020的原理图可以看出CS0和CS1分别给了内部的nand_flash以及nor_flash使用,另外输出3位的片选信号(CS2,CS3和CS4),说明最多可以挂8片局部总线外设,,这些外设(含*_flash)共用数据线、地址线以及读写使能。 第一步就得先知道驱动使用了哪个片选信号,驱动也是摸索,驱动代码写着只使用了CS4,屏蔽了原来例程中的CS2,通过硬件侧抓cpu_csn[2:0]发现,cpu_csn[0]也会存在低片选状态,后经驱动修改,先保留使用CS2,这样驱动每次读写操作时都能触发“cpu_csn[2:0]==3’b110”。 CPU板将对地址区间0xf1000_0000~0xf1000_ffff(128KB)进行读写操作时会拉低CS2,映射到硬件侧就是对寄存器/RAM的读写了。

测试写功能,在CPU启动后,驱动会給内存地址0xf100_0118处写16‘h5555,如下图5所示,先给出写地址,然后拉低片选信号,几乎同时拉低了写使能信号,这样数据就从CPU写入到FPGA了。

pYYBAGO8zNaAcflKAAB3zA4twPw038.jpg

图5 板级写操作

与写操作的简单相比,问题都出在了读操作,我们也同样地将AX7103和p2020的读使能线接好(地址、数据和片选信号先接好了),发现此时CPU不能启动了,但是将此信号接到未使用的EX_IO上时CPU可以正常启动,说明读使能信号干扰了CPU的启动,可是,cpu_oen和cpu_wen属性是一样的,input到FPGA内部, 不存在输出到CPU导致不能启动,,,查看p2020的datasheet发现p2020上的LGPL2信号有两重定义:

1、Local Bus的读使能cpu_oen;

2、配合LBCTL、LALE信号配置e500核pll时钟占空比。

怀疑是系统启动后短时间内FPGA侧的cpu_oen电平影响到CPU侧的LGPL2,为此,我们将读使能改为inout信号,在CPU启动后的10s内为高阻态,起着隔离作用,而10s后p2020的bootrom也加载差不多可以bootup了,然而实际测试下来的结果是CPU依旧不能正常启动。

我们把所有的杜邦线完全拔掉,只保留读使能线的连接,发现CPU可以正常启动,此时说明FPGA侧的读使能电平并没有影响到CPU侧的启动,为了具体定位到哪一个信号,我们再次基础上,把线一点一点接上去,最后接完了读使能线、写使能线,片选线以及地址线后,CPU板可以正常bootup而且FPGA能抓到正常的读写(只是看不到读写数据)时序, 插上了数据线后发现CPU就不能启动了,至此,总算定位到问题出在哪了,为此,FPGA侧第一次修改,做简单的延迟处理,数据线一直处于20s的高阻态(此时CPU可以进行Local Bus写操作),等到bootup后,才使能数据的读出,这样处理其实很笨拙,但是确实能解决CPU不能正常启动的问题,可治标不治本/允悲/,毕竟刻意的延迟不靠谱。

/**第一次修改/

//rst_done只有20s后才为1,在此之前cpu_data处于高阻

分配cpu_data =((cpu_oen==1'b0)&&(rst_done==1'b1)) ?cpu_rdata : 16'bz;

分配cpu_wdata = cpu_data ;

/*******************************/

灵感一现。。。 FPGA侧在“assign cpu_data =(cpu_oen==1'b0) ? cpu_rdata : 16'bz; ”只是多加了一条约束条件“(rst_done==1'b1)”就能让CPU启动,说明在CPU启动之初,cpu_oen满足低使能导致cpu_data有输出干扰到CPU侧的数据线,,,本文之初提及p2020内部还有nand_flash和nor_flash,在p2020启动的时候要从这些flash里读写数据,也拉低了cpu_oen ,此时Local Bus读出的是默认值16’h0,而本应该从*_flash里读出一些有用的值被16’h0覆盖。 为了验证这种猜想,我将数据信号的代码做第二次修改。

/**第二次修改/

//CPU只有片选CS_4了localbus后FPGA才会将cpu_rdata输出,否则高阻.

assign cpu_data =((cpu_oen==1'b0)&&(cpu_csn[2]==1'b0)) ?cpu_rdata : 16'bz;

分配cpu_wdata = cpu_data ;

/*******************************/

这样修改后CPU正常启动,因为p2020启动之初,会读*_flash,虽然拉低了cpu_oen,但是选通并非CS2,故此时FPGA的cpu_data保持高阻,直到片选成功且读使能低有效才将读数据输出。 最终调试正确的板级读操作时序如下图6所示。

pYYBAGO8zNaAEeA8AACelsmtoUg765.jpg

图6 板级读操作

3.2.硬中断

p2020处理器的中断分为外部中断和内部中断,我们使用的是外部中断1。 在Vxworks下,处理器外部中断向量从0开始编号,故分配给外部中断1的中断向量为1。 首先,在BSP中将中断向量与设备绑定,并注册到hcfDevice设备列表中; 然后,在驱动中初始化并使能中断,即可收到来自外部中断1引脚的中断信号。

需要注意的是,下图7是p2020datasheet关于中断irq的描述:为高时置中断,为低时不产生中断,然而实际板级测试发现,irq为低时有效,产生硬线中断。

pYYBAGO8zNaAM9yFAAFqXSf3wL0242.jpg

图7 p2020中断irq描述

当驱动收到中断后,需要对硬线中断进行复位,参考PCIe总线中INTa中断操作(干货! 实测VxWorks响应PCIe中断的最小时间间隔),我们定义0x110寄存器为中断寄存器,驱动往0x110第[15]位写1再写0时硬件将硬线中断信号重新拉回高电平复位状态,中断时序如下图8所示。

pYYBAGO8zNaAXe_5AAC8FBgab20575.jpg


图8 中断时序

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1655

    文章

    22286

    浏览量

    630297
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11216

    浏览量

    222949
  • 接口
    +关注

    关注

    33

    文章

    9444

    浏览量

    156143
  • 总线
    +关注

    关注

    10

    文章

    3014

    浏览量

    91307
  • locale
    +关注

    关注

    0

    文章

    11

    浏览量

    1363

原文标题:FPGA与嵌入式CPU的Local Bus接口调试

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式CPU指令Cache的设计与实现

    针对嵌入式CPU 指令处理速度与存储器指令存取速度不匹配问题,本文基于FPGA 设计并实现了可以有效解决这一问题的指令Cache。根据嵌入式五级流水线
    发表于 08-05 14:27 36次下载

    FPGA嵌入式系统USB接口设计

    FPGA嵌入式系统USB接口设计 摘要:设计基于FPGA的IP-BX电话应用系统,用于传统的电话网络(PSTN)与PC机之间的接口连接。
    发表于 04-03 10:52 2167次阅读
    <b class='flag-5'>FPGA</b>的<b class='flag-5'>嵌入式</b>系统USB<b class='flag-5'>接口</b>设计

    嵌入式系统的远程调试

      1 基本方法   图1(a)是传统的嵌入式调试方法:主机PC通过串口与从机嵌入式系统相连,接收从嵌入式系统发来的调试信息并向
    发表于 08-30 10:23 1250次阅读
    <b class='flag-5'>嵌入式</b>系统的远程<b class='flag-5'>调试</b>

    嵌入式CPU软核综述

    随着FPGA 和SoPC(System on Programmable Chip)技术的迅速发展,基于 FPGA嵌入式系统得到了广泛的研究和应用。该文针对目前比较有影响和特点的4 款嵌入式
    发表于 06-07 18:35 53次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>CPU</b>软核综述

    基于FPGA嵌入式CPU的VHDL建模和设计

    目前,基于FPGA嵌入式CPU核的设计已成为SOC设计的重要部分.提出一种嵌入式CPU核的VHDI 行为建模方法,与传统的基于电路结构建
    发表于 06-27 16:00 75次下载
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>嵌入式</b><b class='flag-5'>CPU</b>的VHDL建模和设计

    一种带Cache的嵌入式CPU的设计与实现

    基于FPGA平台实现了嵌入式RISC CPU的设计。根据项目要求,实现指令集为MIPS CPU指令集的一个子集,分析指令处理过程,构建了嵌入式
    发表于 09-26 14:24 1529次阅读
    一种带Cache的<b class='flag-5'>嵌入式</b><b class='flag-5'>CPU</b>的设计与实现

    嵌入式Linux下CAN接口调试

    CAN(Controller Area Network)总线是嵌入式设备最为常用的接口之一,常用于汽车以及工业自动化等嵌入式领域,因此本文就基于嵌入式Linux演示使用CAN总线进行通
    发表于 04-29 16:40 3572次阅读

    使用ARM核设计实现嵌入式CPU的AHB接口说明

    本文分析了基于芯核的嵌入式CPU 设计的特点,提出了设计基于ARM 核的嵌入式CPU内AHB 接口存在的空洞问题。结合体系的设计,给出了通过
    发表于 10-18 16:13 3次下载
    使用ARM核设计实现<b class='flag-5'>嵌入式</b><b class='flag-5'>CPU</b>的AHB<b class='flag-5'>接口</b>说明

    嵌入式软件的开发流程_嵌入式软件的调试

    本文首先介绍了嵌入式软件的发展,其次阐述了嵌入式软件的开发流程,最后介绍了嵌入式软件的调试
    发表于 08-31 16:02 6681次阅读

    如何实现嵌入式系统远程调试

    嵌入式系统随着目前科技的发展,正逐步融入人们的生活中。对于嵌入式系统,我们应该有所了解。就专业人员而言,他们对嵌入式系统早已驾轻就熟。为增进大家对嵌入式系统的认识,本文将对
    的头像 发表于 11-22 11:55 6679次阅读
    如何实现<b class='flag-5'>嵌入式</b>系统远程<b class='flag-5'>调试</b>

    FPGA实现嵌入式系统

    FPGA实现嵌入式系统(嵌入式开发报班哪个好)-该文档为FPGA实现嵌入式系统原理资料,讲解的还不错,感兴趣的可以下载看看………………………
    发表于 07-30 09:13 12次下载
    <b class='flag-5'>FPGA</b>实现<b class='flag-5'>嵌入式</b>系统

    嵌入式LINUX系统内核和内核模块调试

    嵌入式LINUX系统内核和内核模块调试(嵌入式开发和硬件开发)-嵌入式LINUX系统内核和内核模块调试                 
    发表于 07-30 13:55 10次下载
    <b class='flag-5'>嵌入式</b>LINUX系统内核和内核模块<b class='flag-5'>调试</b>

    基于FPGA嵌入式硬核的PCIExpress总线接口设计与验证

    基于FPGA嵌入式硬核的PCIExpress总线接口设计与验证(嵌入式开发架构)-该文档为基于FPGA
    发表于 07-30 15:23 7次下载
    基于<b class='flag-5'>FPGA</b><b class='flag-5'>嵌入式</b>硬核的PCIExpress总线<b class='flag-5'>接口</b>设计与验证

    fpga嵌入式

    FPGA(现场可编程门阵列)不是嵌入式系统,但FPGA嵌入式系统中有着重要的应用。
    的头像 发表于 03-14 17:19 4537次阅读

    嵌入式fpga是什么意思

    嵌入式FPGA是指将FPGA技术集成到嵌入式系统中的一种解决方案。嵌入式系统是一种为特定应用而设计的计算机系统,它通常包括处理器、内存、外设
    的头像 发表于 03-15 14:29 2707次阅读