coreconnect总线时序

来源:互联网 发布:睡大外女生知 编辑:程序博客网 时间:2024/05/22 04:51

最近的项目要在coreconnect上搭些外设,了解coreconnecttransfer的时序非常重要,coreconnect包括三大总线,我想就写三篇博文来简单总结一下coreconnecttransfer的时序。

第一篇是使用chipscope来观察coreconnect总线时序之plb时序

其实看coreconnect总线的transfer的时序有两种方法:

     1BFM进行仿真。这要建立仿真的工具,modelsim和所需的EDK的仿真库。这只要PC机就能完成,但是建立仿真工具比较麻烦,而且我自己建的仿真工具对一些外设仿真不了。像读写CF卡这些,我搞很久都搞不定,如果有人知道,请教小弟。

     2,利用chipsocpeEDK里提供的Chipscope Integrated logic Analyzer (ILA)来观察FPGA里实际的总线信号。但是这要有开发板。我想这是最准确的debug的方法。
   其实EDK里也提供chipscope_plb_iba可以对PLB进行观察,但是我发现其实这个IP也是根据Chipscope Integrated logic Analyzer (ILA)修改完成,只是它把plb的所有信号列为观察的信号,但是其实有些信号我们根本都关心,有点多余,观察起来很费劲,所以还是用这个Chipscope Integrated logic Analyzer (ILA)来自定义自己所需观察的信号。

Processor Local Bus的作用:

1PLB 总线是一种高带宽、低延迟、高性能的处理器内部总线。

2,高速的 CPU 核、高速存储器控制器、仲裁器、高速的 DMA 控制器等高性能、宽带宽的设备都连接在 PLB 上。

    我用的是ISE9.1i,EDK9.1i,chipsocpe9.1.03.

   ISEEDK是没有打SP的,但是chipsocpechipsocpe9.1.03的,如果用chipsocpe9.1.01的,EDK生成硬件时会报错。xilinxforum里有人讲。

   这里要用的例子是xilinx提供的在XUPV2P开发板上完成的Slide Show using 256 MB DDR Memory的例程。http://www.xilinx.com/univ/xupv2p_demo_ref_designs.htm

  这个例程是VGA_FrameBufferDDR中读取一行pixel的数据到VGA_FrameBuffer里的Block_ram,最后读取Block_ram里的数据进行显示。

 我关心的是,VGA_FrameBuffer作为一个Master,用plb总线的哪一种transfer来读取DDR里面的数据。

整个过程如下:

首先,打开例程。在这里你会看到chipscope_iconchipscope_ila,双击添加这两个IP

 

 

添加后如下:

 

第二:修改代码,把关心的信号从VGA_FrameBuffer中引出。

 

 

第三:双击chipscope_ila设置参数。

1,采样数

 

 

采样如果没有资源限制当然是越多越好,但是chipsocpe得采样数据是用片上的BlockRAM来存储,设置太大,综合时会报错。

2Trigger Unit

我要观察八组信号,所以使能8Trigger Unit,设置如下:

 

 

第四:连接chipscope_iconchipscope_ila之间的控制信号。

 


注意CLK要连接sys_clk_s

第五,将要观察的信号连接到chipscope_ila

 

 

 

这样就可以生成硬件了。

然后,下载硬件,并把软件也跑起来。

打开chipsocpe,点File下面那个图标连接到JTAG

 

 

成功连接后,可以看到

 

 

这些triggerport对应刚才我们连接到上面的信号。右击可以修改triggerport名字。

修改后我们可以观察到这样的信号图:

 

 

 

这就是实际中64-bit Master 8-word Line Read From a 64-bit Slave的时序

 

这与64bitPlbBus.pdf的是大致相同,但是访问DDR要等16clk才能得到数据。

 

总结:实际的总线时序和datasheet画的总是有一些偏差,有了chipsocpe真的对观察实际运行的总线时序帮助很大,但是就是综合一次比较久。

使用chipscope来观察coreconnect总线时序的第二篇博文,那就来看看DCR总线的时序吧。

Device Control Register Bus 有两个作用:

1DCR总线是用于ppc general purpose registers和  DCR从设备的device control registers之间的数据传输。

2, DCR总线使configuration registers不在映射到内存地址空间上(它有自己的地址空间),从而减少了PLB总线的负荷,增加了PLB总线的带宽。

使用的软件是ISE9.1i,EDK9.1i,chipsocpe9.1.03.
ISEEDK是没有打SP的,但是chipsocpechipsocpe9.1.03的,如果用chipsocpe9.1.01的,EDK生成硬件时会报错。

本文举例的系统如下:

 

 

这个系统很简单,除了dcr_ram是自定义的IP外,其它IP都是EDK里提供的。

dcr_ram,是一个DCRslave,它里面也很简单,我例化了一个RAMB16_S36BLOCKRAM。这样的话,PPC405可以通过DCR总线来向dcr_ram读写数据。这样dcr_ram可以看成一个DCR的寄存器堆,总共有51232位的DCR寄存器。

 

下面是系统的address

 

 

可以看到dcr_ram的地址是可以和DDR的地址是有重叠的,这可以说明它们的地址空间是不同的。

为了访问不同的地址空间,EDK里提供了不同的访问函数。

DCR的空间:XIo_DcrOutXIo_DcrIn

PLB的空间:XIo_Out32XIo_In32

这个IP的实现,如果有时间,我再写一篇博文来介绍。

 

这个系统的功能很简单,ppc405通过DCR总线,不断地写入和读出dcr_ram.

代码如下:

 

 

chipscope_iconchipscope_ila的搭建方法,上一篇博文已经介绍,

http://xilinx.eefocus.com/utoo/blog/10-02/185008_93c8e.html 这里不再啰嗦。同样,把关心的信号引出。

 

 

chipscope_ila连接

 

 

打开chipsocpe,修改信号名,设置触发条件。

 


 

TriggerPort2对应于我们的DCR write 信号,一旦有上升沿到来,这个chipsocpe开始保存采样。

 

按下,会出现下图:

 

 

这是因为还没有运行软件,chipsocpe没有扫到DCR write 上升沿,所以一直处于等待状态。

我们运行软件,进入debug状态。设置如下断点。

 

 

运行至断点。Chipsocpe出现信号。

 

 

这样就完成了对dcr_ram的写入。

为了证明数据确实被写入Blockram中,我再从Blcokram将数据读出。

这需要重新设置触发条件和断点。

 

 

TriggerPort1对应于我们的DCR read 信号,一旦有上升沿到来,这个chipsocpe开始保存采样。

 


 

SDK也可以看到PPC也读到了正确的数据

 

 

总结:      DCR总线的读写时序十分简单,只要我们观察到其时序,chipscope可以帮助我们做到这一点。

            更重要的是,FPGA作为软硬件协同设计的平台,需要能做到软硬件的codebugChipscope+SDKdebug,将是最佳的选择。


使用chipscope来观察coreconnect总线时序的第篇博文,轮到opb了。

On-Chip Peripheral Bus的作用:

1,连接具有不同的总线宽度及时序要求的外设,以使这些外设能够尽量减少对 PLB 性能的影响。

2,一些低速的设备都连接在 OPB 总线上。像RS232,CF卡控制器,PS2控制器。

使用的软件是ISE9.1i,EDK9.1i,chipsocpe9.1.03.
ISEEDK是没有打SP的,但是chipsocpechipsocpe9.1.03的,如果用chipsocpe9.1.01的,EDK生成硬件时会报错。

本文使用的例程还是xilinx提供的在XUPV2P开发板上完成的Slide Show using 256 MB DDR Memory的例程。http://www.xilinx.com/univ/xupv2p_demo_ref_designs.htm

 

 

  这个例程这样工作的:

首先,从CF卡里读取多个BMP图片的数据,去掉BMP的头信息之后,把RGB的数据放到内存中。

同时,每个BMP图片在内存中的地址都被记录。

最后,PPC通过DCR总线向把要显示的图片的地址写给plb_tft_cntlr_refplb_tft_cntlr_ref 就会根据这个地址从内存中读取数据进行显示。PPC通过传不同的地址给plb_tft_cntlr_ref,这样就能显示不同的图片,做到幻灯片的效果。

这样的话,就需要PPCplb_tft_cntlr_refSDCR端口写图片在内存中的地址,照我想,最直接的方法是通过PPCMDCR端口由DCR总线plb_tft_cntlr_refSDCR端口写图片在内存中的地址。像我第二篇博文那样访问DCR会更直接。

http://xilinx.eefocus.com/utoo/blog/10-02/185025_1f4ec.html

但是,这个例程并没有这样做,PPCMDCRNO connection的,那他是怎样向plb_tft_cntlr_refSDCR端口写图片在内存中的地址呢?

  这个例程是这样的:PPCPLB接口->PLB->plb2opb_bridge->OPB->opb2dcr_bridge->plb_tft_cntlr_ref的 SDCR接口。感觉绕了一大圈。

给它这么一绕,差点给它绕晕。既然SDCR接口得到的数据的源头是PPCPLB接口,那么SDCR上的两个寄存器的地址是映射在PLB的地址空间上。我们看看地址就明白了。

 

 

               首先,看一下与PLB有关的地址空间。PLB_ddr的地址是0x00000000--0x07ffffff

plb2opb_bridge有两个RNGRNG1是给OPB总线上那些外设的,可以看到OPB总线上那些外设的地址都在RNG1内。RNG0是给opb2dcr_bridge的,可以看到opb2dcr_bridge的地址也在RNG0内。这样SDCR上的两个寄存器的地址是映射在PLB的地址空间上。而且从中可以知道OPB的地址空间属于PLB的地址空间的。

我们可以在SDK的代码中,可以看到软件是这样访问DCR寄存器的。

 

因为DCR32位寻址,而PLB上是8位寻址,所以0xD0000040右移2位会得到上面的0b000010000,至于前面的D,那是因为这两个寄存器放在了RNG0里。

为了验证上面的想法,我在例程中加入chipscope_opb_iba,来观察是否访问寄存器时要通过OPB总线。端口连上后使用默认配置。

 

 

 

 

连接chipscope_iconchipscope_ila之间的控制信号

 

 

打开chipsocpe可以看到IBA

 

 

其实用IBA一个最大的好处就是EDK工具帮我们生成了所有的信号名,不用我们一个个去改。

我们可以这样来导入这些信号名。在当前的project的目录下找到implement这个目录。然后找到文件就可以导入了。

 

 

 

 

接着设置触发条件

 

 

下载硬件,在软件中设置如下断点。

 

 

   当程序运行到断点时,chipsocpe可以采到这样的信号。

 

 

    这样就验证了刚才的猜测。

总结:在FPGA上设计片上系统,了解总线的时序十分重要,在利用仿真和datasheet给我们提供的总线时序的基础上,通过猜测和思考并最后通过chipsocpe的验证,我们可以得到我们关心的总线信号的准确时序。

这样使用chipscope来观察coreconnect总线时序的博文就写完了,希望这三篇博文对大家有所帮助,起到抛砖引玉的作用。由于我还处于学习阶段,如果文章写得有什么不对的地方,还请大家指出。